Skip to content

[finding] The 2026-07 unknown-key strictness ledger still teaches the broken-sweep predicate as a detector, and states the misspelled-effect direction backwards — but it is a dated audit record, so correcting it is a decision not a sweep #13101

Description

@os-trump

Filed unassigned by the dev on #13063 (PR #13096). Dedupe search run: one targeted search against the broken-sweep / spec-TSDoc family; positive control satisfied in the same session (#13063, #12722, #12685 and #12900 all came back), no existing card for this carrier.

The carrier

docs/audits/2026-07-unknown-key-strictness-ledger.md line 726, the flow-function.zod.ts row, ends:

... so a misspelled effect was dropped at the schema and then not looked for by the reader — and the failure runs the quiet way. The function registers, runs, and its writes are counted as none, which is precisely what keeps #4354's broken-sweep query (selected > 0 AND acted = 0 AND unmeasured = 0) silent on the one run that needed it

It carries both defects the #12685 family has been closing out, in one sentence:

  1. "broken-sweep query" — the alarm/detector vocabulary. The documented broken-sweep predicate selected > 0 AND acted = 0 AND unmeasured = 0 fires on a HEALTHY idempotent sweep — measured A/B, and "over consecutive runs" does not rescue it #12685 measured that the three-clause predicate cannot separate a healthy idempotent sweep from a dead gate; fix(service-automation): the broken-sweep predicate is a first FILTER, not the detector #12721, The corrected broken-sweep claim is still stated unqualified in packages/spec TSDoc — same false predicate, a surface #12685 was fenced away from #12722, FlowFunctionEffectSchema TSDoc still states the broken-sweep predicate unqualified — the third packages/spec surface, outside #12722's fence #12900 and docs(spec): the broken-sweep predicate in FlowFunctionEffectSchema is a first FILTER, not the detector #13068 rewrote every live surface to call it a FIRST FILTER with the per-node fold (FlowRunSummary.nodes[] / gates[]) as the discriminator. This row was outside all four fences.
  2. "silent on the one run that needed it" — the causal direction, which docs(spec): the residual broken-sweep mentions in automation are a first FILTER, and the misspelled-effect sentences state the measured direction #13096 measured as backwards. A lost effect: 'writes' declaration means the script step reports no unmeasuredEffect, so the run folds to selected > 0, acted 0, unmeasured 0 — which SATISFIES the filter. The run lands INSIDE the candidate set reading exactly like a dead sweep, rather than escaping it. (Code path and the two in-tree confirmations are quoted in docs(spec): the residual broken-sweep mentions in automation are a first FILTER, and the misspelled-effect sentences state the measured direction #13096's body: the executor in packages/services/service-automation/src/builtin/screen-nodes.ts, the same file's own @module block, and the end-to-end assertions in packages/qa/dogfood/test/flow-function-effect.dogfood.test.ts.)

After #13096 this is the last carrier of either defect in the tree outside CHANGELOG.md history.

Why this is a decision and not a sweep

It was deliberately left out of #13096's diff. The file is a dated audit record — a snapshot of a reading as of 2026-07 — and silently rewriting a record is a different act from correcting live contract prose. The maintainer's call, roughly:

Recommendation: B. The severity argument the parent cards were graded on is that the claim comes back through the sentences the next author reads, and an audit ledger is exactly such a sentence — but the same argument does not license editing the record itself, and the ledger's .counts.md companion is gated (check:strictness-ledger, green here) while this prose is not, so nothing mechanical will notice either way.

Note the counts artifact is not affected: check:strictness-ledger was run green during #13096 and this row's prose is not part of what it gates.

Related: #13063, #13096, #12900, #12722, #12721, #12685, #4354, #4396.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions