---
id: CUST-WP-0042
type: workplan
title: "Workplan State Model Cleanup"
domain: infotech
repo: state-hub
status: finished
owner: custodian
topic_slug: custodian
planning_priority: high
planning_order: 42
state_hub_workstream_id: "522608cb-81a2-491f-b6b3-eff00fe01269"
created: "2026-05-17"
updated: "2026-05-17"
---

# CUST-WP-0042 - Workplan State Model Cleanup

## Goal

Make the State Hub workplan lifecycle explicit and consistent across
file-backed workplans, the workstream API, consistency scripts, validation,
dashboard filters, and documentation.

This workplan exists because `proposed`, `ready`, and `backlog` represent real
planning states that the current model cannot express cleanly:

- `proposed`: plan exists, but must be reviewed against current repo state
- `ready`: reviewed and executable against current repo state
- `backlog`: intentionally parked so it does not clutter current work views

Supporting design note:
`docs/workplan-state-model-proposal.md`

## Context

State Hub currently has vocabulary drift:

- Workstream API/schema: `todo`, `active`, `blocked`, `completed`, `archived`
- Workplan consistency scripts: `active`, `completed`, `archived`
- Dashboard overview modes: `active`, `accepted`, `finished`, `blocked`,
  `stalled`, `oldies`

The intended cleanup is to separate stored lifecycle states from derived health
labels. `stalled`, `oldies`, and stale-ready detection should not be stored as
primary workplan states.

## Target State Model

Canonical stored workplan states:

```text
proposed, ready, active, blocked, backlog, finished, archived
```

Derived health labels:

```text
needs_review, stalled
```

Normal progression:

```text
backlog -> proposed -> ready -> active -> finished -> archived
                    \          \
                     \          -> blocked -> active
                      -> backlog
```

## Tasks

### T01 - Capture State Model Proposal

```task
id: CUST-WP-0042-T01
status: done
priority: high
state_hub_task_id: "fbc17b50-7b7e-41ba-bd13-d66a6a546450"
```

Write the design proposal that defines canonical states, derived labels, legacy
aliases, UI cleanup, and migration expectations.

Done when `docs/workplan-state-model-proposal.md` exists and can be
reviewed as the design source for this workplan.

### T02 - Centralize Workplan Status Constants

```task
id: CUST-WP-0042-T02
status: done
priority: high
state_hub_task_id: "9be18f7e-1db1-464b-8c65-bf64ae3462e8"
```

Add a shared source of truth for workplan/workstream statuses and legacy aliases
used by API schemas, consistency scripts, validation scripts, and dashboard
classification code.

Done when supported statuses and aliases are no longer duplicated as local
string sets in multiple files.

### T03 - Update API Schema And Database Migration

```task
id: CUST-WP-0042-T03
status: done
priority: high
state_hub_task_id: "1d9964ce-7b30-49d3-a4e3-6d5b3ef8d684"
```

Update the workstream schema to accept the canonical state set and add a
migration for existing values:

- `completed` -> `finished`
- `accepted` -> `finished`
- `todo` -> `ready` when no work has started, otherwise `active`

Done when API validation accepts the canonical states and existing DB rows are
normalized without data loss.

### T04 - Update Consistency And ADR Validation

```task
id: CUST-WP-0042-T04
status: done
priority: high
state_hub_task_id: "c80df776-5d45-419d-a92c-59e3b77d9798"
```

Update `scripts/consistency_check.py` and `scripts/validate_repo_adr.py` so
file-backed workplans can use `proposed`, `ready`, `active`, `blocked`,
`backlog`, `finished`, or `archived` without false warnings.

Done when consistency checks compare normalized values and write back canonical
values only when they intentionally edit files.

### T05 - Add Ready-Staleness Detection

```task
id: CUST-WP-0042-T05
status: done
priority: medium
state_hub_task_id: "97ebc285-3998-4f17-bf43-c4f803cf1e7b"
```

Support optional ready-review metadata:

```yaml
reviewed_at: "YYYY-MM-DD"
reviewed_by: "human-or-agent"
reviewed_against_commit: "<git-sha>"
context_paths:
  - "path/or/glob"
```

Done when `ready` workplans can be flagged as `needs_review` after relevant repo
changes, with any automatic demotion from `ready` to `proposed` guarded behind
an explicit flag.

### T06 - Clean Up Dashboard Status Filters

```task
id: CUST-WP-0042-T06
status: done
priority: high
state_hub_task_id: "210fcff3-e3e9-4f8a-9687-c5de83ace465"
```

Replace dashboard lifecycle filters with canonical stored states and move
`stalled`/`needs_review` into derived health filters or badges.

Done when the overview no longer uses `accepted`, `oldies`, or derived
`finished` as primary lifecycle filters.

### T07 - Update Docs And Registration Templates

```task
id: CUST-WP-0042-T07
status: done
priority: medium
state_hub_task_id: "8ecceebb-0471-4541-96f9-c9f98df12f84"
```

Update dashboard docs, State Hub docs, project registration templates, and
agent guidance so new repos use the canonical workplan frontmatter states.

Done when new generated repo guidance references the same state model as the
API and consistency engine.

### T08 - Add Regression Tests

```task
id: CUST-WP-0042-T08
status: done
priority: medium
state_hub_task_id: "7dd1f27d-4a4a-4c78-8b91-6103688559a9"
```

Add tests for API status validation, file status normalization, legacy alias
handling, ready-staleness detection, and dashboard classification helpers.

Done when the new state model is covered well enough that vocabulary drift is
hard to reintroduce accidentally.

## Acceptance Criteria

- Workplan files and API workstreams support the same canonical state set.
- `proposed`, `ready`, and `backlog` are first-class lifecycle states.
- `stalled` and `needs_review` are derived health labels, not stored lifecycle
  states.
- Legacy status values are normalized or migrated safely.
- Dashboard filters and docs use the same vocabulary as the file/API model.
