Skip to content

correction-mining: miner has no negative-signal run telemetry #614

Description

@ahuimanu

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestruntimeRuntime-affecting change (eligible for patch release)

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions