Repository navigation
Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed - #1252
Conversation
…10d3 and green The realization of the ratified change landed as PR #1243, merged 2026-10-06T03:37:58Z as 92010d3 on Brett Heap's word "land #1243 when green". It landed by squash: 92010d3's single parent is ba89e04 and its tree fd3b9f0 equals the tree of the pull request's final head 6ab7126, so the checks at that head cover the merged bytes exactly. Every required context passed at 6ab7126. pytest-suite run 37407361293 read selected=9831 passed=9825 skipped=6 failures=0 errors=0, and the push run on main at 92010d3 itself (37409899722) reads the same. SonarCloud is not required; its one S8707 finding was dispositioned before the landing (#1243 comment 6008804840). The tick also corrects one sentence of the 2026-10-05 addendum, written before the landing: after the squash, d2baf6f and the ratified revision 8acd2ec are ancestors of refs/pull/1243/head, not of main. The ratified delta's blob (a4865bd) is the same at 8acd2ec and on main. Task 3.2, the archive, stays open in this commit. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The governed wrapper refuses to archive a change with an open box, so 3.2 is ticked before the run. Its condition, merged and green realization, is recorded at 3.1. The run itself is the next commit, and its output and the promotion's measurements are recorded under 3.2 in the commit after that. The archive is prepared on a DRAFT pull request. It lands by merge commit, never squash, and only on Brett Heap's archive word, which has not been given. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nce capability after realization 92010d3 PREPARED, NOT YET AUTHORIZED. This commit is the archive act, carried on a DRAFT pull request. It lands by merge commit, never squash, and only on Brett Heap's separate archive word, which has not been given. WHY IT MAY ARCHIVE. code_surface is non-empty (openxFactory), so under release-realization the packet archives on merged-plus-green realization evidence, and that evidence exists. The realization, Speckit feature 037, landed as PR #1243 -> 92010d3 (2026-10-06T03:37:58Z, by squash from head 6ab7126, whose tree it carries unchanged) on Brett Heap's word "land #1243 when green". Every required context passed at that head, and pytest-suite decided success on main at 92010d3 itself, run 37409899722 (selected=9831 passed=9825 skipped=6 failures=0 errors=0). Task 3.1 cites the rest. PERFORMED THROUGH THE GOVERNED WRAPPER, never a bare openspec archive: TZ=UTC python3 scripts/proposal-support.py . archive \ add-factory-mcp-conformance --yes exit 0, run 2026-10-06T16:21:19Z to 16:21:30Z: ORIGIN RETAINED add-factory-mcp-conformance (declaration unchanged since the ratifying commit 92010d3) Totals: 1 passed, 0 failed (1 items) Task status: Complete factory-mcp-conformance: create Applying changes to openspec/specs/factory-mcp-conformance/spec.md: + 8 added Totals: + 8, ~ 0, - 0, -> 0 Change 'add-factory-mcp-conformance' archived as '2026-10-06-add-factory-mcp-conformance' NO SUPPORTING DOCS (origin retained, nothing to package) The CLI is the content-addressed @fission-ai/openspec@1.12.0 pin, not the 1.13.1 on PATH. --date was not passed, so the directory takes today in UTC. ORIGIN, ACROSS BOTH HISTORIES. On main the ratifying commit is the squash 92010d3, the first commit there whose proposal.md says Status: ratified. On the original lineage it is 54bce01. The .openspec.yaml blob is c1e5cd9 at 54bce01 and in the archive, so the origin block has not moved since ratification on either reading. openspec/origin-dispositions.yaml is not edited. THE PROMOTION, MEASURED BY CONTENT. The delta is all ADDED over a new capability directory: openspec/specs/factory-mcp-conformance/spec.md, its Purpose taken from the delta's own Purpose section and eight requirements with twenty-two scenarios. Each requirement block was extracted by heading from the archived delta and from canon, and hashed; all eight are byte-identical (828, 945, 941, 767, 951, 826, 1,039 and 1,251 bytes). Canon holds no requirement the delta lacks. Capability directories go from 66 to 67, and no other file under openspec/specs/ changes. THE PACKET MOVES AS NINE R100 PURE RENAMES; the 3.1 and 3.2 ticks landed in the two commits before this one. README: the doc index now points at the promoted specification, with the archived proposal beside it, and the OpenSpec Records bullet moves from Active to the head of Archived. Its pull-request link carries the ARCHIVE-PR-NUMBER-PENDING marker until the pull request exists. NOT IN THIS COMMIT. The sweep-ledger row is seeded once a pull-request number exists. The wrapper run is recorded under the archived 3.2, and the links the move breaks are repointed, in the commits after this one. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The run happened in the commit that moved this directory (7102cd4). This commit records it under 3.2, as the item's pre-run tick said it would. It records the wrapper's decisive lines, the promotion verified by content (eight requirement blocks, each byte-identical between the archived delta and canon), and provenance: nine R100 renames, the origin block unchanged since ratification on both histories, and the original commits reachable through refs/pull/1243/head. It also names one relative link in the archived proposal.md that now resolves one level short. Those bytes are kept as ratified, because repairing an archived record needs a recorded ruling first. And it names the items this archive does not settle, which still await Brett Heap's rulings. tasks.md only; no requirement or scenario text moves. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eight markdown links outside the packet named its active path. They now name openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/: two in the runbook docs/factory-mcp-conformance.md, one in the brainstorm factory-mcp-overview.md, and five in Speckit feature 037 (data-model.md, spec.md twice, verification.md twice). This is the shape 687b85e used for feature 005 after its packet archived. The quickstart's third command, validate-openspec-cli-pin.py --change add-factory-mcp-conformance --strict, refuses once the change is archived (exit 2, pin-report-unreadable, measured in this clone). It now runs --all --strict, with a sentence saying why and linking the promoted specification. verification.md's record that --change passed at a12c702 stays as written, because it reports a measurement taken then. Every markdown link whose target names factory-mcp-conformance resolves (31 checked, 0 broken), and no file names the active path any more. Link targets only; no requirement or scenario text moves. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviewer's GuideThis PR archives the ratified add-factory-mcp-conformance packet after documenting its merged and green realization, promotes its eight requirements and 22 scenarios into the canonical factory-mcp-conformance specification, and updates all affected documentation and links while preserving provenance and pending governance decisions. Flow diagram for factory MCP conformance archivalflowchart LR
A["Ratified change packet"] --> B["Merged and green realization\nPR #1243 → 92010d3e"]
B --> C["proposal-support.py archive\nexit 0"]
C --> D["Promoted specification\n8 requirements, 22 scenarios"]
C --> E["Archived packet\n2026-10-06-add-factory-mcp-conformance"]
D --> F["Documentation and links updated"]
E --> F
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
…l request in the README --moved-by needs a real pull-request number, and this branch had none until #1252 was opened, so the row is seeded here rather than in the archive act. That follows the order 5216c70 and 97d9fa5 used. Seeded by the machine, not by hand: python3 scripts/validate-sequenced-after.py . --seed-ledger --moved-by '#1252' -> wrote tests/sequenced_after/corpus-ledger.yaml (231 rows, 1 moved by #1252) - add-factory-mcp-conformance python3 scripts/validate-sequenced-after.py . --ledger-diff -> per-change sweep ledger consistent with the corpus (231 rows) The diff is one line: state active -> archived, moved_by "#1243" -> "#1252", and moved_on 2026-10-05 -> 2026-10-06. A flipping row takes its archive directory's date. No other row moved. README: the archived bullet's ARCHIVE-PR-NUMBER-PENDING marker (two occurrences, one line) now names PR #1252. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brett Heap gave the archive word on 2026-10-06, in session, verbatim "archive add-factory-mcp-conformance when green". It is RULED in opensoft/brett-wip lanes/log/openXfactory-5.md at 2026-10-06T17:25:24Z (commit 5f02a237), against openspec/changes/add-factory-mcp-conformance. No GitHub comment carries it, so the register entry and this record are where it lives. The archived tasks.md 3.2 gains one bullet naming the word, its date and the RULED cite; the pre-run tick text, which says the word had not been given when the box was ticked, stays as written. The README archived bullet now quotes the word with the same cite, in place of the sentence that deferred it to the landing lines. The pull request still lands by merge commit, under a Rule 6 window, once its gates, checks and Copilot review are green. No requirement or scenario text moves. Refs #1243 Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
The advisory floor escalation requires owner disposition and coordinated repair, while required validation remains pending.
Review effort: Balanced
Findings: 1
Open (1)
What changed in this PR
Archives the realized Factory MCP conformance change and promotes its ratified requirements into the canonical specification.
Changes:
- Promote eight requirements and 22 scenarios without changing validator behavior.
- Preserve the proposal packet and record realization and archive evidence.
- Update documentation links, validation guidance and lifecycle ledger.
| File | Description |
|---|---|
| tests/sequenced_after/corpus-ledger.yaml | Record archived state and provenance. |
| specs/037-factory-mcp-conformance/verification.md | Repoint historical evidence links. |
| specs/037-factory-mcp-conformance/spec.md | Repoint governing specification links. |
| specs/037-factory-mcp-conformance/quickstart.md | Adjust validation for the archived change. |
| specs/037-factory-mcp-conformance/data-model.md | Repoint design reference. |
| README.md | Index promoted specification and archive evidence. |
| openspec/specs/factory-mcp-conformance/spec.md | Add canonical requirements and scenarios. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/tasks.md | Record closure and supporting evidence. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/specs/factory-mcp-conformance/spec.md | Preserve ratified delta. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/review/validation-2026-09-07.md | Preserve validation record. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/review/ratification-2026-09-07.md | Preserve ratification evidence. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/review/codex-baseline-2026-09-07.md | Preserve compatibility baseline. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/review/claim.md | Preserve authoring claim. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/proposal.md | Archive governing proposal. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/design.md | Archive ratified design. |
| openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/.openspec.yaml | Preserve origin metadata. |
| openspec/changes/add-factory-mcp-conformance/tasks.md | Remove active-path task record after relocation. |
| ideation/brainstorm/factory-mcp-overview.md | Repoint proposal link. |
| docs/factory-mcp-conformance.md | Repoint governance and baseline links. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Lane: openxfactory-5 (openXfactory-5) Disposition of the non-required Brett Heap, 2026-10-06, in session, verbatim: "land #1252 and do the floor repair". This chose option (a): land this archive with the
|
|
Lane: openxfactory-5 (openXfactory-5) LANDING — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-06T18:57:52Z, PR #1252 into opensoft/openxFactory main |
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 3 days and 2 hours by commenting |
|
Lane: openxfactory-5 (openXfactory-5) Correction to the repair plan in comment 6023311177. A read-only recon of the floor machinery found that the lanes' own automation already carries steps (2) and (3). No hand pull request will be opened for either one, because it would collide with the bots.
|
…5b1618f (#1138) Advance the pinned decision core to fe9a6f5b, the merge of codexFactory #524, which regenerates the openxFactory review-authority floor block from 66 to 67 entries and so covers the four specs added to base since b21f0100 (corpus-adapter-seam, domain-mapping-declaration, packet-citation-report and factory-mcp-conformance). This discharges the merge-master-approval floor_incomplete red admitted at #1252's landing. Lands on Brett Heap's word "land #1138 when green" (2026-10-06); the advisory merge-master-approval red at the head is the pre-landing reading of the old pin, dispositioned on the PR. Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Take the nine items of the independent review of PR #1255 in one pass: 1. MAJOR. The record no longer reads or tallies single-repository.yaml. The ratified requirement makes the advisory its only reader. It is dropped from the reads, the 28 evidence cells, the counts, the re-run recipe and the 5.7 tick; one sentence says why, and discloses the discarded request. 2. Rows 18, 19, 20, 23 now state both facts: a product with code and specs, and the naming barrier. Note B says the barrier is the documented in-place posture, not a hard check in adopt-project.py. Row 22 has no spec corpus at its measured sha and keeps its "a tool" reason. 3. The external row cites the inventory's own definition and is called a stated departure from 5.7's text, in note D and in the tick. 4. The base sentence names #1252 and #1254; fc4fa0f is #1253's merge. 5. Rows 11 and 12 drop the "already elected" clause. 6. Private rows' reasons are described as naming no path from their tree. 7. Section 1 states the inventory's scope (brett-wip, MedxGlass). 8. The 5.7 tick names PR #1255. 9. The naming verdicts are identical at the pinned openRepoShape e9c4827b. Counts are unchanged: 3 Triads, 6 legs, 28 single; 12 migrate, 15 record staying single, 1 none made. Lane: codeXfactory-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n 038) (#1251) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) **T002, plan 038: release 2's base (`evidence/r2-base.md`), and plan 038's `tasks.md` bookkeeping, items 1 to 15.** Bookkeeping and evidence, so this PR carries no `Arc:` line. It touches no `openspec/changes/` path, so no Rule 6 window applies. ## From plan 038's `tasks.md`, T002 - **Task**: T002, "Release-2 base, and the re-measure at the ruling". Record in `evidence/r2-base.md` every repository's `main` (research.md's R0 command), the box census, and `PACKET_MERGE=94b6f7f1` for F11.1, with lane 3's composed re-run quoted against R2-INV-P4F's 174. **README**: links `evidence/r2-base.md`. **After**: T004. **Lane**: 4 (lane 3 for the composed run). - **Realizes**: none (bookkeeping; FR-025). **Falsifier**: T002 names none. Its gates are the brief's, and are quoted under "Gates" below. - **Ruled / Decisions**: T002 carries none. Part 2 encodes rulings already posted on `#656`, each cited by comment id, and takes no decision of its own. ## Part 1: `evidence/r2-base.md` (new), linked from the README's feature-038 entry Each figure is a command quoted with its output, or lane 3's measurement quoted and attributed. - **Every repository's `main`** (the R0 command, run 2026-10-06T16:09:44Z to 16:10:31Z, and again at 16:26:12Z): `openDox-code 34c20641`, `openXdox-code 56e1c238` (then `c6d15b27`, T020's #39, committed 16:10:44Z), `openDox d77f8cbf`, `openXdox 9564d5d9`, `openDox-spec 7db9438b`, `openXdox-spec f088b097`, `openxFactory 5145683`, `xFactory 1047586d`, `codexFactory 563212a1`. The file gives each full SHA with its commit date and subject, against the R0 values of plan time, and what moved. - **The box census**: plan 034's `box_census.py` over #1144's `tasks.md` at `51456835` reads `total 125 Counter({'x': 74, ' ': 42, '~': 9})`. At `ce64afc9` it reads the same, and `diff` of the two full outputs is empty: delta 0. Batch Q (#1248) landed between them, adding 526 lines and removing none. - **`PACKET_MERGE=94b6f7f1`** (`94b6f7f13b45c351b9142345738965c974b7dd37`), on `origin/main`'s first-parent line; 83 first-parent commits since, 3 with the `Arc:` trailer (release 1's consumer pins). - **Lane openXfactory-3's composed re-run**, quoted from `lane3-to-lane4.log` (09:52:07Z and 09:52:31Z), claimed on `#656` `6013610393`: "174 red vs 174 (170 failed + 4 errors, 668 passed ...)"; "moved: none"; "5 suites / 210 cases"; openDox installed from openDox-code `main` `a9ac96f9` while openXdox-code's `pyproject.toml:126` and openxFactory's nested `openDox/code` pin `dede32b4` (v0.1.0); openxFactory `main` `0f2a87f6` to `92010d3e`. I verified one thing there: of the 48 files that differ, the two under `scripts/` are `scripts/ideation_dashboard/nightly_lane.py` and `scripts/validate-factory-mcp.py`. Nothing was re-run. ## Part 2: plan 038's bookkeeping Every item is a holder ruling or a Brett ruling already posted on `#656`, encoded as worded. The files are `tasks.md`, `plan.md`, `data-model.md`, `contracts/health-finding.md`, `contracts/cli-http-health.md` and `checklists/requirements.md`. | # | Task | What changed | Record | |---|---|---|---| | 1 | T022 | Files gain new `tests/test_composed_placements.py` (openXdox-code#41) | holder `6016356225` | | 2 | T023 | Files gain new `tests/test_swb_session_transport.py` (the bound and unbound probes in one committed file; #42) | holder `6016676145` | | 3 | T026 | Files gain `tests/test_protected_suite_check.py`, and T020's `tests/conftest.py` and `tests/test_host_plane.py` after T020 lands; 'cluster' respells to "group neighbourhood"; the single-writer table's chain | holder `6016356225`, Brett `6016648451` | | 4 | T029 | Files gain the two floor lines `MIN_SELECTED` and `MIN_PASSED` of openXdox-code's `validate.yml`, raised ONCE at its final head after merging `main`; no other PR raises them; a new single-writer row | holder `6017860539` | | 5 | R-1 (a), widened | SIX spans of `tests/test_staging_workbench.py` (`_CREATE_HARNESS`, `_SESSION_HARNESS`, `_run_create`, `_run_session`, `_hostile_descriptors`, `_HOSTILE_HARNESS`), served display, in T026, plan.md § R-1 and the ruled-answers row | Brett `6016648451` | | 6 | F12.1 | `--chains`, carried out by T026 and T029; the amendments table gains the row | Brett `6016648451` | | 7 | T073 | After gains T095+; new T094 (lane 3, read-only, claimed `6017801219`) and T095+; T073's PR stays a DRAFT until they land; the lane table, the critical path, the slice tables and the dependency list follow | holder `6016982816` | | 8 | T073 `open_until` | `doc_health` keeps its words plus lane 3's clause; `status-exemption-rail` and `openxfactory-contracts` read the ruled sentence, quoted | holder `6016982816` | | 9 | T076 / F9.2 | the WRITTEN DISPOSITION naming `realize-doc-health-direction-arc` as F9.2's carrier, in T076, T084, the box-accounting row and plan.md's ARC-5 | holder, ARC-5 (a) `6013547504` | | 10 | T003 | ticked, CLOSED ON THE RE-CHECK | holder `6017901451` | | 11 | T074 | Files gain the six openXdox-code files of the arc change's `design.md` § 10; the single-writer table: `validate.yml` T029 (floors) then T074 (`LEFT_OUT`) | holder, from #1247's `design.md` § 10 | | 12 | `identity` | stored (a `health_findings` column, canonical sorted-key JSON, capped) and emitted, bounded as T040's schema bounds it: `contracts/health-finding.md`, `data-model.md` § Finding, `contracts/cli-http-health.md`, plan.md, T041, T042 and T046; the cross-run collision stays an accepted limit, detectable now, whether the engine reports it being T046's | holder `6018624750` | | 13 | ticks | T005 #1248 `91e961a0`; T008 codeXfactory/codexFactory#515 `f1b019fe`; T010 openDox-code#89 `34c20641`; T040 openDox-spec#17 `7db9438b`; T070 #1247 `51456835`; and, on the coordinator's later word, T020 openXdox-code#39 `c6d15b27` and T024 openXdox-code#38 `8b64fae0`. Each was verified with `gh pr view <n> -R <repo> --json mergeCommit` | landed 2026-10-06 | | 14 | T073 | Files gain new `tests/test_declared_rail_registration.py` (the conftest rail block's 5 lone cases with stand-in rails) | holder `6020698021`, answering `6020683941` | | 15 | T026 | the H-2 in-test respellings move from 17 to 20: `test_gate_off_descriptor_is_the_real_cli_invocation`, `test_gate_off_session_affordances_are_the_real_cli_invocations` and `test_the_notebook_refresh_is_a_descriptor_in_BOTH_gate_postures`, admitted under CF-4; plan.md's CF-4 row notes it | holder `6020859092` | T002 itself is ticked. **Items skipped because already present: none.** Each was searched for at `origin/main` (`git show origin/main:<file> | grep -c`), and none was in place. **Where an item could not be encoded exactly as worded, or needed a reading:** - **Item 9**: no task of § "Close" archives #1144 (the archive act stays the holder's, ARC-5 (a)). The coordinator accepted placing the disposition in T084, the last task to edit #1144's `tasks.md`, and in T076 and the F9.2 accounting row. - **Item 3, the chain**: the rulings order T020 before T026, and T020 before T021, but not T021 against T026. The table says "T021 and T026, in landing order", as the coordinator confirmed. - **Item 12's grep**: the brief's `\|` is a markdown-table escape, so I ran it with plain `|`. Four hits remain, each the note that reverses the old wording ("reversing the engine-internal refinement"). The ruling gives no cap value, so none is written: the engine caps it, and the cap is T041's. - The commit trailer names the model that wrote it, `Claude Sonnet 5.5`, as the session's attribution rule requires, where the writer rules spell `Claude Opus 5.5 (1M context)`. ## The holder's answers on this PR's four open questions 1. **`tests/test_declared_exclusion.py`** is NOT in T073's Files: T073 measured its lone CI green while touching only its own four files. It IS in T074's Files (item 11). 2. **FR-011 and an `identity` response-shape falsifier** are DEFERRED to the holder's next bookkeeping batch, with T094's T095 to T104 entries. This PR keeps to its list, so `spec.md` is as `origin/main` has it. (Copilot asked; the edit was made at `76b9428b` and taken back at `7ddfda5e`.) 3. **The `identity` cap is T041's**: the contract module owns the field bounds, and T042 stores what T041 bounds. T041's and T042's entries, `data-model.md` § Finding and `contracts/health-finding.md` say so (`80c6fee7`). No value is written. 4. **T003**: the constitution's analyze gate was met by round 1 (`evidence/analyze-round-1.md`) and its re-check (`6013547504`). T003 was a discretionary second round, so the closure (`6017901451`) stands. ## Review and gates | Copilot at | verdict | findings | answered | |---|---|---|---| | `8b0a535d` | Changes recommended | 5: FR-011 and the identity's response shape; an exact aggregate cap; the T003/T004 states; the F9.2 disposition against ARC-5; the task count | the T003/T004 states, ARC-5 and the count were fix-now, fixed in `76b9428b`. The cap is an accepted limit (no value is written, by the holder's word); FR-011 is the holder's (open question 2) | | `da00b298` | Changes recommended | 3 new: FR-011 against the bookkeeping scope; T003 without a fresh analyze; T020's tick against the old body | FR-011 taken back in `7ddfda5e`; T003 is the holder's (open question 4); the body is corrected (item 13) | | `7ddfda5e` | Needs a closer look | 0 new threads; the 2 it listed as "previously missed" are those two | answered, see the threads | | `80c6fee7` | Needs a closer look | 2 body-level findings: `identity` should be NOT NULL in the store's model; `r2-base.md` called its figures an input to T004's ruling, but T002 follows T004 | both fix-now, fixed in `fb57b851` | | `f0f6923d` (final) | Changes recommended | 1: the "stored identity makes a collision detectable" sentence overstates it for an exception-only finding, which is never stored | accepted limit (#656 `5988818366`): the sentence is the holder's own wording (`6018624750`), and what T046 can detect from stored rows is T046's. Answered and resolved; no push | 9 threads, 0 unresolved. Every reply cites its commit or ruling. - **`python3 scripts/validate-openspec-cli-pin.py --all`**, in the clone named `openxFactory`, at `f0f6923d`: exit 0, `Totals: 113 passed, 1 failed (114 items)`, `0 UNDISPOSITIONED failures`. The one failure is the dispositioned `add-chain-attestation` finding, the same on `main`. - **openxFactory pytest**, locally at `8b0a535d` (CI venv, `-m "not postgres"`, TMPDIR under `~/.local/state`): `1 failed, 9206 passed, 7 skipped, 338 deselected, 9 warnings, 598 subtests passed in 2589.39s`. The one failure is `tests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization]`, a 30s `TimeoutExpired`. It fails the same way on `origin/main` in the same clone (`1 failed, 1 passed in 54.40s`), and the CI job passes it, so it is pre-existing and environmental. My later commits change documents only. - **Doc-health**, `scripts/doc-health.py --single-repo .`, branch `f0f6923d` against `origin/main` `c44c1610` in the same clone: the two reports are byte-identical (sha256 `3b2e1f59db747178…`; `Findings: 31 critical, 26 error, 69 warning, 20 info. New regressions vs previous report: 0.`). So no new error. - **CI at `f0f6923d`**: all 15 check runs completed at the head: `pytest-suite` success (19:00:34Z to 19:27:22Z), `SonarCloud Code Analysis` success, `doc-health-py314`, `openxdox-consumer-gate`, `openspec-cli-pin`, `wallet-validation`, `clearing-dispatch-gate`, `signed-execution-chain-gate`, `former-id-arrival-gate`, `release-tag-gate`, `openreposhape-pin` and the three `lane-line` runs all success. One is RED, `merge-master-approval`, and it is inherited from `main`: its floor evaluation stops at `floor_incomplete`, "4 covered-pending path(s) exceed the tolerance of 3", the four being `openspec/specs/corpus-adapter-seam`, `domain-mapping-declaration`, `factory-mcp-conformance` and `packet-citation-report`, each `added_to_base_after_pin`. This PR touches no `openspec/specs` path. #1252 (the archive that promoted `factory-mcp-conformance`) merged at 18:58:07Z, and this run (18:59:37Z) is the first gate run after it; every other open PR's last run predates it. It passed on this PR at `7ddfda5e` and `80c6fee7`. A rerun reads the same base, so the pin or floor refresh (#1138, "Advance the pinned decision core") is what clears it; the holder rules on landing over it. - **`main` moved once more after these gates**, to `a2dc658d` (#1254, which touches `contracts/schemas/project-register.schema.yaml`, `docs/project-repo-schema.md` and `openspec/changes/prefer-triad-project-shape/tasks.md`). It shares no file with this PR, and `git merge-tree` reports a clean merge. I did not merge it in, since each merge restarts the 27-minute gate; the holder can run `gh pr update-branch` before landing if wanted. ## Files changed - `specs/038-opendox-document-tool-self-maintenance/evidence/r2-base.md` (new) - `specs/038-opendox-document-tool-self-maintenance/tasks.md`, `plan.md`, `data-model.md`, `checklists/requirements.md` - `specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md`, `contracts/cli-http-health.md` - `README.md` (the feature-038 entry's evidence list, one link) ## What is NOT done - No requirement, scenario or spec delta is touched: `spec.md` is as `origin/main` has it, and nothing is under `openspec/changes/`. - No box of #1144 is ticked, and T071 and the other tasks are left as they stand. - T046's falsifier is unchanged: whether the engine reports a cross-run collision is named as its concern in `contracts/health-finding.md` only. - Lane 3's composed run is quoted, not repeated. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…as they stand' (#1250) Lane: openxfactory-1 ## The two words Brett Heap gave both words on 2026-10-06, in session to lane `openxfactory-1`. Both are RULED lines on the estate's lane register, with object `opensoft/openxFactory:openspec/changes/add-worker-input-budget`. 1. **The ratification.** > 0.4: (a) ratify as they stand It answers `tasks.md` 0.4, *"Ratify or amend the two spec deltas"*. The question was put to him as *"task 0.4: (a) ratify the two doc-health deltas as they stand, or (b) amend first"*, and he chose (a). RULED at **2026-10-06T13:55:03Z** (`opensoft/brett-wip` commit `06709554`, `lanes/log/openxfactory-1.md`). 2. **The origin file.** > #1250: (i) add the origin file It answers the RULING NEEDED this PR raised on Copilot's finding `r4196698454`. Option (i) was put to him as adding `.openspec.yaml` in the ratifying commit, with values following the 2026-08-25 origin sweep `b7513733`. RULED at **2026-10-06T17:24:57Z** (`opensoft/brett-wip` commit `f739ab74`). This lane has held the change's claim since 2026-09-24T16:33:03Z. ## What is ratified `add-worker-input-budget`'s two `doc-health` spec deltas, as they stand and with no amendment: - **MODIFIED: *Sweep sequencing and snapshot consistency*** (three scenarios); - **ADDED: *Bounded worker input budget*** (six scenarios). The ratified text is `specs/doc-health/spec.md` blob `9a817d65`. That blob is the same at #1137's merge commit `9da52e31` and on `main`. **No requirement or scenario text moves in this PR.** ## The origin declaration, on the second word **Why it is needed.** `document-lifecycle` § *Proposal origin declaration* says: > A proposal whose own `Status:` declares `ratified`, or any standing beyond it, SHALL carry approval provenance in its origin. This packet had no `.openspec.yaml`, and it was the only active change without one. **What it declares.** The new `openspec/changes/add-worker-input-budget/.openspec.yaml` is hand-written in the form of sweep `b7513733`. Every value is derived from the packet's own record and is folded or plain, so the file parses: - `schema: spec-driven`; - `created: 2026-09-22`, from the packet's true first commit, `ee2185d6` (2026-09-22T01:26:47Z); - `origin.kind: ad_hoc`. No `Staging ID:` header and no staging topic's exit names this change, checked in both directions; - `origin.id: openxFactory:adhoc:2026-09-22-add-worker-input-budget`; - a folded `reason` that quotes the second word; - the drafting pair: lane `openxfactory-1`, on *"brief a writer to add the input-size guard"*, `proposed_on: 2026-09-22`; - the approval pair: Brett Heap, *"0.4: (a) ratify as they stand"*, `approved_on: 2026-10-06`. **What it changes.** - `proposal-support.py verify add-worker-input-budget` now **passes**, where `main` refuses it with *"no origin declaration"*. - `proposal-origin`'s WARNING for the missing origin is gone. - No other finding moves. ## What this PR does not do - **Group 4's 4.1 sequencing question stays open.** The *"Sequencing tension, named rather than hidden"* note in `tasks.md` asks Brett Heap a question. Was *"land the input-size guard when green"* the approved exception, or should 0.4 have gated 4.1? Neither word answers that question, and the note does not move. - **No archive.** The archive is a separate act. - **No other substance moves.** That covers proposal substance, `code_surface:`, `target_release:`, realization and the sequenced-after ledger row. - **It lands by SQUASH.** The lane's coordinator lands it in a Rule 6 window. The archive PR is a separate landing, as a merge commit. ## Every changed line, file by file **`openspec/changes/add-worker-input-budget/proposal.md`** (the front-matter header): - `Status: draft` becomes `Status: ratified`. - One line is added after it: `Ratified: 2026-10-06 by Brett Heap (openxFactory repository owner) — …`. The line carries: - the 0.4 word, verbatim, and the question as it was put; - the register RULED line; - both requirement names; - the #1137 `9da52e31` baseline; - "archives nothing" and "does not answer the Group 4 sequencing question on 4.1"; - the record path. **`openspec/changes/add-worker-input-budget/tasks.md`:** - `- [ ] 0.4 Ratify or amend the two spec deltas.` becomes `- [x] 0.4 …`. - Ten record lines follow it: the word, the question, the RULED line, both requirement names, the 4.1 question staying open, no archive, and the record. **New: `openspec/changes/add-worker-input-budget/.openspec.yaml`** (52 lines): the declaration described above. **`README.md`** (*OpenSpec Records* > *Active changes*, the `add-worker-input-budget` entry only): - `` `Status: draft` `` becomes **`` `Status: ratified` ``**. A parenthetical gives: - the date, Brett Heap, the 0.4 word, "no amendment" and the RULED time; - the link to the record; - *"the origin declaration `.openspec.yaml` added on his second word, verbatim "#1250: (i) add the origin file", RULED 2026-10-06T17:24:57Z"*. - The closing sentence changes. It read: "`Status: draft` is unchanged: …". It now reads: "Resolving the questions ratified neither spec delta; the 2026-10-06 word did (task 0.4). **RATIFICATION ONLY** — the archive is a separate later act on Brett Heap's word, and the Group 4 sequencing question on 4.1 stays open." **New: `openspec/changes/add-worker-input-budget/review/ratification-2026-10-06.md`:** - The header: `Status: ratified`, `Kind: report`, `Decision date:`, `Ratifier:`, one `Ratified:` citation and the ratified baseline. - The sections: - Decision; - 1, the word; - 2, what the word does not decide; - 3, what this pull request changes, including the origin file and the second word, verbatim; - 4, a disclosure; - 5, the measurements, and the statement that this PR lands by squash. **`ideation/staging/doc-health-sweep-carry-over/doc-health-sweep-carry-over.md`** (Copilot `r4198710846`, the first Conflicts bullet only): - The status clause *"`add-worker-input-budget` is `Status: draft`, its two deltas unratified (its task 0.4)"* now says the packet is `Status: ratified` (task 0.4, Brett Heap's word of 2026-10-06) but still ACTIVE, not archived. - A parenthesis records what the clause read before. The sequencing constraint, proposing this topic's change after that packet archives, is unchanged. **Not moved:** - `specs/doc-health/spec.md`; - the Group 4 4.1 note; - `tests/sequenced_after/corpus-ledger.yaml`. ## Precedent followed - **#974** (`c521504c`): - `Status: draft` becomes `Status: ratified`, with one citation line in the lifecycle header; - the ruled box is ticked with its record; - the README row is moved in place, with a bold `Status: ratified` and the word and the record link; - a **RATIFICATION ONLY** tail; - a `review/ratification-<date>.md` record carries `Status: ratified` and ONE citation. - **#1151** (`cd494e4c`): the closest case, an in-place ratification of a draft already on `main`. Copied: the one-line `Ratified:` form inside the front-matter, and the record's sections. - **#1028**: the record header. `Decision date:` and `Ratifier:` accompany the citation. - **#267**: the record-citing `Ratified:` spelling for an in-session ruling. Both citations clear the three-way floor, and each document carries exactly one citation in its 15-line window. - **Sweep `b7513733`**: the `.openspec.yaml` form, on the second word: - `created` from the true first commit; - an `ad_hoc` id carrying the created date; - a folded `reason` derived from the record and checked in both directions; - the approval quoted from the packet's own citation. - **Not copied:** `Status:` and `Ratified by:` on `tasks.md` and `design.md`. The packet has no `design.md`. Its `tasks.md` carries no `Status:` header to move, and `document-lifecycle` does not rule `tasks.md`. ## Landing: squash **This PR lands by SQUASH, and only a squash landing conforms to the second word.** Option (i) was put as adding the origin file *in the ratifying commit*. On this branch the ratification is `a93865f0` and the origin file is the later commit `b3b7db42`, so only a squash puts the two into one commit on `main`. The record's § 5 says the same. The archive gate's origin-retention walk takes the FIRST commit whose `proposal.md` declares `Status: ratified` as the ratifying commit. A probe on throwaway copies measured two landings: - **Squash, the conforming landing:** the squash commit is the ratifying commit and carries the origin. The walk reads *"ORIGIN RETAINED … declaration unchanged since the ratifying commit"*. #974 and #1151 also landed by squash. - **Merge, not conforming:** the walk takes `a93865f0`, which has no origin, as the ratifying commit, and reads *"ORIGIN RETENTION NOT COMPARABLE"*. The gate does not refuse that, but it leaves no retention baseline. - **Rebase, not conforming and not run:** it would also land `a93865f0` as a commit of its own, ahead of the origin file. ## Observation (no change made) `proposal.md` § Impact says *"two requirements MODIFIED, one ADDED"*. The delta has carried one MODIFIED and one ADDED requirement since its first commit, `ee2185d6`. The record's § 4 discloses this. It is not corrected here, because it is proposal text. ## How it was verified All runs used full clones named `openxFactory`. The full set ran at the same time in two same-kind clones: `main` `51456835`, and this branch merged with it (`9e67f838`). The gates and doc-health then ran again on `main` `e6380965` and on `cc0fc853`. After that, the full set ran a third time on `main` `e6380965` and on `60c38a56`. All three runs gave the same results. The record's § 5 names each measured tree by sha (Copilot `r4198710942`). Copilot's review `5433270341` at `60c38a56` raised no inline finding. Its "previously missed" note on record § 5 is answered in `7229fde4`, which rewrites only the record's landing paragraph to say this PR lands by squash. The gates and doc-health ran again on that tree against `main` `e6380965`, with identical results. The branch then merged `main` `c44c1610`, which archived `add-factory-mcp-conformance` (#1252) and touched no byte of this packet. The gates and doc-health ran once more, on `main` `c44c1610` and on that merge, `8dbb011e`. The results were again identical: `verify` exits 1 on `main` and 0 on the branch, and doc-health reports 284 against 282 finding lines, the difference being only the `proposal-origin` WARNING. Copilot's review `5433389325` at `8dbb011e` (thread `r4199425241`) asked that record § 5 list every tree measured. `6f4e98d1` rewrites that list as six runs, each named by sha. The gates and doc-health ran on it against `main` `c44c1610`, with identical results. Last, the branch merged `main` `a2dc658d` (#1254, no byte of this packet) as `35b17c30`, and the gates and doc-health on that merge against `main` `a2dc658d` were again identical. Its other note asks to put the Group 4 sentence *"is still open even as this line is written"* in the past tense. That note is left as it stands, because both briefs keep the Group 4 note untouched and the sentence is anchored to when it was written. Because the carry-over topic changed, `tests/ideation_routing` and `tests/document_catalog` also ran on `main` `e6380965` and on `60c38a56`: 86 passed on each. `tests/ideation-dashboard` cannot be collected in a clone without the openDox and openXdox legs; CI runs it. | gate | `main` | this PR | | --- | --- | --- | | `validate-openspec-cli-pin.py --all --strict` | exit 0; 1 failed item, `add-chain-attestation`'s accepted exception; 0 UNDISPOSITIONED | the same | | `validate-openspec-cli-pin.py --change add-worker-input-budget` | exit 0; 1 passed | the same | | `validate-code-surface.py`, `validate-target-release.py`, `validate-scope-globs.py` | exit 0 | the same output | | `validate-sequenced-after.py .`, and with `--ledger-diff` | exit 0 | the same output; the ledger row does not move | | `proposal-support.py . verify add-worker-input-budget` | **exit 1**, "no origin declaration" | **exit 0**, "proposal support verification ok" | | `doc-health.py --single-repo . --as-of 2026-10-06` | 284 finding lines | 282: the same set without the `proposal-origin` WARNING's two lines. **No new finding.** The `modified-block-currency` INFO, which records the delta's deliberate rewording of canon's "is exactly" bullet, stays | | `pytest` over `tests/doc-health`, `sequenced_after`, `review_lane_pin`, `proposal-support`, `code_surface`, `target_release`, `packet_reference`, `citation_remainder`, `scope_globs`, `former_id_arrival` and `openspec_cli_pin` | 3581 passed, 7 failed and 3 skipped | the same, with the same 7 tests failing. All 7 come from the clone, whose `openDox` and `openXdox` legs were not initialized. CI runs the full suite | **The citation checks were proven to read both files, on a throwaway copy:** - damaging either `Ratified:` line raised a CRITICAL `ratified-provenance` finding naming the damaged file; - removing the proposal's citation raised one; - giving the record `Status: record` raised one. The intact files raise none. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e identity response shape and the single-writer chains (plan 038) (#1257) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) **T002, second bookkeeping batch, plan 038: T094 and the slice entries T095 to T104, the identity response shape, the single-writer chains, and the ticks.** Bookkeeping, so this PR carries no `Arc:` line. It touches no `openspec/changes/` path, so no Rule 6 window applies. It began stacked on #1251's head; #1251 has landed (`1837ea75`) and `main` is merged in (`543f6ce1`), so the diff against `main` is this batch alone. ## From plan 038's `tasks.md`, T002 - **Task**: T002, "Release-2 base, and the re-measure at the ruling" (landed in #1251; this is its second batch of bookkeeping, the brief of the holder's `T002b`). - **Realizes**: none (bookkeeping; FR-025). **Falsifier**: T002 names none. Its gates are the brief's, quoted under "Review and gates". - **Ruled / Decisions**: none of its own. Every item is a ruling already posted on `#656`, or a landing already merged, encoded as worded and cited by comment id or merge commit. ## The items | # | Where | What changed | Record | |---|---|---|---| | 1 | tasks.md: T094, T095 to T104, T073 | T094 ticked, with its result quoted: 436 composed reds over 51 files, outside 12.5's set (Base 2; 533 at Base 1). The `T095+` placeholder becomes ten entries, T095 to T104, each with its slice name, Files, After and Falsifier from R2-INV-R9's outline and the holder's rulings, `Lane: 3 (openXfactory-3)`. T073's After and Files name them. The map's means, the rulings (R9-R1 (a), R9-R2 (a), W1 to W7) and the OQ defaults are recorded once, above the entries | map `R2-INV-R9.md`; `6021830607`; claim `6021862323`; rulings `6021830531` | | 2 | T095, T101, T104, T097 | T095: the two confirmed departures from OQ-R9-1 (`plane_host_for` untouched, an autouse fixture registers the declared host; `DECLARED_HOST_SUITES` guarded structurally). T101: `tests/declared_exclusion.yaml` for ONE entry (reasons `[doc_health]`, note dropped, the `only` list loses the file, count stays 66). T104: `tests/test_binding_stylesheets.py`, the pin 572 to 574. T097: its served-display respelling is R9-R1 (a) applied | `6022291206`; the T097 line is `6023517122` (the holder confirmed the citation, `6026622117`) | | 3 | plan.md: the single-writer table; tasks.md Files and After lines | W7's chains: `tests/conftest.py` T020, then T021 and T026 in landing order, then T095, T073, T074; `tests/test_host_plane.py` T020, T026, T095; `declared_exclusion.yaml` T101, T073, T074; the four T074 test files T103 then T074; the census T025, T104, T015, T016, T057 (the row splits, so `test_web_boundary.py` keeps its own chain). T015's and T074's After gain T104 and T103 | `6021830531`, `6022291206` | | 4 | tasks.md: T072, T074, T075 falsifiers | The four folds of #1253, in the arc change's own wording: T072 asserts that ONLY CR, LF and CRLF split rows; T074's seam tests assert that an empty-seam read names the seam AND its registrar; T075's host-wiring test shows a leg declaring only SOME of the four seams refused, and a leg declaring the six and none of the four accepted; T074's protected-suite oracle computes 12.5's set as 12.5 does (`git grep -l -e 'open-pr' -e 'open_pr' -e 'FakePullRequests'`), from the pre-arc and the final tree, the floor of 16 on each, and takes the union | openxFactory#1253 to `fc4fa0ff`; Copilot `5427373153` | | 5 | spec.md FR-011; tasks.md T041 | FR-011's JSON shape gains `identity`, emitted and bounded as openDox-spec's finding schema bounds it (no `excerpt`, `text`, `content` or `quote` key, no number, strings of at most 200 characters, `{category, entry}` for a pathless finding, `{collided_id}` for a collision). T041's falsifier gains a response-shape test asserting exactly that bound. The coverage row for FR-011 names T041. The serialized-size cap was already T041's at the base (T041's text says so, and T042 "stores what T041 bounds"), so nothing moved | holder `6018624750` | | 6 | tasks.md ticks | T011, T014, T021, T023, T025, T026 and T060 ticked, T070's tick gains #1253, and T002's own landing is recorded. Each merge commit was verified with `gh pr view <n> -R <repo> --json mergeCommit` (listed below) | the landings | | 7 | tasks.md: T072 | A Files line (`src/opendox/lines.py`, `tests/test_lines.py`); the Ruled line gains `6023517122`: `head_sha` (a), its own public `head_sha` parity-tested against `serve._head_of`, `serve.py` untouched; the line split (a), `doxbench_defaults.py` untouched. Folding either private helper is recorded as unscheduled and optional, and is not scheduled | holder `6023517122` | | 8 | contracts/health-finding.md:91 | The sentence reads: a stored `identity` makes a cross-run collision between STORED findings detectable; an exception-only finding is never stored; whether the engine reports it remains T046's concern. Nothing else on the line changed | holder `6018624750`; Copilot `5433292692` | | 9 | plan.md; tasks.md | Copilot's three items at #1251's head `1eb8e9eb`, accepted by the holder at its landing: (a) the pin and landing-order row for T073 names T005 and T095 to T104 as prerequisites, and `T095+` reads T095 to T104 at the critical path, the lane table and the revision note; (b) the combined `conftest.py` and `test_host_plane.py` row splits, and the cross-lane summary gains T026 (and the other chains of item 3); (c) the same split in T020's, T021's and T026's Files lines | holder replies `4201056969`, `4201057311`, `4201057577`; READY note `6026651962` | ### The ticks, verified | task | pull request | merge commit | merged | |---|---|---|---| | T011 | opensoft/openDox-code#92 | `09b8d44a` | 2026-10-06T19:15:55Z | | T014 | opensoft/openDox-code#93 | `a7a1c4d3` | 2026-10-06T22:23:06Z | | T021 | opensoft/openXdox-code#40 | `f70bc9c3` | 2026-10-06T19:07:10Z | | T023 | opensoft/openXdox-code#42 | `d45a0939` | 2026-10-06T17:45:33Z | | T025 | opensoft/openDox-code#91 | `84f8ed83` | 2026-10-06T17:33:31Z | | T026 | opensoft/openXdox-code#43 | `36bbef79` | 2026-10-06T22:35:40Z | | T060 | opensoft/openDox#20, the tag `dox-v1.2` (tag object `58538ff3`, on `6a9f4902`), opensoft/openDox#21 | `6a9f4902`, `c7f75845` | 17:46:59Z, tag 17:58:45Z, 19:02:39Z | | T070 | openxFactory#1253 (T070b, added to its tick) | `fc4fa0ff` | 2026-10-06T18:56:42Z | | T002 | openxFactory#1251 (its own landing) | `1837ea75` | 2026-10-06T22:31:42Z | - **T021** landed with Copilot r4199337845 an ACCEPTED LIMIT (holder READY note `6023492215`); T021's entry records it. - **T025's** entry says its 34 nodes are "quoted at T029"; that stays T029's, and the entry says so. - **T011's** server node is T014's, as its own Falsifier says. **Skipped, because already present at the base:** T020's and T024's ticks (#1251 item 13) and T004's tick (#1245, `260234b5`), all confirmed with `git show <commit>:<tasks.md> | grep`. **T071 is NOT ticked.** Brett's word, "Ratify it (Recommended)" (`#656` `6023375303`), is recorded on T071's entry, but the change's ratification-record PR has not landed (no such PR is open or merged on `opensoft/openxFactory` at this writing). The box stays open. ## Readings the holder accepted (`6026622117`), disclosed as the brief requires - **W7 omits T026 from the openXdox-code chains.** The single-writer table keeps T026 where its own ruling (`6016648451`) puts it, and lane 3's claim (`6021862323`) says T026's PR lands before T095. So the conftest chain reads T020, then T021 and T026 in landing order, then T095, T073, T074; and `test_host_plane.py` reads T020, T026, T095, as W7 gives it with T026 added. - **R9-R2's last sentence** ("If the re-scoped test runs alone, it leaves the declaration, and the count moves with it, as the declaration's own rules require") is recorded in T100 as worded. `declared_exclusion.yaml` is NOT added to T100's Files: the holder's file list at `6022291206` names it for T101 only. - **Edits outside tasks.md**, ruled in scope as each item names its place: plan.md (items 3, 9), spec.md FR-011 (item 5) and `contracts/health-finding.md:91` (item 8). ## Other notes on where an item needed a reading - **Counting.** The task count reads 90 rows: the placeholder `T095+` is replaced by T095 to T104 (81 - 1 + 10). - **Plan 034's task numbers.** The entries cite plan 034's T103 (#80, in T099's `Host` header) and plan 034's T086 (W2, in the rulings) as "plan 034's", because plan 038 now has its own T103. - **OQ-R9-3.** The map did not measure the respelled gate-console and wheel-model skips; T097 and T103 say so, and the map's 127 passed and 5 skipped is quoted as the measurement. - **Counts of slices** are copied in the map's own form (for example "16 nodes, and +5 on R9-R1 (a)"), not summed. - **T095's chain after T026.** T095's After names T021 and T026, both landed. - **Not mirrored from the arc's 4.1:** T075's falsifier gains the some-of-four refusal and the six-and-none acceptance, which #1253 folded. The arc's two older refusals (part-way through the seams; at the column call) are not in T075, since #1253 did not add them. - **T046 and T057** carry no response-shape falsifier for `identity`: item 5 names T041's. ## Review and gates - **`python3 scripts/validate-openspec-cli-pin.py --all`**, in the clone named `openxFactory`, at `691648c6`: exit 0, `Totals: 113 passed, 1 failed (114 items)`, `0 UNDISPOSITIONED failures`. The one failure is the dispositioned `add-chain-attestation` finding, the same on `main`. - **openxFactory pytest.** The full local run was stopped at about 44% at a coordinator drain, so it is NOT a result and is not claimed. The repository's own gate, `pytest-suite` in CI at `691648c6`, completed `SUCCESS` (2026-10-06T23:32:38Z to 23:58:56Z). - **Doc-health**, `scripts/doc-health.py --single-repo . --as-of 2026-10-07`, branch `691648c6` against `origin/main` `0992369a` in the same clone: the two reports are byte-identical (sha256 `ce17aadd6d96e484170e2ec4784e44972e33c7d1a6c65830ea14a1035f2ae976`; `Findings: 31 critical, 26 error, 69 warning, 20 info. New regressions vs previous report: 0.`). So no new error. - **CI at `691648c6`**: all 14 check runs are `SUCCESS` (rollup `SUCCESS`): `pytest-suite`, `merge-master-approval` (the red inherited from `main` since #1252 was cleared by #1138), `openspec-cli-pin`, `doc-health-py314`, `openxdox-consumer-gate`, `wallet-validation`, `clearing-dispatch-gate`, `signed-execution-chain-gate`, `former-id-arrival-gate`, `release-tag-gate`, `openreposhape-pin`, the two `lane-line` runs and SonarCloud. - **`main`** has moved to `0992369a` since the last merge (`543f6ce1`). GitHub reports this PR `MERGEABLE`, and the ruleset is not strict, so `main` is not merged in again (a merge would restart the 27-minute gate). | Copilot at | verdict | findings | answered | |---|---|---|---| | `691648c6` (final; review `5435686665`) | Changes recommended | 1 (thread `4201443690`): T041's falsifier cannot verify what T046's `health list --json` and T057's HTTP route emit; the review summary adds that the new T095 to T104 collide with plan 034's task numbers cited unqualified at `spec.md:662`, `spec.md:1222` and `clarify-questions.md:437` | accepted limit (#656 `5988818366`): plan-record accuracy, not a bypass, and the T041 placement is the holder's own instruction (item 5). Answered (`4201487553`) and resolved | 1 thread, 0 unresolved. The holder ruled both points YES at `6027706377` and has them encoded in a THIRD batch, not here: the `identity` falsifier split across T041, T046 and T057, and the plan 034 references qualified. This PR therefore carries T041's wording as the brief gave it. ## Files changed - `specs/038-opendox-document-tool-self-maintenance/tasks.md`, `plan.md`, `spec.md` - `specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md` ## What is NOT done - T071 stays open (its ratification record has not landed). No box of #1144 is ticked, and no task other than those listed is ticked. - No scenario or spec delta beyond FR-011's JSON-shape bullet is touched, and nothing is under `openspec/changes/`. `README.md` is untouched. - The T095 to T104 entries record the slices; none of their work is done here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>




Lane: openxfactory-5 (openXfactory-5)
Archive word GIVEN. Brett Heap, 2026-10-06, in session, verbatim "archive add-factory-mcp-conformance when green". It is RULED in
opensoft/brett-wiplanes/log/openXfactory-5.mdat 2026-10-06T17:25:24Z (commit5f02a237). This lands by MERGE commit, never squash, under a Rule 6 window, once its gates, checks and Copilot review are green. A squash would re-date the archive directory's adding commit, which redsarchive-date-vs-commitonmain. The coordinator lands it; this seat does not un-draft or merge.What this does
It archives the ratified change
add-factory-mcp-conformance. Its realization, Speckit feature 037, landed as #1243 →92010d3e. The tasks 3.1 and 3.2 that were still open onmainare ticked with evidence. The packet moves toopenspec/changes/archive/2026-10-06-add-factory-mcp-conformance/, and its delta is promoted as the new capabilityopenspec/specs/factory-mcp-conformance/spec.md. The README Records bullet moves from Active to Archived, and every link the move breaks is repointed.Realization evidence (task 3.1)
92010d3e67f2c556687e1c3583ed3ca1867f4b8b, on Brett Heap's word "land Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 when green". It landed by squash:92010d3ehas the single parentba89e046, and its treefd3b9f08equals the tree of the final head6ab7126724bf7d5771d3929934ed0b28d29ea0aa.6ab71267: signed-execution-chain-gate, lane-line, former-id-arrival-gate, openspec-cli-pin, wallet-validation, pytest-suite, release-tag-gate and openxdox-consumer-gate.pytest-suitealso passed onmainat92010d3eitself (run 37409899722,selected=9831 passed=9825 skipped=6 failures=0 errors=0) and at51456835(run 37480682619). SonarCloud is not required; its one S8707 finding was dispositioned before the landing (comment 6008804840).main:contracts/factory-mcp/,scripts/validate-factory-mcp.py,tests/factory-mcp/anddocs/factory-mcp-conformance.md.specs/037-factory-mcp-conformance/tasks.mdhas 16 of 16 boxes ticked. Nothing after92010d3etouches the code surface, the feature or the packet.The archive act (task 3.2)
TZ=UTC python3 scripts/proposal-support.py . archive add-factory-mcp-conformance --yesran with exit 0, at 2026-10-06T16:21:19Z, over the content-addressed@fission-ai/openspec@1.12.0pin. Its decisive lines:ORIGIN RETAINED ... (declaration unchanged since the ratifying commit 92010d3e67f2),Applying changes to openspec/specs/factory-mcp-conformance/spec.md: + 8 added,Totals: + 8, ~ 0, - 0, → 0, andarchived as '2026-10-06-add-factory-mcp-conformance'.openspec/specs/changes.8acd2ec4. The origin block is unchanged since ratification on both histories:.openspec.yamlhas blobc1e5cd98at54bce013(the original lineage's ratifying commit) and in the archive.8acd2ec4,54bce013andd2baf6fdstay reachable throughrefs/pull/1243/head.Commits
9df08c71ticks 3.1 with evidence. It also corrects one addendum sentence: after the squash, the original commits are ancestors ofrefs/pull/1243/head, not ofmain.df52f26dticks 3.2 ahead of the run, because the wrapper refuses an open box.7102cd48is the wrapper's archive act, plus the README doc index and the Records move (with theARCHIVE-PR-NUMBER-PENDINGmarker).85017f76records the run under the archived 3.2.00b5c84brepoints 8 links outside the packet to the archive path. It also changes the quickstart's--change add-factory-mcp-conformancecommand, which refuses once the change is archived, to--all --strict.14920eceseeds the sweep-ledger row by machine (--seed-ledger --moved-by '#1252': 1 row moved, active → archived,moved_on2026-10-06;--ledger-diffconsistent, 231 rows) and names PR Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252 in the README bullet.92dfd83crecords the archive word, verbatim with its RULED cite, in the archived 3.2 and the README bullet.Gates
Two fresh full clones of the same kind, with submodules initialized as
pytest-suitedoes (openXwallet, then openXdox and openDox recursively): the branch at92dfd83candmainat51456835. TMPDIR and--basetempsit under~/.local/state.92dfd83cmain51456835validate-openspec-cli-pin.py --all --strictvalidate-sequenced-after.py .(plain, incl.archive-date-vs-commit)validate-sequenced-after.py . --ledger-diffvalidate-code-surface.py ./validate-estate-inventory.py .doc-health.py --single-repo .pytest tests/ -q -m "not postgres"92dfd83c)add-chain-attestation(Brett Heap, 2026-09-05, "take exit 2").Status: draftfeature docs today; the draft count stays 71.main's three pytest failures are environmental and pre-existing:tests/doc-health/test_tag_hygiene_pinned_targets.py::test_a_lexically_malformed_value_builds_no_path_and_reads_nothing,tests/domain_profile/test_hermeticity_probe_routes.py::test_the_bare_unittest_route_is_detected_as_unguarded, andtests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization]. They are the same three the realization seat recorded on both sides for Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 (temp-path placement, the symlinked clone root, a subprocess timeout). CI'spytest-suiteruns at this head as well.A non-required red:
merge-master-approvalIt refuses at
floor_incompleteon this branch (00b5c84b,14920eceand92dfd83c). The review-authority floor tolerates 3 covered-pending paths underopenspec/specs/. Base already carries 3 (corpus-adapter-seam,domain-mapping-declarationandpacket-citation-report), and this archive's newfactory-mcp-conformance/spec.mdis the 4th. The gate names its own repair order for an addition: (1) this candidate lands; (2) a codexFactory pull request regenerates the specs floor block at a landed commit; (3) an openxFactory pull request advancescontracts/review-lane-pin.yaml. The check is not required onmain. After this lands, base holds 4 pending paths, somerge-master-approvalwill read red on every later openxFactory pull request until (2) and (3) land. Whether to admit it at the landing or hold for the regeneration is an owner disposition, routed to the coordinator and Brett Heap. Copilot raised the same finding (thread onopenspec/specs/factory-mcp-conformance/spec.md).Disclosed before the archive word
Brett Heap gave the word with these three items known.
proposal.mdnow resolves one level short (../../../ideation/brainstorm/factory-mcp-overview.md, line 60). It is left as ratified, as the coordinator directed on the word: editing an archived record needs a ruling first, and two earlier archives kept the same shape.d2baf6fd's history, including its unreduced codex wording, is not inmain's history. It survives atrefs/pull/1243/headand on the two review branches, whose deletion is still Brett's open R2.Refs #1242
Refs #1243
🤖 Generated with Claude Code