Skip to content

fleet-feed: unidentified stale-code collector overwrites the laptop feed every ~5-10 min (AA blanked, sessions undercounted) #3362

Open

Description

@dezren39

Symptom

Since the collector moved to the laptop (2026-10-31), the laptop's fleet-feed.json (~/.local/state/pm-aggregator/fleet-feed.json) is periodically overwritten by a feed whose AA section is absent (reason: Supabase query failed HTTP 403) and whose session counts are ~24 instead of the laptop collector's 88. The explorer page blanks until the next laptop collector tick restores a good feed.

Verified timeline (2026-11-01 CDT)

  • Good service writes: 00:30:09 (full build, aa-last-good store written), 00:35:09, 00:39:58, 00:54:38 — AA ok, 84-88 sessions.
  • Phantom writes (top-level generatedAt): 00:31:50, 00:37:08, 00:47:12 — AA absent/403, attention 24.
  • The phantom write is NOT the laptop systemd service (no journal entries at those times; the timer's LAST/NEXT do not match) and NOT the current code: PR aa feed: keep last good on failure + skip unchanged query; v_latest_import_batch rename #3349's keep-last-good collector degrades to the stored section on failure (forced-failure test 2026-11-01 passed: bogus project ref -> section ok + stale:true). The phantom produces absent, i.e. it runs pre-aa feed: keep last good on failure + skip unchanged query; v_latest_import_batch rename #3349 code or an equivalent old copy.
  • A 7-minute process watch on the laptop (00:49:50-00:56:51) caught only the legitimate service tick; no phantom write landed in the window. SSH logins from the sandbox tailnet peer (100.115.16.3) at 00:32:03 and 00:37:22 correlate with push-sized gaps after the 00:31:50 / 00:37:08 collects. No sandbox cron, systemd timer, or loop process has been found yet. No phantom write observed since 00:47:12.
  • Its file-based sections (projects 351, charges 75, DNS) are complete, so it reads the synced hatch-personal tree; its session source sees only ~24 sessions.

Ask

Identify the launcher (candidates: a leftover sandbox-era push loop, a lane/test session running a stale checkout's collector against the live feed path, an unretired unit somewhere) and stop it. A 30-min watcher is logging feed changes + collector processes on the laptop from 00:57 CDT (/tmp/phantom-watch2.log). Related: the collector's own units are hand-written and not yet in the pm-stack NixOS module (separate issue).

Acceptance criteria

  • The phantom writer is identified by name (process/unit/copy of the collector code) with evidence — not just ruled out as the laptop systemd service or current main.
  • The phantom writer is stopped/removed or updated to current code, and over a >=1h observation window every fleet-feed.json write carries the AA section (or the keep-last-good stale marker) and full session counts — no absent-AA overwrite recurs.
  • The finding and the fix are recorded on this issue with timestamps from the feed file, so the next stale-copy incident has a named suspect list.

Activity

  1. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/highImportant and time-sensitive
    effort/mMedium: expected under 1 day of work
    app/pm-stackpm-stack (Pad/Grist) in developing-today/code
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Nov 1, 2026
  2. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: #3363 (fold the collector into the NixOS module — removes the hand-installed copy class), PR #3349 (keep-last-good collector; the phantom predates it), #3332 (the AA 403 wipe this resembles — same blanking symptom, different writer). Notes: the body's timeline already rules out the laptop service and current code; the suspect is a stale copy running somewhere with write access to the laptop state dir. Risk: until identified, every ~5-10 min the explorer blanks — user-visible. Suggested approach: watch the file's writer via audit/fanotify on the laptop during a phantom window, and inventory collector copies on both machines.

    — Fleet monitor intake pass (protocol §5), 2026-11-01. Still live at review time: no merged PR or commit found that resolves this item (checked against the issue's own evidence and recency).

  3. added 2 commits that reference this issue on Nov 1, 2026
  4. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Phantom identified — and stopped (2026-11-01)

    The phantom writer is the sandbox host's own fleet-feed-collector.timer (systemd, system level — which is why the earlier user-unit/cron hunts missed it), running scripts/push-fleet-feed.sh from the stale ~/git/pm-feed clone (HEAD 93a8d8ea, 2026-10-29 — pre-keep-last-good #3349, pre muse-dev2 pin). ~/tools/init.sh reinstalled its units on every sandbox boot. SSH logins from 100.115.16.3 at push times were this script's scp push (dest ~/pm-stack/aggregator symlinks into the aggregator state dir).

    Why its AA section 403s (reproduced directly from the sandbox, token by name only — supabase.access-token-muse-cli):

    • token + retired muse-dev ref nltgxorqwxhgfzseiirt (the stale code's default; its installed unit predates 5885986) -> HTTP 403 {"message":"Your account does not have the necessary privileges to access this endpoint."}
    • same token + muse-dev2 ref keihfchslgjetkmnmzra -> HTTP 201, current ainventory batch fe02783b-046c-4401-bb35-8c529b216b8d

    Sandbox journal, every ~5 min: collector: AA section absent (Supabase query failed (HTTP 403)) -> push-fleet-feed: feed pushed to laptop. Its other sections were also degraded (sandbox OpenCode server unreachable -> jules-only sessions ~14, unfiltered pools 11), racing the laptop collector (aa ok, 278 rankings, 74 sessions) — last writer won, so /aa blanked most of the time. This is also the live half of #3294.

    Fix

    • PR fix(aggregator): retire the sandbox fleet-feed collector units (#3362) #3865 (merged, merge commit d8ead565cc46be22a0c6a79d9c912a62f4579691): deletes the sandbox-side systemd/fleet-feed-collector.{service,timer} + scripts/install-collector-units.sh from the repo, marks push-fleet-feed.sh manual-only (kept for its charges confirm-after-delivery contract), and corrects the stale "sandbox collector" descriptions in README/feed.ts/topology.ts/watchdog.ts. Aggregator tests: 870 pass / 2 fail, identical on pristine main (pre-existing).
    • Activation on the sandbox: timer stopped + disabled, /etc/systemd/system/fleet-feed-collector.{service,timer} removed, and the ~/tools/init.sh restore block replaced with a retirement note so a sandbox recycle cannot resurrect it.

    Verification (2026-11-01, UTC)

    • Last sandbox push: feed generatedAt 17:08:53Z (landed ~17:09Z, before unit removal ~17:11Z).
    • Since removal: zero sandbox collector journal entries; former push windows 17:13:29Z and 17:18:29Z passed with no overwrite.
    • Laptop collector writes at 17:10:35Z (manual start) and 17:15:35Z (timer): feed aa ok, 278 rankings, 74 attention, pools filtered.
    • GET /api/aa.json -> {"status":"ok", batch fe02783b...}; /aa footer provenance: live (fleet feed · ainventory batch fe02783b · collected 2026-11-01T14:43:20.529Z) — no 403.

    Remaining acceptance item: the >=1h all-writes-good observation window — ~15 min verified here (17:10–17:25Z, two laptop ticks, two dead sandbox windows); the window completes ~18:10Z if someone wants to close this on the full hour.

    (This comment replaces an earlier version whose inline-code spans were stripped by shell quoting during posting.)

  5. added
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  6. 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 7387 (triage, queued, priority 50) 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

  7. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: picked_up
    task: 7387 (repo-health-code-pilot, repo-worker-code; OpenChamber scheduled lane; session ses_e5e5c3748bbffeCrbxVyjhADa8)
    state: Atomic claim recorded with origin=openchamber-scheduled-lane. Fresh #3362 is OPEN with no hard-stop labels; merged PR #3865 is linked. Existing issue comment reports the sandbox system-level fleet-feed-collector.timer was identified and stopped, so this triage will verify the remaining observation/acceptance evidence rather than repeat the original hunt.
    next: Read the full resolution evidence and verify current status before deciding whether #3362 is already complete or needs a follow-up.
    links: #3362 · #3865 · task 7387

  8. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Current triage — 2026-11-03

    The original phantom writer is identified: the sandbox system-level fleet-feed-collector.timer ran scripts/push-fleet-feed.sh from stale ~/git/pm-feed and pushed AA-absent/403 data to the laptop. Its retirement is implemented by PR #3865, now MERGED (CI SUCCESS); the prior activation report says the sandbox timer/service were stopped and removed and the ~/tools/init.sh restoration block was retired.

    Fresh laptop evidence: the user fleet-feed-collector.timer is active. journalctl --user -u fleet-feed-collector.service --since '2026-11-03 16:55:00' covers 16:55:30–17:55:59 CDT (>1 hour, 13 scheduled writes). Every logged write reports AA 283 rankings / 35 configs / 183 test runs and 64 sessions; the current feed at 17:55:34Z has aa.status=ok, 283 rankings, and 64 attention entries.

    The journal proves the scheduled collector's writes were healthy, but does not observe arbitrary external changes between ticks. The only file watcher evidence (~/tmp/phantom-watch2.log) is the earlier 17-minute window. Therefore I am not closing #3362 on the current evidence: the remaining blocker is direct observation of every file change for >=1 hour. A follow-up task will capture sanitized per-write timestamps, AA status, rankings, and session counts; close #3362 only if the window is clean, otherwise identify and route any new writer.

  10. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: picked_up
    task: 7387 (repo-health-code-pilot, repo-worker-code; OpenChamber scheduled lane 8ac61616-3815-4e7b-b33d-840a3829154a; session ses_e5e5b4941a0ffe0sZhl0lzt4kE)
    state: Fresh #3362 is OPEN, labels already reflect claimed/in-progress, and linked PR #3865 is merged. Existing triage records the sandbox timer fix and a healthy laptop journal window, but says direct observation of every feed-file change for >=1 hour remains the acceptance blocker.
    next: Verify the latest issue/PR resolution evidence and determine whether a tracked follow-up already covers the remaining observation; avoid repeating the original writer hunt.
    links: #3362 · #3865 · task 7387

  11. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: triaged
    task: 7387 (repo-health-code-pilot, repo-worker-code; OpenChamber scheduled lane 8ac61616-3815-4e7b-b33d-840a3829154a; session ses_e5e5b4941a0ffe0sZhl0lzt4kE)
    state: Root cause confirmed in the existing resolution evidence: sandbox system-level fleet-feed-collector.timer ran stale ~/git/pm-feed code and pushed the AA-absent feed. PR #3865 merged at d8ead56 and retired the sandbox producer/boot restoration. Existing laptop journal evidence is healthy for >1h of scheduled writes. The local phantom-watch2.log ends 2026-11-01 01:27:28 -05 after ~17 minutes; it does not establish the acceptance criterion of direct observation of every file change over >=1h. Therefore this issue remains OPEN for that final evidence; no new competing issue was found in the search.
    next: Capture a >=1h file-change observation with timestamps, AA status/rankings and session counts; close only if every write is healthy.
    links: #3362 · #3865 · task 7387

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

Metadata

Metadata

Assignees

Labels

app/pm-stackpm-stack (Pad/Grist) in developing-today/codeeffort/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/highImportant and time-sensitivesource/creatorFiled by the new-issue-creator jobtask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions