Skip to content

T002: release 2's base and plan 038's bookkeeping, items 1 to 15 (plan 038) - #1251

Merged
brettheap merged 9 commits into
mainfrom
r2/t002-base-and-bookkeeping
Oct 6, 2026
Merged

brettheap merged 9 commits into
mainfrom
r2/t002-base-and-bookkeeping

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

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 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.
  • The box census: plan 034's box_census.py over File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #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 (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), 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 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) 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 File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144 (the archive act stays the holder's, ARC-5 (a)). The coordinator accepted placing the disposition in T084, the last task to edit File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #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. 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.

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 File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #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

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:

  • Add release 2 base evidence covering repository revisions, task census, packet merge, and the composed-suite re-measurement.
  • Document health-finding identity as a bounded field that is stored and exposed through CLI and HTTP health results.

Enhancements:

  • Update plan and task bookkeeping with completed work, revised dependencies, ownership, rulings, and follow-up repair tasks.
  • Record the closure of the analyze task and several landed implementation tasks, including the associated evidence and merge references.
  • Clarify composed-test coverage, protected-suite bookkeeping, F9.2 disposition handling, and validation workflow ownership.

Documentation:

  • Link the new release 2 base evidence from the feature documentation index.
  • Update release 2 contracts, data model, plan, task records, and requirements checklist to reflect the latest rulings and bookkeeping.

Chores:

  • Mark T002 and related completed tasks and merge commits in the feature bookkeeping.

…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>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 16:31
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

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.
specs/038-opendox-document-tool-self-maintenance/evidence/r2-base.md
README.md
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.
specs/038-opendox-document-tool-self-maintenance/tasks.md
specs/038-opendox-document-tool-self-maintenance/plan.md
Changes the health-finding contract and data model so identity is persisted and exposed instead of remaining engine-internal.
  • Adds identity to CLI JSON and HTTP response requirements.
  • Defines canonical JSON storage, schema-aligned field restrictions, serialized-size capping, and engine-authored identity forms.
  • Revises collision wording to make cross-run collisions detectable through stored identity while retaining reporting as T046's concern.
  • Adds the identity column and updates the finding model and refusal rules.
specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md
specs/038-opendox-document-tool-self-maintenance/contracts/cli-http-health.md
specs/038-opendox-document-tool-self-maintenance/data-model.md

Tips and commands

Interacting with Sourcery

  • 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!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Task-state contradictions and underspecified identity API behavior must be reconciled before approval.

Review effort: Balanced
Findings: 2 Medium severity · 3 Low severity

Open (5)
What changed in this PR

Records release 2 baseline evidence and synchronizes feature 038’s planning, task bookkeeping, and health-finding contracts.

Changes:

  • Adds release baseline and composed-suite evidence.
  • Records task completions, rulings, dependencies, and repair slices.
  • Makes finding identity stored and publicly emitted.
File Description
README.md Links release-2 evidence.
specs/​038-opendox-document-tool-self-maintenance/​tasks.md Updates task state and sequencing.
specs/​038-opendox-document-tool-self-maintenance/​plan.md Records post-ruling decisions.
specs/​038-opendox-document-tool-self-maintenance/​evidence/​r2-base.md Captures release baseline measurements.
specs/​038-opendox-document-tool-self-maintenance/​data-model.md Adds persisted finding identity.
specs/​038-opendox-document-tool-self-maintenance/​contracts/​health-finding.md Defines identity storage and emission.
specs/​038-opendox-document-tool-self-maintenance/​contracts/​cli-http-health.md Exposes identity through CLI and HTTP.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md Outdated
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md Outdated
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>
brettheap and others added 2 commits October 6, 2026 17:34
- 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>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The analyze gate is closed without the constitution-required run, and the diff contains scope discrepancies with the PR description.

Review effort: Balanced
Findings: 4 Medium severity · 1 Low severity

Open (5)
Resolved since last review (3)

Comment thread specs/038-opendox-document-tool-self-maintenance/spec.md Outdated
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md
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>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The analyze gate is improperly closed, and the identity contract and cap ownership remain inconsistent.

Review effort: Balanced
Findings: 3 Medium severity · 1 Low severity

Open (4)
Resolved since last review (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity T003 closes without required fresh analysis

specs/​038-opendox-document-tool-self-maintenance/​plan.md:252

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.

Medium severity Serialized-size cap is inconsistent across parallel tasks

specs/​038-opendox-document-tool-self-maintenance/​tasks.md:874

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>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The identity persistence invariant and T002 evidence chronology need correction.

Review effort: Balanced
Findings: None

Resolved since last review (4)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Require identity column to be NOT NULL

specs/​038-opendox-document-tool-self-maintenance/​data-model.md:198

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.

Low severity Correct T002 and T004 chronology and evidence usage

specs/​038-opendox-document-tool-self-maintenance/​evidence/​r2-base.md:235

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>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 18:59

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The collision documentation incorrectly claims detectability where exception records retain no prior identity.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)

@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

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 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

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Writer-chain and landing-order records remain internally inconsistent.

Review effort: Balanced
Findings: 3 Low severity

Open (3)
Resolved since last review (1)

Comment thread specs/038-opendox-document-tool-self-maintenance/plan.md
Comment thread specs/038-opendox-document-tool-self-maintenance/plan.md
Comment thread specs/038-opendox-document-tool-self-maintenance/tasks.md
@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

READY (holder, manual landing) at 1eb8e9e

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

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).

  • The head: 1eb8e9eb is the holder's update-branch merge of main 9171d14a, made after Advance the pinned decision core to fe9a6f5b91886e4f07296dc6a264deb345b1618f #1138 (lane openXfactory-5, on Brett's word) moved the review-lane pin onto the re-swept floor. That cleared the inherited merge-master-approval red, floor_incomplete since Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252. Plan 038's content equals the frozen f0f6923d.

  • Gates at the head:

    • every check passes (rollup SUCCESS): pytest-suite, merge-master-approval, openspec-cli-pin, openxdox-consumer-gate, lane-line, wallet-validation, release-tag-gate, signed-execution-chain-gate, former-id-arrival-gate, clearing-dispatch-gate, doc-health-py314, openreposhape-pin and SonarCloud; Sourcery is skipped;
    • the files are README.md and specs/038-… only, with no Rule 6 path;
    • 0 closing keywords in the body or commits.
  • Copilot "Changes recommended", ACCEPTED under 5988818366:

    • at f0f6923d, the identity-collision wording, which is the holder's own (6018624750);
    • at 1eb8e9eb, three plan-record items: the landing-order row for T073, and splitting the conftest.py/test_host_plane.py chains.

    None is a bypass. All are folded into T002 batch 2 (r2/t002b-bookkeeping-2, stacked on this PR), and each thread is answered and resolved.

@brettheap
brettheap merged commit 1837ea7 into main Oct 6, 2026
16 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

LANDED — lane openxfactory-4, 2026-10-06T22:31:49Z, PR #1251 → 1837ea7 (opensoft/openxFactory main; plain gate)

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.

brettheap added a commit that referenced this pull request Oct 7, 2026
…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>
brettheap added a commit to opensoft/openXdox-code that referenced this pull request Oct 7, 2026
…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>
brettheap added a commit that referenced this pull request Oct 8, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants