Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions openspec/changes/migrate-to-triad/adoption-plan.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Rehearsal input, NOT the cutover plan: regenerated 2026-10-07 from source e43b2432976a22eb3bf8c419c96209399251d375 (chore/openreposhape-pin-7f84ca4)
# Rehearsal input, NOT the cutover plan: regenerated 2026-10-08 from source 837928a1029ac53b050a9bdcbc0ef4055b10719b (main)
# with openRepoShape adopt-project.py at 7f84ca42ca86a8902928345109d2bf6bad87bd91.
# The October 4 mapping's 19 reasoned overrides are reapplied verbatim; the new paths lane-worktrees
# and lanes-index (code) and ideation/ (spec) are resolved with reasons.
# Disposable rehearsal evidence: ../../../specs/004-migrate-to-triad/adopter-rehearsal-2026-10-07.md.
# Run C: the run B plan's 22 resolutions (the October 4 mapping's 19, plus lane-worktrees and
# lanes-index to code and ideation/ to spec) are reapplied verbatim; no new top-level path.
# Disposable rehearsal evidence: ../../../specs/004-migrate-to-triad/adopter-rehearsal-2026-10-08.md.
# Gate B remains open (T006-T011); execution needs a frozen baseline and explicit Gate C approval.
# Paths are relative to the source checkout (local_path published as "."); generated metadata
# does not authorize repository creation.
Expand All @@ -15,17 +15,17 @@ kind: adoption-plan
# drop and adding one line of `resolution:` beside it. `check` then
# has to pass, and `execute` REFUSES while any leg is still null.

generated_on: 2026-10-07
generated_on: 2026-10-08
tool: opensoft/openRepoShape adopt-project.py

source:
repository: opensoft/openRepoTools
local_path: .
default_branch: chore/openreposhape-pin-7f84ca4
commit: e43b2432976a22eb3bf8c419c96209399251d375
files: 100
bytes: 6139047
commits: 91
default_branch: main
commit: "837928a1029ac53b050a9bdcbc0ef4055b10719b"
files: 120
bytes: 6292407
commits: 92

# The adopted repository KEEPS its name, its identity and
# its history and becomes the assembly root. `new-root` — a new
Expand Down Expand Up @@ -310,8 +310,8 @@ paths:
confidence: high
rule: spec-governance
reason: "Requirements, decisions, contracts and governance prose — what the project has DECIDED, as opposed to what it currently runs. `contracts/` is here by the 2026-09-02 ruling even where the code reads it: the code reads across the assembly-root mount (`spec/contracts` from the root, `../spec/contracts` from `code/`), which is what the legs are mounted for."
files: 21
bytes: 135920
files: 28
bytes: 185941
review_required: false
- path: park
leg: code
Expand Down Expand Up @@ -357,8 +357,8 @@ paths:
confidence: high
rule: spec-governance
reason: "Requirements, decisions, contracts and governance prose — what the project has DECIDED, as opposed to what it currently runs. `contracts/` is here by the 2026-09-02 ruling even where the code reads it: the code reads across the assembly-root mount (`spec/contracts` from the root, `../spec/contracts` from `code/`), which is what the legs are mounted for."
files: 10
bytes: 20264
files: 23
bytes: 123603
review_required: false
- path: status
leg: code
Expand Down Expand Up @@ -412,7 +412,7 @@ follow_ups:
- "Preserve original .gitmodules, upstream/openRepoShape gitlink and contracts/openreposhape-pin.yaml together in code; rehearse existing-submodule extraction/removal and recursive bootstrap before real execution. Never weaken blob verification or edit the standard in place."
- "Add an assembly openRepoTools compatibility entry point after byte-preserving split verification; resolve one immutable code pin for all installer artifacts and preserve OPENREPOTOOLS_REPO/REF forks, raw/gh and offline checkout behavior."
- "Separate code, assembly and spec roots in test fixtures and hygiene checks; code CI must supply the exact compatible spec/assembly context where a test reads product documentation."
- "Current .specify and agent links are ignored local bootstrap artifacts, not the 100-file source tree; capture local configuration and regenerate root workflow using setup-openspeckit after manifest/legs are present."
- "Current .specify and agent links are ignored local bootstrap artifacts, not the 120-file source tree; capture local configuration and regenerate root workflow using setup-openspeckit after manifest/legs are present."
- "Preserve all branch/PR/worktree and dirty/untracked work; source main extraction does not transport unfinished feature branches. Migrate selected patches to paired feature branches with old-to-new receipts before rebinding lanes."
- "Regenerate this preliminary plan after planning lands and baseline freeze; require current coverage check, local bare-remote rehearsal, prerequisite availability and explicit approval before execute."
- "Review genuine bounded features/<NNN-feature>/openspec/ amendment records explicitly as code; canonical/full proposals and archives remain spec even when created on a feature branch. No existing bounded amendment paths were observed; do not manufacture them for historical features."
Expand All @@ -422,20 +422,20 @@ follow_ups:

summary:
spec:
files: 45
bytes: 493610
file_share: 0.4500
byte_share: 0.0804
files: 65
bytes: 646970
file_share: 0.5417
byte_share: 0.1028
code:
files: 49
bytes: 5579879
file_share: 0.4900
byte_share: 0.9089
file_share: 0.4083
byte_share: 0.8868
root:
files: 6
bytes: 65558
file_share: 0.0600
byte_share: 0.0107
file_share: 0.0500
byte_share: 0.0104
unresolved:
files: 0
bytes: 0
Expand Down
135 changes: 135 additions & 0 deletions specs/004-migrate-to-triad/adopter-rehearsal-2026-10-08.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# Gate B rehearsal, run C, at the post-landing source — October 8, 2026

**Task:** T003–T005 rehearsal evidence under [#186](https://github.com/opensoft/openRepoTools/issues/186).
No task is checked complete by it.
**Tool:** openRepoShape `7f84ca42ca86a8902928345109d2bf6bad87bd91` on its `main`
(`compare main...7f84ca4`: `identical` at measurement).
**Source:** main `837928a1029ac53b050a9bdcbc0ef4055b10719b`, read with `git ls-remote`
at 2026-10-08T20:54:21Z just before cloning. It is `c4864ac` plus #187, the
planning documents squashed as `44983ce`, and #188, the repin to `7f84ca4`
squashed as `837928a`.
**Private receipt ID:** `adopter-fix-20261008-1HztL0`.

**Run C supersedes nothing.** Runs A (`c4864ac`) and B (the repin candidate
`e43b243`) stand as recorded in
[adopter-rehearsal-2026-10-07.md](adopter-rehearsal-2026-10-07.md). That file
is on branch `004-migrate-to-triad-rehearsal` and reaches main with the
combined evidence PR. Run C is the same rehearsal, with the same tool and the
same resolutions, at the source that now exists after both landings. It is
also the durable rehearsed arrangement that T006–T010 take as input. It is
kept host-local outside every repository so it survives a bench restart.
Clone paths, local remote URLs, exact command lines and complete logs stay in
the private receipt.

## Setup

- **filter-repo:** `git-filter-repo` 2.47.0 from a private venv. The rebuilt
bench has no `ensurepip`, and `python3 -m venv` refused with
`The virtual environment was not created successfully because ensurepip is
not available.` So the venv was created with `--without-pip`. The wheel
came from `pip download` with SHA256
`2cd04929b9024e83e65db571cbe36aec65ead0cb5f9ec5abe42158654af5ad83`, matching
the recorded value. That exact file was installed into the venv with
`--no-index`. The venv's `git-filter-repo` came first on `PATH`, and
`git filter-repo --version` printed `a40bce548d2c`.
- **Tool and source:** a fresh clone of openRepoShape at `7f84ca4`, unedited
and clean afterwards, ignored files included. A fresh `--single-branch`
clone of main, with one worktree and no linked worktrees. Its nested
`upstream/openRepoShape` was not initialized.
- **Transport:** limited to local files (`GIT_ALLOW_PROTOCOL=file`). `gh` and
`curl` shims refused and logged; no call was logged. The recursive clone
reached code's nested openRepoShape through a local mirror of the tool clone.

## Mapping (T003)

Since the run B source, the tree gained 20 files and no new top-level path:

- 13 under `specs/004-migrate-to-triad/`;
- 6 under `openspec/changes/migrate-to-triad/`, including the October 4
`adoption-plan.yaml` itself;
- `openspec/config.yaml`.

The pin change is the one run B already carried; its contract blob is
identical. `plan` left the same 18 questions. All 22 resolutions of the run B
plan were reapplied verbatim: the October 4 mapping's 19, plus
`lane-worktrees` and `lanes-index` to code and `ideation/` to spec. Every
other entry kept the tool's leg, unchanged from run B. The 20 new files are
spec through the existing `openspec/` and `specs/` entries.

The tool's follow-ups, re-derived over the resolved entries, are identical to
run B's. The ten reasoned follow-ups are unchanged except the source file
count, now 120. `check` printed `plan ok` for the executed plan and again
for the published copy. On this branch the
[mapping](../../openspec/changes/migrate-to-triad/adoption-plan.yaml) is that
published copy. It differs from the executed plan only by its header,
`local_path: .`, and the two closing status fields
(`execution_authorized: false`).

## Run C — main `837928a`

`execute --local-remote-dir … --work-dir … --yes` exited **0** and printed
`adoption verified: every source path is in exactly one place`.

| Source accounting (the standard's table) | Original entries |
| --- | ---: |
| Spec | 65 |
| Code | 49 |
| Assembly root | 6 |
| Dropped | 0 |
| Total | 120 |

The standard reported 18 added assembly paths, the same set as runs A and B.
An independent comparison matched path, mode, object type and object ID for
all 120 entries of `ls-tree -r 837928a`: 65 spec, 49 code and 6 root. It
found zero missing, duplicate or misplaced owners and no leg extras. The
gitlink `upstream/openRepoShape` at `7f84ca4` has exactly one owner, code.

| Disposable repository | Commit | Kept commits |
| --- | --- | ---: |
| Spec | `593250d600ca291f610671d993c2a6fc36cd690e` | 35 |
| Code | `73b04d637634f897ad24e22ee4c12bed287172d6` | 88 |
| Assembly split | `69b89245029d0339afd3317df7c9b1b3bbaf7fc1` | — |

Spec gained one kept commit, the planning squash. Code's tree digest
`b4940a13bd8ecbe2d1c6ed49368d1545d1a5f1f7a92623c7fe11ac1cb3617604` has the
same prefix run B recorded. Only the code commit identities differ, because
the repin landed as a different commit. The split commit's only parent is
`837928a`.

The recursive clone, `scripts/bootstrap.py` (`bootstrap ok`) and the
naming, manifest and pins validators all passed, and every tree was clean
afterwards. Code's nested openRepoShape was checked out at `7f84ca4`, matching
code's `contracts/openreposhape-pin.yaml`. The pinned checkout's own
`scripts/repo_shape.py` recomputed
`3be52767e727d924dd05f9e78b18eb70f1682fe48614fab519f85331eeff5fa8`, which
matches the contract.

The source clone was unchanged except for the one documented local-mode ref,
`refs/heads/adopt/three-repo-shape` at the split commit. That ref and the
two leg remotes are left in place, read-only, as the input to T006–T010.

## Private log SHA256s

- Execute: `f766bc707c88272598b6947ae850d9d42922763f0820940a0202ebcbc1835a46`.
- Bootstrap: `ea2be5dc7455c869a48c7bd36d73024c53ef6f233916cbf8e67ba897b3b732f7`.
- Independent comparison: `d3acbcd6274267eeadd36892bdbe2a08a9b08269d3215b373f84d630b91da007`.

The receipt holds every log with its SHA256. None was over 2 MB, so none was
trimmed.

## Remaining gates

**Gate B is not complete.** T006–T011 remain:

- root collisions and leg guidance;
- the installer entry point;
- composed tests and CI;
- the restore and rollback rehearsal.

Gate A preservation must be refreshed at a coordinated breakpoint. Before
Gate C, regenerate the plan from the frozen source that is actually chosen.
Brett Heap's explicit Gate C approval must name the revisions, the leg
repositories, their visibility and the final plan.

This evidence authorizes no real conversion, repository creation, merge,
default-branch move or lane rebinding.
Loading
Loading