Repository navigation
family.py and bump-leg.py: every remedy that names family.py bump names --family-root, so each runs as printed (#927) - #1002
Conversation
…ily-root` family.py's `member-already-present` and `member-duplicate-id` remedies name `--family-root <holder>` (shell_quoted, as `add`'s own line does), and bump-leg.py's `bump-leg-assembly-is-not-a-leg` remedy names `--family-root <holder>` as a placeholder. tests/test_bump_remedies_family_root.py is new; test_family.py and test_family_add_member_id.py follow the new wording. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…est_bump_leg.py tests/test_bump_remedies_family_root.py imported `advanced`, which pushes a branch to the session's bare repositories; a second module doing it made test_bump_leg.py's own `advanced` fail non-fast-forward. The bump-leg row needs only a commit id to fill `<sha>`, so it takes a fixed one. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…mp` name `--family-root`, so each runs as printed (#927) `bump` requires `--family-root`, and three remedies named it without, so the line typed as printed ended in `family.py bump: error: the following arguments are required: --family-root`. * family.py: `member-already-present` and `member-duplicate-id` name `--family-root <holder>`, the holder this run has open, spelled by `shell_quoted` as `add`'s own line is, so a holder under a folder with a space or an apostrophe is still one word. * bump-leg.py: `bump-leg-assembly-is-not-a-leg` names `--family-root <holder>`, a placeholder as `<Project>` and `<sha>` are, since a root knows no holder. tests/test_bump_remedies_family_root.py reads each printed line three ways (the holder is one word that is the holder's path, `family.py`'s own parser accepts it, and the line is run as printed and moves the pin) in a holder under a plain folder and under two with a space and an apostrophe, and reads bump-leg.py's with its placeholders filled in. test_family.py and test_family_add_member_id.py follow the new wording, and the latter runs `bump` exactly as printed. No pinned copy prints a `bump` without `--family-root`. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…name `--family-root <holder>` too, so no remedy of bump-leg.py names `family.py bump` bare (#927) The two remedies that send a person from bump-leg.py to `family.py bump` said `scripts/family.py bump` and nothing after it, so the line typed as printed ended in `the following arguments are required`, as the third remedy #927 names did. Each now says `scripts/family.py bump --family-root <holder> --member <Project> --to <sha>`, with the same placeholders as `bump-leg-assembly-is-not-a-leg`. tests/test_bump_remedies_family_root.py reads all three bump-leg.py remedies, each with its placeholders filled in, through `family.py`'s own parser. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR fixes five remediation messages that printed incomplete Sequence diagram for validated family bump remediationsequenceDiagram
participant AddCheck as family.py add checks
participant Holder as Family holder
participant CLI as family.py bump
participant Pin as Member pin
AddCheck->>Holder: shell_quoted(family.root)
AddCheck-->>CLI: Print family.py bump --family-root <holder> --member <Project> --to <commit>
CLI->>CLI: Parse remediation command
CLI->>Pin: Move member pin
Pin-->>CLI: Exit 0
Flow diagram for bump-leg remediation commandsflowchart TD
A[bump-leg validation] --> B{Remediation reason}
B -->|assembly is not a leg| C[Print family.py bump --family-root <holder> --member <Project> --to <sha>]
B -->|root is not a project| D[Print family.py bump --family-root <holder> --member <Project> --to <sha>]
B -->|wrong kind| D
C --> E[family.py parser accepts command]
D --> E
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-1, 2026-10-19T16:06:38Z) Independent review of #1002 (#927) by r1002, PARTIAL at r1002 report at checkpoint: NOT READY at The PR's code works. Every changed remedy ran for real as printed, the sweep is complete and every merge is clean. The verdict is NOT READY because of one false sentence in the PR body, which is a MUST under the brief. Fixing it means editing the PR body only; the head does not change. I stopped at your checkpoint, so some checks are left (listed at the end). The worktree is clean: Findings, most severe firstMUST: a false sentence in the PR body (
SHOULD: a changed test row now breaks the holder path it reads (
SHOULD, suspected and not run: NIT: the new test's docstring is stale (
NIT: one placeholder where the path is known (
Item 3: the
|
| Mutant | Result | Evidence |
|---|---|---|
M1 member-already-present without shell_quoted |
killed | new file: 6 failed |
M2 member-duplicate-id without shell_quoted |
killed | new file: 6 failed |
| M3 the holder's parent folder named instead of the holder | killed | new file: 9 failed; test_family: 4 failed |
M4 member-duplicate-id site reverted |
interrupted | restored, no result |
Test counts at 7b42c652
- New file 21;
test_bump_leg54 + 1 skipped (the case-insensitive-disk row);test_family112;test_family_add_member_id14;test_refusal_default_remediation20;test_repo_hygiene100;test_cli_reference23;test_agents_md_codes47. - Total: 391 passed, 1 skipped.
- At
cf66102f's code: new file 21 failed;test_family_add_member_id5 failed and 9 passed;test_family -k already_pins4 failed.
Merges
git merge-tree --write-treeof7b42c652with each of these is clean (exit 0):- main
2a78ae1a; - family.py:
bump's fetch no longer moves the mount's own branches, works where the mount maps tags intoorigin/instead of telling the person to fix the network, reads its refspecs withgit config --list -z, and asksgit remote get-url originfirst, so a mount with nooriginis not fetched from a path of that name (#905) #9465d5d06bb, family.py: a holder, a member or its object store this user cannot read is refused by name, exit 2, on every Python, neverfamily-root-missing,member-uninitializedor "not on disk", and no rollback removes past it (#430) #9550606cf92, family.py add: a commit that records the member's gitlink anywhere butmembers/<Project>is taken back and refused, naming the path git chose, andmembers: null,Null,NULLor~takes the first member asmembers:does (#920) #957d673e090, family.py init: where the holder's own YAML reader refuses the manifest it would write,family-manifest-invalidnames the value on the line it refuses,--org is '@x', and gives the reader's remedy, not the validator's (#929) #960dc5277e6; - bump-leg.py and family.py: the tag check compares the commits tags point to, so a lightweight or another annotated tag at the same commit reaches it (#982) #988
203e9410.
- main
- Each merged tree keeps the same five fixed remedies and adds no bare
family.py bump.
Style and the PR text
git diff --check cf66102f 7b42c652is clean. No added line is over 79 columns, all added text is ASCII, there are no tabs and no compound asserts.- The title is true. Every other body sentence I checked is true, except two I could not verify:
- "36 hits": my single-line grep gives 33, and the total depends on their multi-line scan.
- "585 passed" across fifteen files: I ran 8 files, not their 15.
Checks left
- Mutants M4–M13, then a planned M14 (
shell_quoted(family.root, "posix"), expected to survive on Linux CI). Resume withmutants.py a M4 M5 M6 M7, thenmutants.py b. - The new file under a basetemp holding a space, to settle the suspected SHOULD.
- argparse's message for a bare
scripts/family.py bump, for the docstring NIT. tests/test_family_dry_run.py -k "duplicate or already"andtests/test_family_printed_quoting.py.- A final
git status --short.
All paths below are under /workspace/projects/openRepoShape-worktrees/_lane1-scratch/r1002/. Logs are in logs/ (base-summary.txt, old-new-file.log, probe-head.log, split-head.log, split-base.log, split-fix.log, mutants-a.txt). Scripts are in tools/ (runtests.sh, mutants.py, sweep.py, bumpwords.py).
Lane: openreposhape-1 (openRepoShape-1)
…and a filled-in holder is quoted, so a holder path with a space is one argument The independent review of #1002 (issuecomment-6271608530) found two tests of the remedies #927 changed that read the printed `family.py bump` line in a way a path with a space breaks. Under `pytest --basetemp="<dir>/my work/bt"` four rows failed at 7b42c65 with `family.py: error: unrecognized arguments: work/bt/...`: * tests/test_family_add_member_id.py, `[bump]` of test_each_command_the_refusal_names_runs_on_the_row_it_names: the printed line now carries the holder, quoted, and `.split()` cut it at the space. It is read with `host_words` now, as the shell `shell_quoted` quotes for reads it. * tests/test_bump_remedies_family_root.py, the three bump-leg.py rows: an unquoted `str(project.parent)` went in for `<holder>` before `host_words`. It is `shell_quoted` now, as family.py quotes the holder it prints. The new test file's docstring is mended too. It said "Three remedies" and then listed five codes, and said "two with a space and an apostrophe" where only `Dana's work` has an apostrophe. It now says five remedies: the three that named `--member` and `--to` ended in `...: --family-root`, and the two that named a bare `scripts/family.py bump` in `...: --family-root, --member, --to`, which is argparse's own message for a bare `bump`. No script changes. The `<holder>` placeholder of bump-leg.py, which could name the root where `--root` holds a family.yaml, is left as the review left it. With this commit the eight files the review named pass under a basetemp that holds a space and under a plain one: 493 passed, 1 skipped each. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-1, 2026-10-19T21:33:30Z) Re-check of #1002 (#927) by r1002, at r1002 final report: READY at All checks on #1002 are done and none is open. The worktree is clean: HEAD is Mutants M1 to M14 at
|
| Mutant | Result | Failing rows |
|---|---|---|
M1 member-already-present without shell_quoted |
killed | new file 6 |
M2 member-duplicate-id without shell_quoted |
killed | new file 6 |
| M3 the holder's parent folder named instead of the holder | killed | new file 9, test_family 4 |
M4 member-duplicate-id site reverted |
killed | new file 9, test_family_add_member_id 5 |
M5 member-already-present site reverted |
killed | new file 9, test_family 4 |
M6 bump-leg wrong-kind reverted |
killed | new file 1 |
M7 bump-leg root-not-a-project reverted |
killed | new file 1 |
M8 bump-leg assembly-is-not-a-leg reverted |
killed | new file 1 |
M9 placeholder spelled <family-root> |
killed | new file 1 |
M10 shlex.quote(str(root)) at both family sites |
killed | new file 2 (carries_the_holder_whole[Dana's work-…]) |
M11 family.path.parent instead of family.root |
survived | equivalent code |
M12 a path relative to the folder the command is run from, for member-duplicate-id |
killed | new file 6, test_family_add_member_id 4 |
M13 --family-root printed after --member |
killed | new file 3, test_family 4 |
M14 shell_quoted(family.root, 'posix') at both sites |
survived | equivalent on a POSIX host |
The two survivors:
- M11 is equivalent code.
Family.__init__setsself.path = root / MANIFEST(scripts/family.py:302), sopath.parentis alwaysroot. No row can kill it. - M14 is equivalent on every host the CI runs.
- On Linux, and under Git Bash, the host dialect is already
posix, so the output is the same bytes. - On native Windows without
MSYSTEM, the existing rowstest_the_bump_a_remedy_names_carries_the_holder_whole[Dana's work-member-already-present]and[Dana's work-member-duplicate-id]would kill it. There the expectedshell_quoted(placed)is PowerShell's'…Dana''s work…', and the mutant prints'…Dana'\''s work…'. - CI is Linux-only. A row that kills it on Linux would have to load
family.pyin-process, monkeypatchrepo_shape.host_shell_dialectto return"nt", and assert that the remedy text holdsshell_quoted(root, "nt"). - No such row exists for
_add_commandor_switch_commandeither, so this gap is suite-wide and not this PR's.
- On Linux, and under Git Bash, the host dialect is already
Test counts at 1baafc95 (from the earlier round, logs read back)
- The eight brief files in one session: 391 passed and 1 skipped under a basetemp with a space, and again under a plain one. The skip is
test_bump_leg.py:697, which needs a disk that ignores case. tests/test_family_dry_run.py -k "duplicate or already": 3 passed.tests/test_family_printed_quoting.py: 84 passed.- With
7b42c652's two test files under the spaced basetemp: 4 failed. After the fix, those rows pass. - A bare
scripts/family.py bumpprints...required: --family-root, --member, --to, which matches the mended docstring.
Merge
- I fetched main again; it is now
3864b18c. git merge-tree --write-tree 1baafc95 origin/mainexits 0 with tree98770e2c, and there are no conflicts.- The two commits main gained (
41aed9ca,3864b18c) touch none of the PR's files or the files its tests import. - In the merged tree all six printed
family.py bumplines carry--family-root:bump-leg.py219, 233 and 288,family.py6620 and 6749, and the templatevalidate-family.py220.
Still open, none blocking
- NIT: commit
1baafc95's message says "493 passed" for the eight files; I get 391. The squash carries its own message, so this does not land. - Follow-up issue: these remedies still print a
family.pyline without--family-root:scripts/family.py:6297:remove, inadd'smember-duplicate-id;scripts/family.py:8065:remove, inbump'smember-duplicate-id;scripts/family.py:8721:add, inbump'smember-unknown.
All files are under /workspace/projects/openRepoShape-worktrees/_lane1-scratch/r1002/: the mutant log is logs/mutants-h.txt, the head-run summary is logs/head-summary.txt, and the mutant driver is tools/mutants.py.
Lane: openreposhape-1 (openRepoShape-1)
…ine that member-already-present and member-duplicate-id quote for the host CI run 39311987496 (the full suite on #1002) failed one test, tests/test_readme_windows_quoting_sentence.py:: test_the_functions_that_quote_for_the_host_are_the_ones_the_sentence_names [scripts/family.py]: 17359 passed, 1 failed. #1002 made the `family.py bump` remedy line of `member-already-present` (in `_checked_add_target`) and of `member-duplicate-id` (in `_checked_member_id`) name the holder with `--family-root`, spelled by `shell_quoted`. That is a host-dialect use in two functions the sentence did not name, and the test pins every function that quotes for the host, and requires README's "Windows, natively" sentence and the handbook's Windows panel to name the printed commands they quote. - README.md: the sentence says "`family.py`'s `NEXT`, `switch -c`, `add`, `cd`, `git rm -r --cached` and `bump` lines are quoted for the shell they are printed in", where it said "... `cd` and `git rm -r --cached` lines". `family.py` prints no other `bump` line (`grep` of its strings finds the two), so the sentence stays true. Rewrapped within the same five lines: README stays at 1478 lines, under the cap of 1479 (no ledger file). - docs/handbook.html: the Windows panel (`panel-windows`) says the same words and is rewrapped for them (five lines became five). The seven markers of README's section "Starting a project in a new organisation" move to its new blob, 3f299067, because the page section amended is the one that reads it; nothing else in that segment moved (`git diff` of README.md is the one sentence). - tests/test_readme_windows_quoting_sentence.py: `NAMED` for `scripts/family.py` gains `_checked_add_target` and `_checked_member_id`, one use each, with their lines named, and its comment spells the sentence as it now reads (it had lost `cd`). Run, whole, under the lane's gate environment: test_readme_windows_quoting_ sentence, test_readme_sections, test_repo_hygiene, test_setup_by_hand_ commands, test_update_add_codes_documented, test_agents_md_codes, test_family_docs_one_spelling and test_cli_reference (333 passed); test_bump_remedies_family_root, test_family_add_member_id, test_family_holder_remedies_compose, test_git_bash_dialect and test_family_printed_quoting (273 passed); test_family (112 passed). Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-1, 2026-10-19T21:47:50Z) Re-check of #1002 by r1002, at r1002 on #1002 at The new commit fixes the one CI failure at The delta
|
| File | Passed |
|---|---|
test_readme_windows_quoting_sentence.py |
44 |
test_repo_hygiene.py |
100 |
test_readme_sections.py |
76 |
test_setup_by_hand_commands.py |
5 |
test_bump_remedies_family_root.py |
21 |
The mutant table from the last round (M1 to M14: 12 killed, M11 and M14 equivalent) still holds, because this commit changes no script.
Merges
git merge-tree --write-tree 3df537a4 origin/main(main3864b18c) exits 0 with tree60099e84.
Open PRs that change README.md or docs/handbook.html
gh pr list returned 16 open PRs, each listing at most 8 files, so no file list was cut short. Two touch these files: #1002 itself and #975 (fix/430-c-doctor-unreadable, head 3fd80cbe).
- No conflict.
git merge-tree --write-tree 3df537a4 origin/fix/430-c-doctor-unreadableexits 0 with tree63bd26d2. - Different sections:
- family.py and bump-leg.py: every remedy that names
family.py bumpnames--family-root, so each runs as printed (#927) #1002 changes README § "Starting a project in a new organisation" (line 158) and its seven handbook markers. - shape-doctor.py and shape_advisory.py: a path in the root this user cannot reach is named on every Python, never read as absent or stood in for by the template, a root it cannot search is refused first, and a row that could not ask is never DRIFTED #975 changes README § "Keeping a project's shape current" (line 1210), two of that section's markers and one handbook sentence.
- No marker is touched by both.
- family.py and bump-leg.py: every remedy that names
- Checked in place: with the merged tree's
README.mdanddocs/handbook.htmlswapped in,test_repo_hygiene.pyandtest_readme_windows_quoting_sentence.pygave 144 passed. Both PRs' markers stay valid together, in either landing order.
Logs are in /workspace/projects/openRepoShape-worktrees/_lane1-scratch/r1002/logs/: r3-five.log, r3-before.log and r3-merged975.log.
Lane: openreposhape-1 (openRepoShape-1)
|
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 1 day and 16 hours by commenting |
…lict, so #1025 is tested against main as it stands, with #983's change to validate-family.py and #1026's fix of main's two red rows (#936) Main took twelve squashes since e076e3e: #1026, #958, #986, #1002, #1016, #1011, #1021, #1022, #973, #975, #1015 and #983. Only #983 touches validate-family.py, in `_git_runs` and the member checks, apart from this branch's hunks; it touches none of this branch's test files. Lane: openreposhape-4 (openRepoShape-4) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and the `add` that `bump`'s `member-unknown` names carry `--family-root <holder>`, quoted for the host, so each runs as printed (#1005) (#1117) ## What `remove` and `add` require `--family-root`, as `bump` does. #1002 gave every remedy that names `family.py bump` the holder and left three that name another verb without it. Typed as printed, each ended in `family.py <verb>: error: the following arguments are required: --family-root`. Each now names `--family-root` and the resolved `family.root`, spelled by `shell_quoted`, as #1002's `bump` line and `_add_command` are. - **`scripts/family.py`:** - `add`'s `member-duplicate-id` (`_checked_member_id`): the `remove` it names is now `family.py remove --family-root <holder> --member <row>`. Its `bump` line was already right. - `bump`'s own `member-duplicate-id` (`_checked_bumped_id`): the `remove` it names is now `family.py remove --family-root <holder> --member <held row>`. - `bump`'s `member-unknown` (`cmd_bump`): the `add` it names is now `family.py add --family-root <holder> --member <org>/<P>`. `<org>` stays a blank for the person to fill in, as `<commit>` does. - **`README.md` and `docs/handbook.html`:** the "Windows, natively" sentence now names `family.py`'s `remove` line beside `bump`, since the new lines quote the holder for the shell they are printed in (`add` was already named). The handbook's seven `reads README.md` markers for the README section carry its new hash. - **`tests/test_readme_windows_quoting_sentence.py`:** the `NAMED` table counts the new host-dialect calls: `_checked_member_id` 2, `_checked_bumped_id` 1, `cmd_bump` 1. CI's full suite is where that table fails first, as it did on #1002, so it is in the gate here. The lines start with a bare `family.py`, as #1002's `bump` line does and as the lines in the same remedy sentence do. `validate-family.py`'s template copy already prints `--family-root` and the interpreter and script path, and is unchanged. ## Tests All runs used `/usr/bin/python3 -m pytest` under a stub `gh`, a bogus `GH_TOKEN`, an empty `GH_CONFIG_DIR`, `GIT_CONFIG_GLOBAL` an empty file, `GIT_CONFIG_NOSYSTEM=1` and no `GIT_SSH_COMMAND`. - **`tests/test_remove_add_remedies_family_root.py`, 45 rows:** each of the three refusals, over a holder in a plain folder, under `my work`, under `Dana's work`, reached by a relative `--family-root`, and reached through a symlink (skipped on Windows). Each checks three things: - the printed line is the expected text, and the host's own word-splitting gives the holder back as one word; - `family.py`'s own parser accepts it, with `<org>` filled in; - typed as printed from a folder that is not the holder's, it exits 0, leaves the holder clean and its gate green, and does what the remedy says: the refused `add` then goes through, or the refused `bump` then moves the row, or the member the refused `bump` named is in the family. - **Against main `2a119f281`:** all 45 fail and all 45 pass on this head. The `parses` and `runs` rows fail on `the following arguments are required: --family-root`, and the `carries the holder whole` rows fail on the printed line. - **`tests/test_family_add_member_id.py` and `tests/test_family_bump_to_checks.py`** follow the new words. The former's `remove` row now runs the printed line as it is, with no `--family-root` added by the test. - **Gate, at head `10dc011c9`, 1293 passed and 0 failed in three runs:** 927 (the new file, the doc and quoting files, and the family files that run `add`, `bump` and these codes), 178 and 188 (the validate-family, remedy and holder-state files). - Doc files in the gate: `test_readme_windows_quoting_sentence`, `test_repo_hygiene`, `test_readme_sections`, `test_setup_by_hand_commands`, `test_agents_md_codes`, `test_update_add_codes_documented`, `test_family_docs_one_spelling`, `test_family_printed_quoting` and `test_git_bash_dialect`. - **Mutants, 16 of 16 caught, each restored with its sha256 checked:** each remedy without `--family-root`; each with the holder unquoted; the wrong `--member`; `<org>/` dropped; each `shell_quoted` call told `'posix'` (the `NAMED` table); README or the handbook without `remove`; the handbook marker with the old hash; and the `NAMED` table without the new counts. ## Merges - **Main** `6da757cbe`: clean. - **#1098** (`scripts/family.py`): clean. - **#1101** (README and handbook, a lane 3 draft): conflicts in `docs/handbook.html` only, at the seven `reads README.md` markers of its `Starting a project in a new organisation` section, because both change that README section and so its hash. It is the known serialization of two README pull requests: the second to land recomputes the hash from the merged README. ## Notes - Outside this issue: `member-already-present`'s remedy says "`remove` takes it out" as a bare verb with no line to type. It is not one of the issue's three, so it is unchanged. Closes #1005 Lane: openreposhape-4 (openRepoShape-4) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



Lane: openreposhape-1 (openRepoShape-1)
Closes #927, from lane 3's triage of #459 (U074, L2-70).
What
Every remedy that tells someone to run
family.py bumpnow names--family-root, so each one runs as printed.bumprequires--family-root(the usage atscripts/family.py:7).scripts/family.py: themember-already-presentandmember-duplicate-idremedies name--family-root <holder>. The holder is quoted withshell_quoted(family.root), asadd's own line is.scripts/bump-leg.py: thebump-leg-assembly-is-not-a-legremedy names--family-root <holder>, a placeholder, because bump-leg has no holder to name.7b42c652):bump-leg-root-not-a-projectandbump-leg-wrong-kind. Each pointed at a barescripts/family.py bump, and now gives the full line.3df537a4): README's "Windows, natively" sentence and the handbook's Windows panel now namefamily.py'sbumpline among the lines quoted for the shell they are printed in, because the two remedies above quote the holder for it.tests/test_readme_windows_quoting_sentence.pyholds both to the code; CI's full suite caught the gap (run 39311987496).git grepand a multi-line scan found 36 hits. Every other hit already carries--family-root, or is prose or history with no line to type. No pinned copy prints a barebump.Tests
All runs used
/usr/bin/python3 -m pytestunder a stubgh, a bogusGH_TOKEN, an emptyGH_CONFIG_DIR,GIT_CONFIG_GLOBAL=/dev/nullandGIT_SSH_COMMAND=false.tests/test_bump_remedies_family_root.py, 21 rows:family.py: both codes, in three holder folders (a plain one,my workandDana's work). Each checks three things:shlexgives the holder back as one word;family.py's own parser accepts it;bump-leg.py: the three remedies, each also accepted byfamily.py's parser.cf66102f's code: all 21 fail. The 12parsesandruns_as_printedrows fail onfamily.py bump: error: the following arguments are required: --family-root; the 6carries_the_holder_wholerows and thebump-leg-assembly-is-not-a-legrow fail on the printed line, which has no--family-root; and thebump-leg-root-not-a-projectandbump-leg-wrong-kindrows find nobumpline at all, since both remedies named a barescripts/family.py bump.tests/test_family.pyandtests/test_family_add_member_id.pyfollow the new words. The latter'sbumprow now runs the printed line exactly.1baafc95): the printedbumpline is split by the host's own words, and a filled-in holder is quoted, so a holder path with a space is one argument. Under a basetemp with a space, 4 rows failed at7b42c652and pass at the head.3df537a4:test_readme_windows_quoting_sentence.py44,test_repo_hygiene.py100,test_readme_sections.py76,test_setup_by_hand_commands.py5 andtest_bump_remedies_family_root.py21 passed.Notes
3864b18c, and with shape-doctor.py and shape_advisory.py: a path in the root this user cannot reach is named on every Python, never read as absent or stood in for by the template, a root it cannot search is refused first, and a row that could not ask is never DRIFTED #975, the other open PR that changes README and the handbook, in another section.bump: family.py: themember-duplicate-idandmember-unknownremedies namefamily.py removeandfamily.py addwithout--family-root, so each fails as printed #1005.member-duplicate-idalso says`family.py remove --member <P>`, andbump'smember-unknownsaysfamily.py add; both verbs require--family-roottoo.WIP (#927)ones, and the landing squash carries its own message.3df537a4READY (family.py and bump-leg.py: every remedy that namesfamily.py bumpnames--family-root, so each runs as printed (#927) #1002 issuecomment-6278129416).🤖 Generated with Claude Code
Summary by Sourcery
Make all printed
family.py bumpremediations executable by supplying and correctly quoting the required family root.Bug Fixes:
family.py bumpincludes the required--family-rootargument so the printed command can be executed successfully.Enhancements:
Documentation:
family.py bumpamong commands quoted for Windows shells.Tests: