circle-ir-ai 2.35.0 → 2.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +84 -0
- package/dist/cache/backend.d.ts +39 -7
- package/dist/cache/backend.d.ts.map +1 -1
- package/dist/cache/backend.js +18 -6
- package/dist/cache/backend.js.map +1 -1
- package/dist/cache/backends/index.d.ts +12 -7
- package/dist/cache/backends/index.d.ts.map +1 -1
- package/dist/cache/backends/index.js +12 -7
- package/dist/cache/backends/index.js.map +1 -1
- package/dist/cache/backends/layout.d.ts +13 -4
- package/dist/cache/backends/layout.d.ts.map +1 -1
- package/dist/cache/backends/layout.js +20 -5
- package/dist/cache/backends/layout.js.map +1 -1
- package/dist/cache/backends/local-fs.d.ts +9 -5
- package/dist/cache/backends/local-fs.d.ts.map +1 -1
- package/dist/cache/backends/local-fs.js +9 -5
- package/dist/cache/backends/local-fs.js.map +1 -1
- package/dist/cache/backends/r2.d.ts +14 -9
- package/dist/cache/backends/r2.d.ts.map +1 -1
- package/dist/cache/backends/r2.js +14 -9
- package/dist/cache/backends/r2.js.map +1 -1
- package/dist/cache/classification-cache.d.ts +22 -4
- package/dist/cache/classification-cache.d.ts.map +1 -1
- package/dist/cache/classification-cache.js +32 -4
- package/dist/cache/classification-cache.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,90 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.36.0] - 2026-07-03
|
|
9
|
+
|
|
10
|
+
Cache Round 3 (`cognium-ai#189`) — model-in-path defense-in-depth.
|
|
11
|
+
Motivated by the 2026-07-03 `zai-org/glm-5.2` and `minimax/minimax-m3`
|
|
12
|
+
CWE-Bench-Java runs, which both produced byte-identical 65/120
|
|
13
|
+
results with **zero** `llm-discovery:` attribution markers in either
|
|
14
|
+
log. Investigation confirmed the real root cause is a silent LLM-
|
|
15
|
+
error swallow in `src/llm/discovery.ts:524-531` (returns
|
|
16
|
+
`{vulnerabilityFound: false}` for any exception → LLM failures show
|
|
17
|
+
up as "no vulnerability found"). The cache-key composition IS
|
|
18
|
+
correctly model-fingerprinted, so this patch does NOT fix the
|
|
19
|
+
identical-result bug — it makes future model-cross-contamination
|
|
20
|
+
visible in R2 dashboards and impossible under a targeted `s3 rm`.
|
|
21
|
+
|
|
22
|
+
### Changed — R2/local-fs layout: `<model-slug>` path segment
|
|
23
|
+
|
|
24
|
+
`CacheKey` gains a new optional `modelSlug?: string` field
|
|
25
|
+
(`src/cache/backend.ts`). `renderObjectPath()` in
|
|
26
|
+
`src/cache/backends/layout.ts` injects the slug between the
|
|
27
|
+
namespace root and the sharded digest for the three model-dependent
|
|
28
|
+
namespaces:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
verify/<model-slug>/<4hex>/<sha>.json (was: verify/<4hex>/<sha>.json)
|
|
32
|
+
discovery/<model-slug>/<4hex>/<sha>.json (was: discovery/<4hex>/<sha>.json)
|
|
33
|
+
classifier/<model-slug>/<4hex>/<sha>.json (was: classifier/<4hex>/<sha>.json)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`tree/` and `cluster/` layouts are unchanged (both are model-
|
|
37
|
+
independent). When `modelSlug` is empty (no LLM configured, e.g.
|
|
38
|
+
pure-static scans), the flat 2.28.x path shape is preserved for
|
|
39
|
+
back-compat.
|
|
40
|
+
|
|
41
|
+
`ClassificationCache.toCacheKey()` populates `modelSlug` from the
|
|
42
|
+
per-phase `modelFingerprint` (already threaded through since
|
|
43
|
+
2.28.0/`cognium-ai#151`) sanitized via the new exported helper
|
|
44
|
+
`sanitizeModelSlug()` (replaces `=` with `-` so
|
|
45
|
+
`disc=zai-org_glm-5.2` renders as `disc-zai-org_glm-5.2`).
|
|
46
|
+
|
|
47
|
+
### Changed — SCHEMA_VER bumped `cic:v2` → `cic:v3`
|
|
48
|
+
|
|
49
|
+
All warm entries under both local-fs and R2 backends are invalidated
|
|
50
|
+
so operators re-populate under the Round-3 layout. Rollback path:
|
|
51
|
+
downgrade to `2.35.x` and old entries still miss (their `cic:v2`
|
|
52
|
+
envelope fails the `isValid()` schema check under the new version;
|
|
53
|
+
new writes go under `cic:v2` again). No breaking API change.
|
|
54
|
+
|
|
55
|
+
### Rationale
|
|
56
|
+
|
|
57
|
+
Even though the digest composition already folds
|
|
58
|
+
`modelFingerprint` into the SHA-256 (so `verify=opus` and
|
|
59
|
+
`verify=gpt-4o-mini` land in different files), the flat 2.28.x
|
|
60
|
+
layout made model-cross-contamination invisible in the R2 dashboard.
|
|
61
|
+
Round 3 surfaces the model dimension as a top-level segment so:
|
|
62
|
+
|
|
63
|
+
1. Operators see per-model cache footprint at a glance.
|
|
64
|
+
2. Per-model eviction is a single `s3 rm --recursive s3://cognium-cache/v2/discovery/disc-gemma3-12b/`.
|
|
65
|
+
3. Future digest-composition regressions (e.g. a stray refactor that
|
|
66
|
+
drops `modelFingerprint` from `computeDigest`) become visible as
|
|
67
|
+
an entry hitting under the wrong model prefix.
|
|
68
|
+
|
|
69
|
+
### Tests
|
|
70
|
+
|
|
71
|
+
- `tests/cache-model-in-path.test.ts` — 12 new tests covering the
|
|
72
|
+
layout renderer, `sanitizeModelSlug`, `ClassificationCache`
|
|
73
|
+
round-trip under two different discovery models, tree/cluster
|
|
74
|
+
slug-independence, and the empty-fingerprint back-compat path.
|
|
75
|
+
- `tests/cache-key-shape.test.ts` — SCHEMA_VER assertion updated to
|
|
76
|
+
`'cic:v3'`.
|
|
77
|
+
|
|
78
|
+
Full suite: 1340 pass + 3 skipped (was 1328 + 3), typecheck clean.
|
|
79
|
+
|
|
80
|
+
### Follow-up (out of scope for this release)
|
|
81
|
+
|
|
82
|
+
The silent LLM-error swallow at `src/llm/discovery.ts:524-531` is
|
|
83
|
+
the actual root cause of the "identical 65/120" observation from
|
|
84
|
+
the glm-5.2 + minimax-m3 runs. A separate ticket should:
|
|
85
|
+
|
|
86
|
+
- Surface LLM errors on the runner side (bubble up rate rather than
|
|
87
|
+
return fake `{vulnerabilityFound: false}`)
|
|
88
|
+
- Add a `llm.failureCount` metric to the CWE-Bench-Java runner's
|
|
89
|
+
summary output so a run that lost 100% of LLM calls doesn't look
|
|
90
|
+
like a legitimate static-baseline number.
|
|
91
|
+
|
|
8
92
|
## [2.35.0] - 2026-07-03
|
|
9
93
|
|
|
10
94
|
Sprint P2 Batch 4 — wide precision pass. Three shipping tickets
|
package/dist/cache/backend.d.ts
CHANGED
|
@@ -12,22 +12,34 @@
|
|
|
12
12
|
* fingerprint composition stays in `ClassificationCache` so a backend
|
|
13
13
|
* swap doesn't change observable cache semantics.
|
|
14
14
|
*
|
|
15
|
-
* # CacheKey shape (Round
|
|
15
|
+
* # CacheKey shape (Round 3 — 2.36.0, cognium-ai#189)
|
|
16
16
|
*
|
|
17
17
|
* The Round-1 interface (`get(key: string)`) wasn't enough to express
|
|
18
18
|
* the per-namespace package-coordinate layout the R2 backend needs to
|
|
19
19
|
* surface in dashboards. We now pass a structured `{ namespace, digest,
|
|
20
|
-
* coordinate? }` so backends can render the path however
|
|
20
|
+
* coordinate?, modelSlug? }` so backends can render the path however
|
|
21
|
+
* they want:
|
|
21
22
|
*
|
|
22
|
-
* tree
|
|
23
|
-
*
|
|
24
|
-
* verify
|
|
25
|
-
*
|
|
23
|
+
* tree → `<prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json` (coord)
|
|
24
|
+
* → `<prefix>/tree/_unowned/<4hex>/<sha>.json` (no coord)
|
|
25
|
+
* verify → `<prefix>/verify/<model-slug>/<4hex>/<sha>.json` (slug present)
|
|
26
|
+
* → `<prefix>/verify/<4hex>/<sha>.json` (no slug)
|
|
27
|
+
* discovery → `<prefix>/discovery/<model-slug>/<4hex>/<sha>.json` (slug present)
|
|
28
|
+
* → `<prefix>/discovery/<4hex>/<sha>.json` (no slug)
|
|
29
|
+
* classifier → analogous to verify/discovery
|
|
30
|
+
* cluster → `<prefix>/cluster/<4hex>/<sha>.json` (model-independent)
|
|
26
31
|
*
|
|
27
32
|
* Coordinate is intentionally tree-only: discovery and verify are
|
|
28
33
|
* keyed on method/batch content + model fingerprint, which already
|
|
29
34
|
* collide-correctly across packages without a coordinate prefix.
|
|
30
35
|
*
|
|
36
|
+
* `modelSlug` is intentionally non-tree: the tree cache is pattern-
|
|
37
|
+
* match (SAST) output that doesn't depend on any LLM. Splitting it by
|
|
38
|
+
* model would just fragment the cache. verify/discovery/classifier
|
|
39
|
+
* results are model-dependent and MUST NOT be shared between different
|
|
40
|
+
* discovery/verify models — a defense-in-depth against the digest-
|
|
41
|
+
* composition regressions that motivated Round 3 (cognium-ai#189).
|
|
42
|
+
*
|
|
31
43
|
* Selection: `LLM_CACHE_BACKEND` env (`local` | `memory` | `r2`).
|
|
32
44
|
* Default = `local` (back-compat). See `./backends/index.ts` factory.
|
|
33
45
|
*/
|
|
@@ -66,9 +78,29 @@ export interface CacheKey {
|
|
|
66
78
|
/**
|
|
67
79
|
* Optional package coordinate. Only consulted by tree-namespace keys;
|
|
68
80
|
* verify/discovery backends ignore it. When absent or `_unowned`,
|
|
69
|
-
* tree falls back to `_unowned/<
|
|
81
|
+
* tree falls back to `_unowned/<4hex>/<sha>` layout.
|
|
70
82
|
*/
|
|
71
83
|
coordinate?: PackageCoordinate;
|
|
84
|
+
/**
|
|
85
|
+
* Optional filesystem/URL-safe model identity for the cache path
|
|
86
|
+
* (cognium-ai#189, Round 3). Only consulted by non-tree namespaces
|
|
87
|
+
* (verify / discovery / classifier). When present, injected between
|
|
88
|
+
* the namespace root and the sharded digest:
|
|
89
|
+
* `<namespace>/<modelSlug>/<4hex>/<sha>.json`
|
|
90
|
+
* When absent (unset in the caller or empty string), the layout is
|
|
91
|
+
* flat `<namespace>/<4hex>/<sha>.json` (2.28.x back-compat).
|
|
92
|
+
*
|
|
93
|
+
* Motivation: even though `digest` is already model-fingerprinted
|
|
94
|
+
* (see classification-cache.ts `computeDigest`), surfacing the model
|
|
95
|
+
* segment in the path makes model-cross-contamination visible in R2
|
|
96
|
+
* dashboards, protects against future digest-composition regressions,
|
|
97
|
+
* and makes per-model cache eviction a `s3 rm` on a single prefix.
|
|
98
|
+
*
|
|
99
|
+
* Populated by `ClassificationCache.toCacheKey()` from the per-phase
|
|
100
|
+
* `modelFingerprint` (which is the same value already folded into the
|
|
101
|
+
* digest). MUST be URL/path-safe: the caller sanitizes `=` → `-`.
|
|
102
|
+
*/
|
|
103
|
+
modelSlug?: string;
|
|
72
104
|
}
|
|
73
105
|
export interface CacheBackend {
|
|
74
106
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/cache/backend.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/cache/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAExF,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,SAAS,EAAE,cAAc,CAAC;IAC1B;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,4EAA4E;IAC5E,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC,6DAA6D;IAC7D,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB"}
|
package/dist/cache/backend.js
CHANGED
|
@@ -12,22 +12,34 @@
|
|
|
12
12
|
* fingerprint composition stays in `ClassificationCache` so a backend
|
|
13
13
|
* swap doesn't change observable cache semantics.
|
|
14
14
|
*
|
|
15
|
-
* # CacheKey shape (Round
|
|
15
|
+
* # CacheKey shape (Round 3 — 2.36.0, cognium-ai#189)
|
|
16
16
|
*
|
|
17
17
|
* The Round-1 interface (`get(key: string)`) wasn't enough to express
|
|
18
18
|
* the per-namespace package-coordinate layout the R2 backend needs to
|
|
19
19
|
* surface in dashboards. We now pass a structured `{ namespace, digest,
|
|
20
|
-
* coordinate? }` so backends can render the path however
|
|
20
|
+
* coordinate?, modelSlug? }` so backends can render the path however
|
|
21
|
+
* they want:
|
|
21
22
|
*
|
|
22
|
-
* tree
|
|
23
|
-
*
|
|
24
|
-
* verify
|
|
25
|
-
*
|
|
23
|
+
* tree → `<prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json` (coord)
|
|
24
|
+
* → `<prefix>/tree/_unowned/<4hex>/<sha>.json` (no coord)
|
|
25
|
+
* verify → `<prefix>/verify/<model-slug>/<4hex>/<sha>.json` (slug present)
|
|
26
|
+
* → `<prefix>/verify/<4hex>/<sha>.json` (no slug)
|
|
27
|
+
* discovery → `<prefix>/discovery/<model-slug>/<4hex>/<sha>.json` (slug present)
|
|
28
|
+
* → `<prefix>/discovery/<4hex>/<sha>.json` (no slug)
|
|
29
|
+
* classifier → analogous to verify/discovery
|
|
30
|
+
* cluster → `<prefix>/cluster/<4hex>/<sha>.json` (model-independent)
|
|
26
31
|
*
|
|
27
32
|
* Coordinate is intentionally tree-only: discovery and verify are
|
|
28
33
|
* keyed on method/batch content + model fingerprint, which already
|
|
29
34
|
* collide-correctly across packages without a coordinate prefix.
|
|
30
35
|
*
|
|
36
|
+
* `modelSlug` is intentionally non-tree: the tree cache is pattern-
|
|
37
|
+
* match (SAST) output that doesn't depend on any LLM. Splitting it by
|
|
38
|
+
* model would just fragment the cache. verify/discovery/classifier
|
|
39
|
+
* results are model-dependent and MUST NOT be shared between different
|
|
40
|
+
* discovery/verify models — a defense-in-depth against the digest-
|
|
41
|
+
* composition regressions that motivated Round 3 (cognium-ai#189).
|
|
42
|
+
*
|
|
31
43
|
* Selection: `LLM_CACHE_BACKEND` env (`local` | `memory` | `r2`).
|
|
32
44
|
* Default = `local` (back-compat). See `./backends/index.ts` factory.
|
|
33
45
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/cache/backend.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/cache/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG"}
|
|
@@ -11,14 +11,19 @@
|
|
|
11
11
|
* the backend, the structured `CacheKey` is rendered to a path via
|
|
12
12
|
* `renderObjectPath()`:
|
|
13
13
|
*
|
|
14
|
-
* tree+coord
|
|
15
|
-
* tree+nocoord
|
|
16
|
-
* verify
|
|
17
|
-
*
|
|
14
|
+
* tree+coord → `<eco>/<name>@<ver>/<4hex>/<sha>.json`
|
|
15
|
+
* tree+nocoord → `_unowned/<4hex>/<sha>.json`
|
|
16
|
+
* verify+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
17
|
+
* verify+no slug → `<4hex>/<sha>.json`
|
|
18
|
+
* discovery+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
19
|
+
* discovery+no slug → `<4hex>/<sha>.json`
|
|
20
|
+
* classifier+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
21
|
+
* cluster (flat) → `<4hex>/<sha>.json`
|
|
18
22
|
*
|
|
19
|
-
* `R2_PREFIX` default
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* `R2_PREFIX` default kept at `v2` for the Round 3 layout. The path-
|
|
24
|
+
* shape change is additive — flat 2.28.x entries stay readable, they
|
|
25
|
+
* just miss against Round-3 writes because `SCHEMA_VER` bumped v2→v3.
|
|
26
|
+
* Operators who want the pre-2.28 keys back can pin `R2_PREFIX=v1`.
|
|
22
27
|
*/
|
|
23
28
|
import type { CacheBackend, CacheNamespace } from '../backend.js';
|
|
24
29
|
import { LocalFSBackend } from './local-fs.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAEpD,wBAAgB,cAAc,IAAI,OAAO,GAAG,QAAQ,GAAG,IAAI,CAK1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,YAAY,CAoCrF"}
|
|
@@ -11,14 +11,19 @@
|
|
|
11
11
|
* the backend, the structured `CacheKey` is rendered to a path via
|
|
12
12
|
* `renderObjectPath()`:
|
|
13
13
|
*
|
|
14
|
-
* tree+coord
|
|
15
|
-
* tree+nocoord
|
|
16
|
-
* verify
|
|
17
|
-
*
|
|
14
|
+
* tree+coord → `<eco>/<name>@<ver>/<4hex>/<sha>.json`
|
|
15
|
+
* tree+nocoord → `_unowned/<4hex>/<sha>.json`
|
|
16
|
+
* verify+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
17
|
+
* verify+no slug → `<4hex>/<sha>.json`
|
|
18
|
+
* discovery+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
19
|
+
* discovery+no slug → `<4hex>/<sha>.json`
|
|
20
|
+
* classifier+slug → `<model-slug>/<4hex>/<sha>.json`
|
|
21
|
+
* cluster (flat) → `<4hex>/<sha>.json`
|
|
18
22
|
*
|
|
19
|
-
* `R2_PREFIX` default
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* `R2_PREFIX` default kept at `v2` for the Round 3 layout. The path-
|
|
24
|
+
* shape change is additive — flat 2.28.x entries stay readable, they
|
|
25
|
+
* just miss against Round-3 writes because `SCHEMA_VER` bumped v2→v3.
|
|
26
|
+
* Operators who want the pre-2.28 keys back can pin `R2_PREFIX=v1`.
|
|
22
27
|
*/
|
|
23
28
|
import * as path from 'path';
|
|
24
29
|
import { LocalFSBackend } from './local-fs.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/backends/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/backends/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAEpD,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAyB;IACrE,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,aAAa,EAAE,CAAC;IAElD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACzD,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7D,uDAAuD;YACvD,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,6DAA6D;gBAC7D,wDAAwD;gBACxD,yCAAyC,CAC1C,CAAC;YACF,OAAO,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7E,OAAO,IAAI,SAAS,CAAC;YACnB,QAAQ;YACR,MAAM;YACN,WAAW;YACX,eAAe;YACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;YACvC,MAAM,EAAE,GAAG,UAAU,IAAI,SAAS,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,+DAA+D;IAC/D,mCAAmC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9E,OAAO,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -6,10 +6,19 @@
|
|
|
6
6
|
* backend at a `<prefix>/<namespace>/` path, so the resulting full key
|
|
7
7
|
* is:
|
|
8
8
|
*
|
|
9
|
-
* tree → `<root>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json`
|
|
10
|
-
* → `<root>/tree/_unowned/<4hex>/<sha>.json`
|
|
11
|
-
* verify → `<root>/verify/<4hex>/<sha>.json`
|
|
12
|
-
*
|
|
9
|
+
* tree → `<root>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json` (coord)
|
|
10
|
+
* → `<root>/tree/_unowned/<4hex>/<sha>.json` (fallback)
|
|
11
|
+
* verify → `<root>/verify/<model-slug>/<4hex>/<sha>.json` (slug)
|
|
12
|
+
* → `<root>/verify/<4hex>/<sha>.json` (no slug)
|
|
13
|
+
* discovery → `<root>/discovery/<model-slug>/<4hex>/<sha>.json` (slug)
|
|
14
|
+
* → `<root>/discovery/<4hex>/<sha>.json` (no slug)
|
|
15
|
+
* classifier → analogous to verify/discovery
|
|
16
|
+
* cluster → `<root>/cluster/<4hex>/<sha>.json` (flat)
|
|
17
|
+
*
|
|
18
|
+
* Round 3 (2.36.0, cognium-ai#189) added the `<model-slug>` segment
|
|
19
|
+
* for the three model-dependent namespaces so per-model cache
|
|
20
|
+
* partitioning is visible in R2 dashboards. `tree` and `cluster` stay
|
|
21
|
+
* flat because their content is model-independent.
|
|
13
22
|
*
|
|
14
23
|
* All four namespaces use a 4-hex (65 536) shard prefix. Rationale:
|
|
15
24
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/layout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAM9C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAoBtD"}
|
|
@@ -6,10 +6,19 @@
|
|
|
6
6
|
* backend at a `<prefix>/<namespace>/` path, so the resulting full key
|
|
7
7
|
* is:
|
|
8
8
|
*
|
|
9
|
-
* tree → `<root>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json`
|
|
10
|
-
* → `<root>/tree/_unowned/<4hex>/<sha>.json`
|
|
11
|
-
* verify → `<root>/verify/<4hex>/<sha>.json`
|
|
12
|
-
*
|
|
9
|
+
* tree → `<root>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json` (coord)
|
|
10
|
+
* → `<root>/tree/_unowned/<4hex>/<sha>.json` (fallback)
|
|
11
|
+
* verify → `<root>/verify/<model-slug>/<4hex>/<sha>.json` (slug)
|
|
12
|
+
* → `<root>/verify/<4hex>/<sha>.json` (no slug)
|
|
13
|
+
* discovery → `<root>/discovery/<model-slug>/<4hex>/<sha>.json` (slug)
|
|
14
|
+
* → `<root>/discovery/<4hex>/<sha>.json` (no slug)
|
|
15
|
+
* classifier → analogous to verify/discovery
|
|
16
|
+
* cluster → `<root>/cluster/<4hex>/<sha>.json` (flat)
|
|
17
|
+
*
|
|
18
|
+
* Round 3 (2.36.0, cognium-ai#189) added the `<model-slug>` segment
|
|
19
|
+
* for the three model-dependent namespaces so per-model cache
|
|
20
|
+
* partitioning is visible in R2 dashboards. `tree` and `cluster` stay
|
|
21
|
+
* flat because their content is model-independent.
|
|
13
22
|
*
|
|
14
23
|
* All four namespaces use a 4-hex (65 536) shard prefix. Rationale:
|
|
15
24
|
*
|
|
@@ -40,7 +49,13 @@ export function renderObjectPath(key) {
|
|
|
40
49
|
}
|
|
41
50
|
return `_unowned/${shard}/${sha}.json`;
|
|
42
51
|
}
|
|
43
|
-
// verify / discovery / classifier
|
|
52
|
+
// verify / discovery / classifier — inject `<model-slug>/` when the
|
|
53
|
+
// caller populated it (Round 3, cognium-ai#189). Falls through to
|
|
54
|
+
// the 2.28.x flat layout when the slug is absent so callers with no
|
|
55
|
+
// model configured (or the cluster namespace) get unchanged paths.
|
|
56
|
+
if (key.modelSlug) {
|
|
57
|
+
return `${key.modelSlug}/${shard}/${sha}.json`;
|
|
58
|
+
}
|
|
44
59
|
return `${shard}/${sha}.json`;
|
|
45
60
|
}
|
|
46
61
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/cache/backends/layout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/cache/backends/layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,gFAAgF;AAChF,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;QAC7B,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,GAAG,WAAW,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;QAC/C,CAAC;QACD,OAAO,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC;IACzC,CAAC;IAED,oEAAoE;IACpE,kEAAkE;IAClE,oEAAoE;IACpE,mEAAmE;IACnE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO,GAAG,GAAG,CAAC,SAAS,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;AAChC,CAAC"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Local filesystem cache backend (cognium-ai#158).
|
|
3
3
|
*
|
|
4
|
-
* Round
|
|
4
|
+
* Round 3 (2.36.0, cognium-ai#189) layout (translated to platform path-sep):
|
|
5
5
|
*
|
|
6
|
-
* <cacheDir>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json
|
|
7
|
-
* <cacheDir>/tree/_unowned/<
|
|
8
|
-
* <cacheDir>/verify/<
|
|
9
|
-
* <cacheDir>/
|
|
6
|
+
* <cacheDir>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json (coord)
|
|
7
|
+
* <cacheDir>/tree/_unowned/<4hex>/<sha>.json (fallback)
|
|
8
|
+
* <cacheDir>/verify/<model-slug>/<4hex>/<sha>.json (slug)
|
|
9
|
+
* <cacheDir>/verify/<4hex>/<sha>.json (no slug)
|
|
10
|
+
* <cacheDir>/discovery/<model-slug>/<4hex>/<sha>.json (slug)
|
|
11
|
+
* <cacheDir>/discovery/<4hex>/<sha>.json (no slug)
|
|
12
|
+
* <cacheDir>/classifier/<model-slug>/<4hex>/<sha>.json (slug)
|
|
13
|
+
* <cacheDir>/cluster/<4hex>/<sha>.json (flat)
|
|
10
14
|
*
|
|
11
15
|
* Atomic write via tmp + rename so concurrent `cognium-ai scan`
|
|
12
16
|
* processes don't corrupt each other's entries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-fs.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/local-fs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"local-fs.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/local-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG5D,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,qBAAqB;IAKvC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,SAAS;IAMX,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU1C,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASpC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAsBxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Local filesystem cache backend (cognium-ai#158).
|
|
3
3
|
*
|
|
4
|
-
* Round
|
|
4
|
+
* Round 3 (2.36.0, cognium-ai#189) layout (translated to platform path-sep):
|
|
5
5
|
*
|
|
6
|
-
* <cacheDir>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json
|
|
7
|
-
* <cacheDir>/tree/_unowned/<
|
|
8
|
-
* <cacheDir>/verify/<
|
|
9
|
-
* <cacheDir>/
|
|
6
|
+
* <cacheDir>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json (coord)
|
|
7
|
+
* <cacheDir>/tree/_unowned/<4hex>/<sha>.json (fallback)
|
|
8
|
+
* <cacheDir>/verify/<model-slug>/<4hex>/<sha>.json (slug)
|
|
9
|
+
* <cacheDir>/verify/<4hex>/<sha>.json (no slug)
|
|
10
|
+
* <cacheDir>/discovery/<model-slug>/<4hex>/<sha>.json (slug)
|
|
11
|
+
* <cacheDir>/discovery/<4hex>/<sha>.json (no slug)
|
|
12
|
+
* <cacheDir>/classifier/<model-slug>/<4hex>/<sha>.json (slug)
|
|
13
|
+
* <cacheDir>/cluster/<4hex>/<sha>.json (flat)
|
|
10
14
|
*
|
|
11
15
|
* Atomic write via tmp + rename so concurrent `cognium-ai scan`
|
|
12
16
|
* processes don't corrupt each other's entries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-fs.js","sourceRoot":"","sources":["../../../src/cache/backends/local-fs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"local-fs.js","sourceRoot":"","sources":["../../../src/cache/backends/local-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cloudflare R2 (S3-compatible) cache backend (cognium-ai#158).
|
|
3
3
|
*
|
|
4
|
-
* Round
|
|
4
|
+
* Round 3 (2.36.0, cognium-ai#189) layout:
|
|
5
5
|
*
|
|
6
|
-
* <prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json
|
|
7
|
-
* <prefix>/tree/_unowned/<
|
|
8
|
-
* <prefix>/verify/<
|
|
9
|
-
* <prefix>/
|
|
6
|
+
* <prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json (coord present)
|
|
7
|
+
* <prefix>/tree/_unowned/<4hex>/<sha>.json (no coord)
|
|
8
|
+
* <prefix>/verify/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
9
|
+
* <prefix>/verify/<4hex>/<sha>.json (no slug)
|
|
10
|
+
* <prefix>/discovery/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
11
|
+
* <prefix>/discovery/<4hex>/<sha>.json (no slug)
|
|
12
|
+
* <prefix>/classifier/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
13
|
+
* <prefix>/cluster/<4hex>/<sha>.json (flat; model-indep.)
|
|
10
14
|
*
|
|
11
|
-
* The coordinate is only consulted for tree-namespace keys; verify
|
|
12
|
-
* discovery stay
|
|
13
|
-
* fingerprint + per-batch fingerprint
|
|
14
|
-
*
|
|
15
|
+
* The coordinate is only consulted for tree-namespace keys; verify /
|
|
16
|
+
* discovery / classifier stay coordinate-free because their content
|
|
17
|
+
* already encodes the model fingerprint + per-batch fingerprint. The
|
|
18
|
+
* `<model-slug>` segment (Round 3) surfaces the per-phase model
|
|
19
|
+
* identity in the R2 dashboard so cross-model contamination is visible.
|
|
15
20
|
*
|
|
16
21
|
* Configuration (env vars):
|
|
17
22
|
* LLM_CACHE_BACKEND=r2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/r2.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../../src/cache/backends/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,QAAQ;IACrB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,gBAAgB;IAelC,OAAO,CAAC,SAAS;IAIX,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwB1C,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBpC,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB3C"}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cloudflare R2 (S3-compatible) cache backend (cognium-ai#158).
|
|
3
3
|
*
|
|
4
|
-
* Round
|
|
4
|
+
* Round 3 (2.36.0, cognium-ai#189) layout:
|
|
5
5
|
*
|
|
6
|
-
* <prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json
|
|
7
|
-
* <prefix>/tree/_unowned/<
|
|
8
|
-
* <prefix>/verify/<
|
|
9
|
-
* <prefix>/
|
|
6
|
+
* <prefix>/tree/<eco>/<name>@<ver>/<4hex>/<sha>.json (coord present)
|
|
7
|
+
* <prefix>/tree/_unowned/<4hex>/<sha>.json (no coord)
|
|
8
|
+
* <prefix>/verify/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
9
|
+
* <prefix>/verify/<4hex>/<sha>.json (no slug)
|
|
10
|
+
* <prefix>/discovery/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
11
|
+
* <prefix>/discovery/<4hex>/<sha>.json (no slug)
|
|
12
|
+
* <prefix>/classifier/<model-slug>/<4hex>/<sha>.json (slug present)
|
|
13
|
+
* <prefix>/cluster/<4hex>/<sha>.json (flat; model-indep.)
|
|
10
14
|
*
|
|
11
|
-
* The coordinate is only consulted for tree-namespace keys; verify
|
|
12
|
-
* discovery stay
|
|
13
|
-
* fingerprint + per-batch fingerprint
|
|
14
|
-
*
|
|
15
|
+
* The coordinate is only consulted for tree-namespace keys; verify /
|
|
16
|
+
* discovery / classifier stay coordinate-free because their content
|
|
17
|
+
* already encodes the model fingerprint + per-batch fingerprint. The
|
|
18
|
+
* `<model-slug>` segment (Round 3) surfaces the per-phase model
|
|
19
|
+
* identity in the R2 dashboard so cross-model contamination is visible.
|
|
15
20
|
*
|
|
16
21
|
* Configuration (env vars):
|
|
17
22
|
* LLM_CACHE_BACKEND=r2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../src/cache/backends/r2.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../src/cache/backends/r2.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,17 +10,23 @@
|
|
|
10
10
|
* R2 transparently so two runners on different machines share the same
|
|
11
11
|
* cache.
|
|
12
12
|
*
|
|
13
|
-
* # Round
|
|
13
|
+
* # Round 3 (2.36.0, cognium-ai#189) key shape
|
|
14
14
|
*
|
|
15
15
|
* sha256(
|
|
16
|
-
* 'cic:
|
|
17
|
-
* + '\0' + namespace // 'tree' | 'verify' | 'discovery'
|
|
16
|
+
* 'cic:v3' // SCHEMA_VER — bump on breaking key changes
|
|
17
|
+
* + '\0' + namespace // 'tree' | 'verify' | 'discovery' | 'classifier' | 'cluster'
|
|
18
18
|
* + '\0' + classifier
|
|
19
19
|
* + '\0' + content
|
|
20
20
|
* + '\0' + modelFingerprint // per-phase, see ../llm/config.ts
|
|
21
21
|
* + '\0' + coordinateHashPrefix // empty for non-tree, or _unowned
|
|
22
22
|
* )
|
|
23
23
|
*
|
|
24
|
+
* Round 3 delta: SCHEMA_VER bumped 'cic:v2' → 'cic:v3' AND the model
|
|
25
|
+
* identity now also appears in the backend path as a segment. See
|
|
26
|
+
* `./backends/layout.ts` and `../backend.ts` `CacheKey.modelSlug`.
|
|
27
|
+
* The digest composition is unchanged, but bumping the schema clears
|
|
28
|
+
* all warm entries so operators re-populate under the new layout.
|
|
29
|
+
*
|
|
24
30
|
* Why `namespace` is in the hash:
|
|
25
31
|
* So a tree-cache entry can never collide with a verify-cache entry
|
|
26
32
|
* even if a future caller happens to choose the same classifier name.
|
|
@@ -49,7 +55,19 @@ import type { PackageCoordinate } from './coordinate.js';
|
|
|
49
55
|
* circle-ir-ai will see misses against newer SCHEMA_VER entries and
|
|
50
56
|
* re-populate cleanly.
|
|
51
57
|
*/
|
|
52
|
-
export declare const SCHEMA_VER = "cic:
|
|
58
|
+
export declare const SCHEMA_VER = "cic:v3";
|
|
59
|
+
/**
|
|
60
|
+
* Turn a per-phase model fingerprint (e.g. `disc=zai-org_glm-5.2`) into
|
|
61
|
+
* a filesystem/URL-safe path segment. Only replaces `=` (introduced by
|
|
62
|
+
* the `<phase>=<model>` fingerprint format) so the segment remains
|
|
63
|
+
* human-readable in R2 dashboards. `normalizeModelId()` (see
|
|
64
|
+
* `../llm/config.ts`) has already collapsed `/` and `:` to `_`.
|
|
65
|
+
*
|
|
66
|
+
* Exported for tests. Callers outside classification-cache.ts should
|
|
67
|
+
* NOT invoke this directly — they should pass `modelFingerprint` in
|
|
68
|
+
* `ClassificationCacheOptions` and let the cache populate the slug.
|
|
69
|
+
*/
|
|
70
|
+
export declare function sanitizeModelSlug(modelFingerprint: string): string;
|
|
53
71
|
export interface ClassificationCacheOptions {
|
|
54
72
|
/**
|
|
55
73
|
* Logical cache namespace. Determines backend path layout AND whether
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classification-cache.d.ts","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"classification-cache.d.ts","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAY,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;oEACgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAWD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,qBAAa,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,OAAO,GAAE,0BAA+B;IASpD,mEAAmE;IACnE,mBAAmB,IAAI,MAAM;IAI7B,6EAA6E;IAC7E,cAAc,IAAI,MAAM;IAIxB,0EAA0E;IAC1E,YAAY,IAAI,cAAc;IAI9B,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,OAAO;IAKT,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAqCpF,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3F,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAInF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,KAAK,IAAI,OAAO,CAAC;QACrB,SAAS,EAAE,cAAc,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CAcH;AASD,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,GAAE,0BAA+B,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAUpH;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -10,17 +10,23 @@
|
|
|
10
10
|
* R2 transparently so two runners on different machines share the same
|
|
11
11
|
* cache.
|
|
12
12
|
*
|
|
13
|
-
* # Round
|
|
13
|
+
* # Round 3 (2.36.0, cognium-ai#189) key shape
|
|
14
14
|
*
|
|
15
15
|
* sha256(
|
|
16
|
-
* 'cic:
|
|
17
|
-
* + '\0' + namespace // 'tree' | 'verify' | 'discovery'
|
|
16
|
+
* 'cic:v3' // SCHEMA_VER — bump on breaking key changes
|
|
17
|
+
* + '\0' + namespace // 'tree' | 'verify' | 'discovery' | 'classifier' | 'cluster'
|
|
18
18
|
* + '\0' + classifier
|
|
19
19
|
* + '\0' + content
|
|
20
20
|
* + '\0' + modelFingerprint // per-phase, see ../llm/config.ts
|
|
21
21
|
* + '\0' + coordinateHashPrefix // empty for non-tree, or _unowned
|
|
22
22
|
* )
|
|
23
23
|
*
|
|
24
|
+
* Round 3 delta: SCHEMA_VER bumped 'cic:v2' → 'cic:v3' AND the model
|
|
25
|
+
* identity now also appears in the backend path as a segment. See
|
|
26
|
+
* `./backends/layout.ts` and `../backend.ts` `CacheKey.modelSlug`.
|
|
27
|
+
* The digest composition is unchanged, but bumping the schema clears
|
|
28
|
+
* all warm entries so operators re-populate under the new layout.
|
|
29
|
+
*
|
|
24
30
|
* Why `namespace` is in the hash:
|
|
25
31
|
* So a tree-cache entry can never collide with a verify-cache entry
|
|
26
32
|
* even if a future caller happens to choose the same classifier name.
|
|
@@ -51,7 +57,21 @@ import { coordinateSegments } from './coordinate.js';
|
|
|
51
57
|
* circle-ir-ai will see misses against newer SCHEMA_VER entries and
|
|
52
58
|
* re-populate cleanly.
|
|
53
59
|
*/
|
|
54
|
-
export const SCHEMA_VER = 'cic:
|
|
60
|
+
export const SCHEMA_VER = 'cic:v3';
|
|
61
|
+
/**
|
|
62
|
+
* Turn a per-phase model fingerprint (e.g. `disc=zai-org_glm-5.2`) into
|
|
63
|
+
* a filesystem/URL-safe path segment. Only replaces `=` (introduced by
|
|
64
|
+
* the `<phase>=<model>` fingerprint format) so the segment remains
|
|
65
|
+
* human-readable in R2 dashboards. `normalizeModelId()` (see
|
|
66
|
+
* `../llm/config.ts`) has already collapsed `/` and `:` to `_`.
|
|
67
|
+
*
|
|
68
|
+
* Exported for tests. Callers outside classification-cache.ts should
|
|
69
|
+
* NOT invoke this directly — they should pass `modelFingerprint` in
|
|
70
|
+
* `ClassificationCacheOptions` and let the cache populate the slug.
|
|
71
|
+
*/
|
|
72
|
+
export function sanitizeModelSlug(modelFingerprint) {
|
|
73
|
+
return modelFingerprint.replace(/=/g, '-');
|
|
74
|
+
}
|
|
55
75
|
const DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours
|
|
56
76
|
export class ClassificationCache {
|
|
57
77
|
namespace;
|
|
@@ -103,6 +123,14 @@ export class ClassificationCache {
|
|
|
103
123
|
if (this.namespace === 'tree' && coordinate) {
|
|
104
124
|
key.coordinate = coordinate;
|
|
105
125
|
}
|
|
126
|
+
// cognium-ai#189: surface the per-phase model identity as a path
|
|
127
|
+
// segment for the three model-dependent namespaces. Tree stays
|
|
128
|
+
// model-independent (pattern-match / SAST output), cluster stays
|
|
129
|
+
// model-independent (structural k-medoids).
|
|
130
|
+
if (this.modelFingerprint &&
|
|
131
|
+
(this.namespace === 'verify' || this.namespace === 'discovery' || this.namespace === 'classifier')) {
|
|
132
|
+
key.modelSlug = sanitizeModelSlug(this.modelFingerprint);
|
|
133
|
+
}
|
|
106
134
|
return key;
|
|
107
135
|
}
|
|
108
136
|
isValid(entry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classification-cache.js","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"classification-cache.js","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"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"}
|