Skip to content

tests/test_chain_remedy_callers.py: three rows hold #980's unchanged --link-source reading at the old first-= split's corners (a keyed path that begins with =, a keyed blank path, a key in capitals) (#1054) - #1058

Merged
brettheap merged 2 commits into
mainfrom
fix/1054-chain-split-corners
Oct 20, 2026

Conversation

@brettheap

@brettheap brettheap commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openreposhape-5 (openRepoShape-5)
Claim: #1054 (comment)

Closes #1054.

Goal

Three test rows hold what #980 (#1044) left unchanged in how --link-source reads a value (a keyed path that begins with =, a keyed blank path, a key typed in capitals), so each of rv980's four surviving mutants of scripts/validate-repository-naming.py fails a test. Fix round 1 (rv1058's NIT 1) adds a fifth mutant to what the rows kill.

#1044 said a chain whose links hold no = is read exactly as before. That is true (rv980 compared 800 runs on the base and the head), but it rested on that probe: tests/test_chain_remedy_callers.py held the #980 rows for the new reading and none for the corners of the old first-= split. Of rv980's seven mutants, R1, R5, R10 and R14 survived the five closest test files (404 passed under each).

Tests only. The one file changed is tests/test_chain_remedy_callers.py (72 lines added, none removed, over two commits), in the "#980" section after test_a_key_is_read_whole, reusing the file's THREE, EQUALS, naming, tree, gate_warnings, UNREACHED and clear_ambient_pin_sources. No assert joins conditions with and or or. No script, template or doc changes, so no pinned copy moves and a root's update-shape.py check gains no row.

The three rows

Each pins bytes the gate already prints on main (the new parameter of row 3 passes on 8a057215's script, which is byte-identical to the one here).

  1. test_a_keyed_path_may_begin_with_an_equals, two parameters: openXdox==x with THREE (a-plain-link), and open=y== with EQUALS (a-link-holding-an-equals, the issue's parenthetical). Exit 0; the WARNING link-source-unreadable: =x (--link-source openXdox=...) could not answer for openXdox: no such file or directory (and = (--link-source open=y=...) ... for open=y); no "read as a PATH" line. Kills R10.
  2. test_a_keyed_blank_path_is_one_blank_and_is_not_refused: 'openXdox= ' with THREE. Exit 0; no REFUSED; the WARNING link-source-unreadable: (--link-source openXdox=...) could not answer for openXdox: no such file or directory (the path is one blank); no "read as a PATH" line. Kills R1 and R14.
  3. test_a_key_typed_in_capitals_is_noted_as_the_chain_spells_it, two parameters, with the name brett-wip, which reads no declaration. Exit 0, and the one NOTE line is compared as a whole line: NOTE --link-source <typed>: not used - no name classified here reads <link>'s own declaration. (the em dash of the gate's text, as the file's other NOTE rows spell it).
    • a-link-holding-an-equals: OPEN=Y=<tree> with EQUALS, the NOTE ends reads open=y's own declaration.. Kills R5.
    • a-capital-inside-a-link (new in fix round 1, rv1058's NIT 1): OPENXDOX=<tree> with THREE, the NOTE ends reads openXdox's own declaration.. The first parameter's chain, open=y, is all lowercase, so it could not tell "the link as the chain spells it" from "the link lowercased"; openXdox has a capital X. Kills R5 as well, and M2 (return link.lower(), ...), which survived the first head.

Bytes against 5b41d44f, the base of #1044 (checked with git archive 5b41d44f contracts scripts and the same values: stdout, stderr and exit code compared):

  • Identical to main: openXdox==x (row 1), 'openXdox= ' (row 2) and OPENXDOX=<tree> (row 3, the a-capital-inside-a-link parameter).
  • Different, because they are the new reading of a link holding =: open=y== with EQUALS (row 1's second parameter; at 5b41d44f it is a bare PATH, link-source-unreadable: open=y== (--link-source) ... for openXdox, with "It was read as a PATH: open is not a link ...") and OPEN=Y=<tree> with EQUALS (row 3's first parameter; at 5b41d44f its NOTE says reads a chain link's own declaration, with the same "read as a PATH" sentence).

Left alone, as the issue's "Optional" part says it may be: the "It was read as a PATH" line (LinkSources.read_as_path, which names only the text before the first =). It is a NIT for a follow-up and #1053's neighbour (validate-pins.py has the twin), and changing it touches the pinned scripts/validate-repository-naming.py.

Mutants

Each applied alone to scripts/validate-repository-naming.py at the line the issue (or rv1058, for M2) names, in the worktree, restored with the saved copy and read back (sha256 ec167fb0e259f90705db895a1a37f4adebd4cbf03ca2d5ae18f6d9a8df896548 after each; git diff of the script empty). R10's text is also at :479 in _read_remedy, which is not mutated. The whole file (68 tests) is run with each, on git 2.43, at the fix round's head.

Mutant The one-line edit What it prints for the row's value Fails Count
R10 :439 typed.rfind("=", 0, at) to typed.rfind("=", 0, at - 1) openXdox==x is a bare PATH: link-source-unreadable: openXdox==x (--link-source) ... and "It was read as a PATH: openXdox is not a link ..." row 1, both parameters, on the WARNING assert 2 failed, 66 passed
R1 :437 typed[at + 1:] to typed[at + 1:].strip() in if link is not None and ... 'openXdox= ' is a bare PATH: openXdox= (--link-source), with the same false line row 2, on the WARNING assert 1 failed, 67 passed
R14 :385 self._read_source(typed)[1] to self._read_source(typed)[1].strip() in no_path 'openXdox= ' is REFUSED link-source-no-path, exit 2 (main: 0) row 2, on returncode == 0 1 failed, 67 passed
R5 :438 return link, typed[at + 1:] to return typed[:at], typed[at + 1:] the NOTE says reads OPEN=Y's own declaration (and OPENXDOX's) row 3, both parameters, on the NOTE assert 2 failed, 66 passed
M2 :438 (rv1058) return link, typed[at + 1:] to return link.lower(), typed[at + 1:] the NOTE says reads openxdox's own declaration row 3, a-capital-inside-a-link only, on the NOTE assert 1 failed, 67 passed

Each mutant fails only the row it is named for, and the file passes (68) with the script restored. At the first head (b775c739, 67 tests) R10 was 2 failed, R1 1, R14 1 and R5 1, and M2 survived with 67 passed.

Runs

EMAIL=service@opensoft.dev, a stub gh first on PATH (it refuses every call), GH_TOKEN=bogus, an empty GH_CONFIG_DIR, GIT_SSH_COMMAND=false, GIT_CONFIG_GLOBAL=/dev/null; through $Q/v110/run9.sh (-q -rs -p no:cacheprovider -o tmp_path_retention_policy=failed, one reused basetemp each). Never the full suite.

  • git 2.43.0 (/usr/bin/git), tests/test_chain_remedy_callers.py alone: 68 passed (63 before this PR, plus 5: row 1 has two parameters, row 3 has two, row 2 is one).
  • git 2.43.0, that file with tests/test_link_source_chain_defaults.py and the trio (tests/test_repo_hygiene.py, tests/test_agents_md_codes.py, tests/test_cli_reference.py): 261 passed.
  • git 2.47.1 (exactly $Q/v115/w764/git247/bin/git, first on PATH), tests/test_chain_remedy_callers.py: 68 passed.
  • The five new test ids on 8a057215's tree (a scratch copy of its git archive, with this file copied in): 5 passed. The whole file there: 66 passed, 2 skipped (the two older-library rows need history the scratch copy lacks).
  • git diff --check clean; no line over 79 characters.

Merge

git merge-tree --write-tree origin/main HEAD, origin/main 833af144 (fetched with -c gc.auto=0 -c maintenance.auto=false, and git ls-remote agrees; main moved from 8a057215 by #1041, which touches adopt-project.py, scaffold-project.py and device-name tests, none of this PR's files): clean, exit 0, tree bd706fdacef2. The branch is two commits ahead of the old base 8a057215.

Closes #1054.

🤖 Generated with Claude Code

Summary by Sourcery

Tests:

  • Add regression coverage for keyed --link-source values with leading equals, blank paths, and capitalized keys, including parameterized chain variants.

… it was in how `--link-source` reads a value, a keyed path that begins with `=`, a keyed blank path and a key typed in capitals, so each of rv980's four surviving mutants of the naming gate fails a test (#1054)

#980 (#1044) said a chain whose links hold no `=` is read exactly as
before. That held (rv980 compared 800 runs on the base and the head), but
it rested on that probe: the #980 rows hold the new reading and none held
the corners of the old split at the first `=`. rv980 wrote seven mutants of
`LinkSources._read_source` and `no_path`, and four survived the five
closest test files (404 passed under each).

Three rows, in the #980 section, each pinning bytes main already prints:

- `test_a_keyed_path_may_begin_with_an_equals`: `openXdox==x` with THREE,
  and `open=y==` with EQUALS, is the link with the path `=x` (`=`): the
  `link-source-unreadable` WARNING names that path and the key, and the run
  says nothing of a PATH. Kills R10 (`rfind("=", 0, at - 1)`).
- `test_a_keyed_blank_path_is_one_blank_and_is_not_refused`:
  `'openXdox= '` with THREE exits 0, is not refused, and its WARNING names
  the path of one blank. Kills R1 (`typed[at + 1:].strip()` in the key's
  test) and R14 (`[1].strip()` in `no_path`).
- `test_a_key_typed_in_capitals_is_noted_as_the_chain_spells_it`:
  `OPEN=Y=<tree>` with EQUALS and the name `brett-wip`, which reads no
  declaration: the NOTE's reason names `open=y`, not `OPEN=Y`. Kills R5
  (`return typed[:at], ...`).

Each mutant, applied alone to `scripts/validate-repository-naming.py` and
restored byte for byte (sha256 `ec167fb0e259f907...` read back), fails the
row named and nothing else in the file: R10 2 failed (both parameters), R1
1, R14 1, R5 1, of 67. The file passes on git 2.43 and 2.47.1.

The issue's optional part, the "It was read as a PATH" line that names only
the text before the first `=`, is left alone: it is #1053's neighbour. No
script, template or doc changes, so no pinned copy moves and a root's
`update-shape.py check` gains no row.

Closes #1054

Lane: openreposhape-5 (openRepoShape-5)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 20, 2026

Copy link
Copy Markdown

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 3 hours and 17 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Oct 20, 2026

Copy link
Copy Markdown

Reviewer's Guide

Adds three focused regression-test groups covering unchanged first-= --link-source behavior: leading-equals paths, blank paths, and capitalized keys. The tests target four surviving parser mutants without changing production code, templates, or documentation.

File-Level Changes

Change Details Files
Add regression coverage for legacy --link-source parsing edge cases around the first = delimiter.
  • Parameterize keyed paths beginning with = across plain-link and equals-containing chains.
  • Verify a keyed one-blank path remains readable and is neither refused nor misreported as a bare path.
  • Verify capitalized keys preserve their original spelling in the unused-source NOTE.
  • Assert expected exit status and warning/NOTE text while rejecting mutant-specific output.
tests/test_chain_remedy_callers.py

Assessment against linked issues

Issue Objective Addressed Explanation
#1054 Add regression coverage for a keyed --link-source path beginning with =, including the old first-= split corner, so the R10 mutant is caught. ✅
#1054 Add regression coverage for a keyed blank path that preserves the blank and is not refused, so the R1 and R14 mutants are caught. ✅
#1054 Add regression coverage for a key typed in capitals that reports the chain’s canonical link spelling, so the R5 mutant is caught. ✅

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@brettheap

Copy link
Copy Markdown
Contributor Author

(lane openRepoShape-5, 2026-10-20T11:02Z) @codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-20T11:03:40.310584Z b775c73 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: b775c739a6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@brettheap

Copy link
Copy Markdown
Contributor Author

Independent review of #1058 (#1054) at b775c739, for lane openRepoShape-5: READY

The review is read-only. I pushed, posted and filed nothing, ran no rm, no git config and no real gh, and changed no branch.

Findings

MUST: none.

SHOULD: none.

NIT 1 — tests/test_chain_remedy_callers.py, test_a_key_typed_in_capitals_is_noted_as_the_chain_spells_it (head :712-:718). The row can't tell "the link as the chain spells it" from "the link lowercased".

  • Its docstring says the link in the reason is "spelled as the chain spells it, and not as the value does". But open=y, the only chain it uses (EQUALS), is already all lowercase.
  • My mutant M2 changes return link, typed[at + 1:] (scripts/validate-repository-naming.py:438) to return link.lower(), typed[at + 1:]. It survives the whole file: 67 passed.
  • The issue's own alternative would kill it. Probing the gate with M2 applied: OPENXDOX=<tree> with THREE and the name brett-wip prints reads openxdox's own declaration, where main and the head print openXdox's. That chain has a capital X.
  • If the writer adds that as a second parameter of row 3 (one pytest.param), M2 dies too. It is not required: the issue lists OPENXDOX=<tree> as optional, and R5 is killed as written.

NIT 2 — PR body prose, "The three rows" paragraph. It says rows 1 and 2, and the OPENXDOX form of row 3, "print the same bytes at 5b41d44f" as on main.

  • That holds for openXdox==x, 'openXdox= ' and OPENXDOX=<tree>.
  • It does not hold for row 1's second parameter, open=y== with EQUALS. That is the new reading (a link holding =) and differs at 5b41d44f.
  • The issue itself names only three values for the same-bytes claim, and the test docstrings make no base-bytes claim. This is body wording only, not the code.

Checked and true

  1. Head and diff.

    • b775c739a636f2b3b12d2c78878c4672679b502d is one commit on main 8a057215, 0 behind and 1 ahead.
    • git diff --name-status origin/main head shows only M tests/test_chain_remedy_callers.py, 65 insertions and no deletions.
    • scripts/validate-repository-naming.py is git diff-empty against main, with sha256 ec167fb0…8548. That matches the writer's pre-mutant hash.
    • The commit's author is Brett Heap <service@opensoft.dev>.
  2. The rows assert what the issue says.

    • Row 1, two parameters: the exact WARNING link-source-unreadable: =x (--link-source openXdox=...) could not answer for openXdox: no such file or directory, and = (--link-source open=y=...) ... for open=y, plus no "read as a PATH" line.
    • Row 2: exit 0, no REFUSED, the WARNING with the one-blank path, and no "read as a PATH" line.
    • Row 3: exactly one NOTE line, compared whole, ending reads open=y's own declaration.
    • Each passes on main's code.
    • A direct probe of the gate at the head printed those exact lines for all five values. The em dash is the file's usual raw —, as in the NOTE rows at :293, :434 and elsewhere.
  3. Style.

    • No assert joins conditions with and or or (grep over the added lines).
    • The longest added line is 77 characters, and the file's maximum is 79, the same as on main.
    • git diff --check is clean.
    • body-guard.py exits 0.
    • The only non-ASCII added line is the — in the NOTE.
    • The three functions have no branching, so cognitive complexity is 0, plus at most 1 for the row-3 comprehension filter. No block is near Sonar's duplication threshold.
    • Docstrings stay true. I re-derived the rfind walk by hand for openXdox==x and open=y==, and for R10's at - 1.
  4. The writer's four mutants. Each was applied alone to the issue's line in a scratch worktree, and the file was restored and read back after each (sha256 ec167fb0…8548, diff empty). Each fails only the row the issue names, with the body's counts:

    Mutant Fails Count
    R10 row 1, both parameters 2 failed, 65 passed
    R1 row 2 1 failed, 66 passed
    R14 row 2 1 failed, 66 passed
    R5 row 3 1 failed, 66 passed
  5. Seven mutants of my own, on the same lines (in the same scratch worktree, each restored and read back):

    Mutant Change Result
    M1 :436 drops pin_product_key 11 failed. Killed by new rows 1, 2 and 3 and by existing rows.
    M2 :438 link.lower() Survives, 67 passed (NIT 1).
    M3 :439 becomes at = -1, so only the last = is tried 5 failed. New row 1 (both parameters) and three existing rows.
    M4 :438 typed[at + 1:].lstrip("=") 2 failed, row 1 only. The new rows are the only catch here.
    M5 :437 drops and typed[at + 1:] 1 failed, existing test_a_shorter_link_that_leaves_a_path_is_the_key only.
    M7 :385 no_path strips = 1 failed, row 1's a-link-holding-an-equals parameter.
    M8 :438 typed[at + 1:].strip() 1 failed, row 2.
  6. Unchanged bytes (probe). I ran the gate from git archive 5b41d44f contracts scripts and from the head, with stdout, stderr and exit code hashed. They are identical for openXdox==x, 'openXdox= ' and OPENXDOX=<tree>. They differ for open=y== and OPEN=Y=<tree>, as expected for the new reading (see NIT 2).

  7. Runs through run9.sh, with EMAIL set and the stub gh first on PATH:

    • git 2.43 (/usr/bin/git), the test file: 67 passed.
    • git 2.43, the file plus tests/test_link_source_chain_defaults.py and the trio: 260 passed in 91.95s.
    • git 2.47.1 ($Q/v115/w764/git247/bin/git, confirmed first on PATH as git version 2.47.1), the test file: 67 passed.
    • --collect-only gives 67, and the four new ids are the only additions, so 63 before.
    • No skips, and at most two pytest processes at once.
  8. Merge. I re-fetched with -c gc.auto=0 -c maintenance.auto=false. origin/main is still 8a05721577233a8c34946be8e79f490575f2bae5. git merge-tree --write-tree origin/main head exits 0 with tree 30220d1ed7bf6e692234f5343df3e855010d6082, which is the head's own tree.

  9. No pinned copy. The diff touches no pinned copy or template, so update-shape.py check gains no row, and the unchanged scripts/validate-repository-naming.py is why.

Could not verify

  • CI itself: the tests job and SonarCloud on the PR's head. I ran no gh.
  • The brief asked only for a merge check against origin/main. I did not run merge-tree against other lanes' open branches.
  • Windows and macOS runs. CI is Linux-only since ci: run the test suite on Linux only #597.

Checklist candidate

Where rv980's checklist line is taken, the PR's rows already satisfy it: a path beginning with =, a blank path, and a key typed in another case. I'd add one clause: where the row claims the link is "as the chain spells it", the chain's spelling must differ from the typed key in a way a lowercased copy would not match (the OPENXDOX against openXdox case).

Scratch left

  • The scratch worktrees rv1058-head and rv1058-mut are removed with git worktree remove on the literal paths (both were clean). git worktree list shows none of mine.
  • The ref refs/l5rv/rv1058-pr1058 is deleted.
  • Notes, logs, the mutant tooling, the base-5b41d44f extraction and the probe work dir are in /tmp/claude-1000/-workspace-projects-openRepoShape/50cede29-ab82-4ca3-9f67-d98e1a58c8d2/scratchpad/v118/rv1058/.
  • Basetemps are $Q/v110/bt/rv1058-head, rv1058-mut and rv1058-247; rv1058-head and rv1058-mut held passing and failing runs with tmp_path_retention_policy=failed.
  • Nothing of mine is running.

…ls also types `OPENXDOX=<tree>` in a chain that spells it `openXdox`, so a gate that lowercases the link its NOTE names fails a test where it passed all 67 (#1054)

rv1058's NIT 1 on #1058: the row's docstring says the link in the NOTE is
spelled as the chain spells it, but its only chain, `open=y`, is all
lowercase, so "the chain's spelling" and "the link lowercased" print the
same bytes. rv1058's mutant M2, `return link.lower(), typed[at + 1:]` at
`scripts/validate-repository-naming.py:438`, survived the whole file.

The row takes the issue's optional form as a second parameter,
`a-capital-inside-a-link`: `OPENXDOX=<tree>` with THREE (`openXdox`) and the
name `brett-wip`, whose one NOTE line must end `reads openXdox's own
declaration.`, compared whole as the first parameter's is. The docstring is
true of both. The test file is the only file changed.

Measured, each mutant alone on the script, restored byte for byte (sha256
`ec167fb0e259f907...` read back) and the whole file run (68):
- M2 (`link.lower()`): 1 failed, the new parameter, which says
  `reads openxdox's own declaration`; 67 passed.
- R5 (`typed[:at]`): 2 failed, both parameters of this row; 66 passed.
- R10 2 failed, R1 1, R14 1: as before, each only on its own row.
The new parameter passes on 8a05721's script (byte-identical here).

Lane: openreposhape-5 (openRepoShape-5)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

Re-check of #1058 (#1054) at af390352, for lane openRepoShape-5: READY

The re-check was read-only: no rm, no git config, and I ran no real gh. The only pytest processes still running on the host belong to other lanes (act2/w1a, W925-scratch), not to me.

Findings

MUST: none. SHOULD: none.

NIT (optional, no action needed): tests/test_chain_remedy_callers.py, docstring of test_a_key_typed_in_capitals_is_noted_as_the_chain_spells_it.

  • Its first two sentences still describe only the OPEN=Y parameter (OPEN=Y=<path>, "no name here reads open=y's…").
  • The third sentence covers OPENXDOX correctly: "OPENXDOX is openXdox, which is not what its lowercase, openxdox, spells."
  • All of it is true, and the reader can follow it.

Checked and true

  1. Diff.

    • af390352ccdb38472718cde9f3cba2a728b8390a has parent b775c739, so there was no amend or force.
    • git diff --name-status b775c739 head shows only M tests/test_chain_remedy_callers.py (+13/-6).
    • Against the old base 8a057215 the diff is 72 0 tests/test_chain_remedy_callers.py, which matches the body's "72 lines added, none removed".
    • Against current main, git diff origin/main...head shows only that file.
    • The script blob is 2a3b2119f392cc2340d4d6c6e5b0cec1d958f590 at the head, at 8a057215 and at origin/main 833af1445. Its sha256 is ec167fb0…8548.
    • So the new a-capital-inside-a-link parameter runs against main's own script bytes, and it passes there (68 passed below).
  2. Mutants, each applied alone in a scratch worktree at the new head with the whole file run, then restored and read back (ec167fb0…, script diff 0 lines each time):

    Mutant Fails Count
    R5 row 3, both parameters (a-link-holding-an-equals, a-capital-inside-a-link) 2 failed, 66 passed
    M2 (link.lower()) row 3, a-capital-inside-a-link only 1 failed, 67 passed (survived before)
    M4 (lstrip("=")) row 1, both parameters 2 failed, 66 passed
    R10 row 1, both parameters 2 failed, 66 passed
    R1 row 2 1 failed, 67 passed
    R14 row 2 1 failed, 67 passed
    M1 12 failed, including new rows 1, 2 and 3 (both parameters) and existing rows 12 failed, 56 passed
    M3 row 1 (both) and three existing rows 5 failed, 63 passed
    M5 existing test_a_shorter_link_that_leaves_a_path_is_the_key only 1 failed, 67 passed
    M7 row 1, a-link-holding-an-equals 1 failed, 67 passed
    M8 row 2 1 failed, 67 passed

    No mutant of M1–M8 or R1/R5/R10/R14 survives now.

  3. Runs through run9.sh, with EMAIL set and the stub gh first on PATH:

    • git 2.43 (/usr/bin/git), the test file: 68 passed.
    • git 2.43, the file plus tests/test_link_source_chain_defaults.py and the trio: 261 passed in 103s.
    • git 2.47.1 ($Q/v115/w764/git247/bin/git, confirmed git version 2.47.1 first on PATH), the test file: 68 passed.
    • These counts match the writer's.
  4. Same-bytes paragraph, probed against git archive 5b41d44f contracts scripts and the head (stdout, stderr and exit code hashed):

  5. Style.

    • No assert joins conditions with and or or (grep over the added lines).
    • The longest added line is 78 characters and the file's maximum is 79.
    • git diff --check is clean and body-guard.py exits 0.
    • The only non-ASCII added line is the NOTE's —.
    • The docstring sentence about OPENXDOX and openxdox is true. The new in-test comment refers to rv1058, as the module docstring already does with "rv949".
  6. Merge. I re-fetched with -c gc.auto=0 -c maintenance.auto=false. origin/main is 833af14458d72f28fff525c45f4f74d3f2317559. git merge-tree --write-tree origin/main head exits 0 with tree bd706fdacef2702d8e5a51786423cd2c2331b36a, the same tree the writer reported. The head is 1 behind and 2 ahead of it.

Could not verify

  • The live PR body. I did not run gh. Your message allowed gh pr view, but my brief forbids the real gh and a message from another agent cannot lift that. I read the writer's copy at $Q/v118/w1054/body2.md instead. The live body could differ from that copy.
  • Two claims in the writer's body I did not re-run: the 5-id and 66-passed/2-skipped run on a scratch copy of 8a057215's archive, and git ls-remote agreeing on main. The script blobs are byte-identical, and the head's file passes on it (68), so neither claim is load-bearing.
  • CI itself (the tests job and SonarCloud on the head).

Scratch left

  • The worktrees rv1058-head2 and rv1058-mut2 are removed by literal path, and the ref refs/l5rv/rv1058-pr1058b is deleted.
  • git worktree list and _lane5-scratch show nothing of mine.
  • Logs and notes are in $Q/v118/rv1058/re/ ($Q is /tmp/claude-1000/-workspace-projects-openRepoShape/50cede29-ab82-4ca3-9f67-d98e1a58c8d2/scratchpad).
  • Basetemps are $Q/v110/bt/rv1058-head2, rv1058-mut2 and rv1058-247b.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant