T-Y5VW-dashboard-stale-inflight-gates
Status: closed/superseded · Impact: medium · Complexity: small
Stage 6 of D-S30G-task-state-plane-split. The dashboard’s
staleness signal must be correct on both sides of the cutover, and
lease gates become visible on the task row — the dashboard is
the run-state surface that replaces Obsidian in-flight visibility.
| Location | Role today |
|---|---|
apps/sdlc/lib/services/dashboard/server.ts | stale_inflight = status_group in-progress ∧ no lease; joins lease onto TaskRow; lease-mirror sync with degrade. |
apps/sdlc/lib/services/dashboard/contract.ts | LeaseRow / TaskRow shapes; no gates. |
Proposed
Section titled “Proposed”stale_inflight := (in-progress ∧ no lease) ∨ (active lease ∧ expiry_state expired ∧ phase ∉ {awaiting-review, blocked}). The
first arm naturally vacates as in-progress disappears. Lease
gates are projected into the joined lease object and rendered on
the task row.
Approach
Section titled “Approach”- Extend the join and the
stale_inflightderivation inserver.ts. - Add gates to the lease projection in
contract.tsand the client render. - Extend the lease-mirror test with an expired-
workinglease and a gates-carrying payload.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
apps/sdlc/lib/services/dashboard/server.ts | modify | Dual stale rule; gates in the join. |
apps/sdlc/lib/services/dashboard/contract.ts | modify | Gates on the lease projection. |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: An expired lease in phase
workingmarks its task stale even when frontmatter readsopen/ready. - AC-2: A lease in
awaiting-reviewwithexpires_at: nullis never marked stale. - AC-3: Gates timestamps render on the task row when present.
Out of scope
Section titled “Out of scope”- Static-site projection of lease state — T-UKGW-site-projection-lease-join.
Dependencies
Section titled “Dependencies”- T-5G81-lease-payload-gates — the gates shape it renders.
Discovery context
Section titled “Discovery context”- Scaffolded from D-S30G-task-state-plane-split (migration stage 6 of 7).