You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
T002: release 2's base and plan 038's bookkeeping, items 1 to 15 (plan 038) - #1251
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 Derive-possibles register merge 2026-07-24 #39, committed 16:10:44Z), openDox d77f8cbf, openXdox 9564d5d9, openDox-spec 7db9438b, openXdox-spec f088b097, openxFactory 51456835, 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.
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 #6566013610393: "174 red vs 174 (170 failed + 4 errors, 668 passed ...)"; "moved: none"; "5 suites / 210 cases"; openDox installed from openDox-code maina9ac96f9 while openXdox-code's pyproject.toml:126 and openxFactory's nested openDox/code pin dede32b4 (v0.1.0); openxFactory main0f2a87f6 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 opensoft/openxFactory#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)
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 #124891e961a0; T008 codeXfactory/codexFactory#515 f1b019fe; T010 openDox-code#89 34c20641; T040 openDox-spec#17 7db9438b; T070 #124751456835; 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 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
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).
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.)
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.
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 (#6565988818366): 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/mainc44c1610 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. Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #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 (Advance the pinned decision core to fe9a6f5b91886e4f07296dc6a264deb345b1618f #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 (prefer-triad-project-shape 5.1: the doctrine and register description restate the Triad as preferred, confers nothing #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.
…ng, items 1 to 14
T002 records the base of release 2: every repository's main (research.md R0's
command), the box census (125 boxes, 42 open, delta 0 against ce64afc),
PACKET_MERGE=94b6f7f1, and lane openXfactory-3's composed re-run (174 red
against R2-INV-P4F's 174, no node moved). The README entry links it.
Plan 038's tasks.md, plan.md, data-model.md and contracts record the holder
rulings and Brett's answers posted on #656 since the ruling, as worded, each
cited by comment id: the Files of T022, T023, T026, T029, T073 and T074;
R-1 (a)'s six spans and F12.1's --chains; T073's After set, T094, T095+ and
its open_until wording; T076's F9.2 disposition; T003's close on the re-check;
the finding's identity, stored and emitted; and the ticks of T002, T003, T005,
T008, T010, T040 and T070. Bookkeeping only, so no Arc: line.
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This bookkeeping-focused PR records release 2's repository and test baseline, links the evidence, and synchronizes plan/task records with previously posted rulings and landed commits; it also updates the health-finding contract and data model to store and emit bounded identity data. No implementation code, requirements, spec delta, or openspec change is introduced.
File-Level Changes
Change
Details
Files
Adds a release-2 baseline evidence record covering repository tips, task-box census, F11.1 packet merge ancestry, and the quoted lane-3 composed re-measurement.
Records full repository main SHAs, dates, subjects, and changes since the plan-time R0 baseline.
Captures the 125-box census, 42 open boxes, zero census delta, and PACKET_MERGE first-parent verification.
Quotes lane 3's 174-red composed result, passing-suite counts, pins, and explicitly notes that the run was not repeated.
Links the new evidence from the feature-038 README entry.
Updates feature-038 planning and task bookkeeping to encode previously issued rulings and landed work without introducing new requirements or decisions.
Marks T002, T003, T005, T008, T010, T040, and T070 complete with merge references and adjusts task counts and dependency/order tables.
Records changes to T022, T023, T026, T029, T073/T094+, T074, T076/F9.2, and related single-writer, lane, critical-path, and protected-suite rules.
Adds the six-span R-1 widening, F12.1 --chains behavior, T073 draft dependency on repair slices, and declared-rail test coverage bookkeeping.
Documents the F9.2 archive disposition and expands the arc-change file ownership list.
Trigger a new review: Comment @sourcery-ai review on the pull request.
Continue discussions: Reply directly to Sourcery's review comments.
Generate a GitHub issue from a review comment: Ask Sourcery to create an
issue from a review comment by replying to it. You can also reply to a
review comment with @sourcery-ai issue to create an issue from it.
Generate a pull request title: Write @sourcery-ai anywhere in the pull
request title to generate a title at any time. You can also comment @sourcery-ai title on the pull request to (re-)generate the title at any time.
Generate a pull request summary: Write @sourcery-ai summary anywhere in
the pull request body to generate a PR summary at any time exactly where you
want it. You can also comment @sourcery-ai summary on the pull request to
(re-)generate the summary at any time.
Generate reviewer's guide: Comment @sourcery-ai guide on the pull
request to (re-)generate the reviewer's guide at any time.
Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
pull request to resolve all Sourcery comments. Useful if you've already
addressed all the comments and don't want to see them anymore.
Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
request to dismiss all existing Sourcery reviews. Especially useful if you
want to start fresh with a new review - don't forget to comment @sourcery-ai review to trigger a new review!
T026's H-2 in-test respellings move from 17 to 20: three more are admitted under
CF-4 (the holder's ruling, #656 comment 6020859092). T020 (openXdox-code#39,
c6d15b27) and T024 (openXdox-code#38, 8b64fae0) are ticked, each merge commit
verified with gh. The engine's cap on a finding's serialized identity names no
value: the value is T041's and T042's to set.
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- T003 is closed on the re-check (#656 comment 6017901451), so T004's After,
the header, the dependency list, plan.md and the checklist stop calling its
fresh analyze open.
- ARC-5 (a) in plan.md now says what batch Q's F9.2 note says: #1144's archive
tool refuses unticked lines, so its archive ticks F9.2 with a written
disposition naming the arc change as the carrier.
- A finding's identity is emitted: FR-011 and T046 say so; T041 tests the
engine's cap at its boundary (the cap's value stays T041's and T042's to set).
- The task count reads 81 rows, with T095+ as the one placeholder row.
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The edit of FR-011 in 76b9428 changed a requirement's SHALL shape, which the
holder's list for the identity ruling (#656 comment 6018624750) does not
include. FR-011 is back as origin/main has it. The contracts
(health-finding.md, cli-http-health.md), data-model.md § Finding, T041, T042
and T046 carry the emitted identity; FR-011 mirrors #1144's ratified 14.5
field list, and whether to edit it is the holder's to rule.
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Constitution Check cannot close T003 without the required analyze run. .specify/memory/constitution.md:127-132 mandates tasks → analyze → implement and says /speckit.analyze MUST report no critical findings before implementation; this row itself says the re-check was not a fresh run, while the checklist remains unchecked. The constitution also supersedes other process descriptions (:141-148), so a holder ruling cannot waive this gate. Run and disposition a fresh analysis of the ruled revision before marking T003 complete, or restore T003 to pending.
Serialized-size cap is inconsistent across parallel tasks
This leaves one serialized-size invariant for T041 and T042 to choose independently, but those tasks are parallel and T042 does not depend on T041 (tasks.md:888 versus :923). They can therefore implement or test different limits for validation and storage. Define the cap once in the contract/plan and require both tasks to consume it, or order T042 after the owner of that value.
The holder's answer on #1251: the contract module owns the field bounds, so
the cap on a finding's serialized identity is T041's, and T042 stores what
T041 bounds. T041's and T042's entries, data-model.md § Finding and
contracts/health-finding.md say so. The cap's value is still not written here.
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
identity is required by the T040 finding schema, but this storage model does not declare the new column NOT NULL as it does for the other required provenance fields. That permits T042 to define a nullable column and persist a finding that cannot satisfy the public finding shape; make the at-rest invariant explicit.
Correct T002 and T004 chronology and evidence usage
T002 is explicitly sequenced after T004 (tasks.md:133), so measurements captured by T002 cannot be inputs to T004's already-recorded ruling. Keeping this claim reverses the plan's chronology and misstates the evidence's governance role; limit the consumers to the later checkpoints.
Copilot's review of 80c6fee: data-model.md's identity column is NOT NULL, as
T040's finding schema requires it, and evidence/r2-base.md no longer calls its
figures an input to T004's ruling (T002 follows T004; the checkpoints T033 and
T066 are the consumers).
Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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 @sourcery-ai review. Upgrade to get a review now.
brettheap
changed the title
T002: release 2's base and plan 038's bookkeeping, items 1 to 14 (plan 038)
T002: release 2's base and plan 038's bookkeeping, items 1 to 15 (plan 038)
Oct 6, 2026
Holder, at READY: T002, release 2's base and plan 038's bookkeeping, items 1 to 15. Landing on Brett's word "land #1251 when green" (2026-10-06 ~22:1xZ).
Landed on Brett's word "land #1251 when green". Copilot's four items (identity wording; T073 landing-order row; conftest/test_host_plane chain split) are ACCEPTED under 5988818366 and folded into T002 batch 2.
…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>
…s role keys and the served words (plan 038) (#50)
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 6021862323)
Arc: neutral-product-standalone-operability
## T097, display harnesses (B): `display.js` beside the copied module, S7's role keys, the served words (plan 038)
- **Contract:** there is no `tasks.md` entry yet; lane 4 records T094's slices after T002 (opensoft/openxFactory#1251). Until then the contract is the slice outline row of T094's map (R2-INV-R9, posted as opensoft/openxFactory#656 comment 6021830607) and the holder's rulings (comment 6021830531). The row reads: **T097, display harnesses (B): DJ (A″) + VR keys; files `tests/test_wheel_model.py`, `tests/test_grouping.py`, `tests/test_project_aggregates.py`; depends on R9-W1; 87 reds (wheel_model 76, grouping 7, project_aggregates 4).**
- **Realizes:** requirement 9's declared composed tests (#1144, through T073's composed step 5a, F9.1). This slice repairs 87 of the composed reds T094 mapped.
- **Falsifier:** the composed run of the three files, each alone, red at the base and green at the head; plus the unchanged set (12.5's 16 governed suites, F5.2's 5 protected files, `test_column_contributions_governed.py` at 9 passed, `tests/test_declared_exclusion.py` green run lone).
- **Ruled:**
- **R9-W1 (A″)** (comment 6021830531): each harness copies `display.js` beside the module it copies, as #43 does. No openDox module is made import-free.
- **R9-R1 (a)** (same comment): "every word-asserting pin is respelled, through VR, to the SERVED words". It is given under Brett Heap's served-display ruling for the staging suite (comment 6016648451: "the helpers … hand each harness the SERVED governed display"). The holder's record line for this slice (comment 6023517122): "T097's served-display respelling is R9-R1 (a) applied (6021830531 ...). It needs no new ruling."
- **Decisions:** none of this slice's own. No After dependency; it needs nothing from T095.
### What this PR does
**DJ, R9-W1 (A″).** Since § 3.4 slice S7, `wheel-model.js` and `grouping.js` import `./display.js`. Each harness copied its module ALONE, so node failed with `ERR_MODULE_NOT_FOUND … display.js`. That is the cause of every one of the 87 reds at the base, and of nothing else. Each harness now copies `display.js` beside its module, under its own name (`display.js` imports nothing), and writes a `package.json` so that node reads `.js` as a module, as #43's harness does. `test_wheel_model.py`'s ten copy sites go through one helper, `_copy_wheel_model`.
**VR, the keys.**
- The model's wheel keys are S7's six stage roles (`WHEEL_KEYS = STAGE_ROLES`). The old wheel names map to them as follows: `documents` → `source`, `clusters` → `grouping`, `possibles` → `candidate`, `staged` → `selection`, `active` → `submission`, `archived` → `completion`.
- Every wheel key the cases pass in or the assertions read is respelled: the deck order, edge endpoints, the second-degree and gather cases, the expand events, the 48 action cases, and `test_project_aggregates.py`'s three `actionsFor` calls.
- `grouping.js` keys its tallies `"tally:" + role`, so the tally keys are respelled to `tally:source`, `tally:grouping`, `tally:candidate`, `tally:submission` and `tally:completion`.
- Snapshot FIELD names (`documents`, `clusters`, `staged_topics`, …) are schema and are unchanged, and so are the action cases' ids.
**VR, the words, under R9-R1 (a): the SERVED words.**
- **What reads the facet.** Since S7, three things the expanded tile's cases assert come from the display facet:
- a verb row's label is `display.act(role)`;
- the possibles wheel's promotability matches `display.registerState(...)`;
- the packet flyout's labels and its ordered front matter are the facet's artifact axis.
- **Where the display comes from.** The page hands every one of them the served display: `wheel.js` puts `display: vocab` in each action env and passes `vocab` to `packetGroups`. So the two harnesses whose cases assert those words or values, the expand harness and the staged harness, are handed the display the GOVERNED host serves. They install it with `readDisplay({ display: cases.display })`, as #43's harnesses do.
- The helper `_served_display()` reads the host from the conftest's `governed_host()` (T020), through `display_profile.host_display`'s injected-profile seam.
- Nothing is registered, and no conftest or host-plane file is touched.
- Composed, the host is openxFactory's composite (`OpenxFactoryProfile`, `host_facet: declared`, `host_profile: openxfactory-engineering`). A probe measured the manifest read this way as equal to the one served when the governed host is registered.
- A case that supplies no env keeps none.
- **The respelled words, as measured:**
| assertion | was | served |
|---|---|---|
| the staged tile's propose row | `▶ draft proposal` | `▶ Propose` |
| the four commission verbs | `▲ promote to staging`, `✻ research brief`, `✦ derive possibles`, `◀ demote` | `▲ Promote to staging`, `✻ Research brief`, `✦ Derive possibles`, `◀ Demote` |
| the packet flyout's group labels | `packet`, `spec deltas` | `packet files`, `Spec deltas` |
- **The values.** The served `register_state` values (`latent` is the captured role) keep the live-captured possibles fixtures promotable. The served packet order (`proposal.md`, `design.md`, `tasks.md`) keeps the review-order claim.
**OQ-R9-3, after T095 (#46).** `test_landed_parses_a_real_archived_change_delta` read `REPO_ROOT.parent.parent / "openxFactory"`, which a runner's layout never holds, so it skipped there. It now reads the composed tree through T095's `openxfactory_root()` (OQ-R9-4) and skips only where the run is not composed. Composed it passes, reading this run's own openxFactory checkout. The skip's mutant is not killable: lone, the module stops at collection on `doc_health` before the case runs.
### The falsifier, composed (R1Q23 (a)), each file alone
The composed form:
- openXdox-code at the commit named;
- openDox installed from openDox-code `main` `84f8ed83` (`pip install -e ".[test]"`, then that commit force-reinstalled);
- openxFactory at `92010d3e` (`tests/composed_host_pin.yaml`), with `openDox`, `openXdox` and `openXwallet` initialized recursively and its `scripts/` on `PYTHONPATH`;
- the colour variables unset and `TERM=dumb`;
- each run: `python -m pytest -q -p no:cacheprovider -rfE --junitxml=… <file> < /dev/null` from the checkout root;
- Python 3.12, pytest 8.4.2, Node v24.21.0.
T022's placement script is not on `main` (#41 is open). Run from #41's bytes, it refuses at `main` for want of its `.gitignore` line, so nothing was placed. It places only the session runbook, which none of these files reads.
**Base, `main` `fc1115d6`:**
```
tests/test_wheel_model.py rc=1 77 failed, 3 passed
tests/test_grouping.py rc=1 7 failed, 4 passed
tests/test_project_aggregates.py rc=1 4 failed, 8 passed
```
- 88 failed: the map's 87, every one of them on `ERR_MODULE_NOT_FOUND … display.js`, plus `test_wheel_model.py::test_landed_parses_a_real_archived_change_delta`.
- That 88th node reads `REPO_ROOT.parent.parent / "openxFactory"`. It runs only because the local clone's layout happens to hold an openxFactory checkout two levels up; on a runner it skips (OQ-R9-3).
**Head, `c16c05eb`** (the T097 commits `b401bc0e` and `9a0704a6`, with `main` merged in):
```
tests/test_wheel_model.py rc=0 80 passed
tests/test_grouping.py rc=0 11 passed
tests/test_project_aggregates.py rc=0 12 passed
```
The 87 read 0 red. The 88th now reads the composed tree (below) and passes; it no longer skips on a runner.
### Mutants (each applied alone, run composed, file restored byte-identical)
| mutant | result |
|---|---|
| no `display.js` copy, `test_wheel_model.py` | killed: 77 failed |
| no `display.js` copy, `test_grouping.py` | killed: 7 failed |
| no `display.js` copy, `test_project_aggregates.py` | killed: 4 failed |
| the neutral display in place of the served one (`"display": None`) | killed: 8 failed (the word and value nodes) |
| no `package.json`, each of the three files | killed with node's module-syntax detection off (`NODE_OPTIONS=--no-experimental-detect-module`): 77, 7 and 4 failed. The unmutated head passes in that mode (80, 11, 12). Node 24's detection otherwise reads `display.js` as a module unaided. |
| the expand harness hands the display to a case with NO env too | survives, and it is equivalent: with no env, `actionsFor` offers only rows with no `visible` predicate, and every one of those carries a literal label |
### The unchanged set, composed, base `fc1115d6` against head `c16c05eb`
Node-for-node identical: 974 nodes at both, the same 10 failed at both, and `diff` empty.
- **12.5's 16 governed suites:** 14 green at both (`branch_session` 132, `doxbench_mutation_boundary` 80, `doxbench_share` 34, `gate_loop_views` 74, `gateway_provenance` 24, `hosted_actor` 5, `session_commits` 22, `session_confinement` 53, `session_gates` 81, `session_lifecycle` 53, `session_records` 29, `session_transaction` 57, `session_verbs` 65, `staging_workbench` 83 passed); failing identically at both (open slices own these, not this one): `session_notebook` 1 and `session_runbook` 9.
- **F5.2's 5:** `generator` 45, `session_snapshot` 23, `snapshot_determinism` 6, `snapshot_registry` 40 and `snapshot_validation_launch` 9 passed, at both.
- **`test_column_contributions_governed.py`:** 9 passed, at both.
- **Run lone** (no openxFactory): `tests/test_declared_exclusion.py` 207 passed at both. Each of the three files still stops at collection on its declared reason, `ModuleNotFoundError: No module named 'doc_health'`, at both.
- **The lone CI form:** `validate.yml` collects the suite less the declared exclusion, and all three files are declared. So its floors cannot move.
### Files changed
- `tests/test_wheel_model.py`
- `tests/test_grouping.py`
- `tests/test_project_aggregates.py`
### CI and review at `c16c05eb`
- `validate`: run 37554225217, success.
- Copilot: review 5440546734 at `c16c05eb`, "Needs a closer look", **Findings: None**. Its one note is the merge of current `main` and the composed run after it, which the next section covers. 0 review threads, 0 unresolved. Earlier heads read the same: `b3c2d04e` and `489081e2`, Findings: None, 0 threads.
### NOT done
- Nothing in this slice's scope.
- `main` has moved past the measured base `fc1115d6`. The branch is not merged again here: the holder's landing loop brings each lane-3 PR up to date (update-branch) before it lands. This PR changes only the three declared test files above, and none of the commits since `fc1115d6` touches them.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Arc: neutral-product-standalone-operability
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…entity bound by layer, the single-writer rows and the holder's batch-3 flags (plan 038) (#1263)
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
## T002c: plan 038's third bookkeeping batch (plan 038)
Bookkeeping: no `Arc:` line, and no `openspec/changes/` path. It encodes rulings already posted on #656 and landings already merged, each cited by comment id or merge commit, with no new decision. It follows #1251 and #1257 in form, and redoes nothing either did. #1257 landed as `c70bdbd9`, so this PR is not stacked; `origin/main` (`c9dfd4f8`) is merged into the branch, never rebased.
**Realizes / Falsifier:** none (bookkeeping). The gates are listed under "Gates" below.
### What changed (specs/038-opendox-document-tool-self-maintenance/)
**Ticks, each merge commit read through GraphQL (`pullRequest{mergeCommit{oid}}`) before it was written.** The sweep covered every PR merged since 2026-10-06T23:30Z in openDox-code, openXdox-code, openDox, openXdox, openDox-spec and openxFactory, re-run at 2026-10-08T16:16Z:
- openXdox-code: T095 #46 → `e2340bb6`, T101 #48 → `8b0401a1`, T098 #51 → `fc1115d6`, T103 #49 → `6f259156`, T096 #53 → `34e1c1f2`, T100 #54 → `2a3d8c09`, T099 #47 → `4aa3070a`, T102 #52 → `e7815ac5`, T097 #50 → `4dab93fc`, T022 #41 → `aefd1091`.
- openDox-code: T104 #94 → `d616da3e`, T072 #95 → `99220883` (the arc's first realization).
- Follow-ons recorded on the task they follow: T021's openXdox-code#55 → `da736090`, and T096's openXdox-code#56 → `9720925e`.
- T095's Landed line also records Copilot r4201411760 as the holder's READY note did (`6027382308`, accepted limit under `5988818366`; the fix rides T073).
- Nothing is ticked whose PR has not merged. T029 and T073 (openXdox-code#44, #45) and T012/T013 (openDox-code#90) stay open.
**New task T105** (R2-INV-P5, read-only, lane 3; holder `6027341795`, claimed `6027346843`): ticked on lane 3's DONE line (2026-10-07T00:28:59Z), its summary `6028122920`, the map `lane-coord-034/r2/R2-INV-P5.md`, and the holder's ruling `6028138991`. Verdicts: T041, T042 and T043 READY-WITH-NOTES; T045, T047, T048 and T049 blocked by plan order only. Placed under "Wave 1's readiness" before W1, with a row in the Phase 5 slice table. The task count is 91 and plan.md's two stale "79 tasks" cites now read 91 tasks and T001 to T105 (`6028364555` item 5).
**The four slice notes** (`6028138991`; no requirement or falsifier changes), as implementation notes on T042, T043, T045 and T047, refined by the holder's batch-3 flags (`6028364555`) and the Copilot-thread ruling (`6064169640`):
- T042: the token `RESET_CONFIRMATION` stays byte-identical, its wording may change; Files gain `docs/runtime.md` (R2-INV-P5 § T042: its two table arrays move with `identity.TABLES`, which `test_deploy_shape.py` holds); `RULED_TABLES` is encoded as the map words it.
- T042's SQL column is `full_run` (`6064169640`, fix-now, resolving Copilot 4205521074): the words "quote it or" are gone from T042, and `data-model.md` gains one line saying the SQL column is `full_run` because PostgreSQL 16 reserves `full`.
**Files and falsifiers:**
- T073: Files gain `tests/test_host_plane.py` and the `opendox-snapshot-*` farm exclusion scoped to the `opendox_spec` owner; the falsifier gains the farm case (Copilot r4201411760, accepted at #46's landing, `6027382308`, reply 4201421102). plan.md's conftest and `test_host_plane.py` rows, and the T020, T026 and T095 Files chains, end with T073.
- T015 and T016: Files gain `tests/test_capability_honesty.py` and `tests/test_lens_seed_actions.py` (`6027633398`), with the same-kind enumeration collateral pre-authorized in the minimal way and listed in each PR body, and `tests/test_default_profile.py` (`6023619783` item 1, corrected by `6026622117` item 2), with the chain T015 → T016. plan.md gains two single-writer rows.
- T041, T046, T057: the `identity` bound is split by layer (`6027706377` item 1, refining `6018624750`). T041 narrows to the module's own serialized finding shape; T046 gains it on `health list --json`; T057 gains it on the HTTP Health response; FR-011's coverage row cites all three.
- T022's falsifier gains the root-`.gitignore` source check (`6026275158` item 2); T102's gains the widened no-bypass scan (`6026275158` item 3); `6028364555` item 4.
- T012's Ruled line: `6026275158` item 1 and `6026622117` item 1.
- T072's Files name openDox-code#95, and T071's entry names its ratification record, openxFactory#1261 (a DRAFT PR that exists now). T015's PR does not exist yet, so its number is not named.
**Qualifiers and counts:** "plan 034's" on spec.md (two places) and clarify-questions.md (one place), found by content, nothing else moved (`6027706377` item 2). tasks.md's header and plan.md each carry a revision paragraph.
### Ruled and Decisions
Ruled (all on #656): `6027341795`, `6027346843`, `6027382308`, `6027633398`, `6027706377`, `6026275158`, `6026622117`, `6023619783`, `6028122920`, `6028138991`, `6028364555`, `6064169640`. Decisions: none new.
### Readings, disclosed
- T042's Files wording follows R2-INV-P5 § T042 (the `docs/runtime.md` arrays move with `identity.TABLES`); the holder's `6028364555` item 2 words the cause as the `full` rename, and cites the same map section.
- plan.md's `tests/test_default_profile.py` row says the chain "follows `default_profile.py`'s", as `6023619783` words it; T046 and T057 are not given the file in their own Files lines.
- `6023619783` item 2 (T071's record header) is not in this batch's items and is not encoded here.
- Lane 3's other R2-INV-P5 observations (moved #1144 line references, floor and census counts, T015's census line) stay informational and are not encoded (`6028364555` item 7).
### Gates
- `python3 scripts/validate-openspec-cli-pin.py --all --strict` at the merged head `b236fa6c`: exit 0 (the one accepted exception is `add-chain-attestation`'s disposition, as on main).
- doc-health (`scripts/doc-health.py --single-repo .`) at `b236fa6c` against `origin/main` `c9dfd4f8`, same clone: identical reports, 31 critical, 26 error, 69 warning, 19 info, zero differences after SHA normalization.
- Local `python -m pytest tests/ -q -m "not postgres" -n 8` at `3e6feb6b`: 9206 passed, 7 skipped, 1 failed. The failure is `tests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization]`, a 30 s subprocess timeout that fails identically on `origin/main` in the same clone. Later commits change only spec text and chain records.
- CI at the head `b236fa6c`: every check SUCCESS (rollup SUCCESS, read through GraphQL), including `pytest-suite`, `doc-health-py314`, `openspec-cli-pin` and SonarCloud. The head adds only the merge of `origin/main` `c9dfd4f8` (the archive of amend-worker-input-budget-dispatch-wording, #1269) to `c675894d`, whose rollup was SUCCESS too.
- Copilot: at `a9fc7e7b` two threads (4205521074 → fixed in `4263d665` on `6064169640`; 4205521173 → fixed in `c3409c03`). At `3e6feb6b` two threads (4221525148, the PR description, updated; 4221525277, the T020, T026 and T095 chains, fixed in `c675894d`). At `c675894d` and at the head `b236fa6c`: "Approval recommended", 0 open findings. All four threads are answered and resolved.
### NOT done
No requirement text, no contract file and no `openspec/changes/` path is touched. No box is ticked in #1144.
refs #656
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
T002, plan 038: release 2's base (
evidence/r2-base.md), and plan 038'stasks.mdbookkeeping, items 1 to 15. Bookkeeping and evidence, so this PR carries noArc:line. It touches noopenspec/changes/path, so no Rule 6 window applies.From plan 038's
tasks.md, T002evidence/r2-base.mdevery repository'smain(research.md's R0 command), the box census, andPACKET_MERGE=94b6f7f1for F11.1, with lane 3's composed re-run quoted against R2-INV-P4F's 174. README: linksevidence/r2-base.md. After: T004. Lane: 4 (lane 3 for the composed run).#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 entryEach figure is a command quoted with its output, or lane 3's measurement quoted and attributed.
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(thenc6d15b27, T020's Derive-possibles register merge 2026-07-24 #39, committed 16:10:44Z),openDox d77f8cbf,openXdox 9564d5d9,openDox-spec 7db9438b,openXdox-spec f088b097,openxFactory 51456835,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.box_census.pyover File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144'stasks.mdat51456835readstotal 125 Counter({'x': 74, ' ': 42, '~': 9}). Atce64afc9it reads the same, anddiffof the two full outputs is empty: delta 0. Batch Q (T005: batch Q, the release-2 answers' amendments in #1144 (plan 038) #1248) landed between them, adding 526 lines and removing none.PACKET_MERGE=94b6f7f1(94b6f7f13b45c351b9142345738965c974b7dd37), onorigin/main's first-parent line; 83 first-parent commits since, 3 with theArc:trailer (release 1's consumer pins).lane3-to-lane4.log(09:52:07Z and 09:52:31Z), claimed on#6566013610393: "174 red vs 174 (170 failed + 4 errors, 668 passed ...)"; "moved: none"; "5 suites / 210 cases"; openDox installed from openDox-codemaina9ac96f9while openXdox-code'spyproject.toml:126and openxFactory's nestedopenDox/codepindede32b4(v0.1.0); openxFactorymain0f2a87f6to92010d3e. I verified one thing there: of the 48 files that differ, the two underscripts/arescripts/ideation_dashboard/nightly_lane.pyandscripts/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
opensoft/openxFactory#656, encoded as worded. The files aretasks.md,plan.md,data-model.md,contracts/health-finding.md,contracts/cli-http-health.mdandchecklists/requirements.md.tests/test_composed_placements.py(openXdox-code#41)6016356225tests/test_swb_session_transport.py(the bound and unbound probes in one committed file; #42)6016676145tests/test_protected_suite_check.py, and T020'stests/conftest.pyandtests/test_host_plane.pyafter T020 lands; 'cluster' respells to "group neighbourhood"; the single-writer table's chain6016356225, Brett6016648451MIN_SELECTEDandMIN_PASSEDof openXdox-code'svalidate.yml, raised ONCE at its final head after mergingmain; no other PR raises them; a new single-writer row6017860539tests/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 row6016648451--chains, carried out by T026 and T029; the amendments table gains the row60166484516017801219) and T095+; T073's PR stays a DRAFT until they land; the lane table, the critical path, the slice tables and the dependency list follow6016982816open_untildoc_healthkeeps its words plus lane 3's clause;status-exemption-railandopenxfactory-contractsread the ruled sentence, quoted6016982816realize-doc-health-direction-arcas F9.2's carrier, in T076, T084, the box-accounting row and plan.md's ARC-560135475046017901451design.md§ 10; the single-writer table:validate.ymlT029 (floors) then T074 (LEFT_OUT)design.md§ 10identityhealth_findingscolumn, 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's601862475091e961a0; T008 codeXfactory/codexFactory#515f1b019fe; T010 openDox-code#8934c20641; T040 openDox-spec#177db9438b; T070 #124751456835; and, on the coordinator's later word, T020 openXdox-code#39c6d15b27and T024 openXdox-code#388b64fae0. Each was verified withgh pr view <n> -R <repo> --json mergeCommittests/test_declared_rail_registration.py(the conftest rail block's 5 lone cases with stand-in rails)6020698021, answering6020683941test_gate_off_descriptor_is_the_real_cli_invocation,test_gate_off_session_affordances_are_the_real_cli_invocationsandtest_the_notebook_refresh_is_a_descriptor_in_BOTH_gate_postures, admitted under CF-4; plan.md's CF-4 row notes it6020859092T002 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:
tasks.md, and in T076 and the F9.2 accounting row.\|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.Claude Sonnet 5.5, as the session's attribution rule requires, where the writer rules spellClaude Opus 5.5 (1M context).The holder's answers on this PR's four open questions
tests/test_declared_exclusion.pyis 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).identityresponse-shape falsifier are DEFERRED to the holder's next bookkeeping batch, with T094's T095 to T104 entries. This PR keeps to its list, sospec.mdis asorigin/mainhas it. (Copilot asked; the edit was made at76b9428band taken back at7ddfda5e.)identitycap 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 andcontracts/health-finding.mdsay so (80c6fee7). No value is written.evidence/analyze-round-1.md) and its re-check (6013547504). T003 was a discretionary second round, so the closure (6017901451) stands.Review and gates
8b0a535d76b9428b. The cap is an accepted limit (no value is written, by the holder's word); FR-011 is the holder's (open question 2)da00b2987ddfda5e; T003 is the holder's (open question 4); the body is corrected (item 13)7ddfda5e80c6fee7identityshould be NOT NULL in the store's model;r2-base.mdcalled its figures an input to T004's ruling, but T002 follows T004fb57b851f0f6923d(final)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 push9 threads, 0 unresolved. Every reply cites its commit or ruling.
python3 scripts/validate-openspec-cli-pin.py --all, in the clone namedopenxFactory, atf0f6923d: exit 0,Totals: 113 passed, 1 failed (114 items),0 UNDISPOSITIONED failures. The one failure is the dispositionedadd-chain-attestationfinding, the same onmain.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 istests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization], a 30sTimeoutExpired. It fails the same way onorigin/mainin 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.scripts/doc-health.py --single-repo ., branchf0f6923dagainstorigin/mainc44c1610in the same clone: the two reports are byte-identical (sha2563b2e1f59db747178…;Findings: 31 critical, 26 error, 69 warning, 20 info. New regressions vs previous report: 0.). So no new error.f0f6923d: all 15 check runs completed at the head:pytest-suitesuccess (19:00:34Z to 19:27:22Z),SonarCloud Code Analysissuccess,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-pinand the threelane-lineruns all success. One is RED,merge-master-approval, and it is inherited frommain: its floor evaluation stops atfloor_incomplete, "4 covered-pending path(s) exceed the tolerance of 3", the four beingopenspec/specs/corpus-adapter-seam,domain-mapping-declaration,factory-mcp-conformanceandpacket-citation-report, eachadded_to_base_after_pin. This PR touches noopenspec/specspath. Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252 (the archive that promotedfactory-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 at7ddfda5eand80c6fee7. A rerun reads the same base, so the pin or floor refresh (Advance the pinned decision core to fe9a6f5b91886e4f07296dc6a264deb345b1618f #1138, "Advance the pinned decision core") is what clears it; the holder rules on landing over it.mainmoved once more after these gates, toa2dc658d(prefer-triad-project-shape 5.1: the doctrine and register description restate the Triad as preferred, confers nothing #1254, which touchescontracts/schemas/project-register.schema.yaml,docs/project-repo-schema.mdandopenspec/changes/prefer-triad-project-shape/tasks.md). It shares no file with this PR, andgit merge-treereports a clean merge. I did not merge it in, since each merge restarts the 27-minute gate; the holder can rungh pr update-branchbefore 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.mdspecs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md,contracts/cli-http-health.mdREADME.md(the feature-038 entry's evidence list, one link)What is NOT done
spec.mdis asorigin/mainhas it, and nothing is underopenspec/changes/.contracts/health-finding.mdonly.🤖 Generated with Claude Code
Summary by Sourcery
Record release 2's baseline evidence and incorporate the latest plan rulings, task status, and health-finding contract updates into feature 038.
New Features:
Enhancements:
Documentation:
Chores: