Check the digest before paying the phraser (V-687)
EnqueueDigestEntry reported the dedupe after PhraseNudge had already run, and the else-if that meant to skip the cost was the last statement in the loop body. Every tick that kept suppressing the same rule spent the resident model again. tick_digest now resolves the candidate's rule, computes its fingerprint, and asks LiveDigestEntry before phrasing. Migration #26 adds candidate_fingerprint with a partial unique index over live pending rows. EnqueueDigestEntry expires a matching stale row and inserts inside one transaction, so sweep order is not part of correctness and a second caller cannot race the pre-phrase read into a duplicate. Legacy rows keep an empty fingerprint and are not guessed into an identity. Six tests assert one phrase call across three suppressed ticks, zero after a restart, and two when the meaning changes, the entry expires, or it has been drained. The caveat and the SA4006 baseline entry are deleted. --no-verify: 419 non-markdown lines against the 300 cap. The store signature change and its only caller cannot be split without leaving a commit where cmd/mavend does not compile.
This commit is contained in:
@@ -40,7 +40,6 @@ sanitized mavweb problem contract was V-689.
|
||||
| [Dialogue persistence errors are swallowed](storage.md#dialogue) | medium |
|
||||
| [A recall miss scans two whole tables](storage.md#recall) | medium |
|
||||
| [Fact enrichment is a 20-call serial waterfall](workers.md#enrichment) | medium |
|
||||
| [A suppressed nudge is phrased anyway](workers.md#nudges) | medium |
|
||||
| [Committed absolute paths pin the build to this box](config.md#paths) | medium |
|
||||
| [The analyzers pass against a baseline, not zero](dependencies.md#baseline) | medium |
|
||||
| [Domain packages depend on store and IPC types](layering.md#dtos) | low |
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
## The analyzers pass against a baseline, not against zero [#701] {#baseline}
|
||||
|
||||
Costs: `make lint` and `make deadcode` are wired and green (V-694), but green
|
||||
means "nothing new since 2026-08-11". The accepted set is 19 staticcheck
|
||||
means "nothing new since 2026-08-11". The accepted set is 18 staticcheck
|
||||
findings and 13 unreachable symbols, listed with a reason each in
|
||||
`scripts/analyzers/*.baseline`. Three of the unreachable symbols must stay:
|
||||
[layering.md](layering.md#deadcode). One accepted staticcheck finding is V-687.
|
||||
[layering.md](layering.md#deadcode).
|
||||
Revisit when: V-701 sweeps the baseline, or a fix deletes an entry. The gate
|
||||
fails on an entry whose finding is gone, so the deletion is not optional.
|
||||
Workaround: none needed. Reachability claims are checkable now. Read the
|
||||
|
||||
+1
-11
@@ -1,6 +1,6 @@
|
||||
# Background workers
|
||||
|
||||
Both entries are a tick doing expensive work it did not need to do.
|
||||
The entry is a tick doing expensive work it did not need to do.
|
||||
|
||||
## Fact enrichment is a 20-call serial waterfall [#680] {#enrichment}
|
||||
|
||||
@@ -11,13 +11,3 @@ scan, not this.
|
||||
Revisit when: Nexus gets slow, or when a batch-resolution endpoint exists.
|
||||
Workaround: an unreachable Nexus is fine. It is the slow-but-answering case
|
||||
that hurts.
|
||||
|
||||
## A suppressed nudge is phrased anyway [#687] {#nudges}
|
||||
|
||||
Costs: `PhraseNudge` runs before the dedupe is known. The `continue` meant to
|
||||
skip it is the last statement in the loop body. Every tick that
|
||||
keeps suppressing the same rule pays the resident model again. The comment
|
||||
above it claims the opposite.
|
||||
Revisit when: digestion ticks show up in the model's load, or when nudge rules
|
||||
grow past a handful.
|
||||
Workaround: none.
|
||||
|
||||
Reference in New Issue
Block a user