state-hub/api/schemas
tegwick b9997d6fc7 CUST-WP-0074-T02: task wait qualifiers in the hub read model
Adds tasks.decision_id and workplan_dependencies.from_task_id (migration
e8f9a0b1c2d3). A from_task_id column is needed rather than
from_workplan_id plus description: the partial unique indexes key on
(from_workplan_id, target, relationship_type), so two tasks in one
workplan waiting on the same target could not both be indexed, and the
derived wait_kind needs per-task attribution. The two existing unique
indexes are narrowed to frontmatter edges (from_task_id IS NULL) and two
task-origin counterparts are added; downgrade deletes task-origin rows
before restoring the old indexes.

POST /workplans/{id}/dependencies/ accepts from_task_id (must belong to
the from workplan; a task cannot depend on itself). TaskCreate/Update/Read
carry decision_id.

Derived read-model fields, no new write routes (rule 5):
- TaskRead.wait_kind: external | human | both | unqualified, null unless
  status is wait (dependency rows from this task / needs_human).
- WorkplanRead.blocked_kind: human | external | none, null unless status
  is blocked. Human wins over external.
Both come from api/services/wait_kind.py, applied on GET /tasks/,
GET /tasks/{id}, GET /workplans/ and GET /workplans/{id}.

The identifier-migration reference-count proof now includes from_task_id
(FK count guard 22 -> 23).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: sonnet
Assistant-Process: 237582@bnt-lap001
Assistant-Session: f2b3d9f1-8fb9-4b9c-bc2b-837ec5dfc826
2026-09-28 22:39:18 +02:00
..
__init__.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
agent_message.py STATE-WP-0093: per-recipient broadcast receipts and standing notices (T01-T06). 2026-09-22 00:26:33 +02:00
capability_request.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
compat.py STATE-WP-0069 T04/T06: body metering and workplan-first state internals 2026-07-08 23:13:28 +02:00
consistency_sweep.py finish(STATE-WP-0064): cut over scheduler and split sweep errors from failures 2026-06-22 01:20:59 +02:00
contribution.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
decision.py feat(consistency): rebuild authoritative intake IDs 2026-08-22 12:23:43 +02:00
doi.py feat: import core schemas from hub-core 2026-06-07 01:20:57 +02:00
domain.py feat: reexport domain schemas from hub-core 2026-06-07 10:52:49 +02:00
domain_goal.py feat(goals): add domain/repo goal tracking and update_workstream MCP tool 2026-03-09 00:15:29 +01:00
execution.py fix(retirement): close projection and launch contract gaps 2026-08-23 00:52:18 +02:00
extension_point.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
fabric_graph.py add Fabric read model rollback activation 2026-08-31 23:07:10 +02:00
identifier_migration.py feat: converge mixed identifier projections 2026-08-31 01:27:21 +02:00
intake.py feat(consistency): rebuild authoritative intake IDs 2026-08-22 12:23:43 +02:00
interface_change.py feat(state-hub): Interface Change Registry (CUST-WP-0033 T01-T06) 2026-04-26 15:29:08 +02:00
legacy_meter.py feat: add workplan aliases and legacy meter 2026-06-04 08:25:31 +02:00
managed_repo.py feat: make repository reads alias-aware 2026-08-29 10:47:51 +02:00
ops_run.py Prepare State Hub retirement baseline 2026-08-09 16:19:53 +02:00
progress_event.py STATE-WP-0069 T04/T06: body metering and workplan-first state internals 2026-07-08 23:13:28 +02:00
recently_on_scope.py Add hourly RecentlyOnScope batch endpoint 2026-05-22 16:14:08 +02:00
reconciliation.py Harden reconciliation conflict handling 2026-05-23 18:18:44 +02:00
repo_goal.py feat(goals): add domain/repo goal tracking and update_workstream MCP tool 2026-03-09 00:15:29 +01:00
repository_rename.py feat: prove repository rename continuity 2026-08-29 15:05:09 +02:00
review_contract.py feat(review): add multi-owner contracts and receipts 2026-08-22 20:57:51 +02:00
sbom.py feat(gems): three-pass schema migration aligning state-hub with GEMS 2026-03-02 23:39:17 +01:00
service.py STATE-WP-0062 T2: /services catalog API over the two-dimension model 2026-06-19 20:56:19 +02:00
state.py STATE-WP-0093: per-recipient broadcast receipts and standing notices (T01-T06). 2026-09-22 00:26:33 +02:00
suggestion.py Finish CUST-WP-0011 and implement STATE-WP-0061 suggestion backlog. 2026-07-06 10:52:49 +02:00
task.py CUST-WP-0074-T02: task wait qualifiers in the hub read model 2026-09-28 22:39:18 +02:00
technical_debt.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
token_event.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
topic.py feat(state-hub): implement v0.5 — dynamic domains & multi-repo 2026-02-28 15:20:15 +01:00
tpsc.py feat: reexport TPSC schemas from hub-core 2026-06-07 10:43:21 +02:00
work_record_projection.py feat: add fast forge work-record reconciliation 2026-08-30 22:38:54 +02:00
workplan.py CUST-WP-0074-T02: task wait qualifiers in the hub read model 2026-09-28 22:39:18 +02:00
workplan_dependency.py CUST-WP-0074-T02: task wait qualifiers in the hub read model 2026-09-28 22:39:18 +02:00
workstream.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
workstream_dependency.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00