Skip to content

prefer-triad-project-shape 5.7: the estate inventory, a recommendation only - #1255

Merged
brettheap merged 4 commits into
mainfrom
realize/prefer-triad-estate-inventory
Oct 6, 2026
Merged

brettheap merged 4 commits into
mainfrom
realize/prefer-triad-estate-inventory

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Lane: codeXfactory-5
Refs #1249 (prefer-triad-project-shape, task 5.7)

What this records

This PR realizes task 5.7 of the RATIFIED change prefer-triad-project-shape: the estate inventory, a recommendation only.

  • What was measured. Each of the 37 repositories in scripts/estate-repository-inventory.yaml was read on its own main through the GitHub API. Every file was read at the head sha the record lists.
  • Where it is recorded. openspec/changes/prefer-triad-project-shape/review/estate-inventory-2026-10-06.md (Status: record, Kind: report). It carries:
    • the method and the measurement time (2026-10-06T18:57:19Z to 19:01:23Z);
    • the inventory file's commit and blob;
    • one row per repository, giving its main head sha, its class, the evidence path, and the recommendation with its reason;
    • counts per class;
    • a "not measured" list, which is empty.
  • tasks.md 5.7 is ticked, with the record as its evidence. The hunk touches only 5.7's lines. Sibling prefer-triad-project-shape 5.1: the doctrine and register description restate the Triad as preferred, confers nothing #1254 ticked 5.1 in the same file and has landed, and this branch sits on top of it.

These are recommendations only. For each single repository the record gives its owner a recommendation, with a one-line reason:

  • migrate (adopt-project.py), or
  • record staying single (single-repository.yaml).

They are not decisions. Nothing was converted, created or recorded on any repository's behalf, and every read was a GET. The record states the preference together with its posture: the Triad is preferred, it confers nothing, and a single repository is reviewed identically. It also says that it is not a review input.

Brett Heap's words, verbatim

  • 2026-10-06T10:20:12Z: "the triad should be the prefered structure and should prompt or warn the user if working on a non Triad repo."
  • 2026-10-06T16:02:16Z: "ratify 1249 as recommended"
  • 2026-10-06T17:31:10Z: "merge 1249"
  • 2026-10-06T17:41:18Z: "usage is fine, launch all four" (the realization)
  • At this lane's resume: "usage reset, resume all. read handoff and resume and fan out wide and do as much as possible in parallel"

These words authorize authoring and opening this pull request. None of them is a merge word for it.

Counts per class

class rows
Triad 3 (MedxSoft/MedxEHR, opensoft/openDox, opensoft/openXdox)
leg 6 (the -spec and -code legs of those three)
family holder 0
workspace repository 0
single repository 28
total 37
  • Not measured: none.
  • Recommendations over the 28 single repositories:
    • migrate: 12;
    • record staying single: 15;
    • none made: 1 (Fission-AI/OpenSpec, governance: external).
  • Agreement with design.md D7. The same three repositories it named are the only Triads among the inventory's 37 rows.
  • Scope. The inventory's 37 rows are the whole scope. Repositories outside it are not measured: opensoft/brett-wip is not a row, and Triads such as MedxSoft/MedxGlass exist outside it.

Judgment calls, stated in the record (§ 4)

  1. The -Install names and xFactory-Installer. Eight repositories are recommended to record staying single, because the in-place posture adopt-project.py documents adopts a repository under its own name.
    • The naming policy admits the install form into no role, and xFactory-Installer matches no family.
    • The tool does not itself check that --project equals the source's name. The barrier is the documented posture, not a hard check.
    • Four of the eight (rows 18, 19, 20 and 23) are products with code and specs that would otherwise be "migrate".
    • For all eight a Triad would first need a rename, which is the owner's separate decision.
  2. The external row. No recommendation is addressed to Fission-AI/OpenSpec, which the inventory defines as "NOT of this estate at all". This is a stated departure from 5.7's "for each single repository a recommendation".
  3. What the record cannot be acted on yet. "Record staying single" can be acted on only after tasks.md § 5.2 lands, because openRepoShape main 39d5c986 does not yet carry the single-repository.yaml schema.
  4. Private repositories. A private repository's reason names no path from its tree. Only the public rows 2, 12, 16, 17, 28 and 29 cite paths.
  5. single-repository.yaml is not read. The ratified requirement makes the advisory its only reader, so the record reports and counts nothing about it.

Review round (head e24ac4b7)

An independent opus review of head 05d722ae found one MAJOR, two MINOR and six NIT items. All nine were taken in one pass (63521d48). main was then merged in at 9171d14a (#1138); there was no rebase and no force push.

  1. MAJOR: the record was a second reader of single-repository.yaml.
    • Canon makes the advisory its only reader. The file is dropped from the reads, from the 28 evidence cells, from the counts, from § 6's re-run recipe and from the 5.7 tick.
    • One sentence in § 1 says the inventory is not its reader.
    • The measurement pass had requested the path, and .gitmodules, at each head. The record now discloses that, and says neither result is used or reported.
    • The counts did not change.
  2. MINOR: rows 18, 19, 20 and 23 now state both facts: a product with code and specs, and the naming barrier.
    • Note B now says the barrier is the documented in-place posture. _checked_plan_inputs does not bind --project to the source repository's name.
    • Not taken for row 22. xFactory-Installer has no spec corpus at its measured sha (no openspec/ and no specs/; one script and one test). It keeps its "a tool" reason, with the corrected barrier wording.
  3. MINOR: row 26, the external row. Note D and the 5.7 tick now cite the inventory's own definitions: pinned is "openxFactory consumes it at a commit and digest and authors none of it", and external is "it is pinned and is NOT of this estate at all". Both call the withheld recommendation a stated departure from 5.7's text.
  4. NIT. The base sentence now reads "through Archive add-factory-mcp-conformance: realization #1243 → 92010d3e, packet closed #1252 and prefer-triad-project-shape 5.1: the doctrine and register description restate the Triad as preferred, confers nothing #1254". fc4fa0ff is T070b: fold Copilot's four items into realize-doc-health-direction-arc before the ratify word (plan 038) #1253's own merge, which git log --first-parent fc4fa0ff..a2dc658d confirms.
  5. NIT. Rows 11 and 12 drop the "already elected" clause.
  6. NIT. § 1 now says a private repository's reason names no path from its tree, and names the public rows that do cite paths: 2, 12, 16, 17, 28 and 29. This body's judgment call 4 says the same.
  7. NIT. § 1 states the scope: no row is a workspace repository or a family holder, opensoft/brett-wip is not a row, and MedxSoft/MedxGlass (main 582ce57c) is a Triad outside the inventory. This body now says "the only Triads among the inventory's 37 rows".
  8. NIT. The 5.7 tick names prefer-triad-project-shape 5.7: the estate inventory, a recommendation only #1255 and keeps the closing "holds on main only through that pull request's merge" wording.
  9. NIT. The record now says the 37 naming verdicts are identical at the pinned openRepoShape e9c4827b and at 39d5c986. That was re-run here independently.

Validation

Both trees are checkouts named openxFactory with the three submodules CI initializes (openXwallet, openXdox and openDox, recursively):

  • this branch's head e24ac4b7, after the review round and a merge of main;
  • clean main 9171d14a.

The results:

  • Pinned OpenSpec CLI (@fission-ai/openspec@1.12.0, content address verified):
    • --change prefer-triad-project-shape --strict: 1 passed, 0 failed.
    • --all --strict: 113 passed, 1 failed (114 items), exit 0 on both trees. The one failure is the accepted add-chain-attestation exception and is not new.
  • House validators, each exit 0, with output byte-identical to main:
    • validate-sequenced-after.py .;
    • --ledger-diff: "per-change sweep ledger consistent with the corpus (232 rows)";
    • proposal-support.py . verify prefer-triad-project-shape: "proposal support verification ok";
    • validate-code-surface.py .;
    • validate-target-release.py .;
    • validate-former-id-arrival.py .;
    • validate-release-tag-gate.py .;
    • validate-estate-inventory.py ..
  • doc-health (scripts/doc-health.py --single-repo .):
    • 31 critical, 26 error, 69 warning, 20 info on both trees. The report is byte-identical, and no finding names this record or the packet.
    • Negative control: a deliberately bogus Status: in the record produced a status-validity error naming it. So the record is in scope, and with its real Status: record it is clean.
  • pytest, over the directories that read the change corpus, the ledger or the pins, with -m "not postgres":
    • this content over base c44c1610: 3872 passed, 2 skipped, 0 failed;
    • the re-run on head 05d722ae over a2dc658d: 3872 passed, 2 skipped, 0 failed;
    • the re-run on head e24ac4b7 over 9171d14a: 3872 passed, 2 skipped, 0 failed.
    • The full suite is CI's pytest-suite.
  • Scans. The diff was scanned for secrets, tokens and workstation paths, and is clean.

This pull request touches openspec/changes/, so lane-collision Rule 6's LANDING/LANDED window applies at landing.

Copilot review not requested (Brett Heap, 2026-10-06).

Held for Brett Heap's merge word; do not merge.

🤖 Generated with Claude Code

brettheap and others added 2 commits October 6, 2026 19:31
…n only

Measure each of the 37 repositories in scripts/estate-repository-inventory.yaml
on its own main through the GitHub API, reading every file at the head sha it
records, and capture the result at
openspec/changes/prefer-triad-project-shape/review/estate-inventory-2026-10-06.md.

Classes: 3 Triads (MedxEHR, openDox, openXdox), 6 legs, 0 family holders,
0 workspace repositories, 28 single repositories. None records staying single
and none went unmeasured. For the 28, a recommendation to the owner: migrate
12, record staying single 15, none made for the one external row.

These are recommendations only. Nothing is converted or recorded on any
repository's behalf, and the record states the Triad preference with its
posture (confers nothing, reviewed identically) and says it is not a review
input.

Tick tasks.md 5.7 with the record as evidence, touching only 5.7's lines.

Lane: codeXfactory-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nded

The branch was rebased, before any push, onto main a2dc658 (#1254, the 5.1
tick). The record's two base sentences now name that commit. The inventory
blob is unchanged there (ce17309), and #1254 adds no root project.yaml,
family.yaml or single-repository.yaml. No measured value moves.

Lane: codeXfactory-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brettheap

Copy link
Copy Markdown
Contributor Author

@codex review

@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 22 hours and 24 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This PR records a read-only inventory of all 37 estate repositories at pinned main-branch commits, classifies their project shapes, and issues non-binding owner recommendations without changing any external repository; it also marks task 5.7 complete with the report as evidence.

Entity relationship diagram for estate inventory records

erDiagram
    ESTATE_REPOSITORY {
        string repository
        string main_head_sha
        string project_shape
        string evidence_path
    }
    OWNER_RECOMMENDATION {
        string action
        string reason
        boolean binding
    }
    ESTATE_REPOSITORY ||--o| OWNER_RECOMMENDATION : receives
Loading

Flow diagram for the read-only estate inventory

flowchart TD
    A[37 estate repositories] --> B[GitHub API GET at each main head SHA]
    B --> C[Read project.yaml, family.yaml, single-repository.yaml, AGENTS.md]
    C --> D[validate-repository-naming.py]
    D --> E[Classify project shape]
    E --> F[Recommendation to repository owner]
    F --> G[No repository changes]
    E --> H[Inventory report]
    H --> I[Task 5.7 marked complete]
Loading

Flow diagram for project-shape recommendations

flowchart TD
    A[Single repository] --> B{Product with code and specs?}
    B -->|yes| C[migrate via adopt-project.py]
    B -->|no| D[record staying single via single-repository.yaml]
    A --> E{External repository?}
    E -->|yes| F[No recommendation]
    A --> G{Install or unclassified name?}
    G -->|yes| D
    C --> H[Owner decides]
    D --> H
    F --> H
Loading

File-Level Changes

Change Details Files
Adds a dated, read-only estate inventory report containing classifications and owner-facing recommendations for all 37 repositories.
  • Documents the GitHub API measurement method, pinned head SHAs, evidence paths, naming-policy validation, and measurement timestamp.
  • Classifies repositories into Triads, legs, family holders, workspace repositories, or single repositories.
  • Provides migrate or record-staying-single recommendations for single repositories, including rationale and explicit exceptions.
  • Records that recommendations have no authority, cause no repository changes, and are not review inputs.
  • Summarizes class and recommendation counts, judgment calls, limitations, and rerun instructions.
openspec/changes/prefer-triad-project-shape/review/estate-inventory-2026-10-06.md
Marks task 5.7 complete and links it to the new inventory evidence.
  • Ticks task 5.7 and records the completion date, lane, scope, counts, and recommendation totals.
  • States that the completion is conditional on this pull request landing and that merge awaits the required checks and merge authorization.
openspec/changes/prefer-triad-project-shape/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 22:09
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>
main moved to 9171d14 during the review round (#1138, the pinned decision
core advance). It touches no file of this packet. Merged, not rebased.

Lane: codeXfactory-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

LANDING — lane codeXfactory-5, session ed23f049-7e99-4601-8a6d-760b6aeb5f26@Eagle, 2026-10-06T23:51:54Z, PR #1255 into opensoft/openxFactory main. On Brett Heap's word: "merge 1255".

Lane: codeXfactory-5

@brettheap
brettheap merged commit 0992369 into main Oct 6, 2026
17 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

LANDED — lane codeXfactory-5, session ed23f049-7e99-4601-8a6d-760b6aeb5f26@Eagle, 2026-10-06T23:52:07Z, PR #1255 into opensoft/openxFactory main → squash 0992369ab7f9b4d81ca3099b02961181388c1726

Merged on Brett Heap's word "merge 1255", with every required check green at e24ac4b7. Task 5.7 of prefer-triad-project-shape is ticked on main. The Rule 6 window is closed.

Lane: codeXfactory-5

@brettheap
brettheap deleted the realize/prefer-triad-estate-inventory branch October 6, 2026 23:52
brettheap added a commit that referenced this pull request Oct 7, 2026
…ged evidence

Records the realization lane's own merged acts in tasks.md, on 5.1's pattern
(PR #1254). Edits only the 5.2-5.5 lines; 5.6 stays unticked, and 5.7 is left
exactly as #1255 merged it.

- 5.2: opensoft/openRepoShape#164 -> 1a9fc537 (squash, 2026-10-06T22:52:05Z);
  tests, tests-macos, tests-windows and SonarCloud green; full suite 1159 ->
  1200 passed, 33 skipped.
- 5.3: this PR (#1260) -> 9af2207, the pin advance; openreposhape-pin-gate
  green on it (run 37550154276).
- 5.4: opensoft/workBenches#139 -> 9fbe609c and #140 -> d86ba59b; post-merge
  main CI green; bootstrap suite 1042 PASS; workBenches#138 closed completed.
- 5.5: the private brettheap/new-workstation, cited by merged sha and file
  name only: #52 -> e081c5ab, #53 -> cb411460; no CI there; the live
  ~/.agents files are byte-identical to cb411460.

Each tick holds on main only through this pull request's merge, which waits on
Brett Heap's merge word and its required checks.

Lane: codeXfactory-5
Co-Authored-By: Claude Opus 5.5 <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.

1 participant