Repository navigation
T094's ahead PR: the CLI help golden, the usage line and the rebound-Host case hold at both pins (T066's form; not an arc landing) (plan 034) - #1234
Conversation
…'s form; not an arc landing) At plan 034's phase-3 openDox leg the assembled command line changes in four places, each an openDox-code landing of phase 3 and none openxFactory's: T084 (openDox-code#77) names the installed command, so every usage line reads `opendox` and the root's description and epilog are openDox's own; T070 adds `generate-and-open --local`; T079 and T080 add `--model`, the auth kind `none` and the optional reference to `model-binding add|edit`; and T100 adds `model-binding trust`, so the tree goes from 31 entry points to 32 (research R8). The golden is not one of F11.1's declared surfaces, so T094's arc landing cannot regenerate it (tasks.md T094). - `test_extension_point_parity.py` reads the pinned leg's layout off its own parser (its prog, and whether `model-binding` offers `trust`) and holds that layout's golden exactly. A leg with one change and not the other is refused by name. Two new cases: the two goldens hold the same entry points plus `model-binding trust`, and the selector's negative control. - The phase-3 tree lives at `tests/domain_profile/fixtures/cli-help-tree.phase3.golden.txt`, outside `tests/ideation-dashboard/`, because a new file under that carve prefix is `carve-file-undeclared`. Measured: at the current pin (openDox code 047bb4fa) the module passes 13 of 13; at the phase-3 candidate (a local integration of openDox-code main and the open phase-3 drafts, with openXdox-code T086's local branch) the golden passes, and the two cases left red are T094's own (the /capabilities arm of ROUTE_ARMS, and the MRO case's consumer_reach import). Prepared by lane openxfactory-4 in its T094 prep (local branch build/034-golden-both-pins, c209ff48); carried unchanged onto main c8d8002 by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809313). Lane: openxfactory-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pins (T066's form; not an arc landing) From openDox-code's T103 (openDox-code#80) every loopback route checks the Host before it dispatches, so test_doxbench_routes.py's test_console_gate_refuses_host_not_naming_the_bound_port is refused by that earlier gate (403 invalid_host, serve.FOREIGN_HOST_*) and no longer by the console gate (console_required). The file is one of T104's four composed readers and on no F11.1 surface, so T094's arc landing cannot edit it (tasks.md T094, "the golden's rule above applies to it too"). The layout is read off the pinned leg (serve.FOREIGN_HOST_ERROR exists from T103), never off the answer. Either way the request is refused and the model port is never asked. Measured: the case passes at the current pin (openDox code 047bb4fa) and at the phase-3 candidate (a local integration of openDox-code main 8e377823 and the open phase-3 drafts, 63a4807a, with openXdox-code T086's local 5ce8558a). With T086 and T094's host line, it is the only red of the four token-reading suites there: 1 failed, 239 passed. Prepared by lane openxfactory-4 in its T094 prep (local branch build/034-golden-both-pins, b3e3b9df); carried unchanged onto main c8d8002 by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809313). Lane: openxfactory-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h pins (T066's form; not an arc landing) `test_a_contributed_verb_is_reachable_in_both_documented_invocations` asserts the usage line `usage: ideation-dashboard gate ratify`. openDox-code's T084 (openDox-code#77) renames the parser's program to `opendox` and names it `cli.PROG`, so at the phase-3 pin both parametrizations fail with the verb reachable and only the program name changed. The test file is on none of the surfaces F11.1 lets T094's arc landing touch, so it moves ahead of T094, as T066 moved its tests: the test reads the pinned leg's own program name, `cli.PROG`, and a leg without that name is the earlier one, whose program is `ideation-dashboard`. At the current pin (openDox d5098297, code 047bb4fa): 2 passed. At the phase-3 simulation (openDox-code integration 63a4807a): 2 passed. Prepared by lane openxfactory-4 in its T094 prep (local branch build/034-golden-both-pins, ea5585e3); carried unchanged onto main c8d8002 by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809313). Lane: openxfactory-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…olden PR, plan 034) Main's one commit since c8d8002 is T007 batch P (#1230). It touches none of this branch's files (the parity test, its phase-3 golden, the doxbench routes test, the CLI column split test), no gitlink, no pin yaml and no carve manifest row; git merge-tree reported it clean. openxFactory's own pins stay at phase 2 (openDox d5098297, openXdox f257e021) until T094. Lane: openxfactory-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR extends CLI golden, usage-line, and rebound-Host tests to support both the current pins and phase 3's openDox leg without moving pins or adding host wiring. It adds a phase-3 help snapshot, derives expectations from the pinned implementation rather than the compared output, rejects unsupported mixed layouts, and preserves behavior-specific assertions across both versions. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Copilot review overview
🟢 Approval recommended
The changes match the governed ahead-PR scope and the golden’s documented size, digest, and section count.
Review effort: Balanced
Findings: None
What changed in this PR
This PR prepares tests to pass against both current and phase-3 openDox pins.
Changes:
- Adds the verified 32-section phase-3 CLI help golden.
- Selects expectations from pinned parser/server capabilities.
- Updates CLI usage and rebound-Host assertions for both dependency layouts.
| File | Description |
|---|---|
tests/domain_profile/fixtures/cli-help-tree.phase3.golden.txt |
Adds the phase-3 help snapshot. |
tests/ideation-dashboard/test_extension_point_parity.py |
Selects and validates the appropriate golden. |
tests/ideation-dashboard/test_cli_column_split.py |
Adapts usage assertions to the pinned program name. |
tests/ideation-dashboard/test_doxbench_routes.py |
Supports pre- and post-Host-gate refusal responses. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
There was a problem hiding this comment.
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 9 hours and 21 minutes by commenting @sourcery-ai review. Upgrade to get a review now.
|
READY at 1661c63 — Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Holder: lane openXfactory-3's D2, the ahead golden PR (E1 (a), E3 (a), E5 (a),
|
|
Lane: openxfactory-4 (openXfactory-4-openDox_extraction) LANDING — lane openxfactory-4, session faabad8b-8c31-4958-abd5-b35bdc9cd282@Eagle, 2026-10-05T13:05:08Z, PR #1234 into opensoft/openxFactory main |
Lane: openxfactory-4 (openXfactory-4-openDox_extraction) **Plan 034's phase-3 ticks, the third.** It ticks T076, T086, T087, T101 and T104, which landed in opensoft/openDox-code, opensoft/openDox and opensoft/openXdox-code, in `specs/034-opendox-standalone-operation/tasks.md`, in the form #1221 and #1226 used: the box, and a "Landed" bullet drawn from the landed PR's own body. - **Based on `main` `ba6bb870`** (#1230, batch P), merged up to `ca1c1486` (#1234). If `main` moves again, I merge it in (no rebase, no force-push). - **Four commits and a merge.** `9a27b080` ticks the five tasks. `eee9e38f`, `252ef9f8` and `3f1790ee` each answer Copilot's findings at the head before (see "Review"). `3991b3a8` merges `main` `ca1c1486` (#1234, a tests-only PR with no `tasks.md` change) as a merge commit, never a rebase. - **Bookkeeping only.** It edits one file. `git diff origin/main --stat` shows `tasks.md` alone, 374 insertions and 7 deletions: five box flips, five bullets, and one cell each of the P3-X and P3-C slice rows (below). Nothing under `openspec/` changes, so there is no Rule 6 window. - **No `Arc:` trailer** (R1Q20 (a)), and no closing keyword in the commit message or in this body (both scanned with `/usr/bin/grep`). - **Claim:** #656 comment `5994472613`. - **T099 is NOT ticked.** The PyPI publish has not run. T101 is "T099's release step", and its bullet says what stays for T099. - It stays a DRAFT until the holder marks it ready. ## The ticks, each with its evidence Each sha is the merge commit of the named PR, read from the forge with `gh pr view <n> -R <repo> --json state,mergeCommit,baseRefName` (all six `MERGED`, base `main`), then checked in a bare clone of its repository. Each is a single-parent squash on `main`'s first-parent line. Each squash's tree equals its PR's final head's tree (`b92a2aa0` for openDox-code#84 at `c5fcdfa4`, `027edaf6` for #78 at `07cc8f36`, `0b1a2abc` for openDox#18 at `f451f68c`, `8b175f71` for openDox#17 at `4fddf62f`, `78ef1ed1` for openXdox-code#37 at `57bebd8b`). #79 is the one exception, as it must be: its head `9519cd8e` is `main` `651c35fe` plus the bump, so its tree lacks #78, which landed first. The squash's diff against its parent is the head's diff against `651c35fe`: `pyproject.toml` alone, 6 insertions and 1 deletion. The table is in landing order. | task | landed | note | |---|---|---| | T104 | openDox-code#84 → `32943cbf` (2026-10-05T02:56Z) | The console token travels in the opened URL, not `/capabilities`, on a standalone plane only. The private copy at `<OPENDOX_STATE_DIR>/console/<port>.html`, its safe write, the two-way served-root boundary, the page's fragment reader, and the limits the holder and Brett accepted (B3's hint line, B7, the stale tab). The bullet also records what the composed hosts show, for T086 and T094. | | T101 | openDox-code#78 → `d59f3f26` (11:41Z) and #79 → `dede32b4` (11:50Z) | #78 is the release workflow, with its hash-locked tools and `tests/test_release_workflow.py`. #79 is the version bump to 0.1.0, the last phase-3 openDox-code landing. The bullet records the pin and environment gates, the artifact checks, the publishing order and the accepted limits, and says that T099 keeps its box. | | T087 | openDox#18 → `e1e3a3c3` (11:58Z) | The openDox root's code gitlink and `contracts/code-pin.yaml` move from `047bb4fa` to `dede32b4`, in one commit (two files). | | T076 | openDox#17 → `504324de` (12:07Z) | The root README's "Install and run" section: the two lines, the browser limit, and the dated paragraph for the first line until T099 publishes. The bullet states what the tick means. | | T086 | openXdox-code#37 → `56e1c238` (12:23Z) | openXdox's four governed columns at openDox's seams, the two route columns through the facet, `OPENDOX_BACK_IMPORTS` at `(0, 0)` and the pin at `dede32b4`, with F5.2's three repairs and the host-plane stand-in. | Each task also carries a `**Landed**` bullet in `tasks.md`. The facts in each come from the landed PR's body, and where a bullet states a falsifier outcome I re-ran the falsifier at the merge sha (the next section but one). With these five, 83 of the 96 boxes are ticked (78 on `main`). **Left as they are:** T002, T007, T089, T090 to T093, T094, T095, T096, T097, T098 and T099. **What the T076 and T101 ticks mean.** Both bullets say so in `tasks.md`, as T088's does. T076's falsifier is review, and AT-R1 step 4 follows the README literally, but the first line, `pip install "opendox[local]"`, cannot be followed literally until T099 publishes. PyPI and TestPyPI both answered 404 for `opendox` when I read them (2026-10-05T12:38Z), the repository has no tag and no release, and `release.yml` has never run. So T076's box is the landing of a README that meets the review's criteria, and AT-R1 step 4, run at T095 and T096, keeps its own falsifier. T101's box is the landing of the release workflow and the version bump. T099, the publish, keeps its box. ## T086's files outside its slice row (Q7 (a)) - **Whose list this is.** Only openXdox-code#37's body carries one ("Files outside T086's slice row (Q7 (a)), to record in the next plan bookkeeping round"). The bodies of openDox-code#84 (T104), #78 and #79 (T101), openDox#18 (T087) and openDox#17 (T076) carry no such list: I read all five for "outside", "slice row", "bookkeeping round" and "single-writer", and for any list of files. Q7 is T086's prep question 7, which the holder ruled (a) on 2026-10-02: *"T086 also touches … recorded in the next plan bookkeeping round"*. - **Checked against the forge.** `gh pr view 37 -R opensoft/openXdox-code --json files` lists 18 files. All 13 the body names are among them (12 edited, one created). Four of the 12 are already in the P3-X row since #1225: `tests/test_session_snapshot.py`, `tests/protected_suite_respellings.yaml`, `tests/integration/test_assembled_surface.py` and `.github/workflows/validate.yml`'s `LEFT_OUT`. The other five of the 18 are in the row (`pyproject.toml`, `tests/test_dependency_direction.py`) or are its "gate and projection contributions" and their tests. - **The precedents I found, and used.** (1) #1225 rewrote the P3-E row's files cell to record what T075 did outside it: *"T075 (openDox-code#73, landed) edited `pyproject.toml`'s package data … and its tests; no server module."* (2) Landed bullets name the files a task touched beyond its row: T059's records that it joined the declared exclusion file's single-writer chain, and T075's lists the four files its PR changes. So the nine files not yet in the row are recorded in **both**: T086's `**Landed**` bullet, and the P3-X row's files cell, in P3-E's form (`T086 (openXdox-code#37, landed) also edited, outside the files above (Q7 (a)), … and created …`). The cell also says T086 edited neither route harness the row names, since the stand-in host in `tests/conftest.py` serves T104's token. That is true of the 18 files. - **What the row edits do to the tools.** `sharedfiles` gains one file name on one line, `conftest.py` in P1-J against P3-X, which stays `ordered A<B`. The P3-C edit moves nothing, because the row keeps the three names. No other tool output moves (see Validation). If the holder would rather leave the row alone, it is one cell to revert, and the bullet keeps the list. - **Not done here.** `plan.md` is outside this PR's file. Its single-writer table names openXdox-code's declared exclusion file as T041 → T043 → T044 → T061, and does not name T086's addition to it (65 → 66, `tests/test_column_contributions_governed.py`); T059's addition (67 → 66) was recorded in `tasks.md` only too. I noticed it and left it for the holder. - **A T104 observation, not a list.** T104's body says the one page reader the PR edits is `web/views/notebook.js`, not the three files the task text and the P3-C row name (`app.js`, `edit.js`, `staging-workbench-model.js`), which are untouched. The T104 bullet says so. Copilot's first finding (below) asked for the P3-C row to say so too, and `eee9e38f` does, in P3-E's form: `T104 (openDox-code#84, landed) edited `src/opendox/web/views/notebook.js` instead, … and created `src/opendox/console_access.py``. `plan.md`'s single-writer row for `staging-workbench-model.js` (T102 → T104) still names T104, and I left it with the other `plan.md` item. ## Review Copilot's reviews, each answered and each thread resolved (3 inline findings in all, 0 open): - **At `9a27b080`** (2 findings, low). **r4184226463, the P3-C row** still named the three readers T104 did not edit: fixed in `eee9e38f`, as above. **r4184226530, `plan.md`'s single-writer chain** for openXdox-code's declared exclusion file ends at T061 and omits T086 (and T059): an accepted limit, since this PR is `tasks.md` alone and `plan.md` is the holder's to order. It is the "Not done here" item above, and the reply says so. - **At `eee9e38f`** (no inline finding; two "previously missed" items on my T101 bullet): the release tag `v0.1.0` is made at the openDox-code commit T087 pins (`dede32b4`), not at T087's own commit in the openDox root, and the digests are recorded right after the artifact checks, before the wheel smoke test, not "before any third-party code" (the hash-locked tools and the package's own build have run by then). Both fixed in `252ef9f8`. - **At `3991b3a8`** (1 finding, r4184414419): the T101 bullet's preflight sentence read as if a yanked file were an exception. Fixed in `3f1790ee`: the preflight tolerates only a verified file at its verified digest and refuses any other file of the version, and any yanked one. ## Re-run at each merge sha My own runs, one sha at a time, each in a detached worktree of a bare clone, with a fresh venv per sha installed as that repository's `validate.yml` installs it (openDox-code: `pip install --only-binary :all: -c constraints-cpython312-linux.txt -e ".[runtime,test]"`; openXdox-code: `pip install -e ".[test]"`, which takes `opendox` from git at `dede32b4`). Python 3.12.3, pytest 8.4.2, node v24.21.0, `LANG=C.UTF-8`, run under `env -i` (no `GIT_*`, `XF_*`, `PG*` or `OPENDOX_*` variable inherited), an empty scratch `HOME`, and `TMPDIR` and pytest's `--basetemp` under `~/.cache/ticks-p3c-tmp`, outside `/workspace/projects/xFactory` (`git rev-parse` fails there). T104's red-first run was repeated with both under `~/.local/state/ticks-p3c/tmp` and read the same. There was no PostgreSQL service. I published, dispatched and approved nothing: my only calls to the forge and the indexes were reads (`gh pr view`, `gh run list`, `gh release list`, and two `GET`s of the indexes' JSON APIs). | task | at | what I ran | result | |---|---|---|---| | T087 | `e1e3a3c3` | `make pins`, then `make validate`, in the openDox root with both legs initialised (`git submodule update --init`) | both rc 0. `make pins` prints `ok code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3`, `ok code: tree digest recomputes (c2672463b4d8…)`, the same two lines for `spec` (`f7ee3c763b3a`, `e81f8530d93e…`), `ok contracts/shape-pin.yaml: 10 copied shape file(s) match their digests`, and `pins ok`. `make validate` adds `manifest ok: openDox (opendox), 3 legs`. The commit changes `code` and `contracts/code-pin.yaml` only (2 files, 3 insertions, 3 deletions) | | T076 | `504324de` | `make validate` in the openDox root, legs initialised | rc 0, the same output as above. The commit changes `README.md` alone (82 insertions) | | T076 | `504324de` | the README's two lines, byte for byte, against batch H's 10.3 addendum in the ratified change's `tasks.md` at `ba6bb870` (`openspec/changes/add-neutral-product-standalone-operability/tasks.md:1535-1537`), extracted by a script | the addendum's commands are `pip install "opendox[local]"` and `opendox generate-and-open --local …`. Each is a README line exactly equal, once. The `…` is `e2 80 a6` (U+2026), after one ASCII space | | T076 | now | **the published-package caveat.** `GET https://pypi.org/pypi/opendox/json` and `https://test.pypi.org/pypi/opendox/json`; `gh release list` and the tags of opensoft/openDox-code; `gh run list --workflow release.yml` | 404 and 404 (2026-10-05T12:38Z); no release; 0 tags; no run. So the first line cannot be followed literally today, and the README's dated paragraph names the stand-in, `pip install "./code[local]"` from a recursive clone. I did not run the stand-in, nor the README's start | | T101 | `d59f3f26` | `tests/test_release_workflow.py` (the falsifier: "in the required check"), alone | `129 passed in 35.65s`. It is the only test the PR added | | T101 | `dede32b4` | `pyproject.toml`'s version | `version = "0.1.0"` (line 23), against `0.0.0` at `d59f3f26`. `readme = "README.md"` is there too | | T104 | `32943cbf` | `tests/test_console_token_delivery.py` and `tests/test_console_token_view.py` (the falsifier: "its PR's test, on the standalone serve"), alone, in one invocation | `166 passed in 87.97s` (the second file runs its node cases) | | T104 | `38d3350e` (#84's base: the commit before the squash) | the same two test files and `tests/standalone_child.py` (the helper #84 extends), taken from `32943cbf`, run against the base's own tree in a venv installed there. The task text does not ask for this run. I made it as #1226 did for T103 | `158 failed, 1 passed, 7 errors` in 128s, of the 166. The one pass is `test_a_server_outlives_no_killed_run`, a case of the tests' own server helper, which does not touch the product. The 7 errors are the node file's. Two cases hang at the base, and I cut each at 60s with `pytest-timeout` 2.4.0, which I added to that venv only. My first run, without it, hung at the 23rd case and I killed it | | T086 | `56e1c238` | `validate.yml`'s `pytest` step, lone: `python -m pytest -q --junitxml=pytest-report.xml --deselect "$LEFT_OUT"` with `LEFT_OUT` the 32-entry node, then the step's own triple script over the report | `1095 passed, 4 skipped, 1 deselected`. Triple: `selected=1099 passed=1095 skipped=4 failures=0 errors=0`; pins `selected>=1099 (margin 0) passed>=1095 (margin 0) skipped==4` | | T086 | `56e1c238` | `tests/test_dependency_direction.py`, alone | `17 passed` | **Not re-run, and why.** - **The whole openDox-code suite at any sha**, and so the whole-suite numbers in the T101 and T104 bullets (`4005 passed, 11 skipped` and the like). They are the PRs' own, read from their bodies. They need PostgreSQL and hours. - **T101:** the workflow itself. I ran none of its jobs or steps, its linters, its mutants, or its live reads (the environment and approval steps). The falsifier's other half, the `build` job over the pinned commit, is T099's. Nothing was dispatched. - **T104:** the PR's 90 mutants, its Chromium run, and its composed runs against openxFactory and openXdox-code (they need those checkouts composed with `scripts/`). - **T086:** F5.2 whole, F9.1's other readings, and the composed runs (F5.2's seven suites, the declared-excluded files, 12.5's governed set, the two harness modules as #84 ran them, the 32-entry digest). I tried F5.2's pytest loop composed with `scripts/` from my openxFactory clone, and all seven suites stop at collection (`corpus_adapter_openxfactory.adapter: the pinned openDox corpus-adapter interface is not at …`), because the clone's nested openDox leg is not initialised. I did not pursue it: F5.2 closes at T089. So the bullet's composed numbers are the PR's own. - **T087:** the PR's three other digest recomputations, and its half-move experiments. `make pins` recomputes the tree digest itself. - **T076:** the PR's fresh-venv install and start of the stand-in, and its checks against the pin (the bundled PostgreSQL's lifecycle, the `Host` check, the printed lines). ## Validation - **`python3 scripts/validate-openspec-cli-pin.py --all --strict`**, the pinned CLI 1.12.0, from the openxFactory root, at this head and at `main` `ca1c1486`: both rc 0, `Totals: 110 passed, 1 failed (111 items)`, `0 UNDISPOSITIONED failures`. The one failure is the accepted exception for `add-chain-attestation` (Brett Heap, 2026-09-05). The two outputs are identical line for line but the working directory in the third. - **The plan-graph tools** (`depcheck`, `chaincheck`, `chaindirect`, `arrowcheck`, `phasecover`, `sharedfiles`, `qcheck`, from the lane's `plantools`), this branch against `main` `ca1c1486`: the output is identical except two things. The box count moves, 78 ticked of 96 on `main` and 83 here. And one `sharedfiles` line gains `conftest.py` from the P3-X row edit (above): `P1-J … vs P3-X … share ['.github/workflows/validate.yml', 'conftest.py', 'test_assembled_surface.py', 'validate.yml']: ordered A<B`. Both read 96 tasks, `cycles: none`, `single-writer chain gaps: 0`, `arrow mismatches: 0` (83 arrows), and `qcheck` reads `headers checked: 27 of 27; mismatches: 0`. - **Tests that read plan 034's `tasks.md`:** none. `git grep -nE 'specs/034|opendox-standalone-operation' -- tests scripts .github` finds nothing, and this PR touches no code. - **Every 8-character sha in the added text resolves** with `git rev-parse` in openDox-code, openDox, openXdox-code or openxFactory: 17 of 19. The other two, `c2672463` and `97536dbe`, are tree digests, and I read both in the openDox root's `contracts/code-pin.yaml` (at `e1e3a3c3` and `d5098297`). - **The open PRs that edit the same file.** None edits `specs/034-opendox-standalone-operation/`. `git merge-tree --write-tree` of the head before the merge of `main` (`eee9e38f`) with each open PR's head reported no conflict (rc 0), and `main` has since taken #1234, which touches four test files only. The open PRs now are #1233 (T097's DRAFT, which edits the openspec change's `tasks.md`, not this file), #1211, #1209, #1138, #594 and #518. Lane: openxfactory-4 (openXfactory-4-openDox_extraction) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…, with phase 3's host wiring: openXdox's columns and the governed binding-trust policy (plan 034) (#1236) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Plan 034, task **T094**: phase 3's consumer pins (T090 step 6) with phase 3's host wiring, `specs/034-opendox-standalone-operation/tasks.md` at openxFactory `main`. The precedents are T047 (opensoft/openXdox#20, then #1181) and T064 (opensoft/openXdox#21, then #1215). - **Claim:** #656 (comment) (it covers T087 and T094). - **Landing order, done:** - T087: opensoft/openDox#18 → `e1e3a3c3` (openDox-code `dede32b4`, the 0.1.0 commit T099 publishes). - T086: opensoft/openXdox-code#37 → `56e1c238`. - T090 step 5: opensoft/openXdox#22 → `9564d5d9`. - Lane openXfactory-3's ahead PR (D2, non-arc: the CLI help golden, the usage line and the rebound-Host case at both pins) → #1234, `ca1c148646f1111bc8049bc9cceb3c14ef276967`. This branch merges `main` in at `9cd1bf23` (a merge, never a rebase). - **Holder decisions in force (2026-10-05):** - (a) both pin pairs move in ONE commit, as in T047 and T064 (below); - (b) T092's phase-3 `edits[].note` annotations ride in T089's checkpoint PR (lane openXfactory-3's D3; #656 comment `5987195870`, D5), NOT here. This PR touches no manifest note; - (c) the stale `src/opendox/consumer_reach.py` admission is removed and asserted ABSENT; - (d) the 4 + 3 carve-time files the walk still names stay as T064 left them; - (e) the merge of `main` (`9cd1bf23`) carries the `Lane:` line and no `Arc:` line. T091's trailer belongs on realization commits and on the landing, and the squash landing writes `Arc:` from this body. On the merge, F11.1's guard would charge #1234's non-arc files to the arc. - It stays a DRAFT until the holder marks it READY. ## The pins: both pairs in ONE commit (`caa8d377`) | pair | gitlink | pin file `commit:` | `digests.tree_sha256` | | --- | --- | --- | --- | | openDox | `d5098297` → **`e1e3a3c3`** | same (`contracts/opendox-pin.yaml`:118) | `2815ca23…57cc` → **`55a110f49d268e22d382d47d778dfaf9298c93b555e3c4fcb621afc99f9d011b`** (28 records) | | openXdox | `f257e021` → **`9564d5d9`** | same (`contracts/openxdox-pin.yaml`:109) | `52f0598e…6959` → **`11585eadf4fef2ffcb4419194fa6a52444f56759cfc427d41c352a6b8803cbd2`** (29 records) | - **`e1e3a3c3` is opensoft/openDox#18's squash (T087), one commit above `d5098297`.** It moves `code` `047bb4fa` → `dede32b4` with `contracts/code-pin.yaml` and changes no other path, so openDox's `contracts/manifest.yaml`, its `spec` gitlink and the bundle (`dox-v1.1`) are unchanged. openDox's `main` has since moved to `504324de` (opensoft/openDox#17, T076, the root README only). Step 2's root commit is the one T090 pins, and no check reads `main`'s tip. - **`9564d5d9` is opensoft/openXdox `main`, where #22 squash-landed** (its tree equals #22's head `db6cc2a4`). It moves `code` `6a3b93b9` → `56e1c238`, which is openXdox-code `main` after #37 (T086), and `contracts/opendox-pin.yaml` `d5098297` → `e1e3a3c3` (T090 step 5). - Every digest was recomputed three ways: `repo_shape.tree_digest`, an independent `ls-tree` + `sha256`, and the forge's tree listing (`repo_shape.tree_digest_from_gh`). Controls: the same three methods reproduce the recorded `52f0598e…6959` at `f257e021` and `2815ca23…57cc` at `d5098297`. - **Why one commit and not "one commit each" (T090 step 6).** #22 changes the openDox pin that `verify-opendox-pin.py` check 5 reads through the openXdox gitlink, and `docs/openxdox-pin-resync-runbook.md` § 4 prints DIFFERENT. Each split order was measured on this branch's base, and `verify-opendox-pin.py` exits 2 in both: - the openDox pair alone: `REFUSE opendox-pin-lockstep-mismatch: this pin names openDox@e1e3a3c3f8dd38214510412b71a2e858c6179532, but openXdox's own openXdox/contracts/opendox-pin.yaml names openDox@d5098297a5c262f9977193305210bccb4ec51e89; two direct declarations of one product's bytes disagree.` - the openXdox pair alone: `REFUSE opendox-pin-lockstep-mismatch: this pin names openDox@d5098297a5c262f9977193305210bccb4ec51e89, but openXdox's own openXdox/contracts/opendox-pin.yaml names openDox@e1e3a3c3f8dd38214510412b71a2e858c6179532; two direct declarations of one product's bytes disagree.` So "one commit each" cannot be met without an intermediate red commit. **The holder ruled the single commit for phase 3 on 2026-10-05**, as for phase 1 (T047, #1181) and phase 2 (T064, #1215, decided 2026-09-28). This PR therefore departs from T090 step 6's "one commit each" for the third time. Each pair still moves as one unit (box 9.5). - Both pin files are edited in place, keeping their line counts (216 and 154). The openDox `migration:` block keeps `range` (`0001..0002`) and `reversible` (`false`): no migration path changes over openDox-code `047bb4fa..dede32b4`. Its `runbook` names the new code leg `dede32b4`, and the block is identical to openXdox's derived copy at `9564d5d9`, which `tests/opendox_pin` asserts. - **Gates.** - `verify-opendox-pin.py`: `OK opendox-pin verified: openDox@e1e3a3c3f8dd38214510412b71a2e858c6179532, gitlink read from HEAD, sorted-ls-tree-r-v1 tree digest recomputed (55a110f4…011b), lockstep with openXdox confirmed`. - `verify-openxdox-pin.py`: `OK openxdox-pin verified: openXdox@9564d5d9462ffd1a3155d9177206368e5061efa8, gitlink read from HEAD, sorted-ls-tree-r-v1 tree digest recomputed (11585ead…cbd2)`. ## What else it carries | commit | what | F11.1 surface | | --- | --- | --- | | `3c1c1146` | **The host wiring.** `scripts/opendox_host.register_openxfactory()` calls `openxdox.column_contributions.register()` (T086) after the projection line, and refuses by name when it registers nothing. **`GovernedBindingTrust`** (RULED #656 `5970369724`, "Governance approval (Recommended)") is the sixth `seams()` entry, before the home seam, with its take-back row. Its verdicts: a binding pending in the governed declarations is untrusted (host basis, the governed reason); an unreadable declarations document admits nothing; otherwise trusted, host basis. It answers the console intake's own question, `intake_verdict`, as plan 034's T100 entry says a host policy must. Its `record()` writes nothing and returns None, which openDox-code#86 reads as "no record" (`doxbench_trust.recording_for`; #656 `5986391296`, applied to T094 by `5988088910`), so a failed `add` or `edit` write is refused as the write's own failure and never with `REASON_NO_WITHDRAWAL`. `tests/domain_profile/test_host_registers_binding_trust.py` (new, 9 tests, 11 cases at `7e31eca1`) and `test_openxfactory_host_wiring.py` (six seams; the three columns the facet composes; each declared once) cover it. They pin openDox-code#86's final `REMEDY_NOT_BY_TRUST` and `INTAKE_HOST_NOT_ADMITTED` strings. Planted mutants, measured over the draft rounds of this same code, are each killed: M1-M3 and M5 by `test_host_registers_binding_trust.py`, the column line removed (M4) by `test_doxbench_routes`, `intake_verdict` removed or admitting everything (M6, M7), and `record()` returning the verdict, returning True, or writing MachineTrust's store (M8, M9, M11). | HOST, HOST_TESTS | | `3c1c1146` | **Composition tests**, amended in the arc: `test_extension_point_parity.py` (the `/capabilities` arm of T073 and T103, and the MRO's T084 layout), `test_serve_column_split.py` (the snapshot arm's four handlers are the core's own after T086's trim; every column method is the column's own), and `test_doxbench_status_exemption.py` (T085's `register_default_status_exemption` joins the readers of the registered rail). | COMPOSITION_TESTS | | `1c5f8edb` | The render lane's `RENDER_LEG_MODULES` and the seal test's `RENDER_UNIT_IMPORTS` gain `opendox/doxbench_trust.py`, `opendox/doxbench_intake.py` and `openxdox/column_contributions.py`, which the host bootstrap now imports. The seal carries a leg's whole `src/`, so no sealed artifact changes. `scripts/profile_openxfactory.py`'s note on the two openXdox columns moves to the past tense. | ADMITTED_ARC_EDITS (both paths); HOST | | `24215223` | `test_ruling_q7_two_direct_upstreams_in_lockstep`'s snapshot literal moves `d5098297` → `e1e3a3c3`, as its comment says it does on every bump. | ADMITTED_ARC_EDITS | | `eda75977` | **The lane route's predicate check** (T086's Q8 (a)). openXdox-code's `test_the_hosted_session_arrival_path_is_recorded_and_not_built` no longer reads openxFactory's `_handle_refresh_action` (opensoft/openXdox-code#37 narrowed its loop to the leg's own routes), so `tests/domain_profile/test_lane_route_asks_the_hosted_ref_predicate.py` (new, 2 tests) asserts it here: the route's body calls `hosted_ref_refused(` (openXdox's predicate), and on a hosted plane a refresh naming a session ref is refused with `session_unavailable` before it runs, while a ref-less one runs. Three planted mutants are each killed: the check removed, the call kept but not deciding, and the call asked as loopback. | HOST_TESTS | | `b3a4b6e0` | **29 `created:` admissions** in `docs/opendox-carve-admissions.yaml`, pinned in `tests/carve_arrival` by path, `since` and count, as T047's 37 and T064's 129 are, **and one removed** (below). | ADMITTED_ARC_EDITS (both paths) | | `16136990` | The admissions test's ordinal paragraph and its sixteenth-bump docstring and comment name this PR, #1236 (a follow-up commit: the number did not exist before the PR). | ADMITTED_ARC_EDITS | | `9cd1bf23` | Merge of `main` at `ca1c1486` (lane openXfactory-3's ahead PR). It merged with no conflict, and its four files are byte-identical to the ahead commits this branch was measured over. It is not a realization commit, so it carries the `Lane:` line and no `Arc:` line (T091): F11.1's guard selects commits by that line, and walked over this branch it would otherwise charge #1234's two non-arc files to the arc. | (not on `main`'s first-parent line) | | `7e31eca1` | **Copilot's finding at `16136990`, and the pre-review's six fix-now findings.** (Copilot) A refusal now gives back the unread defaults this call replaced: `_DEFAULTS` names the two globals and the default-registration call of each default-holding seam (T085's doxBench pair, T100's trust default). A write that replaced an unread default is recorded with it, and the take-back registers it again as the unread default, as `openxdox.column_contributions` does. The pre-review's six: (1) the no-columns refusal is tested, and no host seam is written; (2) a refusal at the trust seam is tested on fakes and on the pinned leg; (3) "five seams" becomes six where the count is meant; (4) `GovernedBindingTrust`'s docstring names the one case that changed; (5) the failed-write case skips as root; (6) `__all__` is in ASCII order and names `GOVERNED_PENDING_REASON`. The give-back case, the six-seam message and the exports case each failed before the fix. Planted mutants M12-M19 are each killed. | HOST, HOST_TESTS | The 29 admissions, each `since` the leg's own squash landing (`git log --diff-filter=A`), each path present at the new pin, and none placed by a row or declared before: - **`opendox_code`, 25**: #65 (T088) 1, #67 (T070) 1, #69 (T072) 1, #71 (T085) 2, #72 (T073) 1, #74 (T081) 1, #77 (T084) 9, #78 (T099) 1, #80 (T103) 1, #81 (T102) 1, #82 (T100) 2, #84 (T104) 3, #85 (T102 follow-on) 1. All are openDox-code landings over `047bb4fa..dede32b4`. - **`openxdox_code`, 4**: #37 (T086) at `56e1c238`: `src/openxdox/column_contributions.py`, `tests/test_column_contributions.py`, `tests/test_column_contributions_governed.py` and `tests/test_host_plane.py`. - **One leaves: `src/opendox/consumer_reach.py`** (openDox-code#9, `da8aae96`). openDox-code#77 (T084) deleted it at `e49b17c3` when it retired the reach module, so the walk at `dede32b4` never consumes the admission and the verifier would report it stale (`declared_admissions_unused`). It is removed, as split-opendox § 3.4 slice S5 removed its two re-homed modules', and `tests/carve_arrival` asserts it ABSENT. openXdox-code's own `src/openxdox/consumer_reach.py` (the RULED seed) is still at `56e1c238`, and its entry stays. - Neither spec leg moved (`f7ee3c76`, `f088b097`), so neither admits anything. - **Derived, not run green, for the `-code` legs**, as at T047 and T064: the walk, with every rule `verify-carve-arrival.py` applies, reports stale 0 and only the carve-time files that are unchanged since the old pins (4 at `opendox_code`, 3 at `openxdox_code`), which T064 left as well (decision (d)). ## T094's "Owed elsewhere" list from opensoft/openXdox-code#37, each item to the file that carries it - [x] `scripts/opendox_host.register_openxfactory()` calls `column_contributions.register()` after T064's projection line (Q6 (a)): `scripts/opendox_host.py` (`3c1c1146`). - [x] The module seals: `scripts/ideation_dashboard/dashboard_refresh_lane.py` and `tests/ideation-dashboard/test_dashboard_source_seal.py` (`1c5f8edb`). The carve admissions (`created:` gains `src/openxdox/column_contributions.py`, `tests/test_column_contributions.py`, `tests/test_column_contributions_governed.py` and `tests/test_host_plane.py`): `docs/opendox-carve-admissions.yaml` and `tests/carve_arrival/test_verify_carve_arrival.py` (`b3a4b6e0`). - [x] The parity test's MRO layout and `test_serve_column_split.py`'s four snapshot rows, which move to the core: `tests/ideation-dashboard/test_extension_point_parity.py` and `tests/ideation-dashboard/test_serve_column_split.py` (`3c1c1146`). - [x] `test_openxfactory_host_wiring.py`'s "second copy of the column" check and its contributed tuple, which now has three entries: `tests/domain_profile/test_openxfactory_host_wiring.py` (`3c1c1146`): `test_no_route_extension_declares_a_second_copy_of_the_column` holds each column to one declaration, and `CONTRIBUTED_COLUMNS` is `LaneRoutes`, `GateRoutes`, `ProjectionRoutes`. - [x] The lane route's `hosted_ref_refused(` check (Q8 (a)): `tests/domain_profile/test_lane_route_asks_the_hosted_ref_predicate.py` (`eda75977`). - [x] The trust policy at T100's seam (openXdox registers none; "Governance approval", #656 comment `5970369724`): `GovernedBindingTrust` in `scripts/opendox_host.py`, tested by `tests/domain_profile/test_host_registers_binding_trust.py` (`3c1c1146`). ## F11.1, on the real commits `PACKET_MERGE=94b6f7f1… ARC_TIP=<this branch's head>` over the guard extracted from `openspec/changes/add-neutral-product-standalone-operability/tasks.md` prints: > `requirement 1 holds: 0 note(s) annotated, every other path a declared surface (11.1)` Every path this PR touches is on a declared surface: - PIN_PAIRS: `openDox`, `contracts/opendox-pin.yaml`, `openXdox`, `contracts/openxdox-pin.yaml`; - HOST: `scripts/opendox_host.py`, `scripts/profile_openxfactory.py`; - HOST_TESTS: `tests/domain_profile/test_host_registers_binding_trust.py`, `tests/domain_profile/test_lane_route_asks_the_hosted_ref_predicate.py`, `tests/domain_profile/test_openxfactory_host_wiring.py`; - COMPOSITION_TESTS: `tests/ideation-dashboard/test_extension_point_parity.py`, `tests/ideation-dashboard/test_serve_column_split.py`, `tests/ideation-dashboard/test_doxbench_status_exemption.py`; - ADMITTED_ARC_EDITS: `scripts/ideation_dashboard/dashboard_refresh_lane.py`, `tests/ideation-dashboard/test_dashboard_source_seal.py`, `tests/openxdox_pin/test_openxdox_pin_verifier.py`, `docs/opendox-carve-admissions.yaml` and `tests/carve_arrival/test_verify_carve_arrival.py`. The admitted list does not grow, and no manifest note is annotated here (decision (b)). ## The falsifiers, at the COMMITTED pins | run | head | verifiers | `pytest-suite` | other checks | | --- | --- | --- | --- | --- | | **CI** | `16136990` | OK, OK | **`selected=9362 passed=9356 skipped=6 failures=0 errors=0`**, floors met (margin 2312), run `37315023063` | all success, `openxdox-consumer-gate` included | | local | `eda75977` (`16136990` changes only a docstring and a comment) | OK, OK | **8943 passed, 7 skipped, 0 failed** (`pytest tests/ -q -m "not postgres"`) | the composition, `domain_profile`, carve-mapping, both pin dirs and `carve_arrival`: 569 passed | | **CI** | `7e31eca1` | | PENDING | PENDING | | local | `7e31eca1` | OK, OK | PENDING | `domain_profile`, the seal and the carve mapping: 626 passed; mutants M12-M19 killed | Each local run uses Python 3.12.3, with `TMPDIR` and `--basetemp` under `~/.local/state`, outside the aggregation tree, in a checkout named `openxFactory`. A local run skips 7 where CI skips 6: the work tree sits inside an aggregation checkout, so the aggregation ignore-file case runs and passes there (#1215's reason). - `validate-carve-manifest.py` prints OK (456 rows), and `validate-former-id-arrival.py --base origin/main --head HEAD` passes. ## Accepted limits - A leg from before T100 now fails with an ImportError, because `seams()` imports `doxbench_trust`, rather than with `HostSeamsIncomplete` by name. The pins only move forward. - A directory at the declarations path reads as "no document". That is openDox's own store rule (`document_present` checks for a regular file), and the change opens no new hole. - Under the governed host, `model-binding trust` prints `trusted "m1" on this machine` although `record()` records nothing. That wording is openDox-code's (`cli_model_binding._trusted_line` ignores `recording.recorded`), and it is deferred to an openDox-code follow-on after release 1. - The trust seam's take-back entry cannot fire today. Only the home seam follows it, and the home seam refuses nothing. Nit: `_TAKE_BACK` is keyed by the bare call name `"register"`. ## What this leaves for the aggregation This PR does not do the opensoft/xFactory root pin-sync. When it runs, it needs: - the root `openDox` gitlink → `e1e3a3c3f8dd38214510412b71a2e858c6179532`; - the root `openXdox` gitlink → `9564d5d9462ffd1a3155d9177206368e5061efa8`; - the root `openxFactory` gitlink → this PR's landed sha, with `.github/clearing/openxfactory/PIN.yaml` in the same commit (CLAUDE.md rule 2); - `.github/workflows/dashboard-image-worker.yml`'s `RENDER_LEG_MODULES` and its mirror in `tests/test_dashboard_image_worker_contract.py` gain the same three modules as this PR's `1c5f8edb`. Arc: neutral-product-standalone-operability 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809456) **Plan 034's bookkeeping for phase 3's consumer pins.** It records T098, phase 3's interim F11.1, and ticks T098 and T094 in `specs/034-opendox-standalone-operation/tasks.md`, on T094's landing (#1236 → `36908480`). Lane openxfactory-4 asked for T094's tick here (2026-10-05), in openxFactory#1226's form: the box, and a Landed bullet drawn from the PR bodies. #1217 ticked T064 beside T065 the same way. - **Bookkeeping only**, in two commits: `22de755e` records T098, and `57fb1368` ticks T094. It edits four files: - the new record `specs/034-opendox-standalone-operation/evidence/f11.1-phase3.txt`; - `specs/034-opendox-standalone-operation/tasks.md`; - `specs/034-opendox-standalone-operation/plan.md`'s evidence tree; - the feature's `README.md` entry. `git diff origin/main --stat -- openspec/` is empty, so there is no Rule 6 window. - **No `Arc:` trailer** on any commit, and no closing keyword anywhere in the commits or in this body (both scanned). So F11.1 itself never walks this PR. ## T098: F11.1 at T094's landing - `PACKET_MERGE=94b6f7f13b45c351b9142345738965c974b7dd37` (#1144's landing; `evidence/arc-base.md`). - `ARC_TIP=36908480b40b32509c308087d9d54e6c9d81759d`: #1236's squash commit, landed 2026-10-05T14:06:42Z onto `70602a0a`, carrying the trailer. The sha was read with `gh pr view 1236 -R opensoft/openxFactory --json mergeCommit`, checked with `git rev-parse --short=8`, and confirmed on the first-parent line. - **The guard** is 11.1's FALSIFIED BY block, `openspec/changes/add-neutral-product-standalone-operability/tasks.md` lines 1654-1733 at `36908480`, extracted by anchor, byte for byte (sha256 `60beede1244b6052…`, the bytes T065 ran), and run as extracted. It is the guard as T018 left it, with batch A's `COMPOSITION_TESTS` and the closed `ADMITTED_ARC_EDITS` (RULED `5890601202`). No path was added to either list for phase 3. - It walks three landings: `f56c87c6` (T047), `fcb45380` (T064) and `36908480` (T094). Every path T094 touched is on a declared surface (the record lists each with its surface, read out of the extracted guard's own sets), and the manifest is untouched. **Verbatim output, exit 0, empty stderr:** ``` requirement 1 holds: 0 note(s) annotated, every other path a declared surface (11.1) ``` Beside it, as T065's record carried: - **The walk to main's head** (`36908480`) finds the same three landings and prints the same line, so nothing after `36908480` on the first-parent line carries the trailer. - **A negative control (never pushed).** In a scratch detached worktree at `36908480`, one planted commit (`12d724df`) with the trailer and one file on no surface. The same script refused it with exit 1: `FAIL: the arc changed what requirement 1 keeps: 12d724df557a: touched docs/a-path-on-no-f11.1-surface.md`. The worktree was removed, and the commit is on no branch. - **3.3 (T017).** The `deleted_at_carve` row for `scripts/ideation_dashboard/profile_openxfactory.py` is byte-identical (raw text and parsed) between the manifest's introducing commit `17167481` and `36908480`, so T097 can tick 3.3 on all three interim runs. The record quotes all of it, with the guard's `arc-commits.txt` and `arc-changes.tsv`. ## The tick, with its evidence | task | repo | landed | note | |---|---|---|---| | T098 | oxF | this PR's record, `evidence/f11.1-phase3.txt` | `requirement 1 holds` at `ARC_TIP=36908480`, with the negative control above | | T094 | oX, oxF | opensoft/openXdox#22 → `9564d5d9` (T090 step 5: the openXdox root's code `56e1c238`, openDox pin `e1e3a3c3`), then #1236 → `36908480` (step 6) | Both pin pairs in ONE commit, `caa8d377`, as for T047 and T064 (`verify-opendox-pin.py` refuses either pair alone). The host calls `openxdox.column_contributions.register()` after the projection line, and `GovernedBindingTrust` is a sixth `seams()` entry. 29 carve admissions are added, and the stale `src/opendox/consumer_reach.py` one is removed. The ahead PR landed first (#1234 → `ca1c1486`). The holder's READY is `5996119122`, with Copilot's `r4184739661` an accepted limit; CI at #1236's final head `7e31eca1` passes every check (`pytest-suite`: `selected=9376 passed=9370 skipped=6 failures=0 errors=0`). | **Left unticked:** T089, whose checkpoint quotes this record (its own PR follows). T087 was ticked by #1235. ## Validation - `python3 scripts/validate-openspec-cli-pin.py --all --strict`, through the pinned CLI 1.12.0, from the openxFactory root at this head (`57fb1368`): rc 0, `Totals: 110 passed, 1 failed (111 items)`, `0 UNDISPOSITIONED failures`. The one failure is the accepted `add-chain-attestation` exception (Brett Heap, 2026-09-05), the same at `main` `36908480`. - No test or workflow reads `specs/034-opendox-standalone-operation/` (`git grep` over `tests`, `scripts` and `.github` finds nothing), and this PR touches no code. ## Rehearsals (before T094 landed) - **2026-10-04, at T064.** The same procedure ran at the last arc landing measured that day, `fcb45380`, with the extraction above: `requirement 1 holds: 0 note(s) annotated, every other path a declared surface (11.1)`, the walk to `main` `c8d80020` found the same two landings, a planted path (`d14d04b4`, never pushed) was refused by name, and 3.3's row was byte-identical. Lane openxfactory-4's dry run of 2026-10-03 had run the guard over a simulated T094; every path of that draft sat on a declared surface. - **2026-10-05, at T094's open PR, #1236, head `16136990`.** The guard walked T094's seven branch commits, each carrying the trailer, then T064 and T047, and printed the same line. The branch's merge of `main`, `9cd1bf23`, carries no trailer (the holder's ruling), so it is no landing to the guard, and the first-parent walk never enters its second parent, `main`'s `ca1c1486`. Over a local squash of that head onto `main` `ca1c1486` (never pushed), the walk was exactly three landings, the squash, T064 and T047, with the same line; a planted path was refused by name, and 3.3's row was byte-identical. Host paths in the record are written `<workdir>`. No closing keyword appears in this body or in any commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809190) **Plan 034 T097, release 1's bookkeeping.** This PR ticks all 63 release-1 boxes of #1144's `tasks.md` (`add-neutral-product-standalone-operability`) that a realization task closes, each with its evidence note, and records research R16's non-normative corrections. Its After set has landed: batch P (#1230), T096 (#1241 → `8a37a087`) and T099 (the publish at the cut, and openDox#19 → `d77f8cbf`). On the holder's rulings it also ticks plan 034's T095, T099, T002, T007 and T097, each with its bullet, so plan 034 closes at 92 of its 96 tasks. T090 to T093 tick at the arc's close. - Bookkeeping, so it carries no `Arc:` trailer (R1Q20 (a), `5817152735`; T091) and no closing keyword. It touches `openspec/changes/`, so lane openxfactory-4 lands it under a Rule 6 `LANDING`/`LANDED` window. - **Based on `main` `8a37a087`** (#1241, T096), merged in by `0cde3961`. The PR was first based on `c8d80020` (#1232). The merges since are listed below. Its commits: - `76d8ff37`: the ticks, the notes and R16; - `b7f49673` and `e2efb3a1`: from Copilot's review (below), which edit note text only; - `bd32ea9c`: the merge of `main` after batch P landed; - `cf2c6bdc`: 16.3a's tick, on the T100 follow-on's landing (openDox-code#86 → `651c35fe`); - `5870cd00`: 4.3's and 9.2's ticks, on T086's landing (openXdox-code#37 → `56e1c238`); - `23665543`: 5.5's note reworded (Copilot at `5870cd00`), note text only; - `96c74eab`: the merge of `main` after T094 and T098 landed; - `935164af`: 3.3's tick, on T098's landing (openxFactory#1237 → `20ce593e`); - `e93ab9fb`: 5.4a's note reworded (Copilot at `935164af`), note text only; - `f6c6dc3c`: the merge of `main` after T089 landed; - `e873b25f`: F4.1's, F5.2's and F16.1's ticks, on T089's landing (openxFactory#1238 → `fab575ad`); - `9759313b`: the merge of `main` `f2acc88c`; - `10b6ba05`: the phase-1 and phase-2 checkpoint citations by path (below), note text only; - `0cde3961`: the merge of `main` after T096 landed; - `f94be2fd`: 10.3's tick, on T099's publish, and plan 034's ticks (below); - `9713f991`: plan 034's opening status, which still said batch P was to land (Copilot at `f94be2fd`, below), plan text only. If `main` moves before the landing, I merge it in. No rebase and no force-push. ## Measured, not copied Lane 4's table (2026-10-03T20:05Z, at `de2ab703`: 52 CLOSED-LANDED, 11 PENDING, 5 LEFT-OPEN, 2 ALREADY-TICKED) was regenerated by its own generator, patched, at `c8d80020`, at `ba6bb870`, and again after each closing landing: - every landing PR, now 115 across the six repositories, re-read with `gh pr view <n> -R opensoft/<repo> --json state,mergeCommit,mergedAt`, last at 2026-10-05T16:50Z. Since the first reading these have landed: #1230 (batch P, `ba6bb870`), openDox-code#84 (T104, which realizes no box, `32943cbf`), openDox-code#86 (the T100 follow-on, `651c35fe`), openDox-code#78 and openDox-code#79 (T101, `d59f3f26` and `dede32b4`), openDox#17 (T076, `504324de`), openDox#18 (T087, `e1e3a3c3`), openXdox-code#37 (T086, `56e1c238`), openXdox#22 (T094's openXdox root step, `9564d5d9`), #1234 (T094's ahead PR, `ca1c1486`), #1235 (phase 3's plan ticks, `70602a0a`), #1236 (T094, `36908480`), #1237 (T094/T098, `20ce593e`), #1238 (T089, `fab575ad`), openDox-code#75 (T095, which realizes no box, `389e5a4a`) and openDox#19 (T099's root README, `d77f8cbf`); - every task's landing re-read from plan 034's own `Landed:` bullet (78 of 96 tasks ticked at `c8d80020` and `ba6bb870`, 85 at `20ce593e`, 86 at `a43845e6`, 87 at `8a37a087`), and each run record traced to the openxFactory PR that added it: `checkpoint-phase1.md` (#1204 → `9d2e5bc3`), `checkpoint-phase2.md` (#1218 → `a883bbf6`), `f10.1-run.md` (#1223 → `f261fefa`), `f13.1-run.md` (#1224 → `de2ab703`), `f16.1-run.md` (#1231 → `0e01ca85`), `f11.1-phase3.txt` (#1237 → `20ce593e`), `checkpoint-phase3.md` (#1238 → `fab575ad`) and `at-r1/oracle-verdict.md` (#1241 → `8a37a087`). The T100 follow-on, which is no task, is read from the forge; - batch P's text read at #1230's heads `84113a44` and `d08249a2`, and as it landed (`ba6bb870`, the squash of its head `051f9945`). **Result: 63 CLOSED-LANDED, 0 PENDING, 5 LEFT-OPEN and 2 ALREADY-TICKED, of 70.** Since lane 4's table: - T082 (openDox-code#76 → `ca9e1bd5`), T100 (openDox-code#82 → `38d3350e`), T102 (openDox-code#81 → `0116293a`) and T083 (openxFactory#1231 → `0e01ca85`) have landed. That closes 16.4, 16.5 and 16.6. - The T100 follow-on (openDox-code#86 → `651c35fe`) has landed. That closes 16.3a. - T086 (openXdox-code#37 → `56e1c238`) has landed. That closes 4.3 and 9.2. - T098 (openxFactory#1237 → `20ce593e`), phase 3's interim F11.1, has landed. That closes 3.3 (below). - T089 (openxFactory#1238 → `fab575ad`), phase 3's checkpoint, has landed. That closes F4.1, F5.2 and F16.1 (below). - T076 (openDox#17 → `504324de`) and T101 (openDox-code#78 → `d59f3f26`, openDox-code#79 → `dede32b4`) have landed. - T095 (openDox-code#75 → `389e5a4a`) and T096 (#1241 → `8a37a087`), AT-R1's two halves, have landed. They close no box of #1144. - T099 has published `opendox` 0.1.0, and its root README PR has landed (openDox#19 → `d77f8cbf`). That closes 10.3 (below), the last box. Batch P closes and rewords no box. In #1144's `tasks.md` it only inserts addenda at the ends of 12.4a, 16.3a and F16.1: no box line moves and no box changes state. Since `ba6bb870`, no landing has touched #1144's `tasks.md`. In plan 034's `tasks.md`, T097's own text is unchanged. ## The census `python3 box_census.py openspec/changes/add-neutral-product-standalone-operability/tasks.md`, with the tool written from research.md § Appendix (byte-identical to the Appendix's heredoc). Before, at `main` `8a37a087` (identical to `c8d80020`'s, `ba6bb870`'s, `20ce593e`'s and `a43845e6`'s): ``` 2 8 2.1[ ] 2.1a[ ] 2.2[ ] 2.3[ ] 2.4[ ] 2.5[ ] 2.6[ ] F2.1[ ] 3 5 3.0[x] 3.1[ ] 3.2[ ] 3.3[ ] F3.1[ ] 4 5 4.1[ ] 4.1a[ ] 4.2[ ] 4.3[ ] F4.1[ ] 5 12 5.0[ ] 5.1[ ] 5.2[ ] 5.3[ ] 5.3a[ ] F5.1[ ] 5.4[ ] 5.4a[ ] F5.2[ ] 5.5[ ] 5.6[x] F5.3[ ] 7 8 7.0[ ] 7.1[ ] 7.1b[ ] 7.1a[ ] 7.2[ ] 7.3[ ] F7.1[ ] F7.2[ ] 9 8 9.1[ ] 9.2[ ] 9.2a[ ] 9.3[ ] 9.4[ ] 9.5[ ] F9.1[ ] F9.2[ ] 10 5 10.1[ ] 10.2[ ] 10.2a[ ] 10.3[ ] F10.1[ ] 11 3 11.0[ ] 11.1[ ] F11.1[ ] 13 8 13.1[ ] 13.2[ ] 13.3[ ] 13.4[ ] 13.4a[ ] 13.5[ ] 13.6[ ] F13.1[ ] 16 8 16.1[ ] 16.2[ ] 16.3[ ] 16.3a[ ] 16.4[ ] 16.5[ ] 16.6[ ] F16.1[ ] total 125 Counter({' ': 105, 'x': 11, '~': 9}) ``` After, at this head `9713f991` (`9713f991` changes only plan 034, so the census is `f94be2fd`'s): ``` 2 8 2.1[x] 2.1a[x] 2.2[x] 2.3[x] 2.4[x] 2.5[x] 2.6[x] F2.1[x] 3 5 3.0[x] 3.1[x] 3.2[x] 3.3[x] F3.1[x] 4 5 4.1[x] 4.1a[x] 4.2[x] 4.3[x] F4.1[x] 5 12 5.0[x] 5.1[x] 5.2[x] 5.3[x] 5.3a[x] F5.1[x] 5.4[x] 5.4a[x] F5.2[x] 5.5[x] 5.6[x] F5.3[x] 7 8 7.0[x] 7.1[x] 7.1b[x] 7.1a[x] 7.2[x] 7.3[x] F7.1[x] F7.2[x] 9 8 9.1[x] 9.2[x] 9.2a[x] 9.3[x] 9.4[x] 9.5[ ] F9.1[x] F9.2[ ] 10 5 10.1[x] 10.2[x] 10.2a[x] 10.3[x] F10.1[x] 11 3 11.0[ ] 11.1[ ] F11.1[ ] 13 8 13.1[x] 13.2[x] 13.3[x] 13.4[x] 13.4a[x] 13.5[x] 13.6[x] F13.1[x] 16 8 16.1[x] 16.2[x] 16.3[x] 16.3a[x] 16.4[x] 16.5[x] 16.6[x] F16.1[x] total 125 Counter({'x': 74, ' ': 42, '~': 9}) ``` The release-1 groups are shown. Groups 1, 6, 8, 12, 14, 15 and the follow-ons read the same before and after. Earlier heads read `'x': 66, ' ': 50` (`76d8ff37` to `bd32ea9c`), `'x': 67, ' ': 49` (`cf2c6bdc`), `'x': 69, ' ': 47` (`5870cd00` and `23665543`), `'x': 70, ' ': 46` (`935164af` to `f6c6dc3c`) and `'x': 73, ' ': 43` (`e873b25f` to `0cde3961`). ## The change: #1144's `tasks.md`, and plan 034's ticks - **63 boxes ticked**, each with its evidence note as the item's last paragraph, after any addenda. The note is in 1.8's and 3.0's form: a bold dated lead, `**Landed <date>**`, where the date is the last landing of the box's realizing tasks; the tasks; the landings as `repo#n → sha8`; and the falsifier's result, with where it was quoted. For example, 2.4: > **Landed 2026-09-27** (T030, in T011's PR): openDox-code#46 → `0e88454a`. `tests/test_imports_standalone.py::test_every_module_imports_with_no_sibling` first asserts the four siblings absent, then imports every module, failing with the first that still needs one (`evidence/checkpoint-phase1.md` § 1). - **No ratified line moves.** Against `main` `8a37a087`, #1144's diff is the 63 checkbox lines, `[ ]` → `[x]`, and 64 inserted paragraphs (482 lines): 63 notes, and 1 R16 note on an open box (9.5). This was proven at `f94be2fd` by setting every checkbox to `[ ]` in both files and diffing: the result is 64 insertions and nothing else, and the lines the two files share differ only by the 63 flips. The only other file the PR changes is plan 034's `tasks.md` (below). The file is byte-identical to a fresh re-apply of the regenerated decisions onto `main`'s file. - **Research R16** (research.md § R16), each figure re-checked against research R2, R4, R5, R10 and R13 and plan 034's records: | R16 item | box | where it is recorded | |---|---|---| | 1 | 2.5 | in 2.5's note: 22 modules, not 26, were reached by no CI step | | 2 | 9.4 | in 9.4's note: openXdox-code's floors read `564/558/6` at `626f2c8d`, not `539/533/6` | | 3 | 4.3 | in 4.3's note, since 4.3 closed on T086 (an open-box note until then): `run_scoped_doc_health` makes three of the four reaches, and the fourth is `session_documents` | | 4 | 3.2 | in 3.2's note: the proxy's refusal was written for NOTHING REGISTERED | | 5 | 10.1 | in 10.1's note: Q-R4 is recorded at `runtime/cli.py:39-42`, not `:40-46` | | 6 | 9.5 | a note on the open box (open for the arc's close, T090): the openDox pin was 11 commits behind, not 9, and T086 has since moved it to `dede32b4` | | 7 | Group 2's heading | in 2.1's note, the box the heading introduces: 1,305 and 1,239 at `1e4a57fb` | | 8 | 3.0 | no new line: 3.0's own note already records it (*"Read at ratification, 2026-09-24"*) | ## 10.3, closed on T099 10.3's box says the openDox root documents the entry point and does not host it, and batch H's addendum makes the documented command `pip install "opendox[local]"`, then `opendox generate-and-open --local …`. Plan 034 maps it to T076, T101 and T099: - **T076** (openDox#17 → `504324de`) documents the install and the start, and adds no `make` target. - **T101** adds the release workflow and the version bump (openDox-code#78 → `d59f3f26`, openDox-code#79 → `dede32b4`). - **T099** publishes that commit at the cut, on Brett Heap's word (`5997633384`). Read from the forge and from PyPI: - the annotated tag `v0.1.0` (`9153c254`) names `dede32b4`, which the openDox root's `contracts/code-pin.yaml` names; - openDox-code's `release` run 37339111713, dispatched on that tag, completed `success` in all four jobs: `build and verify`, `publish to TestPyPI (the dry run)`, `install opendox[local] from TestPyPI` and `publish to PyPI`, whose steps include `PyPI serves the files the build job verified`; - `https://pypi.org/pypi/opendox/0.1.0/json` lists exactly two files, neither yanked: `opendox-0.1.0-py3-none-any.whl` (sha256 `8ecea00db6f9…`) and `opendox-0.1.0.tar.gz` (sha256 `56869b6208a8…`); - openDox#19 → `d77f8cbf` replaces the README's stand-in paragraph. At that commit, the README's first line resolves from PyPI, and no paragraph says that no release is published. ## Plan 034: T095, T099, T002, T007 and T097 Lane openxfactory-4's delegation of 2026-10-05T16:37:31Z asks #1233 to tick these, each with a `Landed` or `Done` bullet in #1226's form, so that release 1 closes at 92 of 96. Its ruling `5999175092` settles three points: (a), (a) and (a). Every sha in the bullets was read from GitHub. - **T095**: openDox-code#75 → `389e5a4a`, which is X. Its `acceptance` job at X is the dispatched run 37333323932: `head_sha` X, job 111841708700, `success`, and its log reads `AT-R1 HTTP half: PASS (314 assertions held)`. - **T099**: P against X. The compare shows four files between them, none a build input, so the ruled check exits 0. Then the tag, the release run, PyPI's two files and openDox#19, as above. - **T002** (ruling (a)): 45 of the 50 slices in the three phases' writer tables were claimed on #656, and the bullet cites each claim. The five that were not are named in T091's form: P1-C, whose claim `5850230046` was posted as a literal file path and never edited, and P1-L, P2-H, P2-L and P2-M. Nothing is back-filled. - **T007** (ruling (a)): batches A to P have landed (P #1230 → `ba6bb870`), and its status sentence now says so. - **T097**: the census and research R16's corrections, with two non-normative notes beside them: - D6's T096 refusals, *"refused by name, with no browser signal"*; - the reachability of #1241's first commit, `f632d70c`, which `oracle-verdict.md` names as holding the bytes that ran (ruling (a)'s wording). It is not on `main`: `refs/pull/1241/head` (`5c663a7e`) reaches it, and so does #1241's branch, which still stands. `main`'s `SHA256SUMS` fixes the reviewed scripts, and the record names the ran bytes by their sha256. ## The checkpoint citations, by path Lane openxfactory-4 ruled at 2026-10-05T16:25:25Z that the notes' `CP1 § n` and `CP2 § n` citations name their records, as the phase-3 notes name `evidence/checkpoint-phase3.md`. `CP1` and `CP2` are the shorthand of lane 4's table, and #1144 never defines them. The change is non-normative and inside T097's R16 scope. `10b6ba05` makes it. The 26 citations, in 25 notes, now read `evidence/checkpoint-phase1.md` (T049, #1204) and `evidence/checkpoint-phase2.md` (T063, #1218). A word diff against `e873b25f` finds those 26 tokens and nothing else; only the 25 paragraphs' line breaks move. ## F4.1, F5.2 and F16.1, closed on T089 T089, phase 3's checkpoint, landed on 2026-10-05T15:26:43Z as #1238 → `fab575ad`. Its record, `specs/034-opendox-standalone-operation/evidence/checkpoint-phase3.md`, extracts each block from #1144 by anchor at `36908480` and runs it from a fresh worktree at the commits phase 3 pinned: openDox-code `dede32b4`, the `code` of the openDox root `e1e3a3c3` (T087), and openXdox-code `56e1c238` (T086). It says of F4.1 and F5.2 *"T097 ticks both in #1144; this record ticks nothing there"*, and plan 034's T089 `Run` bullet says the same. Each box closes on that run, by plan 034's Box accounting: - **F4.1** (`F4.1 → T089`): as extracted (sha256 `8900b985e72f`) and run unchanged, it exits 0 with `1 passed`, `1 passed`, then `no deferred reach names the consumer or the publisher` (§ 1). - **F5.2** (`F5.2 → T086, T089`; RULED `5962785556`, item 1, moves its close to phase 3): whole, as batches C, F, G and K amend it (`OPENXFACTORY` at `36908480`, last step `--chains`), it exits 0. The seven suites pass whole (45, 23, 18, 6, 40, 9 and 12 passed), `test -s` holds, and the last step prints five `admitted:` lines, then `ok: 5 protected edit(s), each entered and holding` (§ 5). One of the five admits T086's edits to `tests/test_session_snapshot.py`, by entries 16, 17 and 19 of `tests/protected_suite_respellings.yaml` at `56e1c238`: the three pre-arc reds that T063 quoted, each entry naming the test it repairs. - **F16.1** (`F16.1 → T083 (at 38d3350e), T089 (batch P's cases, at T087's pin)`): with batch M's line, it exits 0 with `24 passed`, the dialect line, `no model configured: the catalog offers nothing`, `83 passed` and `532 passed` (§ 4). `dede32b4` carries the T100 follow-on (openDox-code#86 → `651c35fe` is its ancestor, and the only commit between T100's landing and `dede32b4` that touches `tests/test_model_binding_trust.py`). That file is the same at both: 160 tests, among them batch P's six `test_F16_1_batch_p_*` cases and A8's `test_A8_a_state_directory_that_is_a_link_trusts_nothing`, none of which exists at `38d3350e`. T083's run there is quoted beside it, as before. ## 3.3, closed on T098 3.3 asks that the carve manifest's `deleted_at_carve` row for `scripts/ideation_dashboard/profile_openxfactory.py` stay BYTE-IDENTICAL. T017, which realizes it, reads the row through the three interim F11.1 runs, *"and T097 ticks 3.3 on all three"*. Each was re-checked on `main` `20ce593e`: - **Phase 1**, T018 (#1202 → `e81eed62`, `evidence/f11.1-phase1.txt`): the amended run at T047's landing prints `requirement 1 holds: 0 note(s) annotated, every other path a declared surface (11.1)`, and the record's T017 section reads the row. - **Phase 2**, T065 (#1217 → `1f670bc3`, `evidence/f11.1-phase2.txt`): the same line, at T064's landing. - **Phase 3**, T098 (#1237 → `20ce593e`, `evidence/f11.1-phase3.txt`), at ARC_TIP `36908480` (T094, #1236). It prints the same line (exit 0) over the arc's three landings, and it refuses a planted path. `docs/opendox-carve-manifest.yaml` is touched by none of the three. Its T017 section finds the row equal at the manifest's introducing commit `17167481` and at that tip, both raw and parsed: `not_moved`, `deleted_at_carve`, no `edits`. - **Re-read for this tick at `main` `20ce593e`:** the row is still equal to `17167481`'s, both raw (4 lines) and parsed. `scripts/opendox_host.py` is still openxFactory's host: T094 modified it and deleted nothing, which F11.1 would have refused. ## 4.3 and 9.2, closed on T086 T086 landed on 2026-10-05T12:23:03Z as openXdox-code#37 → `56e1c238`. It is a squash whose tree (`78ef1ed1`) is that of its head `57bebd8b`. Its pin is openDox-code `dede32b4`, the commit T087 pins (openDox#18 → `e1e3a3c3`). - **4.3** closes *"with the last of"* the nineteen reaches into openXdox, and *"openXdox-code's ratchet (`OPENDOX_BACK_IMPORTS`) is tightened to `(0, 0)` in the same landing"*. At `56e1c238`: - `tests/test_dependency_direction.py` holds `OPENDOX_BACK_IMPORTS = {}`, and `test_the_pinned_opendox_does_not_import_openxdox_back` asserts `(0, 0)`. - openXdox-code#37's body reads that file `17 passed` at the pin, with the census empty. - `consumer_reach.py`, absent at `dede32b4`, was retired by T084 (openDox-code#77 → `e49b17c3`). - **9.2** closes in phase 3 (batch F's addendum), with batch B's note. At `56e1c238`: - `tests/declared_exclusion.yaml` holds 66 entries carrying 68 reasons: 60 `doc_health`, 3 `status-exemption-rail` and 5 `openxfactory-contracts`. - CI's `validate` at the PR's head (openXdox-code run 37307785866) printed `open extraction: the declared exclusion` and `triple: selected=1099 passed=1095 skipped=4 failures=0 errors=0`. - Requirement 9 stays open until T008. ## 16.3a, closed on the T100 follow-on 16.3a is *"Carried out by T100"*, and batch P's addendum adds *"Carried out by a T100 follow-on openDox-code PR (claim `5982447319`), which is no task of plan 034 and lands before T087"*: - T100 landed as openDox-code#82 → `38d3350e`. - The follow-on landed as openDox-code#86 → `651c35fe` (09:49:55Z). It is a squash whose tree is that of its head `aecac805`, and it landed before T087 (openDox#18, 11:58:27Z) and T101. - It carries out Brett Heap's `5982436447`, item 2, and `5983805990`, with the holder's `5984069416`, `5985046107` (C1 to C5) and `5985553609`, and the holder's A8. - Its body records the falsifier: F16.1's block as batch P amends it, run by T089's runner at `aecac805`, exits 0 with `532 passed` in `tests/test_model_binding_trust.py`. The six `test_F16_1_batch_p_*` tests are present at `651c35fe`. - The open trust-time existence check, and the follow-ons of openDox-code#86's eighth Copilot review, move no box of release 1. 16.3a's own text says so for the first, and the holder's `5992038800` for the second. ## Left open, by T097's own text - 9.5, 11.0, 11.1 and F11.1, for the arc's close (T090 to T093), and F9.2, until T008. Nothing else is held. ## T097 is ticked T097's task is *"Tick #1144's release-1 boxes, each with its evidence note: the 63 in the table below."* All 63 are ticked, so `f94be2fd` ticks T097 in the same commit as 10.3, the last box, as lane 4's brief requires. ## The merges of `main` - **`bd32ea9c`** merged batch P (`ba6bb870`). It gave the one conflict this PR expected, at 16.4's checkbox line, which follows batch P's insertion at the end of 16.3a. The resolution took `main`'s text for every hunk batch P changed and re-applied the ticks and notes with the same tool, byte-identical to a fresh re-apply onto `main`'s file. - **`96c74eab`** merged `main` `20ce593e` (#1234 to #1237). It was clean, because none of the four touches #1144's `tasks.md`. - **`f6c6dc3c`** merged `main` `a43845e6` (#1238 and #1239). It was clean too, because neither touches #1144's `tasks.md`. - **`9759313b`** merged `main` `f2acc88c` (#1240), and **`0cde3961`** merged `main` `8a37a087` (#1241). Both were clean, for the same reason. - Every tick since is a fresh re-apply onto `main`'s file. ## Gates, at `main` `8a37a087` and at this head `9713f991`, in one full clone named `openxFactory` | gate | `main` `8a37a087` | this head `9713f991` | |---|---|---| | `python3 scripts/validate-openspec-cli-pin.py --all --no-cache` (CI's form; pinned 1.12.0) | rc 0, `110 passed, 1 failed (111 items)`, `0 UNDISPOSITIONED failures`, 1 accepted exception (`add-chain-attestation`) | identical output, but for the pinned CLI's temporary directory | | `… --change add-neutral-product-standalone-operability` | — | rc 0, `1 passed, 0 failed`, `validated --strict clean` | | `scripts/doc-health.py --single-repo . --as-of 2026-10-05` | `31 critical, 22 error, 69 warning, 20 info`, 0 new regressions | byte-identical report | | `proposal-support.py . verify add-neutral-product-standalone-operability` | ok | identical | | `validate-sequenced-after.py . --ledger-diff` | 229 rows, consistent | identical | | `validate-code-surface.py`, `validate-target-release.py`, `validate-pin-registrations.py`, `validate-document-catalog.py` | rc 0 each (the catalog: 0 errors, 0 warnings) | identical | | `pytest -m "not postgres"` over `tests/doc-health`, `sequenced_after`, `proposal-support`, `former_id_arrival`, `citation_remainder`, `signed_execution_chain`, `openspec_cli_pin`, `target_release`, `code_surface`, `packet_reference`, `scope_globs` | the 8 below fail identically | running (the last full run, at `10b6ba05`: `8 failed, 3427 passed, 1 skipped`) | The 8 failures are environmental, the same 8 at every head. Each needs the `openDox` and `openXdox` legs initialized, as CI's `pytest-suite` does, or a reachable pinned validator: `test_ideation_readiness.py` (3), `test_readiness_dispatch.py` (1), `test_sentinel_vocabulary.py` (2), `test_status_reader_real_lines.py` (1) and `test_chain_reader.py` (1). Re-run alone at `main` `8a37a087`, they read `8 failed` with the same messages. The venv was built by CI's own `pip install --require-hashes -r requirements/hermes-runtime-contracts.lock`, with `LANG=C.UTF-8` and every `GIT_*`/`XF_*` variable unset. The earlier rounds read the same: `main` `c8d80020` against `76d8ff37`, `b7f49673` and `e2efb3a1`, `main` `ba6bb870` against `bd32ea9c`, `cf2c6bdc`, `5870cd00` and `23665543`, `main` `20ce593e` against `935164af`, `main` `a43845e6` against `e873b25f`, and `main` `f2acc88c` against `10b6ba05`. At `f94be2fd` the local run was stopped at 31% on a session swap, and CI's `pytest-suite` passed there. No test, script or workflow reads plan 034's files (`git grep` over `tests`, `scripts` and `.github` finds none). Also checked, on the inserted text at `9713f991`: - every `repo#n → sha8` in #1144's notes (71 distinct pairs, 122 mentions) and in plan 034's bullets is that PR's merge commit, per the forge; - every other sha (`17167481`, `1e4a57fb`, `36908480`, `5c137a90`, `626f2c8d`, `aecac805`, `dede32b4`, `f8a1ece`; in the plan, `5c663a7e`, `9153c254` and `f632d70c`) resolves in its repository, and the file digests match PyPI's JSON and the `SHA256SUMS` files; - each of the 63 `Landed` dates equals the last landing of the box's realizing tasks (F5.1's and F7.1's notes also name T063's later re-run, and 5.4a's names the host line, #1215); - no closing keyword, no `Arc:` line, no host path, and no unqualified reference to another repository, in the diff, the commit messages or this body; - no inserted line is wider than 80 characters, and in #1144 none starts a list, a heading or a table. ## CI and review - **CI at this head `9713f991`:** running. - **CI at `f94be2fd`:** every check-run completed `success`, the 8 required among them (`pytest-suite` 17:13:56Z to 17:31:21Z). - **CI at `10b6ba05`:** every check-run completed `success` (`pytest-suite` until 17:04:09Z). - **CI at `e873b25f`:** every check-run completed `success`, the 8 required among them (`pytest-suite` 15:57:01Z to 16:22:01Z). `lane-line` re-ran on each edit of this description and passed. - **CI at `935164af`, `23665543`, `cf2c6bdc`, `bd32ea9c` and `e2efb3a1`:** every check-run completed `success`, the 8 required among them (`signed-execution-chain-gate`, `lane-line`, `former-id-arrival-gate`, `openspec-cli-pin`, `wallet-validation`, `pytest-suite`, `release-tag-gate`, `openxdox-consumer-gate`). At `5870cd00`, `23665543`'s run superseded its `pytest-suite`. - **Copilot at `76d8ff37`:** one finding, r4179674026: F7.2's note named no landing commit for T058 or T063. `b7f49673` names them (openDox-code#68 → `047bb4fa`, openxFactory#1218 → `a883bbf6`), and 7.1's changelog landing too (openDox#15 → `66758438`). The thread is answered and resolved. - **Copilot at `b7f49673`:** no new finding, and one "previously missed" note: that 5.4a's note wrongly said T059's run deselected the three pre-arc cases. The note was right, and comment `5985467371` gives the records. The cited lines are T059's Falsifier line, written before it landed; T059's `Landed` record and openXdox-code#35's body (rulings 4 and 6, and its F5.2 run) record the deselections. `e2efb3a1` makes the note exact and cites them. - **Copilot at `5870cd00`:** *"Findings: None"*, and one "previously missed" low note: 5.5's note read as though `consumer_reach` *"names the task lists"*. `23665543` says what it meant, that the seven `consumer_reach` names T055 lists are retired. - **Copilot at `e2efb3a1`, `bd32ea9c`, `cf2c6bdc` and `23665543`:** *"Findings: None"*. Where its status line read *"Changes recommended"*, it named only what this DRAFT waits for. - **Copilot at `935164af`:** one finding, r4185667778: 5.4a's note read *"the seven red at both pins"*. `e93ab9fb` reads "the seven reds", and the thread is answered and resolved. - **Copilot at `e873b25f`:** one finding, r4186043242: this description was stale after T089's ticks. It is refreshed here, and the thread is answered and resolved. A second request at that head registered no new review. - **Copilot at `10b6ba05`:** *"Findings: None"*. - **Copilot at `f94be2fd`:** two findings, review `5418196219`. r4186761333: plan 034's opening status still said batch P was to land, against this PR's T007 tick. `9713f991` says that all sixteen batches have landed, A (#1171) to P (#1230), and that T007 is closed. r4186761413: this description was stale at `e873b25f`. It was refreshed at 17:16:28Z, while that review ran, and is refreshed again here for `9713f991`. Both threads are answered and resolved. - **Copilot at `9713f991`:** review `5418607294`, on the push. Its one open item was r4186761413, this description, refreshed here for `9713f991`. Its two "previously missed" low notes, at plan 034's lines 129 ("whose message lacks") and 4496 ("the drive"), need no change, because each phrase is the wording of the record it cites, T091's and `oracle-verdict.md`'s. A comment on this PR gives the records. - Sourcery posted a reviewer's guide, and no comment on the diff. At 17:16:25Z it reported its review budget used, and its check-run reads `skipped` at `f94be2fd` and at `9713f991`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>



Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 5984809313)
Plan 034, T094's ahead PR (
specs/034-opendox-standalone-operation/tasks.mdat openxFactorymainba6bb870, T094's After line: "the ahead PR (E1 (a), a non-arc PR with no task of its own: the golden, the usage line and the rebound-Host case)"). The rulings are E1 (a) and E3 (a), recorded with5970369724; the tree at 32,5970917267; and E3 (a)'s reading, E5 (a) and the rebound-Host case,5972924576. This PR makes three openxFactory test surfaces hold at BOTH openDox legs:d5098297(code047bb4fa) and openXdoxf257e021(code6a3b93b9);dede32b4, the commit that T087's openDox roote1e3a3c3(T087, phase 3's openDox root pin: code → dede32b4 (plan 034, T090 steps 1–2) openDox#18) pins.Not an arc landing. Per T091 and plan.md § "The trailer, the guard and Rule 6", no commit of this PR and no line of this body carries the arc trailer. It touches no
openspec/path, so no Rule 6 window applies. No commit and no line here carries a closing keyword. It moves no pin and carries no host wiring (E3 (a)): T094 moves both pin pairs.The three commits were prepared by lane openxfactory-4 in its T094 prep and are carried onto
mainunchanged (the same patch ids). Their "Measured:" paragraphs are that prep's runs; this body's are below.1661c63dmergesmain's one later commit (T007 batch P, #1230), which touches none of these files.What it changes
tests/domain_profile/fixtures/cli-help-tree.phase3.golden.txt(new)--helptree at phase 3's leg, 32 sections: T070'sgenerate-and-open --local; T079's and T080's--model, thenoneauth kind and the optional credential reference onmodel-binding addandedit; T084's program nameopendoxin every usage line, with openDox's own root description and epilog; and T100'smodel-binding trust, the 32nd entry point (research R8). It lives outsidetests/ideation-dashboard/, amoved_paths:prefix of the carve manifest, where a new file iscarve-file-undeclared.tests/ideation-dashboard/test_extension_point_parity.pypinned_help_goldenpicks the golden off the pinned parser, never off the text compared: itsprog(ideation-dashboardbefore T084,opendoxfrom it) and whethermodel-bindingofferstrust(T100). A leg with one change and not the other is refused by name. Two new cases: the two goldens hold the same entry points plusmodel-binding trust, and the selector's negative control.tests/ideation-dashboard/test_cli_column_split.pytest_a_contributed_verb_is_reachable_in_both_documented_invocationsreads the usage line's program off the pinned leg,cli.PROG(T084), andideation-dashboardwhere the leg has noPROG(E5 (a)).tests/ideation-dashboard/test_doxbench_routes.pytest_console_gate_refuses_host_not_naming_the_bound_portexpects403 invalid_host, fromserve.FOREIGN_HOST_*, where the leg has T103's Host gate (openDox-code#80), andconsole_requiredwhere it does not. Either way the request is refused and the model port is never asked.serve.FOREIGN_HOST_ERROR), never off the answer.None of the four files is one of F11.1's declared surfaces (
HOST,HOST_TESTS,PIN_PAIRS,COMPOSITION_TESTS,ADMITTED_ARC_EDITS), which is why they move here and not in T094's arc landing.The golden, regenerated from T087's commit
The tree is the parity test's own walk (
walk_parserandhelp_tree, atCOLUMNS=100), printed by a probe that makes the suite's two set-up calls (carved_reach.install(tests=True),register_openxfactory()) with the openDox code leg at the named commit:047bb4fa, the current pin (the control)9cbeca99…tests/ideation-dashboard/fixtures/cli-help-tree.golden.txt, the goldenmainalready holdsdede32b4, T087's (roote1e3a3c3)9cc6e383…38d3350ewith #84af2a2efband #8696ae8816merged (the drift check before they landed)9cc6e383…0.1.0changespyproject.tomlonly. The parser has no version flag and the tree carries no version string.6a3b93b9and at T086's head (openXdox-code#37,69997db7).The measurements
Every local run follows
pytest-suite's own steps: a checkout namedopenxFactorywithopenXwallet, andopenDoxandopenXdoxrecursively, initialized; Python 3.12.3; the hash-pinned lock; node 24; the pinned OpenSpec CLI 1.12.0;PINNED_CORE_CHECKOUTat codexFactoryb21f0100; thenpython3 -m pytest tests/ -q -m "not postgres".1661c63dpytest-suite(run37311052114): 8929 passed, 6 skipped, 0 failed:selected=9347 passed=9341 skipped=6 failures=0 errors=0, margin 2297,skipped==6; the freshness verifier and the vector replay passed.1661c63dvalidate-carve-manifest: OK, 456 rows, none undeclared. Full suite 8930 passed, 5 skipped, 0 failed:selected=9347 passed=9342 skipped=5 failures=0 errors=0; the freshness verifier and the vector replay passed.7657cc3e, before the merge ofmainvalidate-carve-manifestOK; full suite 8930 passed, 5 skipped, 0 failed:selected=9347 passed=9342 skipped=5 failures=0 errors=0, the freshness verifier and the vector replay passeddede32b4and openXdox code at T086's head69997db7, overlaid with no pin moved6a3b93b9RouteBindingError: no_serve_index, no_handle_gate_action), because phase 3's openDox leg no longer carriesconsumer_reachfor phase 2's openXdox leg. No phase pins this mix; T094 moves both pairs together.test_the_core_dispatch_table_is_unchanged[_route-pinned0](the/capabilitiesarm reaches_serve_bytes,_session_repositoryandinstall_reportfrom T103) andtest_the_mixins_precede_simplehttprequesthandler_in_the_mro(consumer_reachis gone). Both are named composition tests under R1Q2 (a), and T094's arc landing updates them.tests/domain_profile/test_session_worktree_book_scan.py::test_worktree_container_is_gitignored_in_the_aggregation_repofinds the aggregation, runs and passes, where a runner skips it. CI's 8929 passed + 6 skipped and P's 8930 passed + 5 skipped are the same 8935 tests. The local five are the twotests/notebooklmmodule skips, the two conformance-gate self-gate skips and the LedgerxFactory fixture-drift guard.Review
1661c63dLanding
openspec/path, so there is no Rule 6 window.🤖 Generated with Claude Code
Summary by Sourcery
Hold CLI help, usage, and rebound-Host test surfaces consistently across the current and phase-3 dependency pins.
Enhancements:
Tests: