Compare commits

...

3 commits

Author SHA1 Message Date
d327b2eaea Merge origin/main: reconcile STATE-WP-0080 hub IDs and retarget
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
2026-08-16 18:27:54 +02:00
c40eb08e8b Adopt railiance01 hub IDs in STATE-WP-0080
The workstation hub (127.0.0.1:8000) and the railiance01 primary each
registered this workplan under different UUIDs. Adopting the primary's IDs
so the shared file matches production.
2026-08-16 18:27:36 +02:00
30a4133809 docs(workplans): retarget STATE-WP-0080 to handoff after decision 747011c6
Repository standards conformance and governed scaffolding move to
repo-manager (RMGR-WP-0004). Hubs are registers; they do not scaffold or
rewrite repo files.

T01-T04 become guard, delegate, correct the inventory disposition, and
remove the templating path. T05-T08 are cancelled with pointers to their
RMGR-WP-0004 successors, retained so the handoff stays legible.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 18:24:56 +02:00
7 changed files with 10544 additions and 111 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
--- ---
id: STATE-WP-0080 id: STATE-WP-0080
type: workplan type: workplan
title: "statehub register: project-repository flavor awareness" title: "statehub register: stop repo scaffolding, hand off to repo-manager"
domain: infotech domain: infotech
repo: state-hub repo: state-hub
status: active status: active
@ -12,57 +12,61 @@ updated: "2026-08-16"
parent_project: prj-state-hub-retirement parent_project: prj-state-hub-retirement
parent_workplan: SHR-WP-0001 parent_workplan: SHR-WP-0001
related: related:
- RMGR-WP-0004
- STATE-WP-0079
- CFED-WP-0001 - CFED-WP-0001
- SHR-WP-0001 - SHR-WP-0001
state_hub_workstream_id: "bbfce36a-0b19-462f-af78-167f9eb89b86" state_hub_workstream_id: "bbfce36a-0b19-462f-af78-167f9eb89b86"
--- ---
# statehub register: project-repository flavor awareness # statehub register: stop repo scaffolding, hand off to repo-manager
## Goal ## Goal
Make `statehub register` aware of the `prj-` project-repository flavor so that Stop `statehub register` from producing non-conformant repository files, and
scaffolding a project repo produces conformant files instead of files the hand repository scaffolding and standards conformance to `repo-manager` — where
governing standard calls an anti-pattern. decision `747011c6` places them.
This is the residual recorded in `SHR-WP-0001-T01`: **This workplan does not implement flavor awareness.** That is `RMGR-WP-0004`.
The state-hub side is a guard, a delegation, and a clean exit.
> Residual tooling gap: `statehub register` still scaffolds `INTENT.md` for ## Why this changed shape
> ordinary repos — capture under a state-hub child workplan when T05 maps
> implementation streams (do not invent `INTENT.md` on `prj-` repos).
It has now been hit twice — once when founding `prj-state-hub-retirement`, and Drafted 2026-08-16 as a full flavor-awareness implementation inside
again on 2026-08-16 founding `prj-canon-federation`, where the scaffolded `statehub_register.py`; retargeted the same day after decision `747011c6`:
`INTENT.md` and a generic `PRJ-WP-0001-statehub-bootstrap.md` both had to be
deleted by hand before the first `fix-consistency` run.
## Root cause > Hubs are registers: they index and project repository-owned records. They do
> not scaffold, template, or rewrite repository files. Repo Manager owns
> repository representation and governed mutation, and therefore owns the
> standards repositories must comply with.
`statehub_register.py` (872 lines) contains **no reference to Implementing here would have built the capability twice, inside the component
`.repo-classification.yaml`, `category`, or `repo_flavor`**. It has no way to being retired under `STATE-WP-0079`, and deepened exactly the boundary violation
distinguish a project repository from a durable product repository, so: the hub refactor exists to remove. The originating residual (`SHR-WP-0001-T01`)
is unchanged; only its owner is.
- `KEY_CONTEXT_FILES` (`:25`) lists `INTENT.md` as a primary context file; Tasks T05T08 below are `cancel`led with pointers to their `RMGR-WP-0004`
- `:248` writes `INTENT.md` unconditionally when absent; successors. They are retained rather than deleted so the handoff is legible.
- `:786``:790` treat a missing intent as a hard error, prompting interactively
and exiting with `ERROR: Intent is required to create INTENT.md.`;
- `:269` writes `{WP_PREFIX}-0001-statehub-bootstrap.md` with a prefix defaulted
from the repo slug (`:78`, `_default_wp_prefix`), yielding `PRJ-WP-` for every
`prj-` repo rather than a project-derived prefix;
- the generated `.custodian-brief.md` (`:634`) and templates (`:461`, `:509`,
`:525`, `:569`) all instruct agents to read `INTENT.md`.
The governing standard is ## The defect being contained
`the-custodian/canon/standards/project-repository-flavor_v0.1.md`, which states:
> Tooling that scaffolds repositories (e.g. `statehub register`) MUST treat `statehub_register.py` has no reference to `.repo-classification.yaml`,
> `GOAL.md` + `repo_flavor: project` as sufficient purpose documentation for `category`, or `repo_flavor` in 872 lines, so it cannot distinguish a project
> `prj-` repos and MUST NOT require inventing an `INTENT.md` that pretends the repository from a durable product repository. It therefore:
> project is a permanent product.
and names shipping both `INTENT.md` and `GOAL.md` an explicit anti-pattern. - writes `INTENT.md` unconditionally (`:248`) and treats missing intent as a hard
error (`:786``:790`), though `project-repository-flavor_v0.1` calls shipping
both `INTENT.md` and `GOAL.md` an anti-pattern and forbids requiring
`INTENT.md` on `prj-` repos;
- derives the workplan prefix from the slug (`:78`, `_default_wp_prefix`),
yielding `PRJ-WP-` for every project repo, so all `prj-` repos collide;
- writes a generic `{PREFIX}-0001-statehub-bootstrap.md` (`:269`) that competes
with the project's real foundation workplan.
## Detect repository flavor Hit twice: `prj-state-hub-retirement` and `prj-canon-federation`, both requiring
manual deletion after registration.
## Guard against non-conformant scaffolding
```task ```task
id: STATE-WP-0080-T01 id: STATE-WP-0080-T01
@ -71,15 +75,17 @@ priority: high
state_hub_task_id: "6b01a939-7d60-4a0c-90db-af8e31c45359" state_hub_task_id: "6b01a939-7d60-4a0c-90db-af8e31c45359"
``` ```
Give the register path a flavor signal. Read `.repo-classification.yaml` Add a minimal flavor guard to the register path — detect project flavor from
`category` when present, and `GOAL.md` frontmatter `repo_flavor` as a secondary `.repo-classification.yaml` `category`, `GOAL.md` `repo_flavor`, or the `prj-`
signal; fall back to the `prj-` directory/slug prefix. Surface the result as a slug prefix, and on a match **refuse to scaffold**, with a message pointing at
single value threaded through inference and scaffolding. `repo-manager`, rather than writing files the standard forbids.
Treat classification as authoritative when present and disagreeing with the slug Deliberately a refusal, not an implementation: a partial flavor-aware templating
prefix, and warn on the mismatch rather than guessing silently. path here would become a second source of truth competing with `RMGR-WP-0004`.
## Scaffold GOAL.md instead of INTENT.md for project repos Durable-repo behaviour is untouched.
## Delegate registration scaffolding
```task ```task
id: STATE-WP-0080-T02 id: STATE-WP-0080-T02
@ -88,19 +94,14 @@ priority: high
state_hub_task_id: "bd6a9069-b455-4f5e-b1a5-4a87d014e8f6" state_hub_task_id: "bd6a9069-b455-4f5e-b1a5-4a87d014e8f6"
``` ```
For project-flavor repos: Once `RMGR-WP-0004-T03` lands, route scaffolding through Repo Manager instead of
refusing, using the dual-run strangler pattern already proven in `RMGR-WP-0002`
and `RMGR-WP-0003`. Hub-side registration keeps only what a register legitimately
does: record the repo, its identity, and its host path.
- do not write `INTENT.md`, and do not prompt for intent (`:786``:790`); Coordinate the cutover point with `RMGR-WP-0004-T05`.
- accept an existing `GOAL.md` as sufficient purpose documentation;
- when `GOAL.md` is absent, scaffold one from a template carrying the four
sections the standard requires — Outcome, Invariants, Success gates, Project
retirement — plus the recommended frontmatter (`repo`, `repo_flavor`,
`project_status`, `started`, `reviewed`);
- error only if neither `GOAL.md` nor enough input to generate one exists.
For all other flavors, behaviour is unchanged. ## Correct the inventory disposition
## Fix workplan prefix inference
```task ```task
id: STATE-WP-0080-T03 id: STATE-WP-0080-T03
@ -109,107 +110,87 @@ priority: medium
state_hub_task_id: "b141b378-10d0-4865-a67b-159806bcf037" state_hub_task_id: "b141b378-10d0-4865-a67b-159806bcf037"
``` ```
`_default_wp_prefix` derives `PRJ-WP-` from any `prj-`-prefixed slug, which is Confirm the register/scaffolding capability is dispositioned `move`
wrong for every project repo: the standard requires a prefix derived from the `repo-manager` in `prj-state-hub-retirement/inventory/`, not `keep`. If it is
project, not the flavor marker (`SHR-WP-` for State Hub Retirement, `CFED-WP-` recorded as `keep`, correct it and cite decision `747011c6``SHR-INV-0001` is
for canon federation). the retirement lane's source of truth, and a stale disposition would resurrect
the boundary violation during cutover.
For project-flavor repos, strip the `prj-` marker before deriving, and prompt or ## Remove the templating path
require `--wp-prefix` rather than emitting a flavor-derived default. A prefix
collision across two `prj-` repos is the failure this prevents.
## Decide the bootstrap workplan for project repos
```task ```task
id: STATE-WP-0080-T04 id: STATE-WP-0080-T04
status: wait status: wait
priority: medium priority: low
state_hub_task_id: "d933ae91-ad40-4a88-9ce3-90872cd1f3d7" state_hub_task_id: "d933ae91-ad40-4a88-9ce3-90872cd1f3d7"
``` ```
`:269` writes a generic `statehub-bootstrap` workplan. For project repos this After delegation is live and `RMGR-WP-0004-T06` compatibility tests pass, delete
competes with the foundation workplan the project actually needs — in both real the templating code from `statehub_register.py``INTENT.md` generation, the
cases it was deleted immediately. `AGENTS.md` / `CLAUDE.md` / `.custodian-brief.md` templates, `project_rules/`,
and bootstrap-workplan generation.
Either skip it for project flavor, or replace it with a foundation-workplan Sequence behind `STATE-WP-0079`'s strangler so removal lands with the rest of the
template shaped by the standard (confirm conventions, inventory participants, retirement rather than as an isolated breaking change.
map child workplans, define gates). Prefer skipping unless T05's template work
shows the foundation shape is genuinely reusable.
## Update generated templates and briefs ## Moved: generated templates and briefs
```task ```task
id: STATE-WP-0080-T05 id: STATE-WP-0080-T05
status: wait status: cancel
priority: medium priority: medium
state_hub_task_id: "9eb5ddb5-28d9-4244-8a4f-8fe2a50b5d27" state_hub_task_id: "9eb5ddb5-28d9-4244-8a4f-8fe2a50b5d27"
``` ```
Make every generated artifact flavor-correct: Cancelled — moved to **`RMGR-WP-0004-T04`** by decision `747011c6`.
- `KEY_CONTEXT_FILES` (`:25`) — include `GOAL.md`; Worth carrying forward explicitly: `make update-agent-instructions` runs
- `.custodian-brief.md` orientation line (`:634`) — `GOAL.md` for project repos; fleet-wide and shares the flavor-blind templates, so it silently re-breaks
- `AGENTS.md` / `CLAUDE.md` / `scripts/project_rules/` templates (`:461`, conformant `prj-` repos on every run. That is a larger blast radius than first
`:509`, `:525`, `:569`) — session start order `GOAL.md``SCOPE.md` registration, and it must not be lost in the handoff.
history → active workplans, per the standard's agent conventions;
- `_ensure_context_files` (`:431`) — do not treat missing `INTENT.md` as a gap
on project repos.
Confirm `make update-agent-instructions` regenerates conformant files for an ## Moved: conformance check
existing `prj-` repo, not just at first registration.
## Add a conformance check
```task ```task
id: STATE-WP-0080-T06 id: STATE-WP-0080-T06
status: wait status: cancel
priority: low priority: low
state_hub_task_id: "3467ae11-1301-46ab-9e7e-75c4f55f53fe" state_hub_task_id: "3467ae11-1301-46ab-9e7e-75c4f55f53fe"
``` ```
The standard ships a conformance checklist that is currently only human-checked. Cancelled — moved to **`RMGR-WP-0004-T02`** by decision `747011c6`.
Add a consistency check that flags a project-flavor repo which ships `INTENT.md`
alongside `GOAL.md`, is missing a required file, or uses a flavor-derived
workplan prefix.
Advisory severity is sufficient — this is a convention violation, not data Conformance checking is the clearest case for the new boundary: judging whether a
corruption. Follow the existing `C-NN` numbering and register it in the repository satisfies its standard is repository representation, not hub
consistency-check catalog. projection. Repo Manager exposes it as a command and a contract; the hub consumes
the result rather than computing it.
## Cover with tests ## Moved: tests
```task ```task
id: STATE-WP-0080-T07 id: STATE-WP-0080-T07
status: wait status: cancel
priority: medium priority: medium
state_hub_task_id: "126ddd07-df9d-4b65-a651-fff0ad2d4074" state_hub_task_id: "126ddd07-df9d-4b65-a651-fff0ad2d4074"
``` ```
Extend `tests/test_statehub_register_cli.py`: Cancelled — moved to **`RMGR-WP-0004-T06`** by decision `747011c6`.
- registering a `prj-` repo with `category: project` writes `GOAL.md`, no The byte-identical-output regression guard for durable repos stays essential:
`INTENT.md`, and no flavor-derived prefix; the handoff must not change what ordinary repositories receive.
- registering an ordinary product repo is byte-identical to today's output
(regression guard — this workplan must not change durable-repo behaviour);
- classification/slug mismatch warns rather than silently choosing;
- re-running register on an existing conformant `prj-` repo is idempotent.
## Carry the fix forward past State Hub retirement ## Superseded: carry the fix forward
```task ```task
id: STATE-WP-0080-T08 id: STATE-WP-0080-T08
status: wait status: cancel
priority: medium priority: medium
state_hub_task_id: "405526b7-b133-4746-aab5-6301c1a0b72e" state_hub_task_id: "405526b7-b133-4746-aab5-6301c1a0b72e"
``` ```
State Hub is being retired (`STATE-WP-0079`, `prj-state-hub-retirement`). Cancelled — superseded by decision `747011c6`, which answered this task's open
Repository scaffolding and representation are slated to land in `repo-manager`. question outright. It asked whether `repo-manager` was close enough to take the
work; the decision settled that repository standards belong there regardless of
timing, and `RMGR-WP-0004` now carries the whole implementation.
Record where this flavor logic belongs after retirement and link it to the Retained as the record of where the retarget originated.
inventory disposition for the register path, so the fix is not stranded in a
component scheduled for removal. If `repo-manager` is close enough to take it,
prefer implementing there and leaving `statehub register` with a thin
flavor-guard rather than a full templating path.
Coordinate through `SHR-WP-0001` rather than duplicating its task list.