diff --git a/.kiro/specs/controller-status/spec.json b/.kiro/specs/controller-status/spec.json index 4c390449..8e4650b8 100644 --- a/.kiro/specs/controller-status/spec.json +++ b/.kiro/specs/controller-status/spec.json @@ -1,9 +1,9 @@ { "feature_name": "controller-status", "created_at": "2026-06-19T00:00:00Z", - "updated_at": "2026-09-15T20:33:00Z", + "updated_at": "2026-09-16T09:20:00Z", "language": "en", - "phase": "tasks-generated", + "phase": "implementation-complete", "approvals": { "requirements": { "generated": true, @@ -29,7 +29,7 @@ "reason": "User enhancement request (2026-09-15): the xce_test ctrlstatus command should additionally report the term in which the current primary was elected and the wall-clock time at which it was elected, so operators can tell how long the current primary has served and correlate its election with a specific event in the logs. Standby-side fidelity is explicitly in scope (mirrors Req 10's off-primary fidelity pattern): a standby that already knows the current primary's identity (Req 2.3) must report the primary's learned election term/time, not an unset or stale local value.", "new_requirements": "12 (current primary's election term and time)", "needs": "design + tasks regen for Req 12 only; prior tasks 1.1-6.4 (Req 1-11) remain implemented", - "impl_status": "not started", + "impl_status": "7.1-7.6 all implemented + reviewed + committed and complete. Live E2E (7.6) found + fixed a real bug (bug-1818): cmd_ctrlstatus gated electedTerm/electedAt on NULLSTR(primaryName), which is unconditionally empty off-primary in this build, permanently hiding the correct, already-converging elected_at_ms data on every standby. Fixed by gating on elected_at_ms == 0 instead (commit 80839661); design.md's Locked Decision 3 corrected to match. Retry confirmed live convergence across a real primary kill/re-election.", "prior_delta": { "reopened_at": "2026-06-20T00:00:00Z", "reason": "Live E2E finding (2026-06-20): ctrlstatus answered by a standby reports committedLsn=0 / committedConfigVersion=0 while appliedLsn=38 — it reads the primary-only raw markers (persist.committed_lsn, ha->committed_config_tag) instead of the standby's learned committed position (ha->last_known_committed_lsn / last_known_committed_config_tag). Plus an observability gap: no responder timestamp to correlate a captured status against ctrl-N.log.",