|
2 | 2 |
|
3 | 3 | All notable changes to jcodemunch-mcp are documented here. |
4 | 4 |
|
| 5 | +## [1.108.165] - 2026-07-23 - claim-scoped evidence in the handoff contract (handoff/v2 phase 1, #377) |
| 6 | + |
| 7 | +### Added |
| 8 | + |
| 9 | +- **A handoff section may now carry caller-authored `claims`, each with its own |
| 10 | + `evidence_refs`.** v1 proved every cited ref was retrieved this session, but |
| 11 | + it could not say WHICH retrieval backs which sentence: refs landed in one |
| 12 | + global block at the end of the body. Phase 1 of the `handoff/v2` design |
| 13 | + proposed by @mightydanp in [#377](https://github.com/jgravelle/jcodemunch-mcp/issues/377) |
| 14 | + closes that gap. |
| 15 | + |
| 16 | + Each claim is `{id, statement, evidence_refs, classification?}`. New |
| 17 | + `_validate_claims` requires ids unique across the WHOLE handoff, not per |
| 18 | + section, since the id is the machine-readable anchor a caller cites and two |
| 19 | + sections owning the same id would make that citation ambiguous. Statements |
| 20 | + and classifications are preserved verbatim; the server never rewrites one. |
| 21 | + Each claim's refs are attested separately through the existing |
| 22 | + `_validate_evidence`, so an unknown ref returns `invalid_claims: |
| 23 | + [{claim_id, unknown_refs}]` and names the claim that cited it instead of |
| 24 | + vanishing into one global failure list. `render_handoff` prints the claim as |
| 25 | + a `###` heading with its evidence indented beneath it. |
| 26 | + |
| 27 | + Three decisions the proposal left open: |
| 28 | + |
| 29 | + - **The input picks the contract.** No claims anywhere means the schema |
| 30 | + string stays `jcodemunch.handoff/v1` and the body is byte-identical to |
| 31 | + what v1 rendered; `claims_attested` is omitted from the receipt entirely |
| 32 | + rather than reported as `0`. Any claim promotes the handoff to |
| 33 | + `jcodemunch.handoff/v2`. |
| 34 | + - **Claims can satisfy `evidence_refs`.** A caller who scoped everything to |
| 35 | + claims should not have to restate it globally, so the top-level list may be |
| 36 | + empty when claims carry refs. Strictly more permissive; no existing call |
| 37 | + changes. |
| 38 | + - **Claim refs join the canonical evidence index**, caller order first, so a |
| 39 | + v1 consumer reading a v2 handoff still sees every reference in the place it |
| 40 | + expects. |
| 41 | + |
| 42 | + Section `content` becomes optional only for a section that carries claims. |
| 43 | + `finalize_handoff` is standard tier, so `core_compact` is unchanged at 3996. |
| 44 | + New `tests/test_v1_108_165.py` (18, incl. the byte-identical v1 guard). No |
| 45 | + `INDEX_VERSION` or tool-count change. |
| 46 | + |
| 47 | + Known limit, disclosed on #377 before anyone builds against it: phase 1 does |
| 48 | + not narrow what counts as a match. `_validate_evidence` still attests a ref |
| 49 | + against the file component of a served id, so citing a whole file attests |
| 50 | + even when one unrelated symbol from it was served. Narrowing that is phase 2 |
| 51 | + (evidence receipts), which is deferred. |
| 52 | + |
| 53 | + Suite parity same day: jdocmunch-mcp v1.116.0 + jdatamunch-mcp v1.25.0. |
| 54 | + |
5 | 55 | ## [1.108.164] - 2026-07-23 - A path-shaped `repo` arg returns a routed error, not a raw storage crash (#376) |
6 | 56 |
|
7 | 57 | ### Fixed |
|
0 commit comments