Skip to content

Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed - #1252

Merged
brettheap merged 7 commits into
mainfrom
archive/add-factory-mcp-conformance
Oct 6, 2026
Merged

brettheap merged 7 commits into
mainfrom
archive/add-factory-mcp-conformance

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openxfactory-5 (openXfactory-5)

Archive word GIVEN. Brett Heap, 2026-10-06, in session, verbatim "archive add-factory-mcp-conformance when green". It is RULED in opensoft/brett-wip lanes/log/openXfactory-5.md at 2026-10-06T17:25:24Z (commit 5f02a237). This lands by MERGE commit, never squash, under a Rule 6 window, once its gates, checks and Copilot review are green. A squash would re-date the archive directory's adding commit, which reds archive-date-vs-commit on main. The coordinator lands it; this seat does not un-draft or merge.

What this does

It archives the ratified change add-factory-mcp-conformance. Its realization, Speckit feature 037, landed as #1243 → 92010d3e. The tasks 3.1 and 3.2 that were still open on main are ticked with evidence. The packet moves to openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/, and its delta is promoted as the new capability openspec/specs/factory-mcp-conformance/spec.md. The README Records bullet moves from Active to Archived, and every link the move breaks is repointed.

Realization evidence (task 3.1)

  • Merged. Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 merged 2026-10-06T03:37:58Z as 92010d3e67f2c556687e1c3583ed3ca1867f4b8b, on Brett Heap's word "land Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 when green". It landed by squash: 92010d3e has the single parent ba89e046, and its tree fd3b9f08 equals the tree of the final head 6ab7126724bf7d5771d3929934ed0b28d29ea0aa.
  • Green. Every required context passed at 6ab71267: signed-execution-chain-gate, lane-line, former-id-arrival-gate, openspec-cli-pin, wallet-validation, pytest-suite, release-tag-gate and openxdox-consumer-gate. pytest-suite also passed on main at 92010d3e itself (run 37409899722, selected=9831 passed=9825 skipped=6 failures=0 errors=0) and at 51456835 (run 37480682619). SonarCloud is not required; its one S8707 finding was dispositioned before the landing (comment 6008804840).
  • Whole. The declared code surface is on main: contracts/factory-mcp/, scripts/validate-factory-mcp.py, tests/factory-mcp/ and docs/factory-mcp-conformance.md. specs/037-factory-mcp-conformance/tasks.md has 16 of 16 boxes ticked. Nothing after 92010d3e touches the code surface, the feature or the packet.

The archive act (task 3.2)

TZ=UTC python3 scripts/proposal-support.py . archive add-factory-mcp-conformance --yes ran with exit 0, at 2026-10-06T16:21:19Z, over the content-addressed @fission-ai/openspec@1.12.0 pin. Its decisive lines: ORIGIN RETAINED ... (declaration unchanged since the ratifying commit 92010d3e67f2), Applying changes to openspec/specs/factory-mcp-conformance/spec.md: + 8 added, Totals: + 8, ~ 0, - 0, → 0, and archived as '2026-10-06-add-factory-mcp-conformance'.

  • Promoted requirements, by content. Eight requirements and 22 scenarios, plus the delta's own Purpose. Each requirement block was extracted by heading from the archived delta and from canon, and hashed; all eight are byte-identical. Canon goes from 66 to 67 capability directories, and no other file under openspec/specs/ changes.
  • Provenance. The nine packet files move as R100 pure renames, including the ratification record naming reviewed revision 8acd2ec4. The origin block is unchanged since ratification on both histories: .openspec.yaml has blob c1e5cd98 at 54bce013 (the original lineage's ratifying commit) and in the archive. 8acd2ec4, 54bce013 and d2baf6fd stay reachable through refs/pull/1243/head.

Commits

  1. 9df08c71 ticks 3.1 with evidence. It also corrects one addendum sentence: after the squash, the original commits are ancestors of refs/pull/1243/head, not of main.

  2. df52f26d ticks 3.2 ahead of the run, because the wrapper refuses an open box.

  3. 7102cd48 is the wrapper's archive act, plus the README doc index and the Records move (with the ARCHIVE-PR-NUMBER-PENDING marker).

  4. 85017f76 records the run under the archived 3.2.

  5. 00b5c84b repoints 8 links outside the packet to the archive path. It also changes the quickstart's --change add-factory-mcp-conformance command, which refuses once the change is archived, to --all --strict.

  6. 14920ece seeds the sweep-ledger row by machine (--seed-ledger --moved-by '#1252': 1 row moved, active → archived, moved_on 2026-10-06; --ledger-diff consistent, 231 rows) and names PR Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252 in the README bullet.

  7. 92dfd83c records the archive word, verbatim with its RULED cite, in the archived 3.2 and the README bullet.

Gates

Two fresh full clones of the same kind, with submodules initialized as pytest-suite does (openXwallet, then openXdox and openDox recursively): the branch at 92dfd83c and main at 51456835. TMPDIR and --basetemp sit under ~/.local/state.

Gate Branch 92dfd83c main 51456835
validate-openspec-cli-pin.py --all --strict exit 0; 112 passed, 1 failed of 113 exit 0; 112 passed, 1 failed of 113
validate-sequenced-after.py . (plain, incl. archive-date-vs-commit) exit 0; 46 active changes exit 0; 47 active changes
validate-sequenced-after.py . --ledger-diff exit 0; 231 rows consistent exit 0; 231 rows consistent
validate-code-surface.py . / validate-estate-inventory.py . exit 0 / exit 0 exit 0 / exit 0
doc-health.py --single-repo . 31 critical, 26 error, 69 warning, 20 info 31 critical, 26 error, 69 warning, 20 info
pytest tests/ -q -m "not postgres" running (started 17:28Z at 92dfd83c) 3 failed, 9204 passed, 7 skipped, 338 deselected, 598 subtests passed
  • The one openspec failure on both sides is the same accepted exception, add-chain-attestation (Brett Heap, 2026-09-05, "take exit 2").
  • The doc-health reports differ in four lines, all of them this archive's own effect. Canon words rise by 1,037, which is the promoted specification. The informational draft-age minimum moves from 1 day to 0, because commit 5 touched two Status: draft feature docs today; the draft count stays 71.
  • main's three pytest failures are environmental and pre-existing: tests/doc-health/test_tag_hygiene_pinned_targets.py::test_a_lexically_malformed_value_builds_no_path_and_reads_nothing, tests/domain_profile/test_hermeticity_probe_routes.py::test_the_bare_unittest_route_is_detected_as_unguarded, and tests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization]. They are the same three the realization seat recorded on both sides for Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 (temp-path placement, the symlinked clone root, a subprocess timeout). CI's pytest-suite runs at this head as well.

A non-required red: merge-master-approval

It refuses at floor_incomplete on this branch (00b5c84b, 14920ece and 92dfd83c). The review-authority floor tolerates 3 covered-pending paths under openspec/specs/. Base already carries 3 (corpus-adapter-seam, domain-mapping-declaration and packet-citation-report), and this archive's new factory-mcp-conformance/spec.md is the 4th. The gate names its own repair order for an addition: (1) this candidate lands; (2) a codexFactory pull request regenerates the specs floor block at a landed commit; (3) an openxFactory pull request advances contracts/review-lane-pin.yaml. The check is not required on main. After this lands, base holds 4 pending paths, so merge-master-approval will read red on every later openxFactory pull request until (2) and (3) land. Whether to admit it at the landing or hold for the regeneration is an owner disposition, routed to the coordinator and Brett Heap. Copilot raised the same finding (thread on openspec/specs/factory-mcp-conformance/spec.md).

Disclosed before the archive word

Brett Heap gave the word with these three items known.

  1. The archive promotes a scenario the validator does not yet enforce. Unavailable dependency, under Lossless results and explicit failures, becomes canon text as ratified. Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 left its enforcement (M5) and the auth and transport block (M6) awaiting Brett's rulings, and no ruling has been given since. Archiving settles neither.
  2. One relative link inside the archived proposal.md now resolves one level short (../../../ideation/brainstorm/factory-mcp-overview.md, line 60). It is left as ratified, as the coordinator directed on the word: editing an archived record needs a ruling first, and two earlier archives kept the same shape.
  3. Land add-factory-mcp-conformance on main as Speckit feature 037, with repairs and validator fixes #1243 landed by squash, so d2baf6fd's history, including its unreduced codex wording, is not in main's history. It survives at refs/pull/1243/head and on the two review branches, whose deletion is still Brett's open R2.

Refs #1242
Refs #1243

🤖 Generated with Claude Code

brettheap and others added 5 commits October 6, 2026 16:20
…10d3 and green

The realization of the ratified change landed as PR #1243, merged
2026-10-06T03:37:58Z as 92010d3 on Brett Heap's word "land #1243 when
green". It landed by squash: 92010d3's single parent is ba89e04 and its
tree fd3b9f0 equals the tree of the pull request's final head 6ab7126, so
the checks at that head cover the merged bytes exactly.

Every required context passed at 6ab7126. pytest-suite run 37407361293
read selected=9831 passed=9825 skipped=6 failures=0 errors=0, and the push
run on main at 92010d3 itself (37409899722) reads the same. SonarCloud is
not required; its one S8707 finding was dispositioned before the landing
(#1243 comment 6008804840).

The tick also corrects one sentence of the 2026-10-05 addendum, written
before the landing: after the squash, d2baf6f and the ratified revision
8acd2ec are ancestors of refs/pull/1243/head, not of main. The ratified
delta's blob (a4865bd) is the same at 8acd2ec and on main.

Task 3.2, the archive, stays open in this commit.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The governed wrapper refuses to archive a change with an open box, so 3.2
is ticked before the run. Its condition, merged and green realization, is
recorded at 3.1. The run itself is the next commit, and its output and the
promotion's measurements are recorded under 3.2 in the commit after that.

The archive is prepared on a DRAFT pull request. It lands by merge commit,
never squash, and only on Brett Heap's archive word, which has not been
given.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nce capability after realization 92010d3

PREPARED, NOT YET AUTHORIZED. This commit is the archive act, carried on a
DRAFT pull request. It lands by merge commit, never squash, and only on
Brett Heap's separate archive word, which has not been given.

WHY IT MAY ARCHIVE. code_surface is non-empty (openxFactory), so under
release-realization the packet archives on merged-plus-green realization
evidence, and that evidence exists. The realization, Speckit feature 037,
landed as PR #1243 -> 92010d3
(2026-10-06T03:37:58Z, by squash from head 6ab7126, whose tree it carries
unchanged) on Brett Heap's word "land #1243 when green". Every required
context passed at that head, and pytest-suite decided success on main at
92010d3 itself, run 37409899722 (selected=9831 passed=9825 skipped=6
failures=0 errors=0). Task 3.1 cites the rest.

PERFORMED THROUGH THE GOVERNED WRAPPER, never a bare openspec archive:

    TZ=UTC python3 scripts/proposal-support.py . archive \
        add-factory-mcp-conformance --yes

exit 0, run 2026-10-06T16:21:19Z to 16:21:30Z:
  ORIGIN RETAINED add-factory-mcp-conformance (declaration unchanged since
    the ratifying commit 92010d3)
  Totals: 1 passed, 0 failed (1 items)
  Task status: Complete
  factory-mcp-conformance: create
  Applying changes to openspec/specs/factory-mcp-conformance/spec.md: + 8 added
  Totals: + 8, ~ 0, - 0, -> 0
  Change 'add-factory-mcp-conformance' archived as
    '2026-10-06-add-factory-mcp-conformance'
  NO SUPPORTING DOCS (origin retained, nothing to package)
The CLI is the content-addressed @fission-ai/openspec@1.12.0 pin, not the
1.13.1 on PATH. --date was not passed, so the directory takes today in UTC.

ORIGIN, ACROSS BOTH HISTORIES. On main the ratifying commit is the squash
92010d3, the first commit there whose proposal.md says Status: ratified.
On the original lineage it is 54bce01. The .openspec.yaml blob is c1e5cd9
at 54bce01 and in the archive, so the origin block has not moved since
ratification on either reading. openspec/origin-dispositions.yaml is not
edited.

THE PROMOTION, MEASURED BY CONTENT. The delta is all ADDED over a new
capability directory: openspec/specs/factory-mcp-conformance/spec.md, its
Purpose taken from the delta's own Purpose section and eight requirements
with twenty-two scenarios. Each requirement block was extracted by heading
from the archived delta and from canon, and hashed; all eight are
byte-identical (828, 945, 941, 767, 951, 826, 1,039 and 1,251 bytes). Canon
holds no requirement the delta lacks. Capability directories go from 66 to
67, and no other file under openspec/specs/ changes.

THE PACKET MOVES AS NINE R100 PURE RENAMES; the 3.1 and 3.2 ticks landed in
the two commits before this one.

README: the doc index now points at the promoted specification, with the
archived proposal beside it, and the OpenSpec Records bullet moves from
Active to the head of Archived. Its pull-request link carries the
ARCHIVE-PR-NUMBER-PENDING marker until the pull request exists.

NOT IN THIS COMMIT. The sweep-ledger row is seeded once a pull-request
number exists. The wrapper run is recorded under the archived 3.2, and the
links the move breaks are repointed, in the commits after this one.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The run happened in the commit that moved this directory (7102cd4). This
commit records it under 3.2, as the item's pre-run tick said it would. It
records the wrapper's decisive lines, the promotion verified by content
(eight requirement blocks, each byte-identical between the archived delta
and canon), and provenance: nine R100 renames, the origin block unchanged
since ratification on both histories, and the original commits reachable
through refs/pull/1243/head.

It also names one relative link in the archived proposal.md that now
resolves one level short. Those bytes are kept as ratified, because
repairing an archived record needs a recorded ruling first. And it names
the items this archive does not settle, which still await Brett Heap's
rulings.

tasks.md only; no requirement or scenario text moves.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eight markdown links outside the packet named its active path. They now
name openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/: two
in the runbook docs/factory-mcp-conformance.md, one in the brainstorm
factory-mcp-overview.md, and five in Speckit feature 037 (data-model.md,
spec.md twice, verification.md twice). This is the shape 687b85e used for
feature 005 after its packet archived.

The quickstart's third command, validate-openspec-cli-pin.py --change
add-factory-mcp-conformance --strict, refuses once the change is archived
(exit 2, pin-report-unreadable, measured in this clone). It now runs --all
--strict, with a sentence saying why and linking the promoted
specification. verification.md's record that --change passed at a12c702
stays as written, because it reports a measurement taken then.

Every markdown link whose target names factory-mcp-conformance resolves
(31 checked, 0 broken), and no file names the active path any more. Link
targets only; no requirement or scenario text moves.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This PR archives the ratified add-factory-mcp-conformance packet after documenting its merged and green realization, promotes its eight requirements and 22 scenarios into the canonical factory-mcp-conformance specification, and updates all affected documentation and links while preserving provenance and pending governance decisions.

Flow diagram for factory MCP conformance archival

flowchart LR
    A["Ratified change packet"] --> B["Merged and green realization\nPR #1243 → 92010d3e"]
    B --> C["proposal-support.py archive\nexit 0"]
    C --> D["Promoted specification\n8 requirements, 22 scenarios"]
    C --> E["Archived packet\n2026-10-06-add-factory-mcp-conformance"]
    D --> F["Documentation and links updated"]
    E --> F
Loading

File-Level Changes

Change Details Files
Move the ratified OpenSpec change into the dated archive and promote its delta into canonical capability specification.
  • Archive the nine change-packet files while preserving origin and ratification provenance.
  • Create the canonical factory-mcp-conformance specification with eight requirements and 22 scenarios.
  • Record wrapper execution and realization evidence for the merged, green implementation.
  • Update README records and related documentation to distinguish active, archived, and promoted paths.
openspec/changes/add-factory-mcp-conformance/tasks.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/tasks.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/proposal.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/design.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/specs/factory-mcp-conformance/spec.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/.openspec.yaml
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/review/
openspec/specs/factory-mcp-conformance/spec.md
Repoint repository documentation and implementation references after the change directory moves.
  • Replace active proposal links with archive or promoted-spec links.
  • Update runbook, feature, data-model, and verification references to the archived packet.
  • Adjust the quickstart validation command from the archived change selector to all-spec validation.
  • Repair external links affected by the directory relocation.
README.md
docs/factory-mcp-conformance.md
ideation/brainstorm/factory-mcp-overview.md
specs/037-factory-mcp-conformance/data-model.md
specs/037-factory-mcp-conformance/quickstart.md
specs/037-factory-mcp-conformance/spec.md
specs/037-factory-mcp-conformance/verification.md
Document governance constraints and unresolved scope rather than expanding implementation during archival.
  • Keep the PR draft pending a separate archive authorization.
  • Require a merge commit to preserve archive-date versus commit validation.
  • Explicitly retain unresolved auth, transport, error-vocabulary, shared-transport, and unavailable-dependency decisions.
  • Preserve the known relative-link issue inside the archived proposal pending a bookkeeping ruling.
README.md
openspec/changes/archive/2026-10-06-add-factory-mcp-conformance/tasks.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

brettheap and others added 2 commits October 6, 2026 16:34
…l request in the README

--moved-by needs a real pull-request number, and this branch had none until
#1252 was opened, so the row is seeded here rather than in the archive act.
That follows the order 5216c70 and 97d9fa5 used.

Seeded by the machine, not by hand:

  python3 scripts/validate-sequenced-after.py . --seed-ledger --moved-by '#1252'
  -> wrote tests/sequenced_after/corpus-ledger.yaml (231 rows, 1 moved by #1252)
       - add-factory-mcp-conformance
  python3 scripts/validate-sequenced-after.py . --ledger-diff
  -> per-change sweep ledger consistent with the corpus (231 rows)

The diff is one line: state active -> archived, moved_by "#1243" -> "#1252",
and moved_on 2026-10-05 -> 2026-10-06. A flipping row takes its archive
directory's date. No other row moved.

README: the archived bullet's ARCHIVE-PR-NUMBER-PENDING marker (two
occurrences, one line) now names PR #1252.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brett Heap gave the archive word on 2026-10-06, in session, verbatim
"archive add-factory-mcp-conformance when green". It is RULED in
opensoft/brett-wip lanes/log/openXfactory-5.md at 2026-10-06T17:25:24Z
(commit 5f02a237), against openspec/changes/add-factory-mcp-conformance.
No GitHub comment carries it, so the register entry and this record are
where it lives.

The archived tasks.md 3.2 gains one bullet naming the word, its date and
the RULED cite; the pre-run tick text, which says the word had not been
given when the box was ticked, stays as written. The README archived
bullet now quotes the word with the same cite, in place of the sentence
that deferred it to the landing lines.

The pull request still lands by merge commit, under a Rule 6 window, once
its gates, checks and Copilot review are green. No requirement or scenario
text moves.

Refs #1243

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 17:32
@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

🔵 Needs a closer look

The advisory floor escalation requires owner disposition and coordinated repair, while required validation remains pending.

Review effort: Balanced
Findings: 1 High severity

Open (1)
What changed in this PR

Archives the realized Factory MCP conformance change and promotes its ratified requirements into the canonical specification.

Changes:

  • Promote eight requirements and 22 scenarios without changing validator behavior.
  • Preserve the proposal packet and record realization and archive evidence.
  • Update documentation links, validation guidance and lifecycle ledger.
File Description
tests/​sequenced_after/​corpus-ledger.yaml Record archived state and provenance.
specs/​037-factory-mcp-conformance/​verification.md Repoint historical evidence links.
specs/​037-factory-mcp-conformance/​spec.md Repoint governing specification links.
specs/​037-factory-mcp-conformance/​quickstart.md Adjust validation for the archived change.
specs/​037-factory-mcp-conformance/​data-model.md Repoint design reference.
README.md Index promoted specification and archive evidence.
openspec/​specs/​factory-mcp-conformance/​spec.md Add canonical requirements and scenarios.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​tasks.md Record closure and supporting evidence.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​specs/​factory-mcp-conformance/​spec.md Preserve ratified delta.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​review/​validation-2026-09-07.md Preserve validation record.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​review/​ratification-2026-09-07.md Preserve ratification evidence.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​review/​codex-baseline-2026-09-07.md Preserve compatibility baseline.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​review/​claim.md Preserve authoring claim.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​proposal.md Archive governing proposal.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​design.md Archive ratified design.
openspec/​changes/​archive/​2026-10-06-add-factory-mcp-conformance/​.openspec.yaml Preserve origin metadata.
openspec/​changes/​add-factory-mcp-conformance/​tasks.md Remove active-path task record after relocation.
ideation/​brainstorm/​factory-mcp-overview.md Repoint proposal link.
docs/​factory-mcp-conformance.md Repoint governance and baseline links.

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

Comment thread openspec/specs/factory-mcp-conformance/spec.md
@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

Disposition of the non-required merge-master-approval red, on Brett Heap's word.

Brett Heap, 2026-10-06, in session, verbatim: "land #1252 and do the floor repair". This chose option (a): land this archive with the floor_incomplete red admitted, then do the repair the gate itself names.

  • Why it is red. The specs floor tolerates 3 covered-pending paths. Base carries 3: corpus-adapter-seam, domain-mapping-declaration and packet-citation-report. This archive's openspec/specs/factory-mcp-conformance/spec.md is the 4th.

  • What follows from landing. Base will hold 4, so merge-master-approval reads red on later openxFactory pull requests until the repair lands.

  • The repair, in the gate's own order.

    1. This candidate lands.
    2. A codexFactory pull request regenerates the specs floor block at a landed commit.
    3. An openxFactory pull request advances contracts/review-lane-pin.yaml.

    Lane openXfactory-5 prepares (2) and (3) now. Each lands on its own word.

  • Gates. Every required check is green at this head. The archive's fast gates also pass on a local merge of this head with current main e6380965 (Propose prefer-triad-project-shape: the Triad is the preferred project shape, advised at work start, never in review #1249, no shared file): openspec --all --strict, sequenced-after plain and ledger-diff, code-surface, estate-inventory and doc-health. The full pytest shows the same 3 failures on the branch as on main (9204 passed on both).

@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

LANDING — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-06T18:57:52Z, PR #1252 into opensoft/openxFactory main

@brettheap
brettheap marked this pull request as ready for review October 6, 2026 18:58
@brettheap
brettheap merged commit c44c161 into main Oct 6, 2026
16 of 17 checks passed
@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

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

LANDED — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-06T18:58:20Z, PR #1252 into opensoft/openxFactory main → merge c44c161; Archive add-factory-mcp-conformance: realization #1243 → 92010d3, packet closed

@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

Correction to the repair plan in comment 6023311177. A read-only recon of the floor machinery found that the lanes' own automation already carries steps (2) and (3). No hand pull request will be opened for either one, because it would collide with the bots.

brettheap pushed a commit that referenced this pull request Oct 6, 2026
…5b1618f (#1138)

Advance the pinned decision core to fe9a6f5b, the merge of codexFactory #524, which regenerates the openxFactory review-authority floor block from 66 to 67 entries and so covers the four specs added to base since b21f0100 (corpus-adapter-seam, domain-mapping-declaration, packet-citation-report and factory-mcp-conformance). This discharges the merge-master-approval floor_incomplete red admitted at #1252's landing. Lands on Brett Heap's word "land #1138 when green" (2026-10-06); the advisory merge-master-approval red at the head is the pre-landing reading of the old pin, dispositioned on the PR.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 6, 2026
Take the nine items of the independent review of PR #1255 in one pass:

1. MAJOR. The record no longer reads or tallies single-repository.yaml. The
   ratified requirement makes the advisory its only reader. It is dropped from
   the reads, the 28 evidence cells, the counts, the re-run recipe and the
   5.7 tick; one sentence says why, and discloses the discarded request.
2. Rows 18, 19, 20, 23 now state both facts: a product with code and specs,
   and the naming barrier. Note B says the barrier is the documented in-place
   posture, not a hard check in adopt-project.py. Row 22 has no spec corpus at
   its measured sha and keeps its "a tool" reason.
3. The external row cites the inventory's own definition and is called a
   stated departure from 5.7's text, in note D and in the tick.
4. The base sentence names #1252 and #1254; fc4fa0f is #1253's merge.
5. Rows 11 and 12 drop the "already elected" clause.
6. Private rows' reasons are described as naming no path from their tree.
7. Section 1 states the inventory's scope (brett-wip, MedxGlass).
8. The 5.7 tick names PR #1255.
9. The naming verdicts are identical at the pinned openRepoShape e9c4827b.

Counts are unchanged: 3 Triads, 6 legs, 28 single; 12 migrate, 15 record
staying single, 1 none made.

Lane: codeXfactory-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 6, 2026
…n 038) (#1251)

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

**T002, plan 038: release 2's base (`evidence/r2-base.md`), and plan 038's `tasks.md` bookkeeping, items 1 to 15.** Bookkeeping and evidence, so this PR carries no `Arc:` line. It touches no `openspec/changes/` path, so no Rule 6 window applies.

## From plan 038's `tasks.md`, T002

- **Task**: T002, "Release-2 base, and the re-measure at the ruling". Record in `evidence/r2-base.md` every repository's `main` (research.md's R0 command), the box census, and `PACKET_MERGE=94b6f7f1` for F11.1, with lane 3's composed re-run quoted against R2-INV-P4F's 174. **README**: links `evidence/r2-base.md`. **After**: T004. **Lane**: 4 (lane 3 for the composed run).
- **Realizes**: none (bookkeeping; FR-025). **Falsifier**: T002 names none. Its gates are the brief's, and are quoted under "Gates" below.
- **Ruled / Decisions**: T002 carries none. Part 2 encodes rulings already posted on `#656`, each cited by comment id, and takes no decision of its own.

## Part 1: `evidence/r2-base.md` (new), linked from the README's feature-038 entry

Each figure is a command quoted with its output, or lane 3's measurement quoted and attributed.

- **Every repository's `main`** (the R0 command, run 2026-10-06T16:09:44Z to 16:10:31Z, and again at 16:26:12Z): `openDox-code 34c20641`, `openXdox-code 56e1c238` (then `c6d15b27`, T020's #39, committed 16:10:44Z), `openDox d77f8cbf`, `openXdox 9564d5d9`, `openDox-spec 7db9438b`, `openXdox-spec f088b097`, `openxFactory 5145683`, `xFactory 1047586d`, `codexFactory 563212a1`. The file gives each full SHA with its commit date and subject, against the R0 values of plan time, and what moved.
- **The box census**: plan 034's `box_census.py` over #1144's `tasks.md` at `51456835` reads `total 125 Counter({'x': 74, ' ': 42, '~': 9})`. At `ce64afc9` it reads the same, and `diff` of the two full outputs is empty: delta 0. Batch Q (#1248) landed between them, adding 526 lines and removing none.
- **`PACKET_MERGE=94b6f7f1`** (`94b6f7f13b45c351b9142345738965c974b7dd37`), on `origin/main`'s first-parent line; 83 first-parent commits since, 3 with the `Arc:` trailer (release 1's consumer pins).
- **Lane openXfactory-3's composed re-run**, quoted from `lane3-to-lane4.log` (09:52:07Z and 09:52:31Z), claimed on `#656` `6013610393`: "174 red vs 174 (170 failed + 4 errors, 668 passed ...)"; "moved: none"; "5 suites / 210 cases"; openDox installed from openDox-code `main` `a9ac96f9` while openXdox-code's `pyproject.toml:126` and openxFactory's nested `openDox/code` pin `dede32b4` (v0.1.0); openxFactory `main` `0f2a87f6` to `92010d3e`. I verified one thing there: of the 48 files that differ, the two under `scripts/` are `scripts/ideation_dashboard/nightly_lane.py` and `scripts/validate-factory-mcp.py`. Nothing was re-run.

## Part 2: plan 038's bookkeeping

Every item is a holder ruling or a Brett ruling already posted on `#656`, encoded as worded. The files are `tasks.md`, `plan.md`, `data-model.md`, `contracts/health-finding.md`, `contracts/cli-http-health.md` and `checklists/requirements.md`.

| # | Task | What changed | Record |
|---|---|---|---|
| 1 | T022 | Files gain new `tests/test_composed_placements.py` (openXdox-code#41) | holder `6016356225` |
| 2 | T023 | Files gain new `tests/test_swb_session_transport.py` (the bound and unbound probes in one committed file; #42) | holder `6016676145` |
| 3 | T026 | Files gain `tests/test_protected_suite_check.py`, and T020's `tests/conftest.py` and `tests/test_host_plane.py` after T020 lands; 'cluster' respells to "group neighbourhood"; the single-writer table's chain | holder `6016356225`, Brett `6016648451` |
| 4 | T029 | Files gain the two floor lines `MIN_SELECTED` and `MIN_PASSED` of openXdox-code's `validate.yml`, raised ONCE at its final head after merging `main`; no other PR raises them; a new single-writer row | holder `6017860539` |
| 5 | R-1 (a), widened | SIX spans of `tests/test_staging_workbench.py` (`_CREATE_HARNESS`, `_SESSION_HARNESS`, `_run_create`, `_run_session`, `_hostile_descriptors`, `_HOSTILE_HARNESS`), served display, in T026, plan.md § R-1 and the ruled-answers row | Brett `6016648451` |
| 6 | F12.1 | `--chains`, carried out by T026 and T029; the amendments table gains the row | Brett `6016648451` |
| 7 | T073 | After gains T095+; new T094 (lane 3, read-only, claimed `6017801219`) and T095+; T073's PR stays a DRAFT until they land; the lane table, the critical path, the slice tables and the dependency list follow | holder `6016982816` |
| 8 | T073 `open_until` | `doc_health` keeps its words plus lane 3's clause; `status-exemption-rail` and `openxfactory-contracts` read the ruled sentence, quoted | holder `6016982816` |
| 9 | T076 / F9.2 | the WRITTEN DISPOSITION naming `realize-doc-health-direction-arc` as F9.2's carrier, in T076, T084, the box-accounting row and plan.md's ARC-5 | holder, ARC-5 (a) `6013547504` |
| 10 | T003 | ticked, CLOSED ON THE RE-CHECK | holder `6017901451` |
| 11 | T074 | Files gain the six openXdox-code files of the arc change's `design.md` § 10; the single-writer table: `validate.yml` T029 (floors) then T074 (`LEFT_OUT`) | holder, from #1247's `design.md` § 10 |
| 12 | `identity` | stored (a `health_findings` column, canonical sorted-key JSON, capped) and emitted, bounded as T040's schema bounds it: `contracts/health-finding.md`, `data-model.md` § Finding, `contracts/cli-http-health.md`, plan.md, T041, T042 and T046; the cross-run collision stays an accepted limit, detectable now, whether the engine reports it being T046's | holder `6018624750` |
| 13 | ticks | T005 #1248 `91e961a0`; T008 codeXfactory/codexFactory#515 `f1b019fe`; T010 openDox-code#89 `34c20641`; T040 openDox-spec#17 `7db9438b`; T070 #1247 `51456835`; and, on the coordinator's later word, T020 openXdox-code#39 `c6d15b27` and T024 openXdox-code#38 `8b64fae0`. Each was verified with `gh pr view <n> -R <repo> --json mergeCommit` | landed 2026-10-06 |
| 14 | T073 | Files gain new `tests/test_declared_rail_registration.py` (the conftest rail block's 5 lone cases with stand-in rails) | holder `6020698021`, answering `6020683941` |
| 15 | T026 | the H-2 in-test respellings move from 17 to 20: `test_gate_off_descriptor_is_the_real_cli_invocation`, `test_gate_off_session_affordances_are_the_real_cli_invocations` and `test_the_notebook_refresh_is_a_descriptor_in_BOTH_gate_postures`, admitted under CF-4; plan.md's CF-4 row notes it | holder `6020859092` |

T002 itself is ticked.

**Items skipped because already present: none.** Each was searched for at `origin/main` (`git show origin/main:<file> | grep -c`), and none was in place.

**Where an item could not be encoded exactly as worded, or needed a reading:**
- **Item 9**: no task of § "Close" archives #1144 (the archive act stays the holder's, ARC-5 (a)). The coordinator accepted placing the disposition in T084, the last task to edit #1144's `tasks.md`, and in T076 and the F9.2 accounting row.
- **Item 3, the chain**: the rulings order T020 before T026, and T020 before T021, but not T021 against T026. The table says "T021 and T026, in landing order", as the coordinator confirmed.
- **Item 12's grep**: the brief's `\|` is a markdown-table escape, so I ran it with plain `|`. Four hits remain, each the note that reverses the old wording ("reversing the engine-internal refinement"). The ruling gives no cap value, so none is written: the engine caps it, and the cap is T041's.
- The commit trailer names the model that wrote it, `Claude Sonnet 5.5`, as the session's attribution rule requires, where the writer rules spell `Claude Opus 5.5 (1M context)`.

## The holder's answers on this PR's four open questions

1. **`tests/test_declared_exclusion.py`** is NOT in T073's Files: T073 measured its lone CI green while touching only its own four files. It IS in T074's Files (item 11).
2. **FR-011 and an `identity` response-shape falsifier** are DEFERRED to the holder's next bookkeeping batch, with T094's T095 to T104 entries. This PR keeps to its list, so `spec.md` is as `origin/main` has it. (Copilot asked; the edit was made at `76b9428b` and taken back at `7ddfda5e`.)
3. **The `identity` cap is T041's**: the contract module owns the field bounds, and T042 stores what T041 bounds. T041's and T042's entries, `data-model.md` § Finding and `contracts/health-finding.md` say so (`80c6fee7`). No value is written.
4. **T003**: the constitution's analyze gate was met by round 1 (`evidence/analyze-round-1.md`) and its re-check (`6013547504`). T003 was a discretionary second round, so the closure (`6017901451`) stands.

## Review and gates

| Copilot at | verdict | findings | answered |
|---|---|---|---|
| `8b0a535d` | Changes recommended | 5: FR-011 and the identity's response shape; an exact aggregate cap; the T003/T004 states; the F9.2 disposition against ARC-5; the task count | the T003/T004 states, ARC-5 and the count were fix-now, fixed in `76b9428b`. The cap is an accepted limit (no value is written, by the holder's word); FR-011 is the holder's (open question 2) |
| `da00b298` | Changes recommended | 3 new: FR-011 against the bookkeeping scope; T003 without a fresh analyze; T020's tick against the old body | FR-011 taken back in `7ddfda5e`; T003 is the holder's (open question 4); the body is corrected (item 13) |
| `7ddfda5e` | Needs a closer look | 0 new threads; the 2 it listed as "previously missed" are those two | answered, see the threads |
| `80c6fee7` | Needs a closer look | 2 body-level findings: `identity` should be NOT NULL in the store's model; `r2-base.md` called its figures an input to T004's ruling, but T002 follows T004 | both fix-now, fixed in `fb57b851` |
| `f0f6923d` (final) | Changes recommended | 1: the "stored identity makes a collision detectable" sentence overstates it for an exception-only finding, which is never stored | accepted limit (#656 `5988818366`): the sentence is the holder's own wording (`6018624750`), and what T046 can detect from stored rows is T046's. Answered and resolved; no push |

9 threads, 0 unresolved. Every reply cites its commit or ruling.

- **`python3 scripts/validate-openspec-cli-pin.py --all`**, in the clone named `openxFactory`, at `f0f6923d`: exit 0, `Totals: 113 passed, 1 failed (114 items)`, `0 UNDISPOSITIONED failures`. The one failure is the dispositioned `add-chain-attestation` finding, the same on `main`.
- **openxFactory pytest**, locally at `8b0a535d` (CI venv, `-m "not postgres"`, TMPDIR under `~/.local/state`): `1 failed, 9206 passed, 7 skipped, 338 deselected, 9 warnings, 598 subtests passed in 2589.39s`. The one failure is `tests/hermes_runtime_contracts/test_validator_cli.py::test_release_mode_field_is_preserved_on_the_real_repository[--require-realization-realization]`, a 30s `TimeoutExpired`. It fails the same way on `origin/main` in the same clone (`1 failed, 1 passed in 54.40s`), and the CI job passes it, so it is pre-existing and environmental. My later commits change documents only.
- **Doc-health**, `scripts/doc-health.py --single-repo .`, branch `f0f6923d` against `origin/main` `c44c1610` in the same clone: the two reports are byte-identical (sha256 `3b2e1f59db747178…`; `Findings: 31 critical, 26 error, 69 warning, 20 info. New regressions vs previous report: 0.`). So no new error.
- **CI at `f0f6923d`**: all 15 check runs completed at the head: `pytest-suite` success (19:00:34Z to 19:27:22Z), `SonarCloud Code Analysis` success, `doc-health-py314`, `openxdox-consumer-gate`, `openspec-cli-pin`, `wallet-validation`, `clearing-dispatch-gate`, `signed-execution-chain-gate`, `former-id-arrival-gate`, `release-tag-gate`, `openreposhape-pin` and the three `lane-line` runs all success. One is RED, `merge-master-approval`, and it is inherited from `main`: its floor evaluation stops at `floor_incomplete`, "4 covered-pending path(s) exceed the tolerance of 3", the four being `openspec/specs/corpus-adapter-seam`, `domain-mapping-declaration`, `factory-mcp-conformance` and `packet-citation-report`, each `added_to_base_after_pin`. This PR touches no `openspec/specs` path. #1252 (the archive that promoted `factory-mcp-conformance`) merged at 18:58:07Z, and this run (18:59:37Z) is the first gate run after it; every other open PR's last run predates it. It passed on this PR at `7ddfda5e` and `80c6fee7`. A rerun reads the same base, so the pin or floor refresh (#1138, "Advance the pinned decision core") is what clears it; the holder rules on landing over it.
- **`main` moved once more after these gates**, to `a2dc658d` (#1254, which touches `contracts/schemas/project-register.schema.yaml`, `docs/project-repo-schema.md` and `openspec/changes/prefer-triad-project-shape/tasks.md`). It shares no file with this PR, and `git merge-tree` reports a clean merge. I did not merge it in, since each merge restarts the 27-minute gate; the holder can run `gh pr update-branch` before landing if wanted.

## Files changed

- `specs/038-opendox-document-tool-self-maintenance/evidence/r2-base.md` (new)
- `specs/038-opendox-document-tool-self-maintenance/tasks.md`, `plan.md`, `data-model.md`, `checklists/requirements.md`
- `specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md`, `contracts/cli-http-health.md`
- `README.md` (the feature-038 entry's evidence list, one link)

## What is NOT done

- No requirement, scenario or spec delta is touched: `spec.md` is as `origin/main` has it, and nothing is under `openspec/changes/`.
- No box of #1144 is ticked, and T071 and the other tasks are left as they stand.
- T046's falsifier is unchanged: whether the engine reports a cross-run collision is named as its concern in `contracts/health-finding.md` only.
- Lane 3's composed run is quoted, not repeated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)


Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 6, 2026
…as they stand' (#1250)

Lane: openxfactory-1

## The two words

Brett Heap gave both words on 2026-10-06, in session to lane `openxfactory-1`. Both are RULED lines on the estate's lane register, with object `opensoft/openxFactory:openspec/changes/add-worker-input-budget`.

1. **The ratification.**

   > 0.4: (a) ratify as they stand

   It answers `tasks.md` 0.4, *"Ratify or amend the two spec deltas"*. The question was put to him as *"task 0.4: (a) ratify the two doc-health deltas as they stand, or (b) amend first"*, and he chose (a). RULED at **2026-10-06T13:55:03Z** (`opensoft/brett-wip` commit `06709554`, `lanes/log/openxfactory-1.md`).

2. **The origin file.**

   > #1250: (i) add the origin file

   It answers the RULING NEEDED this PR raised on Copilot's finding `r4196698454`. Option (i) was put to him as adding `.openspec.yaml` in the ratifying commit, with values following the 2026-08-25 origin sweep `b7513733`. RULED at **2026-10-06T17:24:57Z** (`opensoft/brett-wip` commit `f739ab74`).

This lane has held the change's claim since 2026-09-24T16:33:03Z.

## What is ratified

`add-worker-input-budget`'s two `doc-health` spec deltas, as they stand and with no amendment:

- **MODIFIED: *Sweep sequencing and snapshot consistency*** (three scenarios);
- **ADDED: *Bounded worker input budget*** (six scenarios).

The ratified text is `specs/doc-health/spec.md` blob `9a817d65`. That blob is the same at #1137's merge commit `9da52e31` and on `main`. **No requirement or scenario text moves in this PR.**

## The origin declaration, on the second word

**Why it is needed.** `document-lifecycle` § *Proposal origin declaration* says:

> A proposal whose own `Status:` declares `ratified`, or any standing beyond it, SHALL carry approval provenance in its origin.

This packet had no `.openspec.yaml`, and it was the only active change without one.

**What it declares.** The new `openspec/changes/add-worker-input-budget/.openspec.yaml` is hand-written in the form of sweep `b7513733`. Every value is derived from the packet's own record and is folded or plain, so the file parses:

- `schema: spec-driven`;
- `created: 2026-09-22`, from the packet's true first commit, `ee2185d6` (2026-09-22T01:26:47Z);
- `origin.kind: ad_hoc`. No `Staging ID:` header and no staging topic's exit names this change, checked in both directions;
- `origin.id: openxFactory:adhoc:2026-09-22-add-worker-input-budget`;
- a folded `reason` that quotes the second word;
- the drafting pair: lane `openxfactory-1`, on *"brief a writer to add the input-size guard"*, `proposed_on: 2026-09-22`;
- the approval pair: Brett Heap, *"0.4: (a) ratify as they stand"*, `approved_on: 2026-10-06`.

**What it changes.**
- `proposal-support.py verify add-worker-input-budget` now **passes**, where `main` refuses it with *"no origin declaration"*.
- `proposal-origin`'s WARNING for the missing origin is gone.
- No other finding moves.

## What this PR does not do

- **Group 4's 4.1 sequencing question stays open.** The *"Sequencing tension, named rather than hidden"* note in `tasks.md` asks Brett Heap a question. Was *"land the input-size guard when green"* the approved exception, or should 0.4 have gated 4.1? Neither word answers that question, and the note does not move.
- **No archive.** The archive is a separate act.
- **No other substance moves.** That covers proposal substance, `code_surface:`, `target_release:`, realization and the sequenced-after ledger row.
- **It lands by SQUASH.** The lane's coordinator lands it in a Rule 6 window. The archive PR is a separate landing, as a merge commit.

## Every changed line, file by file

**`openspec/changes/add-worker-input-budget/proposal.md`** (the front-matter header):
- `Status: draft` becomes `Status: ratified`.
- One line is added after it: `Ratified: 2026-10-06 by Brett Heap (openxFactory repository owner) — …`. The line carries:
  - the 0.4 word, verbatim, and the question as it was put;
  - the register RULED line;
  - both requirement names;
  - the #1137 `9da52e31` baseline;
  - "archives nothing" and "does not answer the Group 4 sequencing question on 4.1";
  - the record path.

**`openspec/changes/add-worker-input-budget/tasks.md`:**
- `- [ ] 0.4 Ratify or amend the two spec deltas.` becomes `- [x] 0.4 …`.
- Ten record lines follow it: the word, the question, the RULED line, both requirement names, the 4.1 question staying open, no archive, and the record.

**New: `openspec/changes/add-worker-input-budget/.openspec.yaml`** (52 lines): the declaration described above.

**`README.md`** (*OpenSpec Records* > *Active changes*, the `add-worker-input-budget` entry only):
- `` `Status: draft` `` becomes **`` `Status: ratified` ``**. A parenthetical gives:
  - the date, Brett Heap, the 0.4 word, "no amendment" and the RULED time;
  - the link to the record;
  - *"the origin declaration `.openspec.yaml` added on his second word, verbatim "#1250: (i) add the origin file", RULED 2026-10-06T17:24:57Z"*.
- The closing sentence changes. It read: "`Status: draft` is unchanged: …". It now reads: "Resolving the questions ratified neither spec delta; the 2026-10-06 word did (task 0.4). **RATIFICATION ONLY** — the archive is a separate later act on Brett Heap's word, and the Group 4 sequencing question on 4.1 stays open."

**New: `openspec/changes/add-worker-input-budget/review/ratification-2026-10-06.md`:**
- The header: `Status: ratified`, `Kind: report`, `Decision date:`, `Ratifier:`, one `Ratified:` citation and the ratified baseline.
- The sections:
  - Decision;
  - 1, the word;
  - 2, what the word does not decide;
  - 3, what this pull request changes, including the origin file and the second word, verbatim;
  - 4, a disclosure;
  - 5, the measurements, and the statement that this PR lands by squash.

**`ideation/staging/doc-health-sweep-carry-over/doc-health-sweep-carry-over.md`** (Copilot `r4198710846`, the first Conflicts bullet only):
- The status clause *"`add-worker-input-budget` is `Status: draft`, its two deltas unratified (its task 0.4)"* now says the packet is `Status: ratified` (task 0.4, Brett Heap's word of 2026-10-06) but still ACTIVE, not archived.
- A parenthesis records what the clause read before. The sequencing constraint, proposing this topic's change after that packet archives, is unchanged.

**Not moved:**
- `specs/doc-health/spec.md`;
- the Group 4 4.1 note;
- `tests/sequenced_after/corpus-ledger.yaml`.

## Precedent followed

- **#974** (`c521504c`):
  - `Status: draft` becomes `Status: ratified`, with one citation line in the lifecycle header;
  - the ruled box is ticked with its record;
  - the README row is moved in place, with a bold `Status: ratified` and the word and the record link;
  - a **RATIFICATION ONLY** tail;
  - a `review/ratification-<date>.md` record carries `Status: ratified` and ONE citation.
- **#1151** (`cd494e4c`): the closest case, an in-place ratification of a draft already on `main`. Copied: the one-line `Ratified:` form inside the front-matter, and the record's sections.
- **#1028**: the record header. `Decision date:` and `Ratifier:` accompany the citation.
- **#267**: the record-citing `Ratified:` spelling for an in-session ruling. Both citations clear the three-way floor, and each document carries exactly one citation in its 15-line window.
- **Sweep `b7513733`**: the `.openspec.yaml` form, on the second word:
  - `created` from the true first commit;
  - an `ad_hoc` id carrying the created date;
  - a folded `reason` derived from the record and checked in both directions;
  - the approval quoted from the packet's own citation.
- **Not copied:** `Status:` and `Ratified by:` on `tasks.md` and `design.md`. The packet has no `design.md`. Its `tasks.md` carries no `Status:` header to move, and `document-lifecycle` does not rule `tasks.md`.

## Landing: squash

**This PR lands by SQUASH, and only a squash landing conforms to the second word.** Option (i) was put as adding the origin file *in the ratifying commit*. On this branch the ratification is `a93865f0` and the origin file is the later commit `b3b7db42`, so only a squash puts the two into one commit on `main`. The record's § 5 says the same.

The archive gate's origin-retention walk takes the FIRST commit whose `proposal.md` declares `Status: ratified` as the ratifying commit. A probe on throwaway copies measured two landings:

- **Squash, the conforming landing:** the squash commit is the ratifying commit and carries the origin. The walk reads *"ORIGIN RETAINED … declaration unchanged since the ratifying commit"*. #974 and #1151 also landed by squash.
- **Merge, not conforming:** the walk takes `a93865f0`, which has no origin, as the ratifying commit, and reads *"ORIGIN RETENTION NOT COMPARABLE"*. The gate does not refuse that, but it leaves no retention baseline.
- **Rebase, not conforming and not run:** it would also land `a93865f0` as a commit of its own, ahead of the origin file.

## Observation (no change made)

`proposal.md` § Impact says *"two requirements MODIFIED, one ADDED"*. The delta has carried one MODIFIED and one ADDED requirement since its first commit, `ee2185d6`. The record's § 4 discloses this. It is not corrected here, because it is proposal text.

## How it was verified

All runs used full clones named `openxFactory`. The full set ran at the same time in two same-kind clones: `main` `51456835`, and this branch merged with it (`9e67f838`). The gates and doc-health then ran again on `main` `e6380965` and on `cc0fc853`. After that, the full set ran a third time on `main` `e6380965` and on `60c38a56`. All three runs gave the same results. The record's § 5 names each measured tree by sha (Copilot `r4198710942`).

Copilot's review `5433270341` at `60c38a56` raised no inline finding. Its "previously missed" note on record § 5 is answered in `7229fde4`, which rewrites only the record's landing paragraph to say this PR lands by squash. The gates and doc-health ran again on that tree against `main` `e6380965`, with identical results. The branch then merged `main` `c44c1610`, which archived `add-factory-mcp-conformance` (#1252) and touched no byte of this packet. The gates and doc-health ran once more, on `main` `c44c1610` and on that merge, `8dbb011e`. The results were again identical: `verify` exits 1 on `main` and 0 on the branch, and doc-health reports 284 against 282 finding lines, the difference being only the `proposal-origin` WARNING. Copilot's review `5433389325` at `8dbb011e` (thread `r4199425241`) asked that record § 5 list every tree measured. `6f4e98d1` rewrites that list as six runs, each named by sha. The gates and doc-health ran on it against `main` `c44c1610`, with identical results. Last, the branch merged `main` `a2dc658d` (#1254, no byte of this packet) as `35b17c30`, and the gates and doc-health on that merge against `main` `a2dc658d` were again identical. Its other note asks to put the Group 4 sentence *"is still open even as this line is written"* in the past tense. That note is left as it stands, because both briefs keep the Group 4 note untouched and the sentence is anchored to when it was written.

Because the carry-over topic changed, `tests/ideation_routing` and `tests/document_catalog` also ran on `main` `e6380965` and on `60c38a56`: 86 passed on each. `tests/ideation-dashboard` cannot be collected in a clone without the openDox and openXdox legs; CI runs it.

| gate | `main` | this PR |
| --- | --- | --- |
| `validate-openspec-cli-pin.py --all --strict` | exit 0; 1 failed item, `add-chain-attestation`'s accepted exception; 0 UNDISPOSITIONED | the same |
| `validate-openspec-cli-pin.py --change add-worker-input-budget` | exit 0; 1 passed | the same |
| `validate-code-surface.py`, `validate-target-release.py`, `validate-scope-globs.py` | exit 0 | the same output |
| `validate-sequenced-after.py .`, and with `--ledger-diff` | exit 0 | the same output; the ledger row does not move |
| `proposal-support.py . verify add-worker-input-budget` | **exit 1**, "no origin declaration" | **exit 0**, "proposal support verification ok" |
| `doc-health.py --single-repo . --as-of 2026-10-06` | 284 finding lines | 282: the same set without the `proposal-origin` WARNING's two lines. **No new finding.** The `modified-block-currency` INFO, which records the delta's deliberate rewording of canon's "is exactly" bullet, stays |
| `pytest` over `tests/doc-health`, `sequenced_after`, `review_lane_pin`, `proposal-support`, `code_surface`, `target_release`, `packet_reference`, `citation_remainder`, `scope_globs`, `former_id_arrival` and `openspec_cli_pin` | 3581 passed, 7 failed and 3 skipped | the same, with the same 7 tests failing. All 7 come from the clone, whose `openDox` and `openXdox` legs were not initialized. CI runs the full suite |

**The citation checks were proven to read both files, on a throwaway copy:**
- damaging either `Ratified:` line raised a CRITICAL `ratified-provenance` finding naming the damaged file;
- removing the proposal's citation raised one;
- giving the record `Status: record` raised one.

The intact files raise none.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Lane: openxfactory-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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