Closes the #280 calibration question by operator decision: at chunk grain a note-pair's similarity is its closest chunk pair, so the shared 0.82 floor saturated the note/task reports with related families (38 note / 155 task groups against the 200-pair cap, measured 2026-08-09).
Defaults: snippet 0.82 (single-chunk — its similarity scale never shifted, and it stays below the 0.90 write gate to catch what the gate admits), note/task 0.93 (above the gate on purpose; chunk grain lifts related families over 0.90).
get_duplicate_threshold(user_id, kind) resolves key + default per kind; the report route, MCP tool, and Knowledge view already pass "use configured" and inherit it unchanged.
Settings UI: the single report-threshold field becomes three per-kind fields with per-kind fallback defaults.
Tests: threshold resolution parameterized per kind; a new test pins that each kind reads its own key; the report-below-gate invariant is narrowed to snippets with the chunk-grain rationale; note/task = 0.93 pinned.
Scribe task #2558. CI green on 272b7db (run 3556).
Closes the #280 calibration question by operator decision: at chunk grain a note-pair's similarity is its closest chunk pair, so the shared 0.82 floor saturated the note/task reports with related families (38 note / 155 task groups against the 200-pair cap, measured 2026-08-09).
- `kb_duplicate_threshold` splits into per-kind settings keys: `kb_duplicate_threshold_snippet` / `_note` / `_task`.
- Defaults: snippet **0.82** (single-chunk — its similarity scale never shifted, and it stays below the 0.90 write gate to catch what the gate admits), note/task **0.93** (above the gate on purpose; chunk grain lifts related families over 0.90).
- `get_duplicate_threshold(user_id, kind)` resolves key + default per kind; the report route, MCP tool, and Knowledge view already pass "use configured" and inherit it unchanged.
- Settings UI: the single report-threshold field becomes three per-kind fields with per-kind fallback defaults.
- Tests: threshold resolution parameterized per kind; a new test pins that each kind reads its own key; the report-below-gate invariant is narrowed to snippets with the chunk-grain rationale; note/task = 0.93 pinned.
Scribe task #2558. CI green on 272b7db (run 3556).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs
At chunk grain (#280) a note-pair's similarity is its closest chunk pair,
so the shared 0.82 floor saturated the note/task reports with related
families (38 note / 155 task groups against the 200-pair cap, measured
2026-08-09). Split kb_duplicate_threshold into per-kind settings keys
with per-kind defaults: snippet 0.82 (single-chunk, scale unchanged),
note/task 0.93 (points the report at genuinely-alike records). Settings
UI grows the two new knobs; report entrypoints inherit the change via
get_duplicate_threshold(user_id, kind).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes the #280 calibration question by operator decision: at chunk grain a note-pair's similarity is its closest chunk pair, so the shared 0.82 floor saturated the note/task reports with related families (38 note / 155 task groups against the 200-pair cap, measured 2026-08-09).
kb_duplicate_thresholdsplits into per-kind settings keys:kb_duplicate_threshold_snippet/_note/_task.get_duplicate_threshold(user_id, kind)resolves key + default per kind; the report route, MCP tool, and Knowledge view already pass "use configured" and inherit it unchanged.Scribe task #2558. CI green on
272b7db(run 3556).🤖 Generated with Claude Code
https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs