Observed
The session-correction-mining miner emits nothing when it finds zero clusters:
$ uv run python -m gzkit.insights.correction_mining --dry-run
session-correction-mining: 0 cluster(s) at threshold 3 from ~/.claude/projects/...gzkit
A zero-proposal run is indistinguishable from a miner that has silently
decayed — e.g. a stale CORRECTIVE_MARKERS lexicon
(src/gzkit/insights/correction_mining.py:33-46) that no longer matches how the
operator phrases corrections would also report 0 cluster(s). Nothing is
written; no run-log records that the miner scanned N transcripts and found 0.
By contrast, the sibling sensor shipped in the same ADR — the Stop hook
(OBPI-0.0.70-01) — writes one telemetry line per block to
.gzkit/sensors/stop-turn-feedback.jsonl (src/gzkit/hooks/scripts/quality.py),
so its catch-rate is observable. The miner has no equivalent negative-signal
surface.
Design gap
ADR-0.0.70 § Consequences › Negative #3 names this exact decay class — the
"fence with no recorded intrusions" class — and books block telemetry as the
mitigation for the hook, but the ADR scoped telemetry to the hook only. The
miner's observability gap is therefore out of ADR-0.0.70's delivered scope,
not a defect in it: the work shipped as designed. This GHI homes the
forward-hardening follow-on.
Proposal
Add bounded run-telemetry to the miner: one append-only JSON line per run to a
gitignored .gzkit/sensors/ run-log capturing run timestamp, transcript count
scanned, distinct sessions, clusters found, and the active threshold — counts
and config only, never operator text (the operator-PII rule and ADR-0.0.70
Boundary Invariant 2 bind every emitted record). A zero-proposal run then leaves
a trace that distinguishes "ran, found nothing" from "did not run / decayed
lexicon."
Class of failure
Read-only mining sensors whose only output is their positive findings: when
findings are zero, there is no signal separating a healthy null result from a
silently-broken detector. Applies to any heuristic miner whose detection
vocabulary can drift out of step with its input.
Scope hint (advisory, for routing)
- Estimated diff: <=100 lines (telemetry helper + call site + test), single module
- Surfaces touched:
src/gzkit/insights/correction_mining.py,
tests/chores/test_session_correction_mining.py, .gitignore (the
.gzkit/sensors/ path is already excluded)
- In-flight vs. new feature: planned forward-hardening (post-ADR-0.0.70)
Provenance
Surfaced by the quality-reviewer persona during the ADR-0.0.70 Gate-5 audit
(2026-06-13); recorded in
docs/design/adr/foundation/ADR-0.0.70-turn-end-feedback-and-correction-mining/audit/AUDIT.md
§ Recommendations.
Related
Observed
The session-correction-mining miner emits nothing when it finds zero clusters:
A zero-proposal run is indistinguishable from a miner that has silently
decayed — e.g. a stale
CORRECTIVE_MARKERSlexicon(
src/gzkit/insights/correction_mining.py:33-46) that no longer matches how theoperator phrases corrections would also report
0 cluster(s). Nothing iswritten; no run-log records that the miner scanned N transcripts and found 0.
By contrast, the sibling sensor shipped in the same ADR — the Stop hook
(OBPI-0.0.70-01) — writes one telemetry line per block to
.gzkit/sensors/stop-turn-feedback.jsonl(src/gzkit/hooks/scripts/quality.py),so its catch-rate is observable. The miner has no equivalent negative-signal
surface.
Design gap
ADR-0.0.70 § Consequences › Negative #3 names this exact decay class — the
"fence with no recorded intrusions" class — and books block telemetry as the
mitigation for the hook, but the ADR scoped telemetry to the hook only. The
miner's observability gap is therefore out of ADR-0.0.70's delivered scope,
not a defect in it: the work shipped as designed. This GHI homes the
forward-hardening follow-on.
Proposal
Add bounded run-telemetry to the miner: one append-only JSON line per run to a
gitignored
.gzkit/sensors/run-log capturing run timestamp, transcript countscanned, distinct sessions, clusters found, and the active threshold — counts
and config only, never operator text (the operator-PII rule and ADR-0.0.70
Boundary Invariant 2 bind every emitted record). A zero-proposal run then leaves
a trace that distinguishes "ran, found nothing" from "did not run / decayed
lexicon."
Class of failure
Read-only mining sensors whose only output is their positive findings: when
findings are zero, there is no signal separating a healthy null result from a
silently-broken detector. Applies to any heuristic miner whose detection
vocabulary can drift out of step with its input.
Scope hint (advisory, for routing)
src/gzkit/insights/correction_mining.py,tests/chores/test_session_correction_mining.py,.gitignore(the.gzkit/sensors/path is already excluded)Provenance
Surfaced by the
quality-reviewerpersona during the ADR-0.0.70 Gate-5 audit(2026-06-13); recorded in
docs/design/adr/foundation/ADR-0.0.70-turn-end-feedback-and-correction-mining/audit/AUDIT.md§ Recommendations.
Related
the decay class)
telemetry — the asymmetry)
gz insightsauthor verb — only a hand-append path #575 (insights: no governedgz insightsauthor verb) — adjacent cutof the same correction-mining surface. insights: no governed
gz insightsauthor verb — only a hand-append path #575 surfaces positive proposals viaa CLI verb; this GHI is the negative-signal / observability cut. Different
root cause; sequenced together is natural (campaign Phase E).