Skip to content

T002b: plan 038's second bookkeeping batch, T094 and T095 to T104, the identity response shape and the single-writer chains (plan 038) - #1257

Merged
brettheap merged 12 commits into
mainfrom
r2/t002b-bookkeeping-2
Oct 7, 2026
Merged

brettheap merged 12 commits into
mainfrom
r2/t002b-bookkeeping-2

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

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 T002: release 2's base and plan 038's bookkeeping, items 1 to 15 (plan 038) #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 opensoft/openxFactory#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

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 Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252 was cleared by Advance the pinned decision core to fe9a6f5b91886e4f07296dc6a264deb345b1618f #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

🤖 Generated with Claude Code

Summary by Sourcery

Record plan 038’s second bookkeeping batch, formalize the health response identity shape, and update repair-slice dependencies and completion records.

Enhancements:

  • Record the second bookkeeping batch for plan 038, including the completed T094 map, concrete T095–T104 repair slices, updated dependency and single-writer chains, and verified task landings.
  • Clarify the bounded identity field in the health JSON response contract and associate its response-shape coverage with T041.
  • Expand the recorded falsifiers for line splitting, seam registration, host wiring, and protected-suite coverage.

Chores:

  • Update plan and task bookkeeping to reflect completed work, landing commits, revised task dependencies, and the still-open T071 ratification record.

brettheap and others added 12 commits October 6, 2026 16:30
…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>
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 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'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>
…'s fold, T072's Files and the ticks (tasks.md; plan 038)

Encodes rulings already posted on #656 and landings already
merged, as worded: T094's map R2-INV-R9 (6021830607) and the slice entries T095 to
T104 with the holder's rulings (6021830531) and answers (6022291206); the four
items of #1253's fold (fc4fa0f) in T072, T074 and T075; T041's identity
response-shape falsifier (6018624750); T072's Files and its two scope rulings
(6023517122); the ticks of T011, T021, T023, T025 and T060 and T070's second
landing; T071's word given, its box left open.

Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…837ea7)

tasks.md conflicts resolved to this branch's side: main's plan 038 tree equals the
head this branch started from (1eb8e9e), so only this branch's edits differ.

Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…tence and T014, T026 and T002's ticks (plan 038)

plan.md: the single-writer table carries the chains of T095 to T104 (6021830531 W7,
6022291206) with tests/conftest.py and tests/test_host_plane.py as separate rows,
T073's landing-order row names T005 and T095 to T104, T095+ reads T095 to T104, and
the cross-lane summary gains T026 (Copilot's three items at #1251's head, accepted
by the holder: 4201056969, 4201057311, 4201057577).
spec.md: FR-011's JSON shape gains the emitted, bounded identity (6018624750).
contracts/health-finding.md: the cross-run collision sentence is qualified for an
exception-only finding (6018624750; Copilot 5433292692).
tasks.md: T014 (openDox-code#93), T026 (openXdox-code#43) and T002 (#1251) ticked
with their merge commits.

Lane: openxfactory-4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 23:32
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This bookkeeping-only PR updates plan 038’s task records to reflect the completed R9 measurement and its ten repair slices, verified landings, dependency and single-writer chains, folded falsifiers, and open T071 status; it also formalizes the bounded emitted identity field in the health-finding response contract.

File-Level Changes

Change Details Files
Expanded plan 038 bookkeeping with completed measurements, concrete repair-slice tasks, verified landing records, and updated dependency/single-writer tracking.
  • Replaced T095+ with T095–T104 and recorded T094’s 436-red map, slice ownership, falsifiers, dependencies, rulings, and lane assignments.
  • Updated plan and task dependency tables for conftest, host-plane, census, exclusion, and T074 test-file writer chains.
  • Recorded verified landing commits for T011, T014, T021, T023, T025, T026, T060, T070, and T002 while leaving T071 open.
  • Added the folded falsifier requirements for line splitting, seam diagnostics, protected-suite coverage, and host-wiring behavior.
  • Clarified task count, critical path, cross-lane handoffs, and the scope/readings accepted from review.
specs/038-opendox-document-tool-self-maintenance/tasks.md
specs/038-opendox-document-tool-self-maintenance/plan.md
Defined the externally emitted health-finding identity response shape and aligned its task coverage and collision semantics.
  • Added identity to the FR-011 JSON response contract with bounded, string-only values and constrained pathless/collision forms.
  • Extended T041’s falsifier and FR-011 coverage mapping with the response-shape assertion.
  • Clarified that only stored findings participate in detectable cross-run identity collisions, while exception-only findings are not stored.
specs/038-opendox-document-tool-self-maintenance/spec.md
specs/038-opendox-document-tool-self-maintenance/tasks.md
specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.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

Several falsifiers cannot enforce their stated behavior, and new task IDs make existing cross-plan references incorrect.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Records plan 038’s second bookkeeping batch and formalizes remaining execution contracts.

Changes:

  • Adds T095–T104 repair slices, dependencies, and completion records.
  • Updates single-writer chains and arc falsifiers.
  • Defines the emitted identity response shape and collision wording.
File Description
tasks.md Adds slices, ticks, dependencies, and falsifiers.
plan.md Updates writer chains and landing order.
spec.md Extends FR-011’s JSON response shape.
contracts/​health-finding.md Clarifies cross-run collision detection.

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

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

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

@sourcery-ai

sourcery-ai Bot commented Oct 7, 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 2 days and 20 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@brettheap

Copy link
Copy Markdown
Contributor Author

READY (holder, manual landing) at 691648c

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

Holder, at READY: T002 batch 2, plan 038's bookkeeping items 1 to 9 plus the ticks. Landed under plan 038's "lane openxfactory-4 lands every PR" (#656 6013547504).

  • Gates at the head:
    • all 14 checks pass (rollup SUCCESS): pytest-suite, merge-master-approval, openspec-cli-pin, doc-health-py314 and SonarCloud among them;
    • the pinned gate exits 0, with 0 undispositioned;
    • doc-health is byte-identical to main 0992369a, with 0 new regressions;
    • the files are four under specs/038-…/, with no Rule 6 path;
    • 0 closing keywords.
  • Copilot 5435686665, "Changes recommended", is ACCEPTED under 5988818366. Its finding: T041's falsifier cannot verify what T046 and T057 emit. The placement was the holder's own (item 5), and holder ruling 6027706377 splits the bound across T041, T046 and T057. Batch 3 (r2/t002c-bookkeeping-3) encodes that. The thread is answered and resolved.
  • Next: batch 3 merges main after this lands.

@brettheap
brettheap merged commit c70bdbd into main Oct 7, 2026
18 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

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

LANDED — lane openxfactory-4, 2026-10-07T00:30:06Z, PR #1257 → c70bdbd (opensoft/openxFactory main; plain gate)

Batch 2 landed; Copilot 5435686665 ACCEPTED under 5988818366, its refinement (6027706377) rides batch 3.

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>
brettheap added a commit that referenced this pull request Oct 9, 2026
…two early-wave words, and the holder's wave-1 and wave-2 rulings (plan 038) (#1279)

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

## T002d: plan 038's fourth bookkeeping batch (plan 038)

Bookkeeping: no `Arc:` line, and no `openspec/changes/` path. It encodes rulings already posted on #656 and a landing already merged, each cited by comment id or merge commit, with no new decision. It follows #1263 in form and redoes nothing #1263 did. Claim: #656 `6069520093`. `origin/main` is merged into the branch twice, `40d6e5c1` and then `564f565a`, never rebased.

**Realizes / Falsifier:** none (bookkeeping). The gates are listed under "Gates" below.

### What changed (specs/038-opendox-document-tool-self-maintenance/)

**A. Ticks.** Each merge commit was read through GraphQL (`pullRequest{mergeCommit{oid}}`) before it was written. The sweep covered every PR merged since #1263's landing (2026-10-08T18:12Z) in openDox-code, openXdox-code, openDox, openXdox, openDox-spec and openxFactory, plus xFactory and codexFactory, and was re-run at 2026-10-08T23:19Z:
- **openDox-code:** T012 and T013, #90 → `6827cafc` (2026-10-08T21:08:43Z), in one PR as T012's "Lands with" requires. T012's Landed line records the accepted limits that #90's body states:
  - the holder's `6067853207`: Copilot 4223441552 with Codex P2 4223462534, Copilot 4223441643, and Codex P1 4223462529. Item 3 widens the fast-forward limit to both paths.
  - `6069024568` item 1: lane 3's R2-DELTA MINOR at `landing.py:836`.
  - beside those, `6026622117` item 1 and `6035797819`.
- **Nothing else** merged in those repositories realizes a plan-038 task. The openxFactory merges since (#1267, #1270, #1271, #1272, #1275 and #1277) belong to other changes.
- **The previous batch,** #1263 → `3a2ab303`, is this batch's "merged since" anchor in the revision paragraph, as #1263 treated #1257. It is not added to T002's Landed line.
- **The task count** reads T012 and T013 done.

**B. Brett's words on phase 5's early waves,** recorded under tasks.md "What can start":
- wave 1 (T041, T042 and T043) is written now and lands after T027 (`6035546708`, *"Write now, land after T027 (Recommended)"*);
- wave 2 (T044 and T046) is written early, stacked (`6067802993`, *"Write now, stacked (Recommended)"*), and lands in plan order. Every After line keeps its landing meaning.

**C. The holder's wave-1 rulings (`6069024023`).**
- **Item 1.** `contracts/health-finding.md` § The id rule names the engine categories, T041's nine plus `dispositions-refused` and `manifest-refused`. It states that a category is also the finding's `kind`, and gains the four mappings:
  - stdout over the cap is `pack-bound-hit`;
  - non-JSON or contract-breaking output is `pack-output-refused`;
  - one finding per (category, entry) per run, with the reasons in `evidence`;
  - each category's `pack_id`, as `6072086385` item 1 rules it (see "The review questions, ruled" below). It replaces the phrase "one `pack_id` per category", which named no value.

  T045's text records its refusal extension, extending `6065680005` item 3: it refuses a pack family that declares an engine kind, and a pack finding with an empty path. T041's note records the two added categories and points to the contract's list.
- **Item 2, option (D).** `contracts/health-finding.md` (the re-raise bullet) and `data-model.md` § Baseline classes carry the re-raise's two forms, with no schema change:
  - `{disappeared_id}`, with the original's path;
  - the pathless form: `path ""`, `{category: <the original's kind>, entry: <its entry, or "">}`, and `disappeared_id` and the baseline run in `evidence`.

  T046's falsifier gains the pathless-original node (run 2 re-raises once, run 3 raises nothing). T041's note says that `disappearance_identity()` returns either form.
- **Item 3.** `data-model.md` § Health run gains the `run_seq` row, and a note that `baseline_class` is NOT NULL, with no fourth value. The note is also on § Finding's own row. T046's text gains the per-corpus advisory transaction lock, and its falsifier gains the node that two overlapping runs serialize. T042's column list and Ruled line name `run_seq` (item 3 accepts it as T042's).

**D. The holder's admissions (`6069024568`).**
- **Item 2.** T015's Files gain `src/opendox/web/views/account-menu.js` (one word, `"submit"` in `WRITE_ACTIONS`) and `pyproject.toml` (one line, `:312`'s 42 → 43), each with the chain T015 → T016 → any later verb. T016's Files record that it follows T015 in both. plan.md gains a row for `account-menu.js`, and its `pyproject.toml` row gains that line's chain.
- **Item 3.** T042's Files gain `tests_runtime/test_api_endpoints.py`, for one edit.

**E. The holder's wave-2 rulings (`6069507373`).**
- **T044 item 3.** `tasks.md:1163` now reads "the top-level directories named by the six role keys or their declared words", as FR-010 words it at `spec.md:819-821`.
- **T046 item 8.** T046's After line gains T016: the `cli.py` and `default_profile.py` chains at `plan.md:456-457`, cited by row name because this PR moves plan.md's lines. Its text says that its `default_profile.py` and `cli.py` contributions, and the admitted `tests/test_default_profile.py` line, join its PR only after T016 lands, by a merge of `main`. That line joins T046's Files.
- **T046 item 2.** T041's note gains the module-level, patchable `finding_id()`, the single hash path `make_finding` calls. Its interface is unchanged (lane 3, `6069516931`).
- **T046 item 4.** T056's Files gain ONE `engine.py` line binding T046's pack hook. It is written after T046 lands, with nothing else in `engine.py` (lane 3's ACK, `6069516931`). T046's Files mark `engine.py` as "first: T046 → T056", and plan.md gains its row.
- **`contracts/health-finding.md:43`.** `baseline_class` is NOT NULL in the store (`0003_`). The row also says that the finding schema's `finding-keys` rule lists it as optional, since no schema change is ruled.
- **N-14 and OQ-H-15, one owner each.**
  - N-14 is T046's: suppression on an injected source of accepted ids, with T054 supplying the parser (T046 item 3).
  - OQ-H-15 is T044's: in the families, through `excluded=`, with no `doxbench_intake.py` edit (T044 item 8).
  - T054's text and its Decisions line drop both.
- **`plan.md:437-438`.** "rebases" becomes "merges `main`".

tasks.md's header and plan.md each carry a revision paragraph.

### The review questions, ruled (`6072086385`), encoded in `8b76a05d`
- **Item 1 (Q1, Codex 4225201227): each engine category's `pack_id`, option (b),** as T041's `ENTRY_CATEGORIES` implements it and as dox-v1.2's schema text for `pack_id` reads.
  - The entry's id, for a finding against a VALID manifest entry's pack: `fetch-failed`, `digest-mismatch`, `declaration-refused`, `pack-crashed`, `pack-timed-out`, `pack-bound-hit` and `pack-output-refused`.
  - `opendox` for every other category: `no-sandbox`, `manifest-refused`, `dispositions-refused` and `entry-refused`. A refused entry rides only in `identity.entry`.
  - The rule is stated in `contracts/health-finding.md` § The id rule (replacing "one `pack_id` per category") and in its Rules section's install-level bullet. T041's note and Ruled line cite it.
- **Item 2 (Q2, Copilot 4225214488), option (b): no plan change.** #99 already pins NOT NULL, the run order and the uniqueness. T042 adds a catalog assertion (GENERATED ALWAYS, CACHE 1) in its own tests.
- **Item 3 (Q3, Copilot 4225214548), option (a).** T045's Falsifier gains one node for each refusal that `6069024023` item 1 extends from `6065680005` item 3: a family that declares an engine kind is refused, and a pack finding with an empty path is refused. T045's Ruled line cites item 3.
- **Item 4 (the NUL seam)** is not in this batch, as the holder directs. It is left to the next batch.

### Ruled and Decisions
- **Ruled (all on #656):** `6035546708`, `6067802993`, `6067853207`, `6069024023`, `6069024568`, `6069507373`, `6069516931` and `6072086385` (items 1 to 3).
- **Cited beside them:** `5988818366`, `6064244857`, `6065680005`, `6026622117` and `6035797819`.
- **Decisions:** none new.

### Readings, disclosed
- **6035546708's placement.** It was recorded nowhere in the tree. Its own record line asks for "beside the release map (T005 item 12)", which is #1144's `openspec/changes/` path, outside this batch. It is recorded with `6067802993` under "What can start", where tasks.md words N-6 (a) as "start". The holder accepted this placement when the writer resumed.
- **`plan.md:437-438`.** A literal swap would read "merges `main` onto the previous slice's landing", so "onto" also became "after".
- **The single-writer rows.** `6069024568` item 2 and `6069507373` T046 item 4 set chains, and plan.md's table records them as #1263 did for its chains:
  - rows for `account-menu.js` and `health/engine.py`;
  - `pyproject.toml`'s `:312` chain, beside its T048 → T055 → T061 chain.
- **The engine categories in the contract.** The ruling adds two categories to T041's nine, so the contract names all eleven. Item 1 accepts the nine as written, and its mappings name `pack-bound-hit` and `pack-output-refused`.
- **The `baseline_class` NOT NULL note** is in `data-model.md` § Health run, as the ruling words it, and on § Finding's own row.
- **Line drift.** Every cited line matched by content at the base `c8dde131`:
  - `tasks.md:1163` and `:1238-1240`;
  - `plan.md:437-438` and `:456-457`;
  - `data-model.md:260-262`;
  - `contracts/health-finding.md:43`, `:59-62` and `:64-69`.

  One exception: `6069024023` item 1 says T041's nine copy `data-model.md:330-334`. In this file, those lines are § Pack declaration, which lists no categories, so nothing is encoded from that cite.

### NOT encoded (the writers' own)
- **`6069507373` T046 item 2's edge,** where two pathless originals of one (category, entry) yield ONE re-raise, and T044's other items: these are implementation rulings for those writers, not bookkeeping.
- **plan.md:664's R2Q11 summary row,** which the ruling does not name.
- **#90's readings 1 to 5 and 7** (inferred, not ruled).
- **`6072086385` item 4,** the NUL seam: left to the next batch.
- **T071's tick** (#1261 → `a020b34a`, landed at 01:13:36Z, after this PR's last push): left to the next batch, as the holder directs.

### Gates
- **Validator.** `python3 scripts/validate-openspec-cli-pin.py --all` and `--all --strict` at `8b76a05d` both exit 0, with `Totals: 113 passed, 1 failed (114 items)`. The one failure is the accepted exception, `add-chain-attestation`'s disposition in the pin, as on main.
- **CI at the head `8b76a05d`:** 14 of 14 checks are SUCCESS (rollup SUCCESS, read through GraphQL), including `pytest-suite`, `doc-health-py314`, `openspec-cli-pin`, `lane-line` and SonarCloud.
  - `pytest-suite` reports `selected=9838 passed=9832 skipped=6 failures=0 errors=0` (9208 tests passed, 6 skipped).
  - Its freshness verifier and its vector replay both passed.
- **Local pytest at `8b76a05d`** (`-m "not postgres" -n 8`, with the three gitlinks initialized as CI does): `2 failed, 9205 passed, 7 skipped`.
  - Both failures are 30 s subprocess timeouts of `validate-hermes-runtime-contracts.py` in `tests/hermes_runtime_contracts/test_validator_cli.py`, on a shared host at a load average of about 85 on 32 cores.
  - Serially, the release-mode node also fails on main, as #1263 recorded.
  - The candidate-mode node passed serially at `897dce40` and on main `b4b9d903`, and timed out under that load at `8b76a05d`.
  - CI runs both green.
- **doc-health** (`scripts/doc-health.py --single-repo .`), at `897dce40` against main `b4b9d903` in the same clone: identical reports, 31 critical, 26 error, 69 warning and 19 info, with 0 differences after SHA normalization. `doc-health-py314` is green at the head.
- **Copilot.**
  - At `897dce40`: "Changes recommended", with two threads (4225214488 and 4225214548), ruled by the holder in `6072086385` items 2 and 3.
  - At `8b76a05d`: "Approval recommended", with 0 open findings.
- **Codex.**
  - At `897dce40` it reviewed the head ("Reviewed commit: `897dce405c`") and opened one P2 thread (4225201227). The holder ruled it in `6072086385` item 1, and `8b76a05d` encodes the ruling.
  - At `8b76a05d`, the trigger posted at 01:02:53Z was answered at 01:02:56Z with "You have reached your Codex usage limits". There is no Codex review at the head yet.
- **Threads:** all 3 are answered, citing `6072086385`, and resolved.

### NOT done
- spec.md, every `openspec/changes/` path and #1144 are untouched.
- No box is ticked in #1144, and no task is added.

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