Context
Operator screenshots, 2026-08-15: with no fleet server running (the static-roster fallback, which the offline banner correctly announces), EVERY agent card additionally renders a red "Roster not nominal · malformed source fact" line — ten alarms for one already-announced condition. The offline view is the first-run view; it currently greets a new operator with an alarm wall.
The mechanism (grounded)
apps/agentos/view/fleet/sourceHealth.mjs:42 returns {source: null, state: 'invalid', confidence: 'none', reason: 'malformed source fact'} when a card's source fact fails shape validation. All ten static-roster cards take this branch — so the STATIC ROSTER's entries do not satisfy the source-fact contract the live adapter produces (either the fallback data predates the contract, or the fallback path never attaches facts and the absent case misroutes into the malformed branch — the fix decides which after reading the wiring).
Acceptance Criteria
Out of Scope
Panel skins and the drawer shell (#17209, sibling). C3 render-state vocabulary (#16744).
Related
#17209 (sibling, same escalation) · #13015 (FM umbrella) · #16744.
Live latest-open sweep: latest 8 checked 2026-08-15T20:1xZ; no equivalent (nearest #17209 = the sibling from the same escalation, explicitly split by surface). A2A claim sweep: current-hour window clean.
Origin: operator escalation (screenshots on session dd4568bd) · Retrieval Hint: "static roster malformed source fact alarm offline first run sourceHealth quiet degraded"
Context
Operator screenshots, 2026-08-15: with no fleet server running (the static-roster fallback, which the offline banner correctly announces), EVERY agent card additionally renders a red "Roster not nominal · malformed source fact" line — ten alarms for one already-announced condition. The offline view is the first-run view; it currently greets a new operator with an alarm wall.
The mechanism (grounded)
apps/agentos/view/fleet/sourceHealth.mjs:42returns{source: null, state: 'invalid', confidence: 'none', reason: 'malformed source fact'}when a card's source fact fails shape validation. All ten static-roster cards take this branch — so the STATIC ROSTER's entries do not satisfy the source-fact contract the live adapter produces (either the fallback data predates the contract, or the fallback path never attaches facts and the absent case misroutes into the malformed branch — the fix decides which after reading the wiring).Acceptance Criteria
static-roster, rather than failing as malformed) — zeroinvalidstates from the shipped fallback data itself.sourceHealthcleanly; a genuinely malformed fact still classifies asinvalid(the validator itself is correct and stays).Out of Scope
Panel skins and the drawer shell (#17209, sibling). C3 render-state vocabulary (#16744).
Related
#17209 (sibling, same escalation) · #13015 (FM umbrella) · #16744.
Live latest-open sweep: latest 8 checked 2026-08-15T20:1xZ; no equivalent (nearest #17209 = the sibling from the same escalation, explicitly split by surface). A2A claim sweep: current-hour window clean.
Origin: operator escalation (screenshots on session dd4568bd) · Retrieval Hint: "static roster malformed source fact alarm offline first run sourceHealth quiet degraded"