⛔ SUPERSEDED — 2026-07-12 (Drop+Supersede). Dropped per @neo-gpt-emmy's corrective review (PRR_kwDODSospM8AAAABFvdVvw), @neo-opus-ada's #15074 close, and @tobiu's negative-ROI direction on this line. openLaneCount is a FALSE concept — promoted from #14592's layout-density evidence, not an actual open-assigned-issue count — and FleetControlBridge as raw GitHub-issue source owner violated the #14573 / D#15090 boundary. No rebuild: do NOT re-invest in an "honestly-named projection" on the same instinct; await a genuinely VALIDATED premise (a canonical lane model only if the operator explicitly asks for one). The Context / Ledger / ACs below are retained for history but are MOOT — the concept they validated is dropped.
Context
The FM cockpit's AgentCard open-lane count badge (PR #15029, #14598) established openLaneCount as a roster-DTO-owned tri-state field end-to-end: createFleetCockpitStatus hoists it from the supplied agent rows (src/ai/fleet/fleetCockpitStatus.mjs, the launchable pattern), FleetCockpit.mapRosterRow() carries it onto the shared FleetAgent record, and the card renders the badge only on a reported positive count. The contract row lives in apps/agentos/CARD-CONTRACT.md.
What does not exist yet is the stamping producer: no Brain-side code writes a count onto the roster rows, so every live row reaches the cockpit as openLaneCount: null and the wired cockpit renders no badges — honest (null = no badge, per the contract's degrade rule), but empty. This is the seam's named successor, surfaced by Euclid's PR-#15029 review (the first-authoritative-load probe).
The Problem
The measured density evidence (#14592) puts 7–17 open lanes on an active resident — the badge is glance-load-bearing at real scale, and it only carries value once a live producer stamps real counts.
The Fix
An assembler-side enricher (the resolveIdentityDisplay precedent, #14802): where the Brain-side fleetRoster verb assembles agent rows, stamp openLaneCount per resident before the rows reach createFleetCockpitStatus.
Source decision at claim (record it on this ticket):
- Local synced issues corpus (
resources/content/issues/** frontmatter assignees) — zero API cost, freshness = the sync pipeline's cadence (hourly), needs the canonical-clone path only where the Brain already runs.
- Live
gh/API query per roster poll — fresh, but rate-limit-coupled and slow at poll frequency.
Option 1 matches the roster's freshness class (the roster itself is poll-based); option 2 is likely over-engineering. Whichever wins, enricher FAILURE must degrade to null (the contract's tri-state rule) — never a stale or fabricated count.
DECISION (recorded 2026-07-12, implemented in PR #15074): Option 1 — the local synced issues corpus (resources/content/issues/issue-*.md frontmatter state+assignees), scanned once per assembly by resolveOpenLaneCounts → {counts, complete}. Enricher failure taints the whole scan → null for every resident (never a guessed 0, never a partial under-count).
Contract Ledger
Canonicalized into this body from @neo-opus-ada's PR #15074 review-response addendum (a Contract Ledger is T3 body-substrate, not a T2 comment) per @neo-gpt-emmy's Cycle-2 review (#15074 review 4679798367). Truth-synced 2026-07-12 to the achieved exact-head evidence (was 35/L2-only at authoring).
| Target Surface |
Source of Authority |
Behavior (COMPLETE) |
Fallback (INCOMPLETE) |
Docs |
Evidence |
fleetRoster().rows[n].openLaneCount (roster DTO, integer ≥ 0 | null) |
local synced issues corpus (resources/content/issues/issue-*.md frontmatter state+assignees), scanned once per assembly by resolveOpenLaneCounts → {counts, complete} |
dir exists, listing ok, EVERY issue file parses → the resident's OPEN-assigned count (RA1 array-only OPEN semantics), or a proven 0 when the resident is absent (nothing open) |
missing corpus / unreadable listing / ANY unparseable OR structurally-unusable record (unrecognized state; OPEN assignees not an array / an invalid entry) / resolver throw → null for every resident — never a guessed 0, never a partial under-count (a parse-or-schema failure can't reveal which assignee it would have counted, so it taints the whole scan) |
apps/agentos/CARD-CONTRACT.md badge row + resolveOpenLaneCounts JSDoc + FleetControlBridge.fleetRoster/laneCountResolver JSDoc |
L2+L3 — 42 tests (16 resolver + 26 bridge) incl. the RA2 discriminating regression (good+malformed issue for the same resident → INCOMPLETE, never the good count) + live-corpus smoke (complete:true, 464 real files, realistic densities); L3 achieved 2026-07-12 — cockpit render badges witnessed on 0ac46a9 (Ada 14 / Euclid 11 / Emmy 1, console errors []); transport to final head 1ce0f74 is valid — the delta changes only true-null handling/spec/JSDoc, the corpus has 0 true-null records, and the final smoke reproduces the same rows |
Acceptance Criteria
Out of Scope
- The badge render + Body-side field plumbing — shipped via PR #15029 (#14598).
- Lane-LINE text enrichment (
laneLine) — the activity capability owns it (#14572/#14573 arc).
Related
Refs #14560 (the consuming cockpit epic — deliberately NOT a sub: Brain-side enrichment is the epic's out-of-scope Lane-C class) · #14598 / PR #15029 (the consumer + seam) · #14592 (the density evidence) · #14802 (the enrichment precedent) · #15022 (the launchable tri-state sibling).
Release classification: not release-blocking (the badge degrades honestly without it; it turns on the value).
Live latest-open sweep: newest #15035 checked 2026-07-11T13:0xZ; no equivalent (searches "lane count" / "openLaneCount" clean). Structure-map gate: assembler-side enrichment beside the existing fleetRoster verb — sibling-lift of #14802's join, no new ai/ placement class.
Authored by Vega (Claude Fable 5, Claude Code). Session d2fbbdb4-404b-47e1-bbb3-1b9e0330894b.
Retrieval Hint: "fleet roster openLaneCount enricher stamp badge Brain-side"
Context
The FM cockpit's AgentCard open-lane count badge (PR #15029, #14598) established
openLaneCountas a roster-DTO-owned tri-state field end-to-end:createFleetCockpitStatushoists it from the supplied agent rows (src/ai/fleet/fleetCockpitStatus.mjs, thelaunchablepattern),FleetCockpit.mapRosterRow()carries it onto the sharedFleetAgentrecord, and the card renders the badge only on a reported positive count. The contract row lives inapps/agentos/CARD-CONTRACT.md.What does not exist yet is the stamping producer: no Brain-side code writes a count onto the roster rows, so every live row reaches the cockpit as
openLaneCount: nulland the wired cockpit renders no badges — honest (null = no badge, per the contract's degrade rule), but empty. This is the seam's named successor, surfaced by Euclid's PR-#15029 review (the first-authoritative-load probe).The Problem
The measured density evidence (#14592) puts 7–17 open lanes on an active resident — the badge is glance-load-bearing at real scale, and it only carries value once a live producer stamps real counts.
The Fix
An assembler-side enricher (the
resolveIdentityDisplayprecedent, #14802): where the Brain-sidefleetRosterverb assembles agent rows, stampopenLaneCountper resident before the rows reachcreateFleetCockpitStatus.Source decision at claim (record it on this ticket):
resources/content/issues/**frontmatterassignees) — zero API cost, freshness = the sync pipeline's cadence (hourly), needs the canonical-clone path only where the Brain already runs.gh/API query per roster poll — fresh, but rate-limit-coupled and slow at poll frequency.Option 1 matches the roster's freshness class (the roster itself is poll-based); option 2 is likely over-engineering. Whichever wins, enricher FAILURE must degrade to
null(the contract's tri-state rule) — never a stale or fabricated count.DECISION (recorded 2026-07-12, implemented in PR #15074): Option 1 — the local synced issues corpus (
resources/content/issues/issue-*.mdfrontmatterstate+assignees), scanned once per assembly byresolveOpenLaneCounts→{counts, complete}. Enricher failure taints the whole scan →nullfor every resident (never a guessed0, never a partial under-count).Contract Ledger
Canonicalized into this body from @neo-opus-ada's PR #15074 review-response addendum (a Contract Ledger is T3 body-substrate, not a T2 comment) per @neo-gpt-emmy's Cycle-2 review (#15074 review 4679798367). Truth-synced 2026-07-12 to the achieved exact-head evidence (was 35/L2-only at authoring).
fleetRoster().rows[n].openLaneCount(roster DTO,integer ≥ 0 | null)resources/content/issues/issue-*.mdfrontmatterstate+assignees), scanned once per assembly byresolveOpenLaneCounts→{counts, complete}0when the resident is absent (nothing open)state; OPENassigneesnot an array / an invalid entry) / resolver throw →nullfor every resident — never a guessed0, never a partial under-count (a parse-or-schema failure can't reveal which assignee it would have counted, so it taints the whole scan)apps/agentos/CARD-CONTRACT.mdbadge row +resolveOpenLaneCountsJSDoc +FleetControlBridge.fleetRoster/laneCountResolverJSDoccomplete:true, 464 real files, realistic densities); L3 achieved 2026-07-12 — cockpit render badges witnessed on0ac46a9(Ada 14 / Euclid 11 / Emmy 1, console errors[]); transport to final head1ce0f74is valid — the delta changes only true-null handling/spec/JSDoc, the corpus has 0 true-null records, and the final smoke reproduces the same rowsAcceptance Criteria
fleetRosterassembly stampsopenLaneCount(integer ≥ 0) per resident from the chosen source; residents the source cannot resolve carrynull.null— the roster verb itself must not fail on enricher trouble.null; a thrown source yieldsnullrows, not a thrown verb.0ac46a9— badge receipts Ada 14 / Euclid 11 / Emmy 1, console errors[]; transport to final head1ce0f74valid (delta = true-null handling/spec/JSDoc only, 0 true-null corpus records, final smoke reproduces the same rows). Reopen-trigger (retained): the first authoritative cockpit load does NOT render a liveN lanesbadge for a resident the corpus shows as open-assigned.CARD-CONTRACT.md's badge row updates its producer cell from "until one exists every live row carries null" to the chosen source.Out of Scope
laneLine) — the activity capability owns it (#14572/#14573 arc).Related
Refs #14560 (the consuming cockpit epic — deliberately NOT a sub: Brain-side enrichment is the epic's out-of-scope Lane-C class) · #14598 / PR #15029 (the consumer + seam) · #14592 (the density evidence) · #14802 (the enrichment precedent) · #15022 (the
launchabletri-state sibling).Release classification: not release-blocking (the badge degrades honestly without it; it turns on the value).
Live latest-open sweep: newest #15035 checked 2026-07-11T13:0xZ; no equivalent (searches "lane count" / "openLaneCount" clean). Structure-map gate: assembler-side enrichment beside the existing
fleetRosterverb — sibling-lift of #14802's join, no newai/placement class.Authored by Vega (Claude Fable 5, Claude Code). Session d2fbbdb4-404b-47e1-bbb3-1b9e0330894b. Retrieval Hint: "fleet roster openLaneCount enricher stamp badge Brain-side"