Skip to content

dox-v1.2: T040's three health schemas (spec pin, manifest bump, CHANGELOG draft) (plan 038 T060) - #20

Merged
brettheap merged 1 commit into
mainfrom
r2/t060-dox-v1.2-spec-pin
Oct 6, 2026
Merged

brettheap merged 1 commit into
mainfrom
r2/t060-dox-v1.2-spec-pin

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Arc: neutral-product-standalone-operability

The dox-v1.2 cut PR. This is plan 038's T060 (opensoft/openxFactory, specs/038-opendox-document-tool-self-maintenance/tasks.md): "The openDox root's spec pin and the dox-v1.2 minor, on Brett's cut word (R2Q22 (a))." Its spec-leg half landed as opensoft/openDox-spec#17 (T040, squash-merged 7db9438b). This PR is the root half. It follows the shape of release 1's dox-v1.1 cut PR, #14 (5200521).

  • Realizes: 9.5 (part).
  • Falsifier: the root's make validate and make pins, quoted; openDox-spec's own validate.
  • Ruled: R2Q22; Brett's cut word, recorded on #656. Decisions: CF-2 (batch Q item 10's addendum).

The authority:

  • R2Q22 (a). Brett Heap, 2026-10-05, opensoft/openxFactory#656 comment 6003486656: "Accept all 25 recommended (Recommended)". openDox-spec owns three schemas, and the openDox root cuts one more dox-v1.y minor.
  • Batch Q's 9.5 addendum (opensoft/openxFactory#1248 → 91e961a0): "The cut is made on Brett Heap's cut word, as dox-v1.1's was (RULED 5894235642)."
  • The plan ruling (6013547504) names the dox-v1.2 cut as still Brett's word, at the act.

This PR does not create or push a tag.

What moved, in the one lockstep commit

file change
spec (gitlink) f7ee3c76 → 7db9438b4cc4446ab4e6ab5b552c220312deccc9
contracts/spec-pin.yaml commit: → the same commit; digests.tree_sha256 e81f8530… → d9f976c5b279b24b80387dad1deb0e8438d95f11ce183540bca93f86a5cd7363. No .github/workflows/*.yml names the spec leg, so there is no third fact to move.
contracts/manifest.yaml contract_bundle_version dox-v1.1 → dox-v1.2. The four existing rows' commit: fields advance with the leg; no sha256 changes. Three rows are added in opendox-snapshot's form: opendox-health-finding, opendox-health-packs and opendox-health-dispositions, each with type: release-schema, contract_schema_version: 1 and release_member: false.
contracts/CHANGELOG.md A new ## dox-v1.2 section. The Status: header reads draft again, and the Unreleased line names the new pins.

These are the same four paths #14 changed. contracts/code-pin.yaml and the code gitlink stay at dede32b4.

Verification

From a fresh --recurse-submodules clone, at this branch's head bb4249d5:

$ make validate
python3 scripts/validate-repository-naming.py --project project.yaml
  openDox                          neutral-product/assembly   also_matches project-leg/assembly
  openDox-spec                     project-leg/spec
  openDox-code                     project-leg/code
python3 scripts/validate-manifest.py
manifest ok: openDox (opendox), 3 legs
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make validate rc=0
$ make pins
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make pins rc=0

Red first. With only the spec gitlink staged, before the pin file moved, make pins refused with exit 2:

FINDING pin-gitlink-mismatch: spec: gitlink 7db9438b4cc4446ab4e6ab5b552c220312deccc9 != contracts/spec-pin.yaml commit f7ee3c763b3af4581daf1cd54406e5111e9358e6

A mutant of the new digest (tree_sha256 d9f976c5… → d9f976c6…) was also refused, with pin-digest-mismatch and exit 1. With the digest restored, the run exited 0.

Every digest was recomputed here, not copied.

  • The spec leg's tree_sha256. Computed twice at 7db9438b: with repo_shape.tree_digest, and by hand (git ls-tree -r -z, sorted, sha256). Both give d9f976c5…5cd7363. openDox-spec#17 squash-merged to the same tree (f143e7dc) as its branch head 58383189, where its validate ran green.
  • Each row's sha256. Computed over git show 7db9438b:<path>, and all seven match the manifest. The four existing digests are unchanged. The seven rows are exactly the seven files under contracts/schemas/ at the pin, and the CHANGELOG's dox-v1.2 table equals the manifest's rows.
  • release_member: false is a measurement. None of the three new ids is among the 51 contract_id rows of openxFactory's contracts/hermes-runtime/contract-index.yaml, read at openxFactory main 51456835.

openDox-spec's own validate. I ran its CI steps locally at 7db9438b, with pytest >=8,<9 and OpenSpec CLI 1.2.0:

602 passed, 5 skipped in 2.13s
PYTEST_RC=0
Totals: 4 passed, 0 failed (4 items)
OPENSPEC_RC=0

The 5 skipped tests need the optional imports yaml and jsonschema. The leg's CI install line installs pytest only, so CI skips the same five.

Why the CHANGELOG's Status: header moves to draft

The rule is the same as in #14. A bundle is four coordinated values: contract_bundle_version, the entries, the annotated tag and the changelog entry. This PR moves three of them. The dox-v1.2 tag does not exist yet, so the header reads draft until it does. dox-v1.1's window paragraph moves into the past tense, as #14 did for dox-v1.0's. dox-v1.0 and dox-v1.1 keep their own tags, entries and digests.

One cell is worded differently from #14 because the code leg has changed since then: the code leg's "contract bytes" cell. At dede32b4, openDox-code has no top-level contracts/. Its src/opendox/contracts/ does hold plan 034 T057's packaged copies of four spec schemas, recorded at f7ee3c76, and the cell says so. Those copies move to this pin later, in T041, T047 and T054.

What is NOT done

  • No tag. After this PR lands, the holder asks Brett for the cut word. On his word, the annotated tag dox-v1.2 goes on the landed commit, and a second PR moves the CHANGELOG header to standard, as openDox contract changelog: Status draft → standard, the dox-v1.1 tag now exists #15 did for dox-v1.1.
  • Nothing under code/ moves, and neither does contracts/code-pin.yaml. No workflow changes.
  • openDox-code's copy record is not touched. That is T041.

🤖 Generated with Claude Code

Summary by Sourcery

Prepare the openDox root for the dox-v1.2 contract bundle by pinning the updated spec revision and registering its three health schemas without creating the release tag.

New Features:

  • Add three openDox health schemas to the dox-v1.2 contract bundle manifest.

Enhancements:

  • Advance the pinned openDox-spec revision and update its verified tree digest.
  • Define the dox-v1.2 bundle metadata and document its draft release status and provenance.

Documentation:

  • Add the dox-v1.2 changelog entry and explain the pending operator tag cut.

…ELOG draft) (plan 038 T060)

Plan 038's T060, the openDox root half of R2Q22 (a): one lockstep commit,
in the shape of dox-v1.1's cut PR (#14, 5200521).

- spec gitlink and contracts/spec-pin.yaml (commit + digests.tree_sha256)
  move to openDox-spec 7db9438b, the squash merge of openDox-spec#17
  (T040's three health schemas). No workflow names the spec leg.
- contracts/manifest.yaml: contract_bundle_version dox-v1.1 -> dox-v1.2;
  the four existing rows' commit: advances with the leg (no sha256
  moves); three rows added, opendox-health-finding, opendox-health-packs
  and opendox-health-dispositions, release_member false by measurement.
- contracts/CHANGELOG.md: a dox-v1.2 section, and the Status: header
  reads draft until the dox-v1.2 tag exists.

No tag is created. The tag is cut on Brett Heap's cut word, asked for
once this lands; a second PR then moves the header to standard.

Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 17:28
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This lockstep cut updates the root's spec submodule and pin digest to openDox-spec#17, bumps the contract bundle to dox-v1.2 with three measured health-schema entries, and records the release as a draft pending Brett's cut word and a later annotated tag; code pins and workflows remain unchanged.

Entity relationship diagram for dox-v1.2 health schemas

erDiagram
    CONTRACT_BUNDLE ||--o{ RELEASE_SCHEMA : contains
    SPEC_LEG ||--o{ RELEASE_SCHEMA : provides

    CONTRACT_BUNDLE {
        string version "dox-v1_2"
    }
    SPEC_LEG {
        string commit "7db9438b"
        string tree_sha256 "d9f976c5"
    }
    RELEASE_SCHEMA {
        string id
        string type "release_schema"
        int contract_schema_version "1"
        boolean release_member "false"
    }
Loading

Flow diagram for the dox-v1.2 release transition

flowchart TD
    A[Update spec gitlink to openDox-spec#17]
    B[Update spec pin commit and tree digest]
    C[Set contract_bundle_version to dox-v1.2]
    D[Add three health-schema manifest entries]
    E[Run make validate and make pins]
    F[CHANGELOG remains draft]
    G[Brett gives cut word]
    H[Operator creates annotated dox-v1.2 tag]
    I[Promote CHANGELOG status to standard]

    A --> B --> C --> D --> E --> F --> G --> H --> I
Loading

File-Level Changes

Change Details Files
Advance the spec leg and its integrity metadata to the T040 squash-merge.
  • Move the spec submodule and spec-pin commit to 7db9438b.
  • Replace the spec tree digest with the recomputed value.
  • Advance existing manifest entry commits without changing their content digests.
spec
contracts/spec-pin.yaml
contracts/manifest.yaml
Define the dox-v1.2 manifest as an additive bundle containing the three health schemas.
  • Bump contract_bundle_version from dox-v1.1 to dox-v1.2.
  • Add finding, packs, and dispositions schema rows with schema version 1 and release_member false.
  • Record the pinned paths and SHA-256 digests for all new schemas.
contracts/manifest.yaml
Document the draft dox-v1.2 release and its pending operator-controlled tag.
  • Add the dox-v1.2 changelog section, provenance, schema table, and cut procedure.
  • Set Status to draft because the annotated tag is intentionally not created by this PR.
  • Update Unreleased pin references and clarify the prior dox-v1.1 window wording.
contracts/CHANGELOG.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

@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

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

🟢 Approval recommended

The coordinated pin, manifest, and changelog changes are consistent and validated.

Review effort: Balanced
Findings: None

What changed in this PR

Prepares the draft dox-v1.2 bundle by advancing the spec leg and registering its three health schemas.

Changes:

  • Moves the spec gitlink and verified pin in lockstep.
  • Adds three health-schema manifest entries.
  • Documents the draft release pending its tag.
File Description
spec Advances the spec submodule revision.
contracts/​spec-pin.yaml Updates the pinned commit and tree digest.
contracts/​manifest.yaml Defines dox-v1.2 and its schemas.
contracts/​CHANGELOG.md Records the draft bundle and provenance.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@brettheap
brettheap marked this pull request as ready for review October 6, 2026 17:42
@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 23 hours and 37 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@brettheap

Copy link
Copy Markdown
Contributor Author

READY at bb4249d

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

Holder, at READY (T060: the openDox root spec pin for dox-v1.2; plan 038).

  • After set met: T040 landed as 7db9438b, and T005 landed as 91e961a0.
  • Gates:
    • make validate and make pins exit 0;
    • Copilot recommends approval with no findings, and there are 0 threads;
    • SonarCloud passes;
    • no closing keywords.
  • The tag dox-v1.2 and the CHANGELOG move to standard wait for Brett's cut word. The holder asks for it after this lands.

@brettheap
brettheap merged commit 6a9f490 into main Oct 6, 2026
4 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

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

LANDED — lane openxfactory-4, 2026-10-06T17:47:10Z, PR #20 → 6a9f490 (opensoft/openDox main; plain gate)

Brett: plan 038 RULED incl. lane openxfactory-4 lands every PR (#656 6013547504); Start release 2 (#656 6001702967)

brettheap added a commit that referenced this pull request Oct 6, 2026
… now exists (plan 038 T060) (#21)

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

Refs opensoft/openxFactory#656 (stays OPEN).

The dox-v1.2 counterpart of #15. This is the second PR of plan 038's **T060** (`opensoft/openxFactory`, `specs/038-opendox-document-tool-self-maintenance/tasks.md`): *"on it, the annotated tag `dox-v1.2` goes on that commit, and a second PR moves the CHANGELOG entry to `standard`, the tag existing."* The cut PR #20 (→ `6a9f4902285029b4fb02753e2b79be0a137302c5`) landed the `dox-v1.2` entry with the header kept at `Status: draft`, because the tag did not exist yet. The file itself says the header *"promotes back to `standard` once the `dox-v1.2` tag exists, by the same act as before — no second open question is needed, the rule already covers it."*

- **Realizes**: 9.5 (part).
- **Falsifier**: the root's `make validate` and `make pins`, quoted below.
- **Ruled**: R2Q22; Brett's cut word, recorded on `#656`. **Decisions**: CF-2 (batch Q item 10's addendum).

**The tag exists now.** `dox-v1.2` is annotated tag object **`58538ff33a953ffd5dfa9b44a7edabd75dada00b`** over **`6a9f4902285029b4fb02753e2b79be0a137302c5`**. The tagger is `Brett Heap <1513478+brettheap@users.noreply.github.com>`, 2026-10-06T17:58:45Z. It was cut on Brett's word, *"Cut dox-v1.2 now (Recommended)"*, recorded at [#656 comment 6022291206](opensoft/openxFactory#656 (comment)). I read the tag object, its target and its tagger from the forge (`git/ref/tags/dox-v1.2` and `git/tags/58538ff3…`). In this branch's clone, `git rev-parse dox-v1.2^{commit}` gives `6a9f4902…`, which is this branch's base.

## One file, the shape of #15

```
 contracts/CHANGELOG.md | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)
```

1. The header changes from `Status: draft` to **`Status: standard`**.
2. The paragraph that explained the draft header (*"the annotated `dox-v1.2` tag does not exist yet … This header promotes back to `standard` once …"*) now records how that was resolved: the cut word, the tag object, the target commit, the tagger and the date. It uses the wording of the resolved `dox-v1.1` paragraph #15 wrote. #15 also changed "was reached once" to "was first reached" in the paragraph above it. Here the paragraphs already read in order, because #20 put the `dox-v1.1` paragraph in the past tense, so there is no second edit of that kind.
3. The Unreleased line changes from "nothing pending beyond `dox-v1.2` below" to "nothing pending", the form the line had after `dox-v1.1` was cut. Both of its claims were re-read today. openDox-spec `main` is still `7db9438b`. openDox-code `main` is `84f8ed83`, past the bundle's `dede32b4`. `git diff dede32b4 84f8ed83 -- contracts src/opendox/contracts` is empty, so "independently of any contract byte" still holds.

## Checked line by line: nothing left asserts the pre-tag state

| line | why it stays |
|---|---|
| the `dox-v1.0` and `dox-v1.1` window paragraphs | past tense, about closed windows |
| *"`Status: draft` again over `dox-v1.2`'s own window … and `standard` again now"* | the resolution record |
| *"`openxFactory`'s own contract changelog still carries `draft` …"* | a different repository, and a measured fact |
| the `dox-v1.2` entry's *"the lane asks for that word once this cut PR lands"* and *"Not cut by this pull request"* | **left alone on purpose.** It is text inside a released entry, and it was true of the cut PR it was written in. #15 left the `dox-v1.1` entry's own "The tag" section unedited in the same way. A release entry does not change after its tag. |
| `contracts/manifest.yaml`'s `dox-v1.2` comment (*"which the lane asks for once this PR lands"*) | **left alone, as #15 left the manifest.** The manifest is one of the tagged bundle's four coordinated values, and #15 touched no manifest. |
| *"cut the tags when the drafts are green"* | the verbatim `dox-v1.0` ruling quote |

## Verification

At this branch's head `9b41eb4b`:

```
$ make validate
python3 scripts/validate-repository-naming.py --project project.yaml
  openDox                          neutral-product/assembly   also_matches project-leg/assembly
  openDox-spec                     project-leg/spec
  openDox-code                     project-leg/code
python3 scripts/validate-manifest.py
manifest ok: openDox (opendox), 3 legs
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make validate rc=0
$ make pins
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make pins rc=0
```

## What does not change

This PR touches no release entry, manifest, pin, gitlink or workflow, and **no tag**. `dox-v1.0` (`608236a1` over `dc7aa08f`), `dox-v1.1` (`851a28e9` over `52005213`) and `dox-v1.2` (`58538ff3` over `6a9f4902`) stay exactly as published. There is no `Arc:` line, because #15 carried none: this is bookkeeping.

It opens as a **draft**.

🤖 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/openxFactory 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>
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