Skip to content

fleet-feed producer (~/git/pm-feed) silently went stale: AA section vanished from the dashboard #1349

Open

Description

@dezren39

What happened (2026-10-27, fixed ~02:29 CDT)

The AA explorer page (/aa + /api/aa.json, shipped in #1250) showed {"status":"absent","reason":"no AA explorer section in the fleet feed yet"} even though the aggregator deploy was current and a manual collector run at 00:29 CDT produced a perfect AA section (138 rankings / 1,144 thresholds / 35 configs / 183 test runs).

Root cause: the feed's actual producer is not the laptop deploy — it's the sandbox clone ~/git/pm-feed. fleet-feed-collector.timer (sandbox, ~5 min) runs ~/git/pm-feed/pm-stack/aggregator/scripts/push-fleet-feed.sh, which collects in that clone and scp's the result to the laptop. The clone sat at merge-of-#994 (14dd66b6); its collector (18,570 bytes) predates the AA section entirely — zero ainventory references — so every push overwrote the laptop feed with a section-less one. The 00:29 good run came from ~/pm-stack-update/aggregator (the deploy working copy), which the timer never executes.

Fix applied tonight (operational, not in this repo)

  • git merge --ff-only origin/main in ~/git/pm-feed (14dd66b6 → 3a32780c, includes feat(pm-aggregator): AA cost explorer page (fleet-feed backed) #1250). Collector is now the merged 25,633-byte version.
  • The clone is a sparse checkout (only pm-stack/aggregator); the new collector reads .opencode/opencode.jsonc at the repo root for the AA coverage lists and failed soft ("opencode.jsonc unreadable; AA coverage omitted"). Added .opencode to the sparse checkout.
  • Verified end-to-end: collector summary aa 138 rankings / 35 configs / 183 test runs, feed pushed, /api/aa.json → status: ok with coverage (4 lists), /aa + board HTTP 200.

Why this will recur

Nothing keeps ~/git/pm-feed current: laptop deploys (pm-stack-update + install.sh) refresh the server, but the producer clone only moves when a human fast-forwards it. It drifted ~250 PRs behind silently — the only symptom was a dashboard section going "absent", and the stale collector can't even log the new design's loud collector: AA section absent (...) error because it doesn't contain that code.

Proposed durable fix (pick one)

  1. Updater step: a tiny pm-feed-sync oneshot (or a pre-step in install-collector-units.sh's units) that git fetch + merge --ff-onlys the feed clone before collector runs — never auto-resolving, failing loud on divergence. Must not edit the running push script in place mid-run (pull in a separate unit, then start the collector).
  2. Staleness guard in push-fleet-feed.sh: before collecting, compare clone HEAD to origin/main; if behind by more than N commits, log a loud journal error (and optionally stamp the feed with the producer commit so /api can surface "producer is stale").
  3. Feed provenance: embed the collector's git HEAD in the feed envelope (generatedAt already exists); the aggregator's absent/stale states could then name the producer commit.

Option 1 is probably the real fix; 2 is the cheapest loud tripwire. Also worth documenting in the aggregator README that the producer is the sandbox feed clone, not the laptop working copy — that fact cost most of the diagnosis time.

Acceptance criteria

  • A durable mechanism (updater step, staleness guard, or equivalent) keeps the sandbox ~/git/pm-feed producer clone current with origin/main, or fails loud in the journal when it cannot — never silently pushing a section-less feed again.
  • The feed envelope or /api surface can name the producer commit, so a stale producer is diagnosable from the feed itself.
  • The aggregator README documents that the producer is the sandbox feed clone, not the laptop working copy.
  • Verified end-to-end: after a simulated stale-clone state, the next collector cycle either self-heals or reports the staleness loudly, and /api/aa.json returns status: ok.

Activity

  1. developing-today commented on Oct 27, 2026

    @developing-today
    Contributor
  2. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    source/humanFiled directly by a human
    priority/normalOrdinary priority (the default)
    effort/mMedium: expected under 1 day of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 27, 2026
  3. dezren39 commented on Oct 27, 2026

    @dezren39
    MemberAuthor

    Intake review

    🤖 Agent note · filed

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-10-27T14:14Z
    • Found via: monitor reconciliation (intake enrichment, protocol §5)
    • Task: intake pass — liveness check, labels normalized, acceptance criteria appended to the body
    • Expectation: see the effort label on this issue
    • Links: n/a

    Related: Related: the AA explorer shipped in #1250; the incident itself was fixed operationally tonight (clone fast-forwarded, sparse checkout widened) — this issue is the durable recurrence guard, and no merged PR resolves it.

    Risks / notes: The producer being a sandbox clone rather than the laptop deploy copy is the trap that cost the diagnosis time; any fix that only updates the clone once will recur on the next aggregator change. Risk: an auto-update step must never auto-resolve divergence or edit the running push script mid-run.

    Suggested approach: Option 1 from the body (a separate sync oneshot that fast-forwards the clone and fails loud on divergence), plus option 3's producer-commit stamp so the next stale state names itself.

    Liveness: searched merged PRs and recent fleet records this run — no merged PR explicitly resolves this issue, so it stays open. Marked meta/enriched.

  4. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — queue task 2559 (lane E) — triage verdict: CONFIRMED, recurrence condition live today

    Verified 2026-11-01:

    Route: scoped implementation packet enqueued as queue task 5006 (small_fix): pm-feed-sync ff-only step failing loud on divergence, producer HEAD stamped into the feed envelope and surfaced via /api, aggregator README documenting the sandbox-clone producer topology, verified with a simulated stale clone.

  5. added
    queue/queuedHas a queued task in the Supabase agent queue
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 1, 2026
  6. 17 remaining items

  7. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 3, 2026
  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: repo-worker-code (OpenChamber scheduled lane)
    • Session / ID: ses_e5e5f25f79cffeYOrsAeLyn7L1 / queue task 5006
    • Found via: repo-health-code-pilot atomic claim after task 6843 completed (lane 262eb403-3347-4a7c-ba6b-e7bc263ca853)
    • Task: Add producer commit provenance to the current laptop fleet-feed envelope and API; verify README topology against the retired sandbox/laptop pm-git-sync setup.
    • Expectation: Name the producer clone HEAD at collect time without reviving the retired sandbox producer or changing the manual-only push script.
    • Links: fleet-feed producer (~/git/pm-feed) silently went stale: AA section vanished from the dashboard #1349; prior re-triage comment and task 6843.
  9. added
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · blocked

    • Agent: repo-worker-code (OpenChamber scheduled lane)
    • Session / ID: ses_e5e5f25f79cffeYOrsAeLyn7L1 / queue task 5006
    • Found via: repo-health-code-pilot atomic claim (lane 262eb403-3347-4a7c-ba6b-e7bc263ca853)
    • Task: No implementation changes were made; blocked the packet as packet_defect.
    • Blocker: The packet says the feed envelope contains only generatedAt and no producer commit, but current main already emits checkout.head from computeCheckoutDrift() (FleetFeed.checkout?: CheckoutDrift). The real API gap is that /api/health omits checkout; README producer-host rows still claim sandbox. The packet must be corrected to reuse checkout.head and state whether HEAD must remain present when origin/main is unreadable, rather than creating a duplicate field.
    • Links: fleet-feed producer (~/git/pm-feed) silently went stale: AA section vanished from the dashboard #1349; queue task 5006; empty branch queue/5006-1349-fleet-feed-commit-stamp retained.
  11. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 5006 (small_fix, blocked, priority 30) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

  12. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 5006 (small_fix, blocked, priority 30) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

effort/mMedium: expected under 1 day of workkind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statequeue/queuedHas a queued task in the Supabase agent queuesource/humanFiled directly by a humanstatus/blockedQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions