Repository navigation
shape-doctor.py: the placement row asks a leg's top-level single-repository.yaml the staying-single record's question only where kind: makes it the record, so one declaring release-config is asked the general question as plan asks it, and an answered entry names that rule (#691) - #734
Conversation
…epository.yaml` the staying-single record's question only where `kind:` makes it the record, so one declaring `release-config` is asked the general question as `plan` asks it, and an answered entry names that rule (#691) `audit_leg` walked a leg with `adopt.walk`, whose rule for the record is by name alone, so a leg's `single-repository.yaml` declaring another kind was told it records that the repository stays single, and was answered under `ambiguous-single-repository-record`, on every run of a project adopted before #617 recorded answers under `answered_paths:`. `ask_about_a_record_only` (shape-doctor.py) reads the leg's file with `shape_advisory.read_record` and, unless it silences the advisory, reclassifies that entry with `policy.classify_file(path, skip=(adopt.RECORD_RULE,))`, as `adopt-project.py`'s function of that name does for `plan`. `adopt-project.py` is not changed. The comment at contracts/path-classification.yaml:443-446 now says the doctor asks the record's question of a leg's copy only where it declares the record's kind. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuidePlacement auditing now shares adoption planning's kind-based classification for single-repository.yaml, reading each leg's Git index and recording answers under the matching question rule, with comprehensive regression coverage for record types, index-versus-disk behavior, links, and row metadata. Sequence diagram for index-based placement auditingsequenceDiagram
participant Doctor as shape-doctor.py
participant Index as Git index
participant Adopt as adopt.ask_about_a_record_only
participant Policy as path-classification.yaml
Doctor->>Index: list leg_tracked_files
Doctor->>Adopt: ask_about_a_record_only(policy, walked, Source(mount, None, "", ""))
Adopt->>Index: read :single-repository.yaml
Adopt->>Policy: classify indexed kind
alt kind is single-repository-record
Policy-->>Adopt: ambiguous-single-repository-record
else any other kind or invalid YAML
Policy-->>Adopt: ambiguous-top-level-yaml
end
Adopt-->>Doctor: walked findings and matching answer rule
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
(lane openRepoShape-3, 2026-10-16T23:09:05Z) Lane 3's independent review of #734 at MUST-1: the doctor now carries its own copy of
SHOULD
NIT
What is right as written
Other checks
Lane: openreposhape-3 (openRepoShape-3) |
…ask_about_a_record_only` over each leg's index, so a leg's `single-repository.yaml` is asked the record's question where the index holds a record, and a link or a file changed or deleted on disk is read as `plan` reads it (#691) RV-e's round on #734. The first commit gave the doctor a copy of `plan`'s `ask_about_a_record_only` under the same name, which made the doctor's own statements that it carries no second copy of the classification false, and read the leg's disk where the row lists its index: a tracked link was followed, including outside the root, and a record deleted or edited on disk and not staged was asked the other question than `plan` asks. `audit_leg` now calls `adopt.ask_about_a_record_only(policy, adopt.walk( policy, kept), adopt.Source(mount, None, "", ""))`. That function reads only `source.path` and `source.commit`, and a commit of `""` is git's `:<path>`, the index `leg_tracked_files` lists, so a link is read as its blob and never followed. The copy in shape-doctor.py is deleted and `adopt-project.py` is not changed. The comment in contracts/path-classification.yaml says the doctor reads the leg's index. tests/test_adopt_single_repository_record.py: the leg's tree holds `widgets/` beside the source file, so a reclassification of every entry adds a second question; the reclassified and the kept entry assert their `files` and `bytes`; a record deleted on disk, a record edited to another kind and a non-record edited to a record, none staged, are read as the index holds them; and a tracked link to a record beside the leg is asked the general question, skipped where a link cannot be made. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
(lane openRepoShape-3, 2026-10-16T23:22:11Z) Lane 3's independent re-verification of #734 at Round-1 items
The writer's open point, an unmerged Mutants: RV-e killed six of seven:
The seventh survives and touches only the unmerged case above. Tests (stub Lane: openreposhape-3 (openRepoShape-3) |
main gained 25 pull requests since de92614: #634, #699, #671, #719, #701, #717, #700, #702, #722, #720, #725, #721, #728, #705, #727, #718, #744, #743, #749, #740, #737, #734, #742, #751 and #736. No conflict: AGENTS.md, adopt-project.py and docs/cli.md merged as text, and README.md and docs/handbook.html are unchanged by the merge. README.md is 1473 lines, its cap; AGENTS.md 494, its cap; every handbook marker is current; `render-cli-reference.py --check` is ok. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es every reason THIS checkout cannot answer, and the notes are current to main bf1f099 with the 25 pull requests since de92614 (#563, #683) - W683 and RV-f's N4 on #742: README's exit-3 list (Keeping a project's shape current, :1208-1220) and its handbook twin (`doctor`) named only a pin whose commit this checkout does not carry. They now say, as shape-doctor.py's EXIT CODES does: a pin's commit it lacks, a partial clone missing what is compared (#683), a read that fails (`update-upstream-unreadable`), a crashed validator of its own (#278, #410), or its own naming policy not loading (#678). +1 line, with tests/readme-cap.d/683.txt; README.md is 1474, its cap (1422 + 2 + 5 + 12 + 22 + 10 + 1). The two `Keeping a project's shape current` markers move: `doctor` text and marker, `current` marker only. - The notes, "What changed since v1.0.1", one entry per pull request from `git log --first-parent de92614..bf1f099`, each from its squash commit and the issues GitHub says it closes: - adopt-project.py: #699, #719, #749, #727, #717, #728 (with #621's hint), #743 + #720 + #718, #722, #721; - update-shape.py, bump-leg.py and a project's own scripts: #702 (with the pinned validators), #634; - scaffold, setup, family and the shared readers: #725, #671, #744; - shape-doctor.py: #742, #701, #737, #751, #736, #734, #700 + #705, #740; - install, CI and the docs: the exit-3 sentence above. - Counts (99 pull requests since bfed143; 109 of 135 milestone issues closed at 10:28Z), the "current to main" sha and the open list (26) are at main bf1f099, still placeholders for tag time. Left for round B: lane 5's eight lines (#630 issuecomment-6227129879), whose pull requests #726, #747, #682, #724, #746, #745 and #738 are open drafts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



Lane: openreposhape-3 (openRepoShape-3)
Claim: #691 (comment)
Closes #691.
What changed and why
The doctor's
placementrow walks each leg withadopt.walk, whose policy rule for the staying-single record (ambiguous-single-repository-record) matches the namesingle-repository.yamlalone. A leg's copy declaringkind: release-configwas told it records that the repository stays single, and offereddropas the default, on every run.adopt-project.py planasks that file the general top-level-YAML question, becauseask_about_a_record_onlyreads itskind:. #617 narrows the difference (executerecords the answer underanswered_paths:), but an answered entry still named the record's rule, and every project adopted before #617 is asked the record's question on every run.shape-doctor.py:6507:audit_legcallsadopt.ask_about_a_record_only(policy, adopt.walk(policy, kept), adopt.Source(mount, None, "", "")),plan's own function (adopt-project.py:1869). The doctor carries no copy of it, so the doctor's statements that it reimplements nothing (shape-doctor.py:9,:152, theIT REIMPLEMENTS NOTHINGparagraph,README.md:1211-1213,docs/handbook.html:1632-1634) stay true and are unchanged. The function reads onlysource.pathandsource.commit, soadopt-project.pyis not changed.""is git's:<path>, the indexleg_tracked_fileslists. So a tracked link is read as its blob and never followed (not into the leg, not outside the root), and a record deleted or edited on disk and not staged is asked as the index holds it, asplanreads its commit.shape-doctor.py:6462-6467says so inaudit_leg's docstring.ambiguous-top-level-yaml. The verdict'slegstays null, so the verdict and exit code do not move.contracts/path-classification.yaml:441-452: the comment says the doctor asks the record's question only of a leg's copy that declares the record's kind in the leg's index, and drops "by name".Tests
tests/test_adopt_single_repository_record.py, besidetest_the_doctor_reads_a_legs_copy_as_a_question_and_not_misplaced, throughaudit_legon a real git leg (leg_audited,:373, whose tree holdswidgets/a.candwidgets/b.cso that a reclassification of every entry adds a second question):single-repository.yamlthat declaresrelease-config, is not a mapping or does not parse gets the general question and rule, with itsfiles == 1and itsbytes(:400);kind:alone, keeps the record's question and its stated default, with itsfilesandbytes(:420);:447);:458).tests/test_doctor_recorded_answers.py:225: through the doctor's--jsonrun, an answeredsingle-repository.yamlthat is not a record namesambiguous-top-level-yaml; a record names the record's rule.Source(mount, None, "", None)) fails the three index cases and the link case; a reclassification of every entry fails the three non-record cases and the edited-to-a-record case; droppingfiles/bytesfails the three non-record cases. The first round's four behaviour cases fail on main and pass here.bytesassertion compares with the leg file's ownread_bytes(), notlen(text.encode()), becausemake_source_repowrites withwrite_textand a Windows checkout would count CRLF.tests/test_shape_doctor.py, run once, same flags:428 passed, 3 skipped, 1 xfailed in 336.95s (0:05:36).Pinned copies
None touched.
shape-doctor.pyandcontracts/path-classification.yamlare in noCOPIED_VERBATIM,FAMILY_COPIED_VERBATIM,COPIED_FROM_SHAPEor assembly-root template list (grep inscripts/shape_materialize.pyandtemplates/), so no project sees anupstream-changedrow. No test pins the comment's text. No doc states the by-name behaviour, so README.md, AGENTS.md, docs/cli.md and docs/handbook.html are unchanged.Lands after
#655 (PR #721) has landed; main is merged into this branch (66b230e), cleanly.
🤖 Generated with Claude Code
Summary by Sourcery
Align placement auditing with planning by classifying a leg’s staying-single file from its indexed content and preserving the corresponding answer rule.
Bug Fixes:
single-repository.yamlthe staying-single record question only when its indexed content declares the record kind.Enhancements:
Tests: