Skip to content

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.

LocationRole today
apps/sdlc/lib/services/dashboard/server.tsstale_inflight = status_group in-progress ∧ no lease; joins lease onto TaskRow; lease-mirror sync with degrade.
apps/sdlc/lib/services/dashboard/contract.tsLeaseRow / TaskRow shapes; no gates.

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.

  1. Extend the join and the stale_inflight derivation in server.ts.
  2. Add gates to the lease projection in contract.ts and the client render.
  3. Extend the lease-mirror test with an expired-working lease and a gates-carrying payload.
LocationKindChange
apps/sdlc/lib/services/dashboard/server.tsmodifyDual stale rule; gates in the join.
apps/sdlc/lib/services/dashboard/contract.tsmodifyGates on the lease projection.
  • AC-1: An expired lease in phase working marks its task stale even when frontmatter reads open/ready.
  • AC-2: A lease in awaiting-review with expires_at: null is never marked stale.
  • AC-3: Gates timestamps render on the task row when present.

T-5G81-lease-payload-gates


← Back to Tasks