Compare commits
No commits in common. "d327b2eaea7b5c8675cf932300e34996d8d4d161" and "1f15ab8a90ea666b809c51018f4df96eccfeee8d" have entirely different histories.
d327b2eaea
...
1f15ab8a90
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
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
id: STATE-WP-0080
|
id: STATE-WP-0080
|
||||||
type: workplan
|
type: workplan
|
||||||
title: "statehub register: stop repo scaffolding, hand off to repo-manager"
|
title: "statehub register: project-repository flavor awareness"
|
||||||
domain: infotech
|
domain: infotech
|
||||||
repo: state-hub
|
repo: state-hub
|
||||||
status: active
|
status: active
|
||||||
|
|
@ -12,61 +12,57 @@ 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: stop repo scaffolding, hand off to repo-manager
|
# statehub register: project-repository flavor awareness
|
||||||
|
|
||||||
## Goal
|
## Goal
|
||||||
|
|
||||||
Stop `statehub register` from producing non-conformant repository files, and
|
Make `statehub register` aware of the `prj-` project-repository flavor so that
|
||||||
hand repository scaffolding and standards conformance to `repo-manager` — where
|
scaffolding a project repo produces conformant files instead of files the
|
||||||
decision `747011c6` places them.
|
governing standard calls an anti-pattern.
|
||||||
|
|
||||||
**This workplan does not implement flavor awareness.** That is `RMGR-WP-0004`.
|
This is the residual recorded in `SHR-WP-0001-T01`:
|
||||||
The state-hub side is a guard, a delegation, and a clean exit.
|
|
||||||
|
|
||||||
## 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
|
It has now been hit twice — once when founding `prj-state-hub-retirement`, and
|
||||||
`statehub_register.py`; retargeted the same day after decision `747011c6`:
|
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
|
## Root cause
|
||||||
> not scaffold, template, or rewrite repository files. Repo Manager owns
|
|
||||||
> repository representation and governed mutation, and therefore owns the
|
|
||||||
> standards repositories must comply with.
|
|
||||||
|
|
||||||
Implementing here would have built the capability twice, inside the component
|
`statehub_register.py` (872 lines) contains **no reference to
|
||||||
being retired under `STATE-WP-0079`, and deepened exactly the boundary violation
|
`.repo-classification.yaml`, `category`, or `repo_flavor`**. It has no way to
|
||||||
the hub refactor exists to remove. The originating residual (`SHR-WP-0001-T01`)
|
distinguish a project repository from a durable product repository, so:
|
||||||
is unchanged; only its owner is.
|
|
||||||
|
|
||||||
Tasks T05–T08 below are `cancel`led with pointers to their `RMGR-WP-0004`
|
- `KEY_CONTEXT_FILES` (`:25`) lists `INTENT.md` as a primary context file;
|
||||||
successors. They are retained rather than deleted so the handoff is legible.
|
- `: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`,
|
> Tooling that scaffolds repositories (e.g. `statehub register`) MUST treat
|
||||||
`category`, or `repo_flavor` in 872 lines, so it cannot distinguish a project
|
> `GOAL.md` + `repo_flavor: project` as sufficient purpose documentation for
|
||||||
repository from a durable product repository. It therefore:
|
> `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
|
and names shipping both `INTENT.md` and `GOAL.md` an explicit anti-pattern.
|
||||||
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.
|
|
||||||
|
|
||||||
Hit twice: `prj-state-hub-retirement` and `prj-canon-federation`, both requiring
|
## Detect repository flavor
|
||||||
manual deletion after registration.
|
|
||||||
|
|
||||||
## Guard against non-conformant scaffolding
|
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: STATE-WP-0080-T01
|
id: STATE-WP-0080-T01
|
||||||
|
|
@ -75,17 +71,15 @@ priority: high
|
||||||
state_hub_task_id: "6b01a939-7d60-4a0c-90db-af8e31c45359"
|
state_hub_task_id: "6b01a939-7d60-4a0c-90db-af8e31c45359"
|
||||||
```
|
```
|
||||||
|
|
||||||
Add a minimal flavor guard to the register path — detect project flavor from
|
Give the register path a flavor signal. Read `.repo-classification.yaml`
|
||||||
`.repo-classification.yaml` `category`, `GOAL.md` `repo_flavor`, or the `prj-`
|
`category` when present, and `GOAL.md` frontmatter `repo_flavor` as a secondary
|
||||||
slug prefix, and on a match **refuse to scaffold**, with a message pointing at
|
signal; fall back to the `prj-` directory/slug prefix. Surface the result as a
|
||||||
`repo-manager`, rather than writing files the standard forbids.
|
single value threaded through inference and scaffolding.
|
||||||
|
|
||||||
Deliberately a refusal, not an implementation: a partial flavor-aware templating
|
Treat classification as authoritative when present and disagreeing with the slug
|
||||||
path here would become a second source of truth competing with `RMGR-WP-0004`.
|
prefix, and warn on the mismatch rather than guessing silently.
|
||||||
|
|
||||||
Durable-repo behaviour is untouched.
|
## Scaffold GOAL.md instead of INTENT.md for project repos
|
||||||
|
|
||||||
## Delegate registration scaffolding
|
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: STATE-WP-0080-T02
|
id: STATE-WP-0080-T02
|
||||||
|
|
@ -94,14 +88,19 @@ priority: high
|
||||||
state_hub_task_id: "bd6a9069-b455-4f5e-b1a5-4a87d014e8f6"
|
state_hub_task_id: "bd6a9069-b455-4f5e-b1a5-4a87d014e8f6"
|
||||||
```
|
```
|
||||||
|
|
||||||
Once `RMGR-WP-0004-T03` lands, route scaffolding through Repo Manager instead of
|
For project-flavor repos:
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
```task
|
||||||
id: STATE-WP-0080-T03
|
id: STATE-WP-0080-T03
|
||||||
|
|
@ -110,87 +109,107 @@ priority: medium
|
||||||
state_hub_task_id: "b141b378-10d0-4865-a67b-159806bcf037"
|
state_hub_task_id: "b141b378-10d0-4865-a67b-159806bcf037"
|
||||||
```
|
```
|
||||||
|
|
||||||
Confirm the register/scaffolding capability is dispositioned `move` →
|
`_default_wp_prefix` derives `PRJ-WP-` from any `prj-`-prefixed slug, which is
|
||||||
`repo-manager` in `prj-state-hub-retirement/inventory/`, not `keep`. If it is
|
wrong for every project repo: the standard requires a prefix derived from the
|
||||||
recorded as `keep`, correct it and cite decision `747011c6` — `SHR-INV-0001` is
|
project, not the flavor marker (`SHR-WP-` for State Hub Retirement, `CFED-WP-`
|
||||||
the retirement lane's source of truth, and a stale disposition would resurrect
|
for canon federation).
|
||||||
the boundary violation during cutover.
|
|
||||||
|
|
||||||
## 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
|
```task
|
||||||
id: STATE-WP-0080-T04
|
id: STATE-WP-0080-T04
|
||||||
status: wait
|
status: wait
|
||||||
priority: low
|
priority: medium
|
||||||
state_hub_task_id: "d933ae91-ad40-4a88-9ce3-90872cd1f3d7"
|
state_hub_task_id: "d933ae91-ad40-4a88-9ce3-90872cd1f3d7"
|
||||||
```
|
```
|
||||||
|
|
||||||
After delegation is live and `RMGR-WP-0004-T06` compatibility tests pass, delete
|
`:269` writes a generic `statehub-bootstrap` workplan. For project repos this
|
||||||
the templating code from `statehub_register.py` — `INTENT.md` generation, the
|
competes with the foundation workplan the project actually needs — in both real
|
||||||
`AGENTS.md` / `CLAUDE.md` / `.custodian-brief.md` templates, `project_rules/`,
|
cases it was deleted immediately.
|
||||||
and bootstrap-workplan generation.
|
|
||||||
|
|
||||||
Sequence behind `STATE-WP-0079`'s strangler so removal lands with the rest of the
|
Either skip it for project flavor, or replace it with a foundation-workplan
|
||||||
retirement rather than as an isolated breaking change.
|
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
|
```task
|
||||||
id: STATE-WP-0080-T05
|
id: STATE-WP-0080-T05
|
||||||
status: cancel
|
status: wait
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "9eb5ddb5-28d9-4244-8a4f-8fe2a50b5d27"
|
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
|
- `KEY_CONTEXT_FILES` (`:25`) — include `GOAL.md`;
|
||||||
fleet-wide and shares the flavor-blind templates, so it silently re-breaks
|
- `.custodian-brief.md` orientation line (`:634`) — `GOAL.md` for project repos;
|
||||||
conformant `prj-` repos on every run. That is a larger blast radius than first
|
- `AGENTS.md` / `CLAUDE.md` / `scripts/project_rules/` templates (`:461`,
|
||||||
registration, and it must not be lost in the handoff.
|
`: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
|
```task
|
||||||
id: STATE-WP-0080-T06
|
id: STATE-WP-0080-T06
|
||||||
status: cancel
|
status: wait
|
||||||
priority: low
|
priority: low
|
||||||
state_hub_task_id: "3467ae11-1301-46ab-9e7e-75c4f55f53fe"
|
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
|
Advisory severity is sufficient — this is a convention violation, not data
|
||||||
repository satisfies its standard is repository representation, not hub
|
corruption. Follow the existing `C-NN` numbering and register it in the
|
||||||
projection. Repo Manager exposes it as a command and a contract; the hub consumes
|
consistency-check catalog.
|
||||||
the result rather than computing it.
|
|
||||||
|
|
||||||
## Moved: tests
|
## Cover with tests
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: STATE-WP-0080-T07
|
id: STATE-WP-0080-T07
|
||||||
status: cancel
|
status: wait
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "126ddd07-df9d-4b65-a651-fff0ad2d4074"
|
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:
|
- registering a `prj-` repo with `category: project` writes `GOAL.md`, no
|
||||||
the handoff must not change what ordinary repositories receive.
|
`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
|
```task
|
||||||
id: STATE-WP-0080-T08
|
id: STATE-WP-0080-T08
|
||||||
status: cancel
|
status: wait
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "405526b7-b133-4746-aab5-6301c1a0b72e"
|
state_hub_task_id: "405526b7-b133-4746-aab5-6301c1a0b72e"
|
||||||
```
|
```
|
||||||
|
|
||||||
Cancelled — superseded by decision `747011c6`, which answered this task's open
|
State Hub is being retired (`STATE-WP-0079`, `prj-state-hub-retirement`).
|
||||||
question outright. It asked whether `repo-manager` was close enough to take the
|
Repository scaffolding and representation are slated to land in `repo-manager`.
|
||||||
work; the decision settled that repository standards belong there regardless of
|
|
||||||
timing, and `RMGR-WP-0004` now carries the whole implementation.
|
|
||||||
|
|
||||||
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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue