Skip to content

Tracking: adopt-project.py, converting an existing repository in place #457

Open
55 of 55 issues completed
Open

Description

@brettheap

Lane: openreposhape-3 (openRepoShape-3)

The parent issue for one area of openRepoShape: converting an existing repository into an assembly root with a spec leg and a code leg (adopt-project.py plan, check, execute). Brett Heap ruled on 2026-10-12 that the open issues are grouped under one parent per area, with a release milestone. Every open issue in this area is a sub-issue here.

v1.0.0. The first release is "core flows, all OSes": every procedure in AGENTS.md works end to end for ordinary repositories on Linux, macOS and Windows. The tag waits for every in-scope issue to close and for a full test run to pass on all three OSes on the release commit. In this area, the sub-issues in the v1.0.0 milestone are:

Known limits. Every other sub-issue is a known limit: only exotic input triggers it (bytes that are not UTF-8, the C locale, control characters, hand-edited YAML, symlink tricks, names that differ only by case). The release notes list them, and they are worked when a release takes them in. A new edge case that review finds goes on this checklist, not into a new issue, unless it is in a release's scope or would hit a real user (Brett Heap, 2026-10-12).

Known limits measured by lane openRepoShape-3 on main 45e01f4 and kept here rather than filed:

Known limits found by lane openRepoShape-3's acceptance passes (standard 36538fd, each re-checked on main 7a8b981) and kept here rather than filed:

Edge cases found in review of lane openRepoShape-3's pull requests, kept here rather than filed:

Activity

  1. added sub-issues on Oct 12, 2026
  2. 106 remaining items

  3. brettheap commented on Oct 18, 2026

    @brettheap
    ContributorAuthor

    (lane openRepoShape-1, 2026-10-18T08:08:32Z) Two limits that lane 1's v1.1.1 PRs named for this checklist: L1-104 and L1-105.

    Each was found in its PR's review and left out of it, as its squash says. The v1.1.1 release notes (#883) list both under known limits as on this checklist, and lane 3's review of #883 found them missing here (#883, issuecomment-6247451611).

    From #829 (#801, dd72294d), the extension-majority fold:

    From #831 (#796, 33419925), --source:

    Lane: openreposhape-1 (openRepoShape-1)

  4. brettheap commented on Oct 18, 2026

    @brettheap
    ContributorAuthor

    (lane openRepoShape-3, 2026-10-18T14:46:39Z) Triage of #457's unchecked items at the v1.1.1 release commit 5017830. This is lane 3's TRIAGE-457, read only, before this filing.

    Counts. 144 lines were unchecked, 9 in the body and 135 in comments. The rulings:

    No open issue or pull request covered any of them. Every -> pointer on this checklist names a closed issue.

    How. Read: this issue's body and every comment, the release notes' Known limits sections, and the first-parent squash messages on main. Probes ran on a detached clone at 5017830, with:

    • a stub gh first on PATH (exit 97), GH_TOKEN=bogus and an empty GH_CONFIG_DIR;
    • GIT_CONFIG_GLOBAL=/dev/null, and local remotes only.

    No pytest was run. Each OPEN row names its issue, whose body holds the probe output.

    Filed:

    This issue's body was edited once:

    Lines in comments stay as their authors wrote them. This comment records their rulings, and each author, or lane 3 on a later word, can tick them.

    Body

    Line Ruling Evidence
    A6: split message and PR body list names raw OPEN -> #900 probe: a kept caf\xe9.md lands as caf?.md, cr\r as cr; adopt-project.py:13498-13509
    A7 (-> #528) FIXED 1d809ea (#566, #528); contracts/path-classification.yaml:453
    AS-1: _spelled leaves " raw OPEN -> #900 probe: _spelled('a"b') is `a"b`; adopt-project.py:3114-3124
    AS-2: _shown of a backticked text OPEN -> #900 probe: _shown of `x` equals _spelled('x'); :3111
    AS-3: question and rule id printed raw OPEN -> #900 :5168, :5173, :5495 (read)
    AT-adopt N1 FIXED 526cd2c (#582, #523); :3323
    AT-adopt N2 FIXED 526cd2c (#582, #523); :13208
    AT-adopt N3 FIXED 526cd2c (#582, #523); AGENTS.md:139-140
    AT-adopt N6 FIXED 9f80939 (#567, #529); :4033

    Comments, 2026-10-12

    Line Ruling Evidence
    L2-6: bad id or org beside a bad leg path OPEN -> #901 probe: check refuses plan-bad-id (or unsafe-value), execute refuses plan-bad-leg-path, 0 legs
    L2-7: _manifest_values docstring OPEN -> #901 :4911-4912
    CONTRACTS_DIR hard-coded (lane 5, -> #522) FIXED fbbbc8d (#572, #522); scripts/shape_materialize.py:1045
    Windows x4 (lane 4, = L4-05 to L4-08) known limit, not filed skips remain (POSIX_ONLY, tests/test_adopt_entry_paths.py:51); v1.1.0 notes
    auA-12 (its copy L4-09 is ticked) FIXED 526cd2c (#582, #523); :200
    auA-13 (its copy L4-10 is ticked) FIXED fbbbc8d (#572, #522); :3224
    root .gitattributes is a symlink (= L4-15) known limit, not filed scripts/shape_materialize.py:909-913; v1.0.0 notes
    older adoption has no block (= L4-17) known limit, not filed extend_eol_block, scripts/shape_materialize.py:796-798; v1.1.0 notes
    L1-J1: link into .git where the clone holds nothing OPEN -> #904 probe: CLAUDE.md -> .git/refs/remotes/origin/main passes check; :8720
    L1-J2: .git/refs/../HEAD refused for a false reason OPEN -> #904 probe: "passes through .git/refs, which is not a directory in the assembly root"

    Comments, 2026-10-13 and 2026-10-14

    Line Ruling Evidence
    L2-12: pins: spelled with repr OPEN -> #901 :554
    L2-14: names only PyYAML misreads written bare OPEN -> #912 _neutral_pin_entry, :13393-13405
    #499 line: adopt-not-the-source after gh repo clone (= L4-37) OPEN -> #903 probe: gh repo clone runs, then source-unclonable
    #499 line: check gives no rename-first remedy (= L4-38) FIXED d7befb9 (#825, #716); :14452
    #499 line: recorded repository not consulted (= L4-40) FIXED d7befb9 (#825, #716); :14520
    #499 line: casefold (= L4-43) known limit, not filed :14398; v1.1.0 notes
    #499 line: _origin_path vs _remote_repository (its copy L4-44 is ticked) FIXED #591 (55faad2, #521); _origin_path reads _origin_url, :14430
    #499 line: None/ org (= L4-45) known limit, not filed :8446-8447; v1.1.0 notes
    #499 line: _origin_path on every plan (its copy L4-46 is ticked) FIXED #591 (55faad2, #521); called only at :14440, :14553
    #499 line: comment wording on org: (= L4-48) FIXED d7befb9 (#825, #716); :14600
    L1-K2: pin file through a kept link OPEN -> #904 probe: contracts -> governance passes check
    L1-K3: bare value made text OPEN -> #902 probe: id: 007 -> adoption verified, id: "7"
    L1-K4: no placeholder row for the submodule codes OPEN -> #914 scripts/shape_materialize.py:4935-4940
    L1-K6: guards that mask each other OPEN -> #916 :4120, :4264, :4161
    L1-K7: tab in a pin product OPEN -> #901 probe: now three findings
    L1-K8: .git/reftable UNSETTLED, rider in #904 git 2.43 here; CLONE_GIT, :8715
    L1-K9: false "after both legs" sentence OPEN -> #904 :6242-6258; tests/test_adopt_root_shape_paths.py:339
    .github -> ci block spelling (= L4-51) FIXED d6475f9 (#844, #807); scripts/shape_materialize.py:887
    hash-object fed text (= L4-54) OPEN -> #916 tests/test_adopt_ignored_shape_files.py:294-295

    Comments, 2026-10-15

    Line Ruling Evidence
    L2-42: pin finding's "and nothing else" OPEN -> #901 :584-586
    L2-43: local-clone (<path>) remedy FIXED 396c0ff (#570, #540); :503; probe: check passes such a plan
    L1-01 FIXED 2d98820 (#725, #651); scripts/shape_materialize.py:3489
    L1-02 known limit, not filed git_out, scripts/repo_shape.py:1206-1209; v1.1.0 notes
    L1-04 FIXED bee84d5 (#842, #800); scripts/shape_materialize.py:3214
    L1-08, L1-10, L1-13, L1-14, L1-17, L1-18 known limits, not filed v1.1.0 notes; L1-10's variable is held back on purpose (:9544-9546); L1-17 narrowed by #825
    L1-29, L1-30, L1-31 known limits, not filed v1.1.0 notes
    L1-32: only OSError around the probe OPEN -> #910 :9374
    L1-36: C-locale table shift OPEN -> #900 probe: the row shifts 3 columns
    L1-38: macOS NFD, Latin-1 UNSETTLED needs macOS or a Latin-1 locale
    L1-39 FIXED b618ec1 (#699, #658); :3835
    L1-40, L1-41, L1-42, L1-44, L1-45, L1-46, L1-47, L1-48 known limits, not filed v1.1.0 notes; probe of url_repository at 5017830 confirms L1-42, L1-44, L1-46
    L1-49: AGENTS.md half OPEN -> #902 AGENTS.md:119-130
    L1-50 to L1-54 known limits, not filed v1.1.0 notes
    L1-60: stub gh via write_text OPEN -> #916 tests/test_adopt_pins.py:112-122
    L1-62: GIT_ALLOW_PROTOCOL not cleared OPEN -> #916 tests/test_adopt_submodule_url_answers.py:301
    L2-55: flag-only refusals late OPEN -> #903 _work_root :5387 before _checked_plan_inputs :5403

    Comments, 2026-10-16 and 2026-10-18

    Line Ruling Evidence
    L2-72: Makefile follow-up beside a root Makefile OPEN -> #906 :3346-3351
    L2-76: raw git-failed OPEN -> #900 :1593-1595
    check names one bad tracking_branch twice (= L4-127) FIXED 64ec47c (#817, #708); :5002
    L2-73: only contracts/ gets a path OPEN -> #906 :3283
    L4-05 to L4-08, L4-15, L4-17, L4-43, L4-45 known limits, not filed as their originals
    L4-37 (its -> #652 is stale) OPEN -> #903 as its original
    L4-38, L4-40, L4-48 FIXED d7befb9 (#825, #716)
    L4-47 FIXED 190133d (#630); README.md:776-777
    L4-51 FIXED d6475f9 (#844, #807)
    L4-54 OPEN -> #916 as its original
    L4-127 FIXED 64ec47c (#817, #708)
    L1-64, L1-77, L1-88 FIXED 3341992 (#831, #796); :1839, :2237
    L1-65 FIXED 5c02a04 (#843, #803); :1894
    L1-66b: mkdtemp with no temp directory UNSETTLED probe: a missing TMPDIR falls back to /tmp, exit 0; the bare mkdtemp is :14700
    L1-67: three nits OPEN -> #903 probe: nit 1 holds; nit 3 by :5387; nit 2 not measured
    L1-68, L1-69, L1-71 FIXED 51414d2 (#830, #797); :2670, :2539
    L1-70: _member_head strict decode OPEN -> #918 scripts/family.py:7188-7206
    L1-72, L1-73 FIXED fe99b8b (#861, #798); :11535, :313
    L1-74: check vs execute under --local-remote-dir UNSETTLED adopt-name-too-long now found by check (a249910, #871); the rest not re-measured
    L1-75: "(private)" for bare repositories OPEN -> #906 :8579-8580
    L1-76, L1-78: late NUL, long target OPEN -> #908 :7710-7711
    L1-79 FIXED 3fb30a8 (#833, #799); :5453
    L1-80 OPEN -> #908 _link, :8964-8977
    L1-81: tag whose target the clone lacks OPEN -> #912 scripts/shape_materialize.py:3498-3508
    L1-82 first case FIXED (bee84d5, #842, #800); second OPEN -> #912 :829-846
    L1-83 FIXED dd72294 (#829, #801); :12874
    L1-84, L1-85, L1-87 OPEN -> #914 shape-doctor.py:246; :6354; :13830-13839
    L1-86: C locale over a UTF-8 plan OPEN -> #918 probe: plan-source-gone for a path that exists, no gh call
    L2-86 to L2-90 OPEN -> #902 probes in #902
    L2-91: naming test asks one name shape OPEN -> #916 tests/test_naming_policy.py:252-254
    L1-89 FIXED 3fb30a8 (#833, #799); :5193
    L1-90, L1-92, L1-94 OPEN -> #910 :10160, :10177, :9551
    L1-91, L1-93 OPEN -> #906 :10444-10448, :9675
    L1-95, L1-96, L1-100, L1-101 FIXED 3341992 (#831, #796); :1770, :1712, :1680
    L1-97, L1-98, L1-99, L1-102 FIXED 5c02a04 (#843, #803); :1960; L1-102 not run on Windows, and its residual is in v1.1.1's notes
    L1-103 STALE ruled by design in 60f146a (#749): execute keeps its clone, and a re-run is refused adopt-work-dir-occupied
    L1-104 known limit, not filed v1.1.1 notes
    L1-105 OPEN -> #918 probe: chmod 000 gives a PermissionError traceback; also in v1.1.1's notes

    File:line references without a file name are in adopt-project.py, at 5017830.

    Not filed.

    • Known limits that the release notes already rule. Each is filed only if a release takes it in:
      • how an origin is read: L4-43, L4-45 (and their originals), L1-40, L1-41, L1-42, L1-44, L1-45, L1-46, L1-47 and L1-48;
      • L1-02, L1-08, L1-10, L1-13, L1-14, L1-17, L1-18, L1-29, L1-30, L1-31, L1-50, L1-51, L1-52, L1-53 and L1-54;
      • the four Windows lines (L4-05 to L4-08, and their originals), L4-15 and L4-17 (and their originals), and L1-104.
    • UNSETTLED:

    Housekeeping.

    Lane: openreposhape-3 (openRepoShape-3)

  5. brettheap commented on Oct 20, 2026

    @brettheap
    ContributorAuthor

    (lane openRepoShape-3, 2026-10-20T03:50:13Z) Left over from #902 (PR #1016): in adopt-project.py, elected_by:, reference: and org: in a hand-edited adoption plan, read by the plan's reader as a number or a boolean (elected_by: 007, elected_by: true, elected_by: 1.50, reference: 1.50, reference: 007, org: 007, org: true), still give check exit 0 and plan ok, and execute takes str() of what was read (007 is 7, true is True, 1.50 is 1.5). It is the same class as L1-K3, which #1016 closes for id:, tracking_branch: and adopt_branch: only. Measured on main c4dd19d and on #1016's head 9261ff2. Each key needs a finding of its own: org: is read as str on purpose for the not-the-source comparison (#513's review), visibility: true is already the validator's finding, and an elected_on: read as a number is #294's. Direction: refuse each by what was read, under a code of its own, as #1016 does for the three keys, with NOT_TEXT_REMEDIATION's remedy.

    Lane: openreposhape-3 (openRepoShape-3)

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions