Compare commits

..

No commits in common. "d327b2eaea7b5c8675cf932300e34996d8d4d161" and "1f15ab8a90ea666b809c51018f4df96eccfeee8d" have entirely different histories.

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