Skip to content

adopt-project.py: check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses, over such a url (#417) - #718

Merged
brettheap merged 3 commits into
mainfrom
fix/417-adopt-check-local-remote-dir
Oct 16, 2026

Conversation

@brettheap

@brettheap brettheap commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openreposhape-1 (openRepoShape-1)
Claim: #417 (comment)

What

adopt-project.py check takes --local-remote-dir: the directory execute --local-remote-dir will be given. With it, check resolves each relative submodule url the plan keeps in a leg from the bare repository execute would create there, as execute does. Given the same directory, the two commands now give one verdict, line for line, in both of the issue's layouts.

Wording. Each place that said check always resolves from GitHub's remotes now says where each run resolves from:

docs/cli.md is regenerated with scripts/render-cli-reference.py, so check's usage and options list the flag. tests/test_cli_reference.py passes.

Why (repro on main)

The issue's script, with a check --local-remote-dir line added and --project Thing in layout B (since #499, plan refuses --project Northwind there as adopt-not-the-source, the source's origin being testorg/Thing), run on main da48256c (the branch's base) and again on this branch's head. Main 78fe3fff prints the same lines as da48256c, and this branch merged with it the same lines as the head. git 2.43.0, Python 3.12.3, local only, with a stub gh first on PATH, GIT_CONFIG_GLOBAL=/dev/null and GIT_ALLOW_PROTOCOL=file. <T> is the run's scratch directory.

On main:

== layout A: origin <T>/remotes/Thing.git, url ../dep, project Northwind
check exit 1: FINDING plan-submodule-relative-url
check --local-remote-dir exit 2: unrecognized arguments: --local-remote-dir <T>/remotes
execute exit 0: adoption verified, leg repositories made: 2
the assembly's recursive clone: exit 0
== layout B: origin git@github.com:testorg/Thing.git, url ../dep, project Thing
check exit 0: plan ok
check --local-remote-dir exit 2: unrecognized arguments: --local-remote-dir <T>/remotes
execute exit 2: REFUSED plan-submodule-relative-url, leg repositories made: 0

On this branch:

== layout A: origin <T>/remotes/Thing.git, url ../dep, project Northwind
check exit 1: FINDING plan-submodule-relative-url
check --local-remote-dir exit 0: plan ok
execute exit 0: adoption verified, leg repositories made: 2
the assembly's recursive clone: exit 0
== layout B: origin git@github.com:testorg/Thing.git, url ../dep, project Thing
check exit 0: plan ok
check --local-remote-dir exit 1: FINDING plan-submodule-relative-url
execute exit 2: REFUSED plan-submodule-relative-url, leg repositories made: 0

In layout B, check --local-remote-dir's finding and the line under execute's refusal are the same text:

FINDING plan-submodule-relative-url: the submodule `vendor/lib` (entry `vendor/`) has leg: code, and its url in the source's .gitmodules is the relative `../dep`, which git resolves against the remote of the repository holding that file: from the source, at `git@github.com:testorg/Thing.git` (its remote `origin`), to `git@github.com:testorg/dep`, and from the code leg, at `<T>/remotes/Thing-code.git`, to `<T>/remotes/dep`; the assembly's recursive clone resolves it from the leg
REFUSED plan-submodule-relative-url: 1 finding(s) in <T>/plan.yaml, as `check` prints them given the same --local-remote-dir, with each relative submodule url resolved from the leg remotes this run would create there:
  FINDING plan-submodule-relative-url: (the same text)

How

  • main(): check gains --local-remote-dir (type=Path, default None), as execute has it.
  • cmd_check: local_remote_dir = getattr(args, "local_remote_dir", None), passed to _entry_findings and, as local, to _print_what_will_happen.
  • _unanswered_url_findings: drops its local_remote_dir parameter and the condition that dropped the NOTE under one. _submodule_findings calls it without the parameter.
  • The texts above, and docs/cli.md.

Tests

New and changed tests, in tests/test_adopt_relative_submodule_url.py and tests/test_adopt_submodule_url_answers.py:

  • New: test_check_and_execute_given_one_local_remote_dir_agree[A-local-origin, B-github-origin]. These are the issue's two layouts end to end (they need git filter-repo). check with no flag gives the opposite verdict in each. Given the directory, check's FINDING lines equal execute's. In A, check passes, execute verifies and the recursive clone checks the dependency out. In B, check exits 1, execute exits 2, and neither makes a leg.
  • New: test_check_given_local_remotes_still_notes_a_url_on_a_network. Under check --local-remote-dir, adopt-project.py says adoption verified when a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone its NEXT: line prints fails; nothing asks whether the url answers #418's NOTE still names an https:// url check did not ask.
  • Extended (these run in both modes, without git filter-repo):
    • test_execute_resolves_again_from_the_remotes_it_would_create (x4, layout B): check --local-remote-dir exits 1 with the refusal's FINDING lines, makes nothing, and the refusal's new first line and remediation are asserted.
    • test_a_relative_origin_resolves_from_the_source_working_tree (x2, layout A): check --local-remote-dir passes for the directory beside the dependency and prints topics skipped for local remotes; for another directory it finds, line for line, what execute refuses.
    • test_execute_refuses_a_relative_url_that_names_nothing_from_either_side: asserts the new URL_ANSWERS_NOTHING_REMEDIATION wording.
  • Reworded asserts: the alike() NOTE, FROM_THE_LOCAL_LEGS and three docstrings.

Before the fix, 16 of these tests fail, with the new tests on main's adopt-project.py. With it, the two files and tests/test_cli_reference.py give 78 passed.

Revert table. Each change is reverted alone in a standalone clone, with the new tests in place and git filter-repo on PATH, over the two test files and tests/test_cli_reference.py (78 tests):

reverted failed which
nothing (head 9bd5585) 0 78 passed
R1: check's --local-remote-dir argument 14 test_execute_resolves_again... x4, test_a_relative_origin... x2, test_check_and_execute_given_one_local_remote_dir_agree x2, test_check_given_local_remotes_still_notes_a_url_on_a_network, and 5 in test_cli_reference.py (docs/cli.md lists the flag)
R2: cmd_check passes the flag to _entry_findings 9 the same 9 adopt tests as R1
R3: the topics line follows the flag 2 test_a_relative_origin... x2
R4: #418's NOTE dropped under a local_remote_dir 1 test_check_given_local_remotes_still_notes_a_url_on_a_network
R5: the relative-url NOTE's new clause 6 test_check_keeps_a_relative_url_its_github_leg_resolves_alike x5, test_each_relative_url_is_resolved_on_its_own
R6: the refusal's first line 5 test_execute_resolves_again... x4, test_execute_refuses_a_relative_url_that_names_nothing_from_either_side
R7: RELATIVE_URL_REMEDIATION 4 test_execute_resolves_again... x4
R8: URL_ANSWERS_NOTHING_REMEDIATION 1 test_execute_refuses_a_relative_url_that_names_nothing_from_either_side
all (main's adopt-project.py and docs/cli.md) 16 every new and reworded test

Chained together, R1 to R8 leave only docstrings, comments and the now-unused getattr line different from main.

Targeted runs at head 9bd5585, dirty 0, with /usr/bin/python3 -m pytest, a stub gh first on PATH, a bogus GH_TOKEN and an empty GH_CONFIG_DIR. They cover 87 files: the 86 that grep -l -E 'adopt-project|adopt_project|\bADOPT\b' tests/*.py names, which include tests/test_shape_doctor.py and tests/test_scaffold_leg_path_collisions.py, plus tests/test_cli_reference.py.

  • With git filter-repo on PATH: 6391 passed, 13 skipped, EXIT=0 (61 min).
  • With it hidden (PATH=<stub>:/usr/local/bin:/usr/bin:/bin): 6045 passed, 359 skipped, EXIT=0 (45 min).

Windows

CI is Linux only since #597, so this was not run on Windows. Even so:

Not in this PR

Known limits

  • check answers for execute --local-remote-dir only when it is given the same directory. A relative --local-remote-dir is resolved from the directory each command runs in, as execute resolves it.
  • check makes nothing in the directory, and asks the disk there only whether each relative url it resolves from it answers. Whether a leg is already there, and whether the directory can be made and written, are execute's to find (see "Not in this PR").

Closes #417

🤖 Generated with Claude Code

Summary by Sourcery

Make check --local-remote-dir resolve relative submodule URLs like execute so both commands consistently validate local-remote adoptions.

New Features:

  • Add check --local-remote-dir so relative submodule URLs are evaluated against the same local bare repositories used by execute.
  • Report local-remote execution context in check output and expose the option in the CLI reference.

Bug Fixes:

  • Align check and execute verdicts for relative submodule URLs when both commands use the same local remote directory.
  • Preserve network URL notes while correctly checking relative URLs against local remotes.

Enhancements:

  • Update diagnostics and remediation text to describe URL resolution consistently across GitHub and local-remote modes.

Documentation:

  • Regenerate the CLI documentation to include check --local-remote-dir.

Tests:

  • Add end-to-end coverage verifying that check and execute agree line for line with shared local remotes.
  • Extend relative-submodule and URL-answer tests for local remote resolution, output, and network notes.

…h relative submodule url the plan keeps in a leg from the bare repositories `execute --local-remote-dir` would create there, so under that test path `check` no longer refuses an adoption `execute` verifies, or passes one `execute` refuses (#417)

Since #245, `check` resolved a kept submodule's relative url from the
leg's GitHub remote, while `execute --local-remote-dir` resolved it from
the bare repository it is about to create. `check` had no flag to ask
the same question, so in #417's layout A (the source's `origin` and the
dependency beside the local legs) it found `plan-submodule-relative-url`
over an adoption that verifies and clones, and in layout B (an `origin`
on GitHub) it said `plan ok` over a plan `execute` refuses.

`check` now takes `--local-remote-dir` and passes it to `_entry_findings`,
as `execute` does, so given the same directory the two give one verdict,
line for line. It is read with `getattr`, as `work_dir` is. With it,
`check` prints the topics line of the run it checks, and still names in
#418's NOTE a url on a network it never asks. #190's and #245's
resolution logic, and one finding per cause, are unchanged.

The NOTE, both remediations, the refusal's first line and the docstrings
that said `check` always resolves from GitHub's remotes now say where
each run resolves from. docs/cli.md is regenerated.

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

sourcery-ai Bot commented Oct 16, 2026

Copy link
Copy Markdown

Reviewer's Guide

The PR makes check --local-remote-dir model execute --local-remote-dir when resolving relative submodule URLs, while preserving GitHub-based behavior without the flag, and adds comprehensive documentation and tests proving matching verdicts and diagnostics.

Sequence diagram for matching check and execute local remote resolution

sequenceDiagram
    participant User
    participant Check as check
    participant Findings as _entry_findings
    participant Remotes as _remote_urls
    participant Execute as execute
    participant Disk as local_remote_dir

    User->>Check: --local-remote-dir
    Check->>Findings: _entry_findings(plan, source, local_remote_dir)
    Findings->>Remotes: resolve relative submodule URL
    Remotes->>Disk: read bare repository path
    Disk-->>Remotes: leg remote URL
    Remotes-->>Findings: resolved URL
    Findings-->>Check: findings and topics
    Check-->>User: plan ok or FINDING

    User->>Execute: --local-remote-dir
    Execute->>Findings: _refuse_what_check_finds(..., local_remote_dir)
    Findings->>Remotes: resolve relative submodule URL
    Remotes->>Disk: use remotes this run would create
    Disk-->>Remotes: leg remote URL
    Remotes-->>Findings: resolved URL
    Findings-->>Execute: matching findings
    Execute-->>User: verify or refuse before creating legs
Loading

Flow diagram for check local remote resolution modes

flowchart TD
    Start["check"] --> Flag{"--local-remote-dir given?"}
    Flag -->|No| GitHub["Resolve relative submodule URLs from GitHub leg remotes"]
    Flag -->|Yes| Local["Resolve relative submodule URLs from bare repositories in local_remote_dir"]
    GitHub --> Findings["_entry_findings"]
    Local --> Findings
    Findings --> Output["Print findings, remediation, and WHAT WILL HAPPEN"]
    Local --> Topics["Print topics skipped for local remotes"]
    Output --> Verdict["check verdict"]
Loading

File-Level Changes

Change Details Files
Add check --local-remote-dir support so relative submodule URLs are resolved against the same local bare repositories that execute would create.
  • Add the CLI option and safely read it for programmatic callers lacking the attribute.
  • Thread the directory through entry findings and local-remote topic reporting.
  • Reuse local repository resolution for relative URL findings, keeping GitHub resolution as the default.
  • Align finding, remediation, NOTE, refusal, docstring, and comment wording with the new behavior.
adopt-project.py
docs/cli.md
Expand coverage to verify that check and execute produce consistent verdicts and diagnostics for local remote layouts.
  • Add end-to-end tests for local-origin and GitHub-origin layouts, including adoption and recursive clone behavior.
  • Assert finding-line equality between check and execute refusals.
  • Cover local-mode topic output and preservation of NOTES for network URLs.
  • Update existing expectations for refusal and remediation wording.
tests/test_adopt_relative_submodule_url.py
tests/test_adopt_submodule_url_answers.py
tests/test_cli_reference.py

Assessment against linked issues

Issue Objective Addressed Explanation
#417 Let check accept --local-remote-dir and use it to resolve kept relative submodule URLs from the same local bare-repository remotes as execute, so both commands agree when given the same directory. ✅
#417 Update CLI documentation and user-facing explanations to describe resolution behavior accurately, including that check uses local remotes only when given the flag and otherwise retains its GitHub-remote behavior. ✅

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 brettheap changed the title adopt-project.py: check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses (#417) adopt-project.py: check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses, over such a url (#417) Oct 16, 2026
@brettheap
brettheap marked this pull request as ready for review October 16, 2026 17:18
@sourcery-ai

sourcery-ai Bot commented Oct 16, 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 4 hours and 33 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

Brett Heap and others added 2 commits October 16, 2026 18:49
`check` keeps #650's `--work-dir` help beside #417's `--local-remote-dir`, and docs/cli.md's `check --help` block is the merged tool's own output.

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

Copy link
Copy Markdown

@brettheap
brettheap merged commit 1b786a2 into main Oct 16, 2026
5 checks passed
@brettheap
brettheap deleted the fix/417-adopt-check-local-remote-dir branch October 16, 2026 19:52
brettheap pushed a commit that referenced this pull request Oct 16, 2026
Conflicts in adopt-project.py (check's `--source` help beside main's new
`check --local-remote-dir`, #718/#417) and docs/cli.md: both arguments are
kept, in the order --plan, --source, --local-remote-dir, --work-dir, and
docs/cli.md is regenerated with scripts/render-cli-reference.py. check's
`--work-dir` help is reworded so every code sits whole on one 80-column
line in the narrower help column (r652's F3).

Lane: openreposhape-1 (openRepoShape-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 16, 2026
…n any spelling is cloned by its name, the plan records `source.cloned`, and a clone no plan records is removed, so a recorded clone that is gone or emptied is refused or cloned again for what it is (#652) (#749)

`adopt-project.py` had five failures with `--source` and the clones it makes:
- `--source acme/Atlas` was read as the directory `./acme/Atlas` when one existed, and nothing was cloned.
- `acme/Atlas/` was cloned into the work directory's `source-readonly/` itself.
- A recorded clone that was gone was refused `source-unclonable`, with a `gh auth status` hint. One a cleaner had emptied was refused `git-failed`.
- A moved clone from another host was cloned again from github.com.
- The clones `plan` and `check` made were never removed.

This is #652: #457's L1-22, L1-23, L1-24, L1-26 and L1-27, with L1-43.

Now:
- **`--source` is read by its spelling.**
  - An `org/repo` that is also a directory here is refused as `source-ambiguous`, which names both `./org/repo` and the github.com url.
  - A trailing `/`, `//` and one `.git` are dropped.
  - A github.com url, `github.com/o/r` or `git@github.com:o/r.git` names `o/r`. `gh` is handed exactly `o/r`, and the plan records it.
  - A url on another host is `source-unresolvable`.
- **The plan records `source.cloned`.**
  - A plan written before this has no such key. It reads as `false` and is never cloned again.
  - A clone `plan` made that is gone, or no longer whole, is cloned again from GitHub.
  - Any other recorded path that is gone is `plan-source-gone`, whose remedy names `--source`.
- **`plan` and `check` remove a clone they made that no plan records,** in `main`'s `finally`.
  - They remove only that clone's recorded real path under the work directory's own `source-readonly/`.
  - They never remove through a symlink, even one swapped in during the run.
  - They never remove a path the person passed, and never anything once the plan is written.
  - A removal that fails is named in a NOTE.
- **`execute` keeps its clone.** A re-run into the same `--work-dir` is refused by name, as `adopt-work-dir-occupied`.

Tests: tests/test_adopt_source_clone_record.py is new, with 50 cases. Of the first round's 45, 42 fail on the base. The 3 that pass guard what must never be removed. Each change reverted alone fails at least one test. The 24-row revert table is in the PR.

Review: the adversarial review found six defects in the first head. Two of them were in what the run removes:
- a work directory swapped for a symlink during the run;
- a `plan` cut short after it had written its plan.

The fix round fixed all six, each shown fixed by a probe or a test. The re-verification found it PR-READY. Its edge cases outside #652 go to #457's checklist.

The branch merged main twice by hand and was never rebased:
- first 2fac979;
- then 66b230e, which met #718's `check --local-remote-dir` beside `check --source`. Both are kept, and docs/cli.md is regenerated.

Its head cecc7e0 already holds main, so it lands as its own tree. That head is green on Linux, Git Bash and SonarCloud. The full suite passed on its tree in lane 1's gate: 200 test files, 11,570 passed and 33 skipped.

Closes #652

Lane: openreposhape-1 (openRepoShape-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap pushed a commit that referenced this pull request Oct 17, 2026
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>
brettheap pushed a commit that referenced this pull request Oct 17, 2026
…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>
brettheap pushed a commit that referenced this pull request Oct 17, 2026
…d A3 (three SHOULDs, four nits), and notes entries for the seven pull requests landed since bf1f099, current to main 2000488 (#563, #683)

Round A4, from lane 2's review (#630 issuecomment-6233033833, READY):
- SHOULD 1: the doctor's exit-3 list names "a validator of its own that
  crashed or could not be run", so the case of one that cannot be given
  its `PYTHONPATH` (shape-doctor.py's EXIT CODES, #278) is listed too:
  README.md:1208-1222, its handbook twin (`doctor`) and the notes' docs
  line. The paragraph re-wraps to one more line:
  tests/readme-cap.d/683.txt is +2, and its text now says which causes
  the EXIT CODES block names and that #742 added the partial clone and
  #701 the naming policy. README.md is 1475 lines, its cap (1422 + 2 + 5
  + 12 + 22 + 10 + 2). Both `Keeping a project's shape current` markers
  move to c728c970: `doctor` text and marker, `current` marker only.
- SHOULD 2: #727's entry names the leg description, whose em dash stopped
  every `execute` against GitHub at the first leg.
- SHOULD 3: #749's entry names `source-ambiguous`, for an `org/repo` that
  is also a directory here.
- Nits: the doctor section's three near-duplicate pairs are merged (#636
  with #737, #632 with #700 and #705, #586 with #736); #718 has its own
  bullet; #634's entry names `git_out`'s spelling for every caller and
  #744's the gate's `--link-source-label` and `--link-remedy`; the header
  comment says 2026-10-17 at main 2000488.

Wave B1, `git log --first-parent bf1f099..2000488`: #706 (#664), #703
(#696), #670 (#646), #682 (#648), #726 (#667), #730 (#666) and #724
(#665), each from its squash commit; #726's and #682's from lane 5's lines
(#630 issuecomment-6227129879), #682's with the unmerged `.gitmodules`
its last round added, and #724's with lane 5's note that v1.0.0's
test-hygiene line on the generator's `.pyc` files closes. The counts (106
pull requests; 116 of 135 milestone issues closed at 11:53Z), "current to
main" and the open list (19) are at main 2000488, still placeholders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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