v0.164.0: deliberately stopped apps no longer alarm (banner + email)
A UI stop (Leallitas -> compose down -> StateStopped) is the user's own
action, not a fault, and must not raise the deadapp banner OR the
app_start_failed event. Filter at the single fix-3 derivation point:
extract scanDeployedAppRunStates's pure core to classifyRunStates and
change the down predicate to IsDownState(st.State) && st.State !=
StateStopped. Suppresses StateStopped from both the banner dead-list and
the notifier Down-set at once.
Rests on two invariants (recorded at the seam, README, CONTEXT):
I1 StopStack = compose down => zero containers => StateStopped
I2 P2 census: all catalog services unless-stopped => faults never rest
at stopped (they surface as exited/degraded).
IsDownState unchanged; out-of-band 'compose stop' (containers remain ->
exited) still alerts. Tests +4 (notify 3->4, main 4->7), both red-proofs
verified. No template/funcmap/notifier/counter/copy change.
This commit is contained in:
+19
-1
@@ -7,7 +7,25 @@
|
||||
>
|
||||
> Ask Claude Code: "Please update CONTEXT.md with what we did today"
|
||||
|
||||
Last updated: 2026-07-24 (v0.163.1 — launcher polish: monogram reveal-on-failure + placeholder everywhere)
|
||||
Last updated: 2026-07-24 (v0.164.0 — deliberately stopped apps no longer alarm; banner + email suppressed for StateStopped)
|
||||
|
||||
> **2026-07-24 — v0.164.0 (stopped ≠ fault).** Operator finding on 9201: a UI stop (Leállítás) raised
|
||||
> the global "Telepített alkalmazás nem fut: … (stopped)" banner on every page AND fired the
|
||||
> `app_start_failed` email. RULING: **a deliberate user action must not alarm anywhere.** One-line
|
||||
> filter at the single fix-3 derivation point — `scanDeployedAppRunStates`'s pure core extracted to
|
||||
> `classifyRunStates([]stacks.Stack)`, down predicate now
|
||||
> `stacks.IsDownState(st.State) && st.State != stacks.StateStopped`. `StateStopped` is dropped from
|
||||
> BOTH the banner dead-list and the notifier Down-set (⇒ no banner, no event, clean tracker). Rests on
|
||||
> **two invariants that MUST both hold for this suppression to be correct:** **I1** — the UI stop path
|
||||
> `Manager.StopStack` runs `docker compose down` → containers removed → a deployed stack with zero
|
||||
> containers aggregates to `StateStopped` (refreshStatusLocked). **I2** — the P2 restart-policy census
|
||||
> (2026-07-21, 53 templates / 78 services) found every catalog service on `unless-stopped`, so a crash
|
||||
> never rests at `stopped` — faults surface as `exited`/`degraded`/`restarting`/`unhealthy`. **If
|
||||
> either invariant changes, revisit this suppression.** `IsDownState` UNCHANGED (other callers rely on
|
||||
> stopped=down). Out-of-band `docker compose stop` (containers remain → `StateExited`) still alerts —
|
||||
> correct, tampering is reportable. The `stopped_by_user` intent flag was considered and PARKED (only
|
||||
> adds value against out-of-band stops, which should keep alerting). Tests +4 (notify 3→4, main 4→7),
|
||||
> both red-proofs verified. No template/funcmap/notifier/counter/copy change.
|
||||
|
||||
> **2026-07-24 — v0.163.1 (launcher polish).** Two v0.163.0 live findings fixed. RULE recorded:
|
||||
> **every app-logo surface ends in a visible placeholder** (`SVG → PNG → /static/app-placeholder.svg`,
|
||||
|
||||
Reference in New Issue
Block a user