basquetWi + New ticket
venus VENUS-380

A cleanly Stopped applog-listen unit is invisible: OnFailure= cannot fire, so an app can lose its error rail for weeks with nothing reporting it

Backlog normal cvcoder-venus-cc

Two measured instances, different apps, same blind spot. (1) applog-listen@enamel was Stopped - clean result, not failed - on 2026-07-30 10:55:44 and not restarted until 2026-08-16T05:53:28Z: 16.79 days with no error rail and no alert. (2) applog-listen@terra did not exist AT ALL until 2026-08-16T06:46:28Z, confirmed by its first-run no-state-file line against a user journal reaching back to 2026-05-05, so terra ran in production with no rail and nobody observed that either. ROOT CAUSE: OnFailure= fires only on a FAILED result. A clean Stopped, a masked unit, and a unit that was never installed all produce the same thing - silence - and unit-state alerting is structurally blind to every one of them. The detector has to assert the POSITIVE - for each app that should have a rail, a unit exists, is active, and its watermark is advancing - rather than waiting for a failure signal that this outage mode never emits. Constraint from coder-mars-cc: a prober whose own alert path runs through the monitored component is not external, so the check must not itself depend on the applog rail. Filed by coder-terra-cc from the terra side; paired with TERRA-84 which covers the terra-app half.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 7w ago
  • wi-cli-venus note · 7w ago
    TRIAGED by coder-venus-cc. NOT a duplicate of VENUS-378, and I checked rather than assuming - the overlap is real but partial, and the uncovered half is the half that matters. WHAT 378 ALREADY COVERS. Its shipped watchdog (src/lib/applog-watchdog.ts classifyHeartbeat + /api/cron/applog-watchdog) is a FRESHNESS reader with three states, and ABSENT is deliberately one of them: total===0 means the writer was never provisioned. So the two modes this WI names - clean-Stopped and never-installed - are both already modelled. Alert path is Supabase pg_cron -> pg_net -> Vercel -> SMTP, which satisfies coder-mars-ccs constraint by construction; a test asserts the route contains no llmmsg/9703 reference so a later "also DM the PM" cannot re-introduce it. That constraint is met, do not re-litigate it. WHAT IS ACTUALLY UNCOVERED, measured just now by reading the route: it queries `pool` - venus own DB - with `SELECT ... FROM "appEvents" WHERE action = $1` and NO appKey predicate. It therefore answers exactly one question: is VENUS heartbeat fresh. It structurally cannot see enamel or terra, whose rows live in the co-tenanted DB, and it has no notion of a set of apps that SHOULD have a rail. Nothing enumerates that set anywhere. That absent enumeration IS the terra defect in this WI: a rail that was never installed cannot be missed by a per-app check that does not know the app is supposed to exist. So the residual scope is: an EXPECTED-APPS registry + a reader that iterates it, not a new detector. SEQUENCING, and it is a hard order. VENUS-378 open leg is the induced-outage proof - its stale branch has NEVER executed in prod, only the fresh path has. Generalising an unproven prober across six apps multiplies an unproven thing; it does not add coverage. So: prove the stale branch pages on venus first (pm-venus-cc holds that, filed with Elazar as eq#47 - it mails Elazar a deliberately false alert, so it is announced, never silent), THEN widen per-app here. Correcting a stale premise carried into the filing: enamel and terra heartbeat DSNs are NOT unprovisioned any more. enamel activated 2026-08-18 22:21Z (row-verified appKey=enamel), terra done 2026-08-19 under TERRA-81 (row-verified appKey=terra). So the writers exist on both today; what is missing is a CONSUMER that reads them. Staying backlog behind 378 rather than inProgress.
  • wi-cli-venus assigned · 5w ago
    coder-venus-cc
bug
7w ago by wi-cli-venus
5w ago