Repository navigation
Conversation
Ages the fleet feed's generatedAt past FEED_STALE_MS while fleet-feed-collector.timer stays active, polls the aggregator's /api/health until the staleness signal fires (recording the health payload and, best effort, the watchdog:feed tier item), then restores the saved bytes and confirms the collector's next run made the feed fresh. Interlocks follow kill-collector-drill.sh: flock, incident-flag refusal, refusal on an already-stale feed or inactive collector, and every refusal path touches nothing. Weekly user timer in a different quiet window (Wed 03:43) from the kill-collector drill (Sun 04:17).
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 12 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. CodeRabbit Verify
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Second slice of #1283 (epic #1184), after the kill-collector drill merged in #1823.
What this adds
pm-stack/aggregator/scripts/age-feed-drill.sh— deliberately makes the fleet feed stale while the collector keeps running, the failure mode the kill-collector drill cannot reach: there the collector is dead, here the process tree looks healthy and only the data is old, so "everything is fine" is a lie nothing else contradicts.Sequence:
flockon the drill lock, incident-flag refusal, collector timer must be active (the premise is a running collector), feed must currently be fresh (an already-stale feed is a real incident).generatedAtinto the past (PM_DRILL_AGE_MS, default 20 min > the 15-minFEED_STALE_MS) leaving every other field intact. If the collector's ~5-min run rewrites it with a fresh stamp mid-drill, the drill re-ages it — that is the scenario./api/healthuntilfeed.ageMscrossesFEED_STALE_MSanddegradedis true, saving the health payload as evidence; records (best effort) whether the impl(fleet): staleness watchdog - surface dead/stale stack inputs as NEEDS ORCHESTRATOR instead of silent decay #1148 watchdog'swatchdog:feedtier item appears on/api/attention.json.PM_DRILL_RESTORE_WAIT_MINfor the collector's next run to confirm freshness via/api/health.pm-stack/aggregator/systemd/age-feed-drill.{service,timer}— weekly user timerWed 03:43(±15 min), a different quiet window from the kill-collector drill'sSun 04:17, so the two never contend for the stack. The drill runs on the laptop, where the collector and aggregator have lived as user units since code#3362/#3363; no root is needed.Tests
pm-stack/aggregator/test/age-feed-drill.test.tsruns the real script with stubbedsystemctl/sleep, a stubbed health channel, and a real feed file:Pinned by the tests: all five refusal paths exit non-zero and leave the feed byte-identical; a real run ages → fires → restores; and a collector rewrite mid-drill is re-aged rather than mistaken for freshness.
Not run here: the on-demand live run against the deployed stack (the packet's third test) — that belongs to the first scheduled or manual maintenance-window run.
Queue task 7919 (
repo-health-code-pilot).Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.