1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! The grouping cache KEY (ADR 0009): labels are non-deterministic across model calls,
//! coverage is not — so a grouping is pinned by a content hash of everything
//! that determines it. The cached value is the RAW model response; audit and
//! assembly are pure functions replayed on load, so their fixes apply to cached
//! runs too (prompt/payload changes must bump `PROMPT_VERSION` instead).
//!
//! Reading and writing entries is `store::FsGroupingCache`; this file is only
//! the key, whose composition pins every existing entry in every checkout and
//! must not change by one byte.
use ;
use ;
/// Key over: prompt generation, backend identity, normaliser fingerprint,
/// SYMBOL-READER fingerprint, and the exact class structure (sorted member hunk
/// digests — content-exact, so the key survives positional-id shifts across
/// regenerations).
///
/// The symbol readers are in the key because the class graph is part of what
/// the model reads (ADR 0022). Readers that answer differently must therefore
/// cold every entry, and adding this component did exactly that, once.
///
/// **Backend IDENTITY, never its display name** (`LlmBackend::identity`). The
/// name is the command as it will run, absolute paths and all; where a binary
/// lives does not determine a grouping, and hashing it made a debug build, a
/// release build and two checkouts of one commit key differently for the same
/// class partition.