Repository navigation
correct-naming-families-count 5.1: the doctrine restates the naming families count-free - #1270
Conversation
…amilies count-free Realizes task 5.1, the doctrine, of the ratified change correct-naming-families-count (ratified 2026-10-07 on PR #1266). docs/project-repo-schema.md: the heading becomes 'Naming, and the naming families'; the leg suffixes sit apart from every family the pinned standard's naming policy spells as a CamelCase word; the sentence that said 'The four families are governed as DATA' becomes count-free, keeping the four forms it named as members; one INFORMATIVE note dated 2026-10-07 to the pin lists the six families the pin 1a9fc537bcce declares and says it governs nothing; and the header gains an Amended by line beside the existing one. Wording is design.md D3's, verbatim. No other sentence moves. The file is not a registered release member, so no digest, inventory member or changelog entry moves. Authority: Brett Heap, 2026-10-08, in session, verbatim: "do the 5.1 doctrine edit for naming families". Held for his merge word. Lane: codeXfactory-5 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 1 day and 3 hours by commenting |
Reviewer's GuideThis doctrine-only PR updates File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
…1270 Ticks task 5.1 in tasks.md on the prefer-triad-project-shape 5.1 model (PR #1254): DONE 2026-10-08 in openxFactory PR #1270 at the doctrine commit 615c79c, with the five places named. Nothing else in the change moves. The tick holds on main only through the pull request's merge, which waits on Brett Heap's merge word and its required checks. Lane: codeXfactory-5 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
LANDING — lane codeXfactory-5, session ed23f049-7e99-4601-8a6d-760b6aeb5f26@Eagle, 2026-10-08T18:26:47Z, PR #1270 into opensoft/openxFactory main Landing on Brett Heap's word "merge the 5.1 PR when green" (2026-10-08). The final head is c07a6fd, and all 14 checks are green, including merge-master-approval. Main has moved one commit past this PR's base: #1263 → 3a2ab30, which touched only Lane: codeXfactory-5 |
|
LANDED — lane codeXfactory-5, session ed23f049-7e99-4601-8a6d-760b6aeb5f26@Eagle, 2026-10-08T18:27:52Z, PR #1270 into opensoft/openxFactory main → e83259b Squash-merged at 2026-10-08T18:27:26Z on Brett Heap's word "merge the 5.1 PR when green". Every required check was green at c07a6fd. This closes the window opened at 18:26:47Z. Task 5.1 of correct-naming-families-count is done. The change's archive (§ 6) waits on its own word. Lane: codeXfactory-5 |
…ommits before it Lane: openxfactory-4 main moved through #1263, #1270, #1271 and #1267 (renew-resolved-council- protocol), which touch README.md, docs/, openspec/ and the sweep ledger and not this change's directory. Section 4 names the new base and the commits since fc4fa0f; section 6 carries the re-measured numbers (pinned gate 114 passed of 115 items, ledger 235 rows, corpus directories 312 subtests). The doc-health report is again byte-identical to main alone. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…et closed (#1275) Archives the OpenSpec change correct-naming-families-count. Its doctrine edit, task 5.1, landed as #1270 → e83259b. - Merged on Brett Heap's word "merge the archive PR when green" (2026-10-08), following "archive the naming families change" (2026-10-08). - Owner boxes 1.1 and 1.2 are closed as discharged by his recorded words, per his selection "Yes, here and prefer-triad (Recommended)" (2026-10-08T20:04:44Z; RULED 20:05:35Z). Both MODIFIED requirements are promoted into openspec/specs/project-repo-schema/spec.md, byte-identical to the archived delta. The README row moves from Active to Archived, and the sweep ledger row is reseeded. The pinned CLI, the sequenced-after validator and doc-health match main apart from the archive itself. Every check is green at a6e2a84. Copilot review not requested (Brett Heap, 2026-10-06). Lane: codeXfactory-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…23375303) (#1261) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Refs #656 (stays OPEN). **THE RATIFICATION RECORD for `realize-doc-health-direction-arc`** (plan 038's T071), the doc_health direction arc's own change. It landed as a draft through #1247 → `51456835` and #1253 → `fc4fa0ff`. No requirement, decision or task text moves: the change has no spec delta (`skip_specs: true`). It lands through the holder's lander in a Rule 6 window; this actor merges nothing. ## The word RULED by Brett Heap, 2026-10-06 at about 18:59Z, by interactive multi-choice, verbatim *"Ratify it (Recommended)"*, recorded at #656 comment [`6023375303`](#656 (comment)) (created 2026-10-06T19:00:45Z). The option text he saw read *"I post your word on #656 and land the ratification record (Status: ratified, Ratified by) under a Rule 6 window. T072 can start right away; T074 and T075 then follow in order."* ## The form followed `cd494e4c` / #1151, "Ratify add-neutral-product-standalone-operability on Brett Heap's word (#656 5815412869)", file for file and field for field. The holder's ruling at #656 [`6023619783`](#656 (comment)) confirms the one choice that differs from the change's as-filed text (below). ## What is ratified, and what the word authorizes - **Ratified:** the change as landed on `main` at `fc4fa0ff` (#1253, merged 2026-10-06T18:56:42Z). Its change-directory tree, `02d362f6ebcaf49e18aa107f7ce2b3a409ca2275`, is identical at #1253's final head `e4f3f1db` and on current `main`, and the last commit on `main` that touches it is `fc4fa0ff`. Copilot's review at `e4f3f1db` read "Approval recommended", Findings: None. - **D1–D7 stand as recommended.** `tasks.md` 1.2 provides that the word rules `design.md` § 11's D1–D7 as recommended unless it says otherwise, and the word does not. The record says that this applies 1.2's own rule and does not claim Brett Heap was shown the seven one by one. - **Authorized:** per the ruling record, the realization in plan 038's order: T072 (opportunistic, ARC-6), then T074 and T075. None of it happens by the word itself. - **Nothing archives or promotes.** The change stays ACTIVE until its realization is merged and green, and it gates neither release 2's close nor #1144's archive (ARC-Q3 (a)). ## What this PR changes Six files. None of the changes is requirement or scenario text. **`openspec/changes/realize-doc-health-direction-arc/proposal.md`** - `Status: ratified`, with a `Ratified:` citation. - A qualifier above the filing's "DRAFT. FILING IS NOT RATIFYING" paragraph, which is kept verbatim as the filing's record. - A `## Ratification record` section. - A read-at-ratification note after the D1–D7 list. **`design.md` and `tasks.md`** - `Status: ratified`, with a `Ratified by:` citation. This is the citation split #1144's record carried. - `design.md` § 11: the same read-at-ratification note. - `tasks.md` 1.1 (the filing, citing #1247 → `51456835` and #1253 → `fc4fa0ff`) and 1.2 (this act) are ticked. Boxes go from 0 `[x]` / 23 `[ ]` to **2 `[x]` / 21 `[ ]`**. - 1.2 keeps its as-filed wording and gains a marked italic note on the one divergence (below), as #1151 did for its own 1.8. **`.openspec.yaml`** - `approved_by` / `approved_on` are ADDED after `proposed_on`. `kind`, `id`, `path`, `reason`, `proposed_by` and `proposed_on` do not move. **New record:** `review/ratification-2026-10-06.md` (`Status: ratified`, `Kind: report`, one `Ratified:` citation). **`README.md`:** the *Active changes* entry's status, now linking the record. The sequenced-after ledger row does not move. **The one divergence from the text as filed.** `tasks.md` 1.2 says the record carries `Status: record`. It carries `Status: ratified` with a `Ratified:` citation, as #1144's record did. `document-lifecycle` sanctions both spellings, the option put to Brett read "(Status: ratified, Ratified by)", and a `Status: record` file trips `record-immutability` (CRITICAL) on any later edit, such as a Copilot fix commit on this PR. Confirmed by the holder at #656 `6023619783`. ## Gate state at `f9f71063` The tree is `main` at `40d6e5c1` plus this PR's twelve commits (the change itself, five merges of `main` and six re-measurements of the record), with the submodules initialised. After the first head, `main` moved five times: the archive of `add-worker-input-budget` (#1258), then #1266 and #1264, then the archive of `amend-worker-input-budget-dispatch-wording` (#1269), then #1263, #1270, #1271 and #1267 (renew-resolved-council-protocol), then #1272, #1275 (the archive of `correct-naming-families-count`) and #1277 (a bot review-lane repin). They touch `README.md`, `docs/`, the sweep ledger, other changes, the review-lane contracts and workflows and the doc-health and project-repo-schema specs, and not the change directory (its tree is still `02d362f6ebcaf49e18aa107f7ce2b3a409ca2275` on `main`, last commit `fc4fa0ff`). So `main` was merged in, never rebased, and everything below was re-measured. `main` has since moved again, to `b4b9d903` (a new change, `refresh-install-repository-enumerations-opsxfactory-gateway`: its own directory, a README entry and a ledger row). It is not merged here, per the holder's one-merge instruction, and a trial merge with it is clean. ``` OPENSPEC_TELEMETRY=0 openspec validate realize-doc-health-direction-arc --strict → valid (the pinned 1.12.0) validate-openspec-cli-pin.py --all --strict → exit 0, 0 UNDISPOSITIONED failures 113 passed, 1 failed (114 items); the 1 = the accepted exception, as on main alone validate-code-surface.py . / validate-target-release.py . → passed validate-sequenced-after.py . / --ledger-diff → pass; ledger consistent (235 rows), this row unmoved proposal-support.py . verify realize-doc-health-direction-arc → ok doc-health.py --single-repo . → 31 critical, 26 error, 69 warning, 19 info report byte-identical to main alone (same clone kind); 0 findings name this change doc-health families (1.2's falsifier) → proposal-origin 0 findings, status-validity 0 findings (negative control: dropping proposal.md's Ratified: line takes ratified-provenance 27 → 28 critical, naming proposal.md) pytest -m "not postgres" -k "ledger or records or sequenced or openspec" → 615 passed, 3 skipped pytest sequenced_after code_surface target_release proposal-support scope_globs packet_reference → 866 passed, 311 subtests passed pytest tests/doc-health → 2157 passed ``` An earlier `tests/doc-health` run showed 8 failures in `test_neutrality_dispatch.py`. They were this actor's own environment, not the tree: an exported `REPO` variable collided with the fake scout worker's `REPO`. With it unset the file gives 25 passed, and the whole directory is green above. ## Copilot - **First head `0039a47e`:** review `5436306140`, "Approval recommended", Findings: None, 0 threads. - **Head `739da6e0`** (after the first merge of `main`): review `5440756736`, "Approval recommended", Findings: None, 0 threads. - **Head `69479c77`** (after the second merge of `main`): review `5459920482`, "Approval recommended", 0 threads. - **Head `83e3511e`** (after the third merge of `main`): review `5460937374`, "Approval recommended", 0 open findings, 0 threads. - **Head `b186eb62`** (after the fourth merge of `main`): review `5462168108`, "Needs a closer look", **0 open findings**, 0 threads. Its stated reason is that final approval depends on human validation of the governance authority and the historical provenance assertions. The holder ruled at #656 [`6069024568`](#656 (comment)), item 5, that this is NOT a block, because that authority is Brett Heap's ratify word `6023375303`. - **Checks at `b186eb62`:** the rollup was SUCCESS with 15 status checks, all SUCCESS, including `merge-master-approval`, `pytest-suite` and SonarCloud Code Analysis. 0 threads unresolved. - **Head `f89fc853`** (after the fifth merge of `main`): review `5464071466`, "Needs a closer look", **0 open findings**, 0 threads. Its stated reason is that the exact-head checks and the Codex review were then pending, and that final approval also depends on governance provenance, which the holder's ruling at #656 `6069024568`, item 5, covers. - **Final head `f9f71063`** (a record-only correction of the corpus subtest figure, 312 to 311, which the completed run measured): Copilot requested through the reviewer API after the push. Its result, the checks and the thread count are recorded here once the exact final head has been reviewed. ## Codex - At `b186eb62`, `@codex review` was posted twice (comments `6067925769` and `6069046343`), and the `chatgpt-codex-connector[bot]` answered both with the usage-limit message (comments `6067927988` and `6069048581`). No Codex review existed at that head. - At `f89fc853`, `@codex review` (comment `6071059884`) was answered with a review: **Reviewed commit `f89fc853cb`**, "Didn't find any major issues" (comment `6071083487`; summary comment `6071062721`, Code Review completed at 2026-10-08T23:29:24Z). - At the final head `f9f71063`, `@codex review` was posted once after the push (comment `6071252263`). The bot's reply is recorded here once it arrives. READY needs a Codex "Reviewed commit" at the exact head, or Brett Heap's explicit waiver (#656 `6069024568`, item 4). ## What is NOT done - No code, pin, gitlink, contract bundle or release tag moves. T072, T074 and T075 are the realization, and none of them starts by this PR. - Plan 038's `specs/038-…/tasks.md` is not edited here. T071's tick there goes in the holder's own bookkeeping batch. - Nothing archives or promotes. **Rule 6:** this PR touches `openspec/changes/` and the README OpenSpec Records block, so it lands in a declared window by the holder, and not by this actor. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…two early-wave words, and the holder's wave-1 and wave-2 rulings (plan 038) (#1279) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) ## T002d: plan 038's fourth bookkeeping batch (plan 038) Bookkeeping: no `Arc:` line, and no `openspec/changes/` path. It encodes rulings already posted on #656 and a landing already merged, each cited by comment id or merge commit, with no new decision. It follows #1263 in form and redoes nothing #1263 did. Claim: #656 `6069520093`. `origin/main` is merged into the branch twice, `40d6e5c1` and then `564f565a`, never rebased. **Realizes / Falsifier:** none (bookkeeping). The gates are listed under "Gates" below. ### What changed (specs/038-opendox-document-tool-self-maintenance/) **A. Ticks.** Each merge commit was read through GraphQL (`pullRequest{mergeCommit{oid}}`) before it was written. The sweep covered every PR merged since #1263's landing (2026-10-08T18:12Z) in openDox-code, openXdox-code, openDox, openXdox, openDox-spec and openxFactory, plus xFactory and codexFactory, and was re-run at 2026-10-08T23:19Z: - **openDox-code:** T012 and T013, #90 → `6827cafc` (2026-10-08T21:08:43Z), in one PR as T012's "Lands with" requires. T012's Landed line records the accepted limits that #90's body states: - the holder's `6067853207`: Copilot 4223441552 with Codex P2 4223462534, Copilot 4223441643, and Codex P1 4223462529. Item 3 widens the fast-forward limit to both paths. - `6069024568` item 1: lane 3's R2-DELTA MINOR at `landing.py:836`. - beside those, `6026622117` item 1 and `6035797819`. - **Nothing else** merged in those repositories realizes a plan-038 task. The openxFactory merges since (#1267, #1270, #1271, #1272, #1275 and #1277) belong to other changes. - **The previous batch,** #1263 → `3a2ab303`, is this batch's "merged since" anchor in the revision paragraph, as #1263 treated #1257. It is not added to T002's Landed line. - **The task count** reads T012 and T013 done. **B. Brett's words on phase 5's early waves,** recorded under tasks.md "What can start": - wave 1 (T041, T042 and T043) is written now and lands after T027 (`6035546708`, *"Write now, land after T027 (Recommended)"*); - wave 2 (T044 and T046) is written early, stacked (`6067802993`, *"Write now, stacked (Recommended)"*), and lands in plan order. Every After line keeps its landing meaning. **C. The holder's wave-1 rulings (`6069024023`).** - **Item 1.** `contracts/health-finding.md` § The id rule names the engine categories, T041's nine plus `dispositions-refused` and `manifest-refused`. It states that a category is also the finding's `kind`, and gains the four mappings: - stdout over the cap is `pack-bound-hit`; - non-JSON or contract-breaking output is `pack-output-refused`; - one finding per (category, entry) per run, with the reasons in `evidence`; - each category's `pack_id`, as `6072086385` item 1 rules it (see "The review questions, ruled" below). It replaces the phrase "one `pack_id` per category", which named no value. T045's text records its refusal extension, extending `6065680005` item 3: it refuses a pack family that declares an engine kind, and a pack finding with an empty path. T041's note records the two added categories and points to the contract's list. - **Item 2, option (D).** `contracts/health-finding.md` (the re-raise bullet) and `data-model.md` § Baseline classes carry the re-raise's two forms, with no schema change: - `{disappeared_id}`, with the original's path; - the pathless form: `path ""`, `{category: <the original's kind>, entry: <its entry, or "">}`, and `disappeared_id` and the baseline run in `evidence`. T046's falsifier gains the pathless-original node (run 2 re-raises once, run 3 raises nothing). T041's note says that `disappearance_identity()` returns either form. - **Item 3.** `data-model.md` § Health run gains the `run_seq` row, and a note that `baseline_class` is NOT NULL, with no fourth value. The note is also on § Finding's own row. T046's text gains the per-corpus advisory transaction lock, and its falsifier gains the node that two overlapping runs serialize. T042's column list and Ruled line name `run_seq` (item 3 accepts it as T042's). **D. The holder's admissions (`6069024568`).** - **Item 2.** T015's Files gain `src/opendox/web/views/account-menu.js` (one word, `"submit"` in `WRITE_ACTIONS`) and `pyproject.toml` (one line, `:312`'s 42 → 43), each with the chain T015 → T016 → any later verb. T016's Files record that it follows T015 in both. plan.md gains a row for `account-menu.js`, and its `pyproject.toml` row gains that line's chain. - **Item 3.** T042's Files gain `tests_runtime/test_api_endpoints.py`, for one edit. **E. The holder's wave-2 rulings (`6069507373`).** - **T044 item 3.** `tasks.md:1163` now reads "the top-level directories named by the six role keys or their declared words", as FR-010 words it at `spec.md:819-821`. - **T046 item 8.** T046's After line gains T016: the `cli.py` and `default_profile.py` chains at `plan.md:456-457`, cited by row name because this PR moves plan.md's lines. Its text says that its `default_profile.py` and `cli.py` contributions, and the admitted `tests/test_default_profile.py` line, join its PR only after T016 lands, by a merge of `main`. That line joins T046's Files. - **T046 item 2.** T041's note gains the module-level, patchable `finding_id()`, the single hash path `make_finding` calls. Its interface is unchanged (lane 3, `6069516931`). - **T046 item 4.** T056's Files gain ONE `engine.py` line binding T046's pack hook. It is written after T046 lands, with nothing else in `engine.py` (lane 3's ACK, `6069516931`). T046's Files mark `engine.py` as "first: T046 → T056", and plan.md gains its row. - **`contracts/health-finding.md:43`.** `baseline_class` is NOT NULL in the store (`0003_`). The row also says that the finding schema's `finding-keys` rule lists it as optional, since no schema change is ruled. - **N-14 and OQ-H-15, one owner each.** - N-14 is T046's: suppression on an injected source of accepted ids, with T054 supplying the parser (T046 item 3). - OQ-H-15 is T044's: in the families, through `excluded=`, with no `doxbench_intake.py` edit (T044 item 8). - T054's text and its Decisions line drop both. - **`plan.md:437-438`.** "rebases" becomes "merges `main`". tasks.md's header and plan.md each carry a revision paragraph. ### The review questions, ruled (`6072086385`), encoded in `8b76a05d` - **Item 1 (Q1, Codex 4225201227): each engine category's `pack_id`, option (b),** as T041's `ENTRY_CATEGORIES` implements it and as dox-v1.2's schema text for `pack_id` reads. - The entry's id, for a finding against a VALID manifest entry's pack: `fetch-failed`, `digest-mismatch`, `declaration-refused`, `pack-crashed`, `pack-timed-out`, `pack-bound-hit` and `pack-output-refused`. - `opendox` for every other category: `no-sandbox`, `manifest-refused`, `dispositions-refused` and `entry-refused`. A refused entry rides only in `identity.entry`. - The rule is stated in `contracts/health-finding.md` § The id rule (replacing "one `pack_id` per category") and in its Rules section's install-level bullet. T041's note and Ruled line cite it. - **Item 2 (Q2, Copilot 4225214488), option (b): no plan change.** #99 already pins NOT NULL, the run order and the uniqueness. T042 adds a catalog assertion (GENERATED ALWAYS, CACHE 1) in its own tests. - **Item 3 (Q3, Copilot 4225214548), option (a).** T045's Falsifier gains one node for each refusal that `6069024023` item 1 extends from `6065680005` item 3: a family that declares an engine kind is refused, and a pack finding with an empty path is refused. T045's Ruled line cites item 3. - **Item 4 (the NUL seam)** is not in this batch, as the holder directs. It is left to the next batch. ### Ruled and Decisions - **Ruled (all on #656):** `6035546708`, `6067802993`, `6067853207`, `6069024023`, `6069024568`, `6069507373`, `6069516931` and `6072086385` (items 1 to 3). - **Cited beside them:** `5988818366`, `6064244857`, `6065680005`, `6026622117` and `6035797819`. - **Decisions:** none new. ### Readings, disclosed - **6035546708's placement.** It was recorded nowhere in the tree. Its own record line asks for "beside the release map (T005 item 12)", which is #1144's `openspec/changes/` path, outside this batch. It is recorded with `6067802993` under "What can start", where tasks.md words N-6 (a) as "start". The holder accepted this placement when the writer resumed. - **`plan.md:437-438`.** A literal swap would read "merges `main` onto the previous slice's landing", so "onto" also became "after". - **The single-writer rows.** `6069024568` item 2 and `6069507373` T046 item 4 set chains, and plan.md's table records them as #1263 did for its chains: - rows for `account-menu.js` and `health/engine.py`; - `pyproject.toml`'s `:312` chain, beside its T048 → T055 → T061 chain. - **The engine categories in the contract.** The ruling adds two categories to T041's nine, so the contract names all eleven. Item 1 accepts the nine as written, and its mappings name `pack-bound-hit` and `pack-output-refused`. - **The `baseline_class` NOT NULL note** is in `data-model.md` § Health run, as the ruling words it, and on § Finding's own row. - **Line drift.** Every cited line matched by content at the base `c8dde131`: - `tasks.md:1163` and `:1238-1240`; - `plan.md:437-438` and `:456-457`; - `data-model.md:260-262`; - `contracts/health-finding.md:43`, `:59-62` and `:64-69`. One exception: `6069024023` item 1 says T041's nine copy `data-model.md:330-334`. In this file, those lines are § Pack declaration, which lists no categories, so nothing is encoded from that cite. ### NOT encoded (the writers' own) - **`6069507373` T046 item 2's edge,** where two pathless originals of one (category, entry) yield ONE re-raise, and T044's other items: these are implementation rulings for those writers, not bookkeeping. - **plan.md:664's R2Q11 summary row,** which the ruling does not name. - **#90's readings 1 to 5 and 7** (inferred, not ruled). - **`6072086385` item 4,** the NUL seam: left to the next batch. - **T071's tick** (#1261 → `a020b34a`, landed at 01:13:36Z, after this PR's last push): left to the next batch, as the holder directs. ### Gates - **Validator.** `python3 scripts/validate-openspec-cli-pin.py --all` and `--all --strict` at `8b76a05d` both exit 0, with `Totals: 113 passed, 1 failed (114 items)`. The one failure is the accepted exception, `add-chain-attestation`'s disposition in the pin, as on main. - **CI at the head `8b76a05d`:** 14 of 14 checks are SUCCESS (rollup SUCCESS, read through GraphQL), including `pytest-suite`, `doc-health-py314`, `openspec-cli-pin`, `lane-line` and SonarCloud. - `pytest-suite` reports `selected=9838 passed=9832 skipped=6 failures=0 errors=0` (9208 tests passed, 6 skipped). - Its freshness verifier and its vector replay both passed. - **Local pytest at `8b76a05d`** (`-m "not postgres" -n 8`, with the three gitlinks initialized as CI does): `2 failed, 9205 passed, 7 skipped`. - Both failures are 30 s subprocess timeouts of `validate-hermes-runtime-contracts.py` in `tests/hermes_runtime_contracts/test_validator_cli.py`, on a shared host at a load average of about 85 on 32 cores. - Serially, the release-mode node also fails on main, as #1263 recorded. - The candidate-mode node passed serially at `897dce40` and on main `b4b9d903`, and timed out under that load at `8b76a05d`. - CI runs both green. - **doc-health** (`scripts/doc-health.py --single-repo .`), at `897dce40` against main `b4b9d903` in the same clone: identical reports, 31 critical, 26 error, 69 warning and 19 info, with 0 differences after SHA normalization. `doc-health-py314` is green at the head. - **Copilot.** - At `897dce40`: "Changes recommended", with two threads (4225214488 and 4225214548), ruled by the holder in `6072086385` items 2 and 3. - At `8b76a05d`: "Approval recommended", with 0 open findings. - **Codex.** - At `897dce40` it reviewed the head ("Reviewed commit: `897dce405c`") and opened one P2 thread (4225201227). The holder ruled it in `6072086385` item 1, and `8b76a05d` encodes the ruling. - At `8b76a05d`, the trigger posted at 01:02:53Z was answered at 01:02:56Z with "You have reached your Codex usage limits". There is no Codex review at the head yet. - **Threads:** all 3 are answered, citing `6072086385`, and resolved. ### NOT done - spec.md, every `openspec/changes/` path and #1144 are untouched. - No box is ticked in #1144, and no task is added. refs #656 🤖 Generated with [Claude Code](https://claude.com/claude-code) Lane: openxfactory-4 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>



Lane: codeXfactory-5
Realizes task 5.1, the doctrine, of the ratified change
correct-naming-families-count(ratified on PR #1266 by the ratifying commitd296570bon its branch, squash-merged asa38585e9on 2026-10-07). It editsdocs/project-repo-schema.mdonly, withdesign.mdD3's wording verbatim. Two commits:615c79c4cis the doctrine edit, andc07a6fdb7ticks 5.1 in the change'stasks.mdciting this PR number (#1270, the tick on the prefer-triad 5.1 model of PR #1254).Authority
Brett Heap, 2026-10-08, in session, verbatim:
That word authorizes AUTHORING and OPENING this realization PR. It is not a merge word. Merging waits on Brett Heap's separate merge word.
The task, verbatim from
openspec/changes/correct-naming-families-count/tasks.mdThe five changed places, before and after
Line numbers were checked against current
main(c9dfd4f8): the heading is still at:236, the CamelCase sentence at:240-242and the governed-as-DATA sentence at:248-251.1. Header, a second
Amended by:line beside the existing one (lines 16-25 after). The existingAmended by: prefer-triad-project-shape …block is untouched; this follows it in the same continuation form (docs/lifecycle-notebook-projection.mdalready carries threeAmended by:lines in the same header).2. Heading (
:236).3. The CamelCase sentence (
:240-242). The next sentence, "The assembly root is bare because the thing you clone has no suffix — the precedent the aggregation root already sets.", is re-wrapped across the same lines and its words are unchanged (word-level proof below).4. The count-free sentence (
:248-251).5. The one INFORMATIVE note, dated to the pin (new, directly after place 4, in the file's
> Amended …blockquote form).The pin was read, not assumed:
contracts/openreposhape-pin.yaml:226iscommit: "1a9fc537bcce37301c85fc108fabd8a599b02000"onmain, andgit -C openRepoShape show 1a9fc537…:contracts/repository-naming.yamldeclares exactly sixfamilies:ids at precedence 1 to 6 —neutral-product,install,domain-descendant,project-leg,family(declared_only: true, declared byfamily.yaml) andworkspace(^[a-z0-9]+(?:-[a-z0-9]+)*-wip$) — under a header reading "the six live naming families". Its sha256 isa4eebad2…f096a4, the digest the pin file records. The note, the heading, and both sentences are checked to equaldesign.mdD3's proposed text by a whitespace-normalized containment test (all three print True).The hunk rule: no other sentence moves
git diff -U0 origin/main -- docs/project-repo-schema.mdhas these hunk headers, and nothing else:That is five changed places in four git hunks; places 4 and 5 touch adjacent lines, so git joins them.
git diff --stat origin/mainfor the doctrine commit:docs/project-repo-schema.md | 40 +++++++---, 32 insertions(+), 8 deletions(-), one file.Word-level proof for place 3,
git diff --word-diff=plain --word-diff-regex='[^[:space:]]+':Only the clause changed; the assembly-root sentence is word-for-word the same. The phrase "every other live family" and the count "four famil…" no longer appear anywhere in the document.
docs/project-repo-schema.mdis not a registered release member: no digest, inventory member or changelog entry moves.The tick (
c07a6fdb7,openspec/changes/correct-naming-families-count/tasks.md, +20 -1)- [ ] 5.1becomes- [x] 5.1and a dated note is appended to that box, worded on #1254's: DONE 2026-10-08 in openxFactory PR #1270 →615c79c4c6c592e7a12bb8e68b639e9198ac545c, lanecodeXfactory-5, naming Brett Heap's word, the five places, "the wording isdesign.mdD3's, verbatim", that no digest, inventory member or changelog entry moves, and ending "The tick holds onmainonly through that pull request's merge, which waits on Brett Heap's merge word and its required checks." No other box and no other line of the change moves (git diff --stat origin/main..HEAD: two files,docs/project-repo-schema.md+32 -8 andtasks.md+20 -1).Validators (re-run at the FINAL head
c07a6fdb7; the doctrine commit alone gave the same results)Run in a scratch checkout directory NAMED
openxFactory, with CI'spytest-suitesubmodules initialized (git submodule update --init openXwalletandgit submodule update --init --recursive openXdox openDox), so repository identity and the skipped-family set match CI.@fission-ai/openspec@1.12.0, content address verified):python3 scripts/validate-openspec-cli-pin.py --change correct-naming-families-count --strict: 1 passed, 0 failed, exit 0.--all --strict: 113 passed, 1 failed (114 items), exit 0 — the same asmain. The one failure is the acceptedadd-chain-attestationexception thatcontracts/openspec-cli-pin.yamlalready carries.validate-code-surface.py .(passed),validate-target-release.py .(47 active proposals, 47 declaring; passed),validate-sequenced-after.py .(47 active changes; passed),validate-sequenced-after.py . --ledger-diff("per-change sweep ledger consistent with the corpus (234 rows)"),proposal-support.py . verify correct-naming-families-count("proposal support verification ok").scripts/doc-health.py --single-repo . --as-of 2026-10-08, the final head againstmainc9dfd4f8: both report 31 critical, 26 error, 69 warning, 19 info, "New regressions vs previous report: 0". The two reports differ by exactly two lines, the canon-word count (382741 → 382979) and theratifiedrow (85892 → 86130), which is this edit's added words. No finding namesdocs/project-repo-schema.mdor this change, in any family (ratified-provenanceandstatus-validityamong them).Merge state
Held for Brett Heap's merge word; it touches openspec/changes/ (the 5.1 tick), so it lands under a Rule 6 landing window.
Copilot review not requested (Brett Heap, 2026-10-06)
🤖 Generated with Claude Code
Summary by Sourcery
Make the project repository naming doctrine count-free and governed by the pinned naming standard.
Enhancements:
Documentation: