You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b20c8d2
Browse filesBrowse the repository at this point in the historyBrowse files
fix(plugin-email,plugin-security): the two durability SUMMARY reports must print against an error-less sink (#10396)
`SweepLogger.error` and `ProjectionLogger.error` are declared OPTIONAL, and
both batch summaries were spelled `logger?.error?.(…)` — an optional call that
emits NOTHING when the method is absent. #9657 repaired the six per-row reports
of this shape; it could not reach these two, because the gate only judges a
call inside a `catch` and a summary sits after the loop.
That made the split WORSE, not better: against a `{ info, warn }` sink the
per-row detail now landed at `warn` while the count of failures stayed silent,
so the detail and the total reported through different channels. Both summaries
now reach for `error` and fall back to `warn`, never to silence.
Also extends `check:durability-log-level` with a SUMMARY limb so the class
cannot regress: a report keyed on the counter a durability-critical catch
accumulated into is judged on SPELLING alone — the limb never second-guesses a
chosen level. Measured before it was proposed: 2 judged (both sites here), 1
discovered and deliberately not judged (`objectql/plugin.ts`, author-chosen
`info`), 3 dropped as boolean latches rather than counters.
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
Co-authored-by: Claude <noreply@anthropic.com>
**Durability fix:** the two boot-time **summary** reports now reach a logger sink that has no `error` method, instead of printing nothing at all (#9748).
7
+
8
+
`SweepLogger.error` and `ProjectionLogger.error` are both declared **optional**, and both summaries were spelled `logger?.error?.(…)` — an optional call that emits **nothing** when the method is absent. #9657 repaired the six per-row reports of this shape; it could not see these two, because `check:durability-log-level` only judges a call inside a `catch`, and a summary sits after the loop. Against a `{ info, warn }` sink the result was that the repair made the split **worse**: the per-row detail arrived at `warn` while the count of failures vanished, so the detail and the total reported through different channels.
9
+
10
+
-`sweepStrandedOutbox()` — *"N stranded `sys_email` row(s) could NOT be delivered"*. Mail the platform **accepted** and never delivered, previously summarised to nobody.
11
+
-`reconcilePermissionSetProjection()` — *"N FAILED backfill(s)"*. Worse than a plain omission here: the `else` branch carrying the `info` "reconciled" line is skipped too, so such a sink heard **neither** — the reassuring half-truth this rule exists to remove, arrived at from the other side.
12
+
13
+
Both now reach for `error` and fall back to `warn`, never to silence — the same repair shape #9657 applied to the per-row lines. A sink that **does** have `error` is unaffected and still gets the summary at `error`; a downgraded level is a degradation of the channel, never of the message, so the consequence and the fix survive the fallback intact.
14
+
15
+
Also enforced from now on: `check:durability-log-level` grew a **summary limb** that judges a report keyed on the counter a durability-critical `catch` accumulated into, so this class cannot regress silently. The limb never second-guesses a chosen log **level** — it only checks that a call that reaches for `error` can actually print.
0 commit comments