the-custodian/workplans/CUST-WP-0055-workplan-terminology-fleet-refactor.md
codex 2e0deee2ef
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 6s
feat(terminology): prose sweep tool and custodian workplan cleanup (CUST-WP-0055 T04)
Add sweep_workstream_prose.py for agent-guidance files, sweep active workplan
prose in-repo, tighten scan allowlist exclusions, and update ADR-001 closure
protocol to workplan-first terminology.
2026-07-08 16:35:37 +02:00

322 lines
No EOL
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: CUST-WP-0055
type: workplan
title: "Fleet-wide workplan terminology refactor (workplan → workplan)"
domain: infotech
repo: the-custodian
status: active
owner: codex
topic_slug: custodian
planning_priority: medium
planning_order: 55
created: "2026-07-08"
updated: "2026-07-08"
state_hub_workstream_id: "d96b72d5-24f2-492b-8bb4-50c39058848a"
---
# CUST-WP-0055 — Fleet-wide workplan terminology refactor
## Goal
Make **workplan** the consistent product and documentation term across all
Coulomb-registered repositories, while preserving compatibility bridges where
clients, events, or frontmatter still depend on legacy `workplan` identifiers.
## Context
State Hub already completed the spine rename (`STATE-WP-0065`) and the
compatibility-first terminology transition (`STATE-WP-0054`,
`docs/workplan-terminology-transition.md`). Preferred REST/MCP surfaces expose
`workplan`; legacy `workplan` paths remain metered via `legacy-meter`.
A fleet scan on **2026-07-08** (see inventory below) shows the term is still
widespread outside State Hub internals:
| Metric | Value |
| --- | --- |
| Registered repos scanned | 76 |
| Repos with `workplan` hits | 73 |
| Total occurrences | 22,237 |
| Files touched | 7,823 |
| Missing local checkouts | `markitect-project`, `vergabe_teilnahme` — exclude from exit counts until paths exist or repos marked dormant |
**Top repos by hit count**
| Repo | Occurrences | Files | Notes |
| --- | ---: | ---: | --- |
| `state-hub` | 13,418 | 4,229 | Legacy compat layer, tests, migrations, dashboard |
| `agentic-resources` | 5,307 | 2,226 | Bulk mirrored agent assets (`other` bucket) |
| `the-custodian` | 754 | 143 | Canon, workplans, governance docs |
| `repo-scoping` | 318 | 123 | Generated classification artefacts |
| `railiance-fabric` | 306 | 54 | Graph/read-model payloads |
| `activity-core` | 214 | 46 | Event contracts + State Hub resolver code |
**Pattern totals (all repos)**
| Pattern | Count | Refactor stance |
| --- | ---: | --- |
| `workplans` (generic) | 13,108 | Prose/docs → `workplans`; code paths case-by-case |
| `workstream_id` | 3,830 | Keep API alias until legacy-meter retires |
| `workplan ` (prose) | 2,420 | **Replace** in user-facing text |
| `state_hub_workstream_id` | 1,065 | **Keep** frontmatter bridge until dedicated migration |
| `/workstreams/` routes | 490 | Keep compat routes; docs point to `/workplans/` |
| `create_workstream` MCP | 346 | Keep alias; guidance prefers `create_workplan` |
| `open_workstreams` | 145 | Internal summary cache — rename when clients move |
| `update_workstream` MCP | 128 | Keep alias |
| `list_workstreams` MCP | 7 | Keep alias |
Re-run the inventory anytime:
```bash
python tools/scan_workstream_terminology.py
python tools/scan_workstream_terminology.py --repo the-custodian --json
```
## Terminology policy (fleet)
| Surface | Canonical term | Legacy bridge | Action in this plan |
| --- | --- | --- | --- |
| Human docs, SCOPE, AGENTS, workplan bodies | **workplan** | — | Replace prose |
| Workplan frontmatter link field | `state_hub_workstream_id` | holds workplan UUID | Document; rename field in later WP |
| REST/MCP params | `workplan_id` preferred | `workstream_id` alias | Guidance only; retire per legacy-meter |
| REST routes | `/workplans/` | `/workstreams/` | Docs + dashboard; retire per meter |
| NATS / State Hub events | `org.statehub.workplan.completed` | `org.statehub.workplan.completed` | State Hub dual-publishes today; retire legacy per meter |
| activity-core event catalog | `org.statehub.workplan.completed` | `org.workplan.completed` | Align catalog to State Hub subjects; retire custodian-era type |
| Python/TS identifiers | `workplan_*` | `workstream_*` | Refactor when behaviour unchanged |
| DB tables / ORM models | `workplan` | — | Done in STATE-WP-0065 |
**Do not** mass-rename `state_hub_workstream_id` in workplan files or DB UUID
columns in this plan — that is a separate bridge-field migration.
**Event namespace note:** three subjects exist in the fleet today. State Hub
emits **`org.statehub.workplan.completed`** (preferred) and
**`org.statehub.workplan.completed`** (legacy, metered) on the same
transition — see `state-hub/api/routers/workstreams.py`. activity-core still
documents the older custodian catalog type **`org.workplan.completed`**
(`activity-core/event-types/org.workplan.completed.md`). This plan aligns
activity-core to the State Hub subjects; it does **not** introduce a bare
`org.workplan.completed` subject.
## Ready gate (`proposed` → `ready`)
Promote this workplan when all of the following are true:
1. T01 canon addendum draft exists under `the-custodian/canon/`.
2. `STATE-WP-0069` workplan file exists in `state-hub` (created by T02-T01).
3. T03 subject names match `state-hub/docs/workplan-terminology-transition.md`.
4. T08 scan exclusions are committed (`tools/scan_workstream_terminology.py` or
`tools/scan_workstream_allowlist.yaml`).
5. 2026-07-08 baseline JSON artefact path is named in T01 completion notes.
## Task: Canon and agent-template alignment
```task
id: CUST-WP-0055-T01
status: done
priority: high
state_hub_task_id: "9db434bd-55c5-4499-a365-8ac6a47726c8"
```
Publish a short canon addendum (or ADR supplement) in `the-custodian/canon/`
defining workplan as the fleet term and listing the legacy bridges above.
Update `state-hub/scripts/project_rules/*.template` so regenerated
`AGENTS.md` / session-protocol files are workplan-first (templates already
partially note the legacy mapping — close remaining gaps).
Done when `update_agent_instruction_files` output uses workplan in prose and
only mentions `workplan` in an explicit compatibility footnote.
Progress 2026-07-08: canon addendum drafted at
`canon/standards/workplan-terminology-fleet_v0.1.md` (fleet term, legacy
bridges, event subjects, agent rules, retirement rule). Baseline JSON at
`docs/evidence/workplan-terminology-baseline-20260708.json`. Template regeneration (`state-hub/scripts/project_rules/*.template`) verified
workplan-first with explicit legacy footnotes only.
## Task: State Hub and hub-core legacy surface retirement plan
```task
id: CUST-WP-0055-T02
status: progress
priority: high
state_hub_task_id: "2bb01721-a86b-43a0-ab4c-e5966743d295"
```
**T02-T01 (blocking):** create child workplan
`state-hub/workplans/STATE-WP-0069-workplan-terminology-legacy-retirement.md`
before any interface retirement executes.
**T02-T02:** inventory remaining `workplan` strings in dashboard, tests, flows
(`flows/workplan.yaml`), and compat routers; tie each to a `legacy-meter`
key; set retirement order after weekly review shows zero callers.
Deliverables: `STATE-WP-0069` file registered via `fix-consistency`, ranked
retirement backlog, dashboard route rename plan, and grep budget targets per
release (e.g. reduce `state-hub` hit count by 50% per phase). Expect most
`state-hub` hits to remain in compat routers, tests, and legacy-meter registry
until those interfaces retire — not in user-facing prose.
## Task: activity-core event and resolver migration
```task
id: CUST-WP-0055-T03
status: done
priority: high
state_hub_task_id: "72c2ecf3-c0c1-4241-b0f2-339a97ccf949"
```
Align activity-core to State Hub's existing dual-publish contract:
| Subject | Role | Action |
| --- | --- | --- |
| `org.statehub.workplan.completed` | preferred | Add/rename activity-core event type; new automations subscribe here |
| `org.statehub.workplan.completed` | legacy (State Hub) | Document as legacy; register in legacy-meter if not already |
| `org.workplan.completed` | legacy (custodian catalog) | Deprecate; map subscribers to `org.statehub.workplan.completed` |
State Hub already emits both `org.statehub.*` subjects on workplan completion;
activity-core must **not** invent `org.workplan.completed`. Update
`activity-core/event-types/`, `activity_core/context_resolvers/state_hub.py`
log messages, k8s manifests, and workplan prose. Publish a sunset date for
`org.workplan.completed` in the activity-core catalog.
Done when activity-core event definitions and subscribers use
`org.statehub.workplan.completed`, legacy subjects are documented with
replacement refs, and legacy-meter shows the custodian-era type at zero new
subscriptions.
## Task: Domain repo prose sweep (template-driven)
```task
id: CUST-WP-0055-T04
status: progress
priority: medium
state_hub_task_id: "2ff6cef9-7ec2-4d44-bce0-b232b1f889dc"
```
Mechanical pass on the ~60 domain repos with the standard bootstrap shape
(typically 2580 hits each): `AGENTS.md`, `SCOPE.md`, `INTENT.md`, `README.md`,
and active root workplans. Replace user-facing `workplan` with `workplan`;
leave `state_hub_workstream_id` and API examples that demonstrate legacy aliases.
Use `scan_workstream_terminology.py --json` before/after per repo; target zero
`prose:workplan ` hits in agent-guidance buckets (per T08 exclusions).
Batch ~10 repos per PR to limit merge churn.
## Task: Code and integration sweep (activity-core, issue-core, railiance-*)
```task
id: CUST-WP-0055-T05
status: todo
priority: medium
state_hub_task_id: "120a8075-3d1f-426d-8800-aa9edac32043"
```
Repos with non-trivial Python/TS code references: `activity-core`, `issue-core`,
`railiance-platform`, `railiance-infra`, `hub-core`, `core-hub`, `ops-warden`,
`reuse-surface`. Rename variables, comments, and client payloads to `workplan`
where they denote the domain concept; keep wire-compat keys until T02 retires
the API alias.
**Out of active sweep:** `inter-hub-haskell` (retired 2026-07-08, `CORE-WP-0007`)
— historical reference only; do not schedule new terminology edits there unless
preserving a compatibility footnote.
## Task: Generated and bulk-content repos
```task
id: CUST-WP-0055-T06
status: todo
priority: medium
state_hub_task_id: "726c12bf-e6e0-4293-b675-e2c0fd10800e"
```
Address high-volume generated trees:
- `agentic-resources` (~5.3k hits, mostly `other` bucket) — fix upstream
generator templates, not files by hand.
- `repo-scoping` / `railiance-fabric` — fix generators or export schemas so
new artefacts are workplan-first.
Done when regenerating those repos drops terminology hits by ≥90% without
manual per-file edits.
## Task: Historical workplan and archive hygiene
```task
id: CUST-WP-0055-T07
status: todo
priority: low
state_hub_task_id: "362790c8-cf27-4042-81e4-533a6b48fb26"
```
Update **active** workplan prose only; for `workplans/archived/`, add a
single header note that historical text may say workplan. Optionally normalize
titles in archived files when the edit is mechanical (no ID renames).
Grandfathered filenames containing `workplan` (e.g.
`CUST-WP-0010-workstream-lifecycle-docs.md`) keep their paths per ADR-001
non-rename policy.
## Task: Verification gate and legacy-meter criteria
```task
id: CUST-WP-0055-T08
status: done
priority: high
state_hub_task_id: "5b6596ef-fd04-4469-b421-f548d292cb0d"
```
Define fleet exit criteria and scan exclusions.
**Scan exclusions** (must not fail the prose gate):
- `workplans/archived/` under any repo
- `state-hub` legacy-meter registry, compat routers, and
`docs/workplan-terminology-transition.md`
- `tools/scan_workstream_terminology.py` and allowlist config
- Explicit compatibility footnotes that document the legacy term (canon addendum,
AGENTS.md legacy bridge section)
- Generated bulk trees until T06 regenerates them (`agentic-resources`)
Commit exclusions as `tools/scan_workstream_allowlist.yaml` or extend the scan
script with `--apply-allowlist`.
**Exit criteria:**
1. `scan_workstream_terminology.py` — zero `prose:workplan ` across domain
repos (with exclusions); `state-hub` under agreed grep budget for non-compat
prose only.
2. State Hub `legacy-meter` weekly review — no new prose-only legacy keys.
3. `fix-consistency` / interface-change registry — no new `workplan`-named
public tools without a workplan alias.
4. CI or activity-core scheduled check fails when prose hits regress outside
the allowlist.
Done when all four checks are automated and the 2026-07-08 baseline is stored
as `docs/evidence/workplan-terminology-baseline-20260708.json` (or equivalent)
at T01 completion.
## Sequencing
```
T01 canon/templates + baseline JSON artefact
T02-T01 draft STATE-WP-0069 (blocking)
├─ T02-T02 state-hub legacy retirement inventory
├─ T04 domain prose sweep (parallel, ~10 repos/PR)
├─ T06 generated repos (early — repo-scoping, railiance-fabric)
├─ T03 activity-core event catalog alignment
├─ T05 code sweep (after T02 defines wire-compat keys)
└─ T08 allowlist + regression gate (continuous)
T07 archives (low priority, anytime)
```
Workplan stays `proposed` until the ready gate above is satisfied.
## Relationship to existing workplans
- **Done:** `STATE-WP-0054`, `STATE-WP-0065`, `STATE-WP-0046`, `CUST-WP-0053`
(C-26 prefix lint), `CUST-WP-0050` (classification spine coordination).
- **This plan** owns cross-repo coordination; implementation splits into
`state-hub`, `activity-core`, and per-domain PRs tracked as child tasks or
linked workplans.
- **Out of scope:** renaming `state_hub_workstream_id` frontmatter field;
database table re-migration (already completed).