Reported by the domain:services dev that delivered #18246 (card #17452) as an out-of-scope finding, and filed here by the seat — dev agents report findings with dedupe words; they ⛔ do not file.
Class (b): the same declared invariant, violated the same way, on a different path.
The shape, for the third time
packages/plugins/plugin-audit/src/read-audit.ts from line 484 — reportReadAuditWriteFailure carries:
- its own process-level
failureReported boolean, so the first failure of any cause silences every later failure of every other cause for the life of the process; and
- its own fixed message literal, carrying the ADR-0057 §3.6 /
OS_TELEMETRY_DB datasource guidance unconditionally — printed for causes that have nothing to do with datasource routing, sending the operator to check something that is working.
Both are exactly the two defects #15166 fixed in audit-writers.ts and #17452 has now fixed in auth-event-audit.ts.
Why this one is not merely a repetition
⭐ Its callee persistReadAuditRows IS registered in DURABILITY_CRITICAL_CALLEES (scripts/check-durability-degradation-log-level.mjs:357). So this copy sits on a seam the repo has already declared durability-critical — the register names it, and the reporting discipline behind the register is the thing that is broken here.
Why it is cheap now, and ⛔ why it was not ridden in on #18246
#18246 exports auditFailureCauseKey and auditFailureCauseSummary from audit-writers.ts precisely so the next copy imports them rather than re-spelling them — a second copy of the key is how this defect reached the second file, and a third spelling would be the same mistake again. The port is therefore a small one.
It was ⛔ deliberately not ridden in on #18246: that card's scope is the auth-event copy, and widening a delivery to a third file on the dev's own initiative is how a reviewable diff stops being reviewable.
⚠️ A near neighbour that is NOT this class
packages/services/service-settings/src/config-change-audit.ts:157 carries the same process-wide failureReported shape, but it is not the same defect and ⛔ should not be folded into this card: its callee is a bare eng.insert that no register names, its first line already carries Cause: plus the real detail, and its remedy text is cause-agnostic (it explains that plugin-audit is optional). An observation, not a contract violation. Natural taker: whoever takes this card, as the same sweep.
Dedupe read, as performed by the reporting dev
One targeted semantic search over this repo, 12 hits, no open duplicate, with #17452 and #15166 both returning as the firing control (so the search was live, not empty).
Dedupe words: read-audit.ts reportReadAuditWriteFailure persistReadAuditRows failureReported third copy
⛔ Ungraded on purpose: grading is triage's, not the dispatching seat's.
Generated by Claude Code
Reported by the
domain:servicesdev that delivered #18246 (card #17452) as an out-of-scope finding, and filed here by the seat — dev agents report findings with dedupe words; they ⛔ do not file.Class (b): the same declared invariant, violated the same way, on a different path.
The shape, for the third time
packages/plugins/plugin-audit/src/read-audit.tsfrom line 484 —reportReadAuditWriteFailurecarries:failureReportedboolean, so the first failure of any cause silences every later failure of every other cause for the life of the process; andOS_TELEMETRY_DBdatasource guidance unconditionally — printed for causes that have nothing to do with datasource routing, sending the operator to check something that is working.Both are exactly the two defects #15166 fixed in
audit-writers.tsand #17452 has now fixed inauth-event-audit.ts.Why this one is not merely a repetition
⭐ Its callee
persistReadAuditRowsIS registered inDURABILITY_CRITICAL_CALLEES(scripts/check-durability-degradation-log-level.mjs:357). So this copy sits on a seam the repo has already declared durability-critical — the register names it, and the reporting discipline behind the register is the thing that is broken here.Why it is cheap now, and ⛔ why it was not ridden in on #18246
#18246 exports
auditFailureCauseKeyandauditFailureCauseSummaryfromaudit-writers.tsprecisely so the next copy imports them rather than re-spelling them — a second copy of the key is how this defect reached the second file, and a third spelling would be the same mistake again. The port is therefore a small one.It was ⛔ deliberately not ridden in on #18246: that card's scope is the auth-event copy, and widening a delivery to a third file on the dev's own initiative is how a reviewable diff stops being reviewable.
packages/services/service-settings/src/config-change-audit.ts:157carries the same process-widefailureReportedshape, but it is not the same defect and ⛔ should not be folded into this card: its callee is a bareeng.insertthat no register names, its first line already carriesCause:plus the real detail, and its remedy text is cause-agnostic (it explains thatplugin-auditis optional). An observation, not a contract violation. Natural taker: whoever takes this card, as the same sweep.Dedupe read, as performed by the reporting dev
One targeted semantic search over this repo, 12 hits, no open duplicate, with #17452 and #15166 both returning as the firing control (so the search was live, not empty).
Dedupe words:
read-audit.tsreportReadAuditWriteFailurepersistReadAuditRowsfailureReportedthird copy⛔ Ungraded on purpose: grading is triage's, not the dispatching seat's.
Generated by Claude Code