@mneme-ai/core 2.19.46 → 2.19.48
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/dist/chronosheaf/aczel.d.ts +72 -0
- package/dist/chronosheaf/aczel.d.ts.map +1 -0
- package/dist/chronosheaf/aczel.js +161 -0
- package/dist/chronosheaf/aczel.js.map +1 -0
- package/dist/chronosheaf/base_space.d.ts +125 -0
- package/dist/chronosheaf/base_space.d.ts.map +1 -0
- package/dist/chronosheaf/base_space.js +216 -0
- package/dist/chronosheaf/base_space.js.map +1 -0
- package/dist/chronosheaf/chronosheaf.test.d.ts +12 -0
- package/dist/chronosheaf/chronosheaf.test.d.ts.map +1 -0
- package/dist/chronosheaf/chronosheaf.test.js +360 -0
- package/dist/chronosheaf/chronosheaf.test.js.map +1 -0
- package/dist/chronosheaf/free_energy.d.ts +109 -0
- package/dist/chronosheaf/free_energy.d.ts.map +1 -0
- package/dist/chronosheaf/free_energy.js +142 -0
- package/dist/chronosheaf/free_energy.js.map +1 -0
- package/dist/chronosheaf/index.d.ts +39 -0
- package/dist/chronosheaf/index.d.ts.map +1 -0
- package/dist/chronosheaf/index.js +30 -0
- package/dist/chronosheaf/index.js.map +1 -0
- package/dist/chronosheaf/live_update.d.ts +221 -0
- package/dist/chronosheaf/live_update.d.ts.map +1 -0
- package/dist/chronosheaf/live_update.js +332 -0
- package/dist/chronosheaf/live_update.js.map +1 -0
- package/dist/chronosheaf/live_update.test.d.ts +16 -0
- package/dist/chronosheaf/live_update.test.d.ts.map +1 -0
- package/dist/chronosheaf/live_update.test.js +405 -0
- package/dist/chronosheaf/live_update.test.js.map +1 -0
- package/dist/chronosheaf/pain_catalog.d.ts +50 -0
- package/dist/chronosheaf/pain_catalog.d.ts.map +1 -0
- package/dist/chronosheaf/pain_catalog.js +108 -0
- package/dist/chronosheaf/pain_catalog.js.map +1 -0
- package/dist/chronosheaf/persistence.d.ts +79 -0
- package/dist/chronosheaf/persistence.d.ts.map +1 -0
- package/dist/chronosheaf/persistence.js +173 -0
- package/dist/chronosheaf/persistence.js.map +1 -0
- package/dist/chronosheaf/rg_flow.d.ts +81 -0
- package/dist/chronosheaf/rg_flow.d.ts.map +1 -0
- package/dist/chronosheaf/rg_flow.js +146 -0
- package/dist/chronosheaf/rg_flow.js.map +1 -0
- package/dist/chronosheaf/sheaf.d.ts +116 -0
- package/dist/chronosheaf/sheaf.d.ts.map +1 -0
- package/dist/chronosheaf/sheaf.js +278 -0
- package/dist/chronosheaf/sheaf.js.map +1 -0
- package/dist/chronosheaf/tropical.d.ts +98 -0
- package/dist/chronosheaf/tropical.d.ts.map +1 -0
- package/dist/chronosheaf/tropical.js +140 -0
- package/dist/chronosheaf/tropical.js.map +1 -0
- package/dist/chronosheaf/wasserstein.d.ts +75 -0
- package/dist/chronosheaf/wasserstein.d.ts.map +1 -0
- package/dist/chronosheaf/wasserstein.js +189 -0
- package/dist/chronosheaf/wasserstein.js.map +1 -0
- package/dist/cosmic/aurelian_v1947.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1947.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1947.test.js +34 -0
- package/dist/cosmic/aurelian_v1947.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1948.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1948.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1948.test.js +62 -0
- package/dist/cosmic/aurelian_v1948.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P1 · pain catalog.
|
|
3
|
+
*
|
|
4
|
+
* Seven user-reported pains from the v2.19.40-46 dogfood cycle. Each
|
|
5
|
+
* pain has the same structural shape: every verifier returns OK
|
|
6
|
+
* pairwise, but the system as a whole carries a contradiction.
|
|
7
|
+
* The catalog encodes (a) the pain, (b) what the current pairwise
|
|
8
|
+
* tools see, (c) what they MISS — the missing piece is always a
|
|
9
|
+
* topological obstruction the sheaf cohomology layer (P2-a) catches.
|
|
10
|
+
*
|
|
11
|
+
* This file is the formal type-system anchor for the rest of
|
|
12
|
+
* CHRONOSHEAF: every new primitive references one or more catalog
|
|
13
|
+
* entries via `painId`, so when we audit "does CHRONOSHEAF actually
|
|
14
|
+
* cover the user's pain?" the answer is structurally enforced.
|
|
15
|
+
*/
|
|
16
|
+
export const PAIN_CATALOG = Object.freeze([
|
|
17
|
+
{
|
|
18
|
+
painId: "PAIN-001",
|
|
19
|
+
pain: "pulse บอก v2.19.42 latest, npm มี v2.19.43",
|
|
20
|
+
currentToolsSee: "snapshot freshness at one moment",
|
|
21
|
+
whatTheyMiss: "time-direction inconsistency — the pulse looks BACKWARD (cache) while npm looks FORWARD (registry); two arrows of time clash without a unifying clock",
|
|
22
|
+
topology: "time-direction",
|
|
23
|
+
primitives: ["sheaf", "free_energy"],
|
|
24
|
+
surfacedIn: "v2.19.40-43 dogfood cycle",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
painId: "PAIN-002",
|
|
28
|
+
pain: "219 KB capabilities โหลดทุก session",
|
|
29
|
+
currentToolsSee: "a flat tool list",
|
|
30
|
+
whatTheyMiss: "scale-appropriate detail — AI agent on cold start needs ≤2 KB summary; only on tool-pick does it need full schema; current tool has ONE detail level",
|
|
31
|
+
topology: "scale-mismatch",
|
|
32
|
+
primitives: ["rg_flow", "persistence"],
|
|
33
|
+
surfacedIn: "v2.19.40 SKINNY CAPABILITIES gap",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
painId: "PAIN-003",
|
|
37
|
+
pain: "claim '699 tools' → reality 711",
|
|
38
|
+
currentToolsSee: "a pairwise contradiction between two claim sites",
|
|
39
|
+
whatTheyMiss: "drift surface — the count crept 685 → 699 → 711 across releases; each step looked locally consistent but the trajectory exposed structural drift",
|
|
40
|
+
topology: "drift-surface",
|
|
41
|
+
primitives: ["persistence", "wasserstein"],
|
|
42
|
+
surfacedIn: "v2.19.34-44 catalog churn",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
painId: "PAIN-004",
|
|
46
|
+
pain: "HONESTY GATE ตัวเองพังเงียบ ไม่ trigger CI",
|
|
47
|
+
currentToolsSee: "the gate's stated verdict",
|
|
48
|
+
whatTheyMiss: "self-referential trust — when the gate audits itself, classical logic risks Russell-style paradox; current tools have no formal way to talk about 'who watches the watcher'",
|
|
49
|
+
topology: "self-reference",
|
|
50
|
+
primitives: ["aczel", "sheaf"],
|
|
51
|
+
surfacedIn: "v2.19.40 HONESTY GATE shipped lying",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
painId: "PAIN-005",
|
|
55
|
+
pain: "welcome --json '{}' โยน แม้ MCP family รับ",
|
|
56
|
+
currentToolsSee: "per-command schema",
|
|
57
|
+
whatTheyMiss: "interface coherence as a global obstruction — every command's --json shape needs to be a section of the same sheaf over the command tree; mismatch = H¹ ≠ 0",
|
|
58
|
+
topology: "interface-coherence",
|
|
59
|
+
primitives: ["sheaf", "tropical"],
|
|
60
|
+
surfacedIn: "v2.19.40-45 N6 4-round bug",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
painId: "PAIN-006",
|
|
64
|
+
pain: "verify confidence 60% — ไม่ derive จากอะไร",
|
|
65
|
+
currentToolsSee: "a heuristic number",
|
|
66
|
+
whatTheyMiss: "mathematical guarantee — confidence should be a posterior derived from Bayesian update OR a measure-theoretic bound (Chebyshev / Hoeffding), not a vibe",
|
|
67
|
+
topology: "epistemic-confidence",
|
|
68
|
+
primitives: ["free_energy", "wasserstein"],
|
|
69
|
+
surfacedIn: "v2.19.44 OSMOSIS posterior gap",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
painId: "PAIN-007",
|
|
73
|
+
pain: "self-upgrade Windows DLL lock (libvips EBUSY)",
|
|
74
|
+
currentToolsSee: "an OS-level error message",
|
|
75
|
+
whatTheyMiss: "action that changes the substrate of the actor itself — the running mneme.cmd IS the file being overwritten; classical action models don't handle the actor mutating its own world",
|
|
76
|
+
topology: "substrate-mutation",
|
|
77
|
+
primitives: ["aczel", "free_energy"],
|
|
78
|
+
surfacedIn: "v2.19.41-45 npm install EBUSY",
|
|
79
|
+
},
|
|
80
|
+
]);
|
|
81
|
+
export function catalogStats() {
|
|
82
|
+
const byTopology = {};
|
|
83
|
+
const byPrimitive = {};
|
|
84
|
+
for (const e of PAIN_CATALOG) {
|
|
85
|
+
byTopology[e.topology] = (byTopology[e.topology] ?? 0) + 1;
|
|
86
|
+
for (const p of e.primitives)
|
|
87
|
+
byPrimitive[p] = (byPrimitive[p] ?? 0) + 1;
|
|
88
|
+
}
|
|
89
|
+
const primitiveLoad = Object.entries(byPrimitive)
|
|
90
|
+
.map(([tag, pains]) => ({ tag: tag, pains }))
|
|
91
|
+
.sort((a, b) => b.pains - a.pains);
|
|
92
|
+
return {
|
|
93
|
+
totalPains: PAIN_CATALOG.length,
|
|
94
|
+
byTopology: byTopology,
|
|
95
|
+
byPrimitive: byPrimitive,
|
|
96
|
+
primitiveLoad,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Look up every pain that a given primitive addresses. */
|
|
100
|
+
export function painsForPrimitive(tag) {
|
|
101
|
+
return PAIN_CATALOG.filter((e) => e.primitives.includes(tag));
|
|
102
|
+
}
|
|
103
|
+
/** Look up every primitive needed for a given pain. */
|
|
104
|
+
export function primitivesForPain(painId) {
|
|
105
|
+
const e = PAIN_CATALOG.find((x) => x.painId === painId);
|
|
106
|
+
return e ? [...e.primitives] : [];
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pain_catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pain_catalog.js","sourceRoot":"","sources":["../../src/chronosheaf/pain_catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-c · persistent homology.
|
|
3
|
+
*
|
|
4
|
+
* Math foundation (Edelsbrunner / Carlsson, ~2002-2008):
|
|
5
|
+
*
|
|
6
|
+
* A filtration is a nested sequence of simplicial complexes
|
|
7
|
+
*
|
|
8
|
+
* ∅ = K_0 ⊆ K_1 ⊆ K_2 ⊆ … ⊆ K_n.
|
|
9
|
+
*
|
|
10
|
+
* For each k, the inclusion K_i ↪ K_j induces a map
|
|
11
|
+
* H_k(K_i) → H_k(K_j). A class c ∈ H_k IS BORN at filtration b if
|
|
12
|
+
* it appears in K_b but not in K_{b−1}, and DIES at d > b if it
|
|
13
|
+
* becomes a boundary in K_d. The persistence pair (b, d) with
|
|
14
|
+
* pers(b, d) = d − b measures structural robustness; long-lived
|
|
15
|
+
* features survive coarse-graining + noise and represent
|
|
16
|
+
* real structure, while short-lived ones are noise.
|
|
17
|
+
*
|
|
18
|
+
* The Persistence Diagram (or Bar Code) PD_k = {(b, d) : (b, d)
|
|
19
|
+
* is a persistence pair} is the canonical invariant. It satisfies
|
|
20
|
+
* a stability theorem (Cohen-Steiner / Edelsbrunner / Harer 2007):
|
|
21
|
+
* bottleneck distance W_∞(PD(f), PD(g)) ≤ ‖f − g‖_∞.
|
|
22
|
+
*
|
|
23
|
+
* AI-memory mapping (PAIN-002 scale-mismatch + PAIN-003 drift-surface):
|
|
24
|
+
*
|
|
25
|
+
* We filter the tool-catalog over releases: K_i = the catalog at
|
|
26
|
+
* release v_i, with each tool name as a 0-simplex and each
|
|
27
|
+
* "is registered" relation as a 1-simplex. A persistent 0-class
|
|
28
|
+
* = a tool present continuously across releases. A 0-class that
|
|
29
|
+
* dies = a tool removed/renamed. A 1-class = a co-registration
|
|
30
|
+
* pattern.
|
|
31
|
+
*
|
|
32
|
+
* The persistence diagram answers "which facts survived the last
|
|
33
|
+
* N releases" in a single picture, and bottleneck distance gives a
|
|
34
|
+
* rigorous "how much did the catalog drift" metric for PAIN-003.
|
|
35
|
+
*
|
|
36
|
+
* Implementation: standard column-reduction algorithm (Zomorodian-
|
|
37
|
+
* Carlsson 2005), over ℝ coefficients. We implement the 0-dim
|
|
38
|
+
* variant (most useful for catalog facts) + a generic kth-dim wrapper.
|
|
39
|
+
*/
|
|
40
|
+
export interface FiltrationStep {
|
|
41
|
+
/** Filtration value (e.g. release index or scalar threshold). */
|
|
42
|
+
value: number;
|
|
43
|
+
/** Simplices added at this step (each = sorted vertex list). */
|
|
44
|
+
add: ReadonlyArray<ReadonlyArray<string>>;
|
|
45
|
+
}
|
|
46
|
+
export interface PersistencePair {
|
|
47
|
+
/** Homology dimension. */
|
|
48
|
+
dim: number;
|
|
49
|
+
/** Birth filtration value. */
|
|
50
|
+
birth: number;
|
|
51
|
+
/** Death filtration value; +∞ for essential (immortal) classes. */
|
|
52
|
+
death: number;
|
|
53
|
+
/** Persistence d − b (∞ for essential). */
|
|
54
|
+
persistence: number;
|
|
55
|
+
/** Optional witness — birth simplex + death simplex (vertex tuples). */
|
|
56
|
+
birthSimplex: ReadonlyArray<string>;
|
|
57
|
+
deathSimplex?: ReadonlyArray<string>;
|
|
58
|
+
}
|
|
59
|
+
export interface PersistenceDiagram {
|
|
60
|
+
pairs: PersistencePair[];
|
|
61
|
+
/** Maximum persistence over the diagram (excluding ∞). */
|
|
62
|
+
maxFinitePersistence: number;
|
|
63
|
+
/** Count of essential classes per dimension. */
|
|
64
|
+
essentialByDim: Record<number, number>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Compute 0-dimensional persistent homology from a vertex filtration.
|
|
68
|
+
* Algorithm: Union-Find with elder rule (Eldership: when two components
|
|
69
|
+
* merge, the YOUNGER one dies at the merge filtration value).
|
|
70
|
+
*/
|
|
71
|
+
export declare function persistentHomology0(filtration: ReadonlyArray<FiltrationStep>): PersistenceDiagram;
|
|
72
|
+
/**
|
|
73
|
+
* Bottleneck distance between two persistence diagrams (1D matching).
|
|
74
|
+
* Uses Wasserstein-∞ approximation via greedy nearest-neighbour matching
|
|
75
|
+
* (good enough for the AI-memory PAIN-003 drift use case where diagrams
|
|
76
|
+
* are small). Bottleneck distance W_∞ = max_pair |Δb| ∨ |Δd|.
|
|
77
|
+
*/
|
|
78
|
+
export declare function bottleneckDistance(a: PersistenceDiagram, b: PersistenceDiagram): number;
|
|
79
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,GAAG,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,0DAA0D;IAC1D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAsEjG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CA+BvF"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-c · persistent homology.
|
|
3
|
+
*
|
|
4
|
+
* Math foundation (Edelsbrunner / Carlsson, ~2002-2008):
|
|
5
|
+
*
|
|
6
|
+
* A filtration is a nested sequence of simplicial complexes
|
|
7
|
+
*
|
|
8
|
+
* ∅ = K_0 ⊆ K_1 ⊆ K_2 ⊆ … ⊆ K_n.
|
|
9
|
+
*
|
|
10
|
+
* For each k, the inclusion K_i ↪ K_j induces a map
|
|
11
|
+
* H_k(K_i) → H_k(K_j). A class c ∈ H_k IS BORN at filtration b if
|
|
12
|
+
* it appears in K_b but not in K_{b−1}, and DIES at d > b if it
|
|
13
|
+
* becomes a boundary in K_d. The persistence pair (b, d) with
|
|
14
|
+
* pers(b, d) = d − b measures structural robustness; long-lived
|
|
15
|
+
* features survive coarse-graining + noise and represent
|
|
16
|
+
* real structure, while short-lived ones are noise.
|
|
17
|
+
*
|
|
18
|
+
* The Persistence Diagram (or Bar Code) PD_k = {(b, d) : (b, d)
|
|
19
|
+
* is a persistence pair} is the canonical invariant. It satisfies
|
|
20
|
+
* a stability theorem (Cohen-Steiner / Edelsbrunner / Harer 2007):
|
|
21
|
+
* bottleneck distance W_∞(PD(f), PD(g)) ≤ ‖f − g‖_∞.
|
|
22
|
+
*
|
|
23
|
+
* AI-memory mapping (PAIN-002 scale-mismatch + PAIN-003 drift-surface):
|
|
24
|
+
*
|
|
25
|
+
* We filter the tool-catalog over releases: K_i = the catalog at
|
|
26
|
+
* release v_i, with each tool name as a 0-simplex and each
|
|
27
|
+
* "is registered" relation as a 1-simplex. A persistent 0-class
|
|
28
|
+
* = a tool present continuously across releases. A 0-class that
|
|
29
|
+
* dies = a tool removed/renamed. A 1-class = a co-registration
|
|
30
|
+
* pattern.
|
|
31
|
+
*
|
|
32
|
+
* The persistence diagram answers "which facts survived the last
|
|
33
|
+
* N releases" in a single picture, and bottleneck distance gives a
|
|
34
|
+
* rigorous "how much did the catalog drift" metric for PAIN-003.
|
|
35
|
+
*
|
|
36
|
+
* Implementation: standard column-reduction algorithm (Zomorodian-
|
|
37
|
+
* Carlsson 2005), over ℝ coefficients. We implement the 0-dim
|
|
38
|
+
* variant (most useful for catalog facts) + a generic kth-dim wrapper.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Compute 0-dimensional persistent homology from a vertex filtration.
|
|
42
|
+
* Algorithm: Union-Find with elder rule (Eldership: when two components
|
|
43
|
+
* merge, the YOUNGER one dies at the merge filtration value).
|
|
44
|
+
*/
|
|
45
|
+
export function persistentHomology0(filtration) {
|
|
46
|
+
const pairs = [];
|
|
47
|
+
const parent = new Map();
|
|
48
|
+
const birthTime = new Map();
|
|
49
|
+
let maxFinite = 0;
|
|
50
|
+
let essential = 0;
|
|
51
|
+
const find = (x) => {
|
|
52
|
+
let r = x;
|
|
53
|
+
while (parent.get(r) !== r)
|
|
54
|
+
r = parent.get(r);
|
|
55
|
+
let c = x;
|
|
56
|
+
while (c !== r) {
|
|
57
|
+
const n = parent.get(c);
|
|
58
|
+
parent.set(c, r);
|
|
59
|
+
c = n;
|
|
60
|
+
}
|
|
61
|
+
return r;
|
|
62
|
+
};
|
|
63
|
+
for (const step of filtration) {
|
|
64
|
+
// First add all 0-simplices at this filtration (vertices).
|
|
65
|
+
for (const simplex of step.add) {
|
|
66
|
+
if (simplex.length === 1) {
|
|
67
|
+
const v = simplex[0];
|
|
68
|
+
if (!parent.has(v)) {
|
|
69
|
+
parent.set(v, v);
|
|
70
|
+
birthTime.set(v, step.value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Then process 1-simplices = edges (each merges 0-components or creates a 1-class).
|
|
75
|
+
for (const simplex of step.add) {
|
|
76
|
+
if (simplex.length !== 2)
|
|
77
|
+
continue;
|
|
78
|
+
const a = simplex[0];
|
|
79
|
+
const b = simplex[1];
|
|
80
|
+
// Edge implicitly adds endpoints if missing.
|
|
81
|
+
for (const v of [a, b]) {
|
|
82
|
+
if (!parent.has(v)) {
|
|
83
|
+
parent.set(v, v);
|
|
84
|
+
birthTime.set(v, step.value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const ra = find(a);
|
|
88
|
+
const rb = find(b);
|
|
89
|
+
if (ra === rb)
|
|
90
|
+
continue;
|
|
91
|
+
// Merge components — younger dies (elder rule).
|
|
92
|
+
const ta = birthTime.get(ra) ?? step.value;
|
|
93
|
+
const tb = birthTime.get(rb) ?? step.value;
|
|
94
|
+
const youngerRoot = ta > tb ? ra : rb;
|
|
95
|
+
const elderRoot = ta > tb ? rb : ra;
|
|
96
|
+
const deathTime = step.value;
|
|
97
|
+
const birthValue = Math.max(ta, tb);
|
|
98
|
+
parent.set(youngerRoot, elderRoot);
|
|
99
|
+
pairs.push({
|
|
100
|
+
dim: 0, birth: birthValue, death: deathTime,
|
|
101
|
+
persistence: deathTime - birthValue,
|
|
102
|
+
birthSimplex: [youngerRoot], deathSimplex: [a, b],
|
|
103
|
+
});
|
|
104
|
+
if (deathTime - birthValue > maxFinite)
|
|
105
|
+
maxFinite = deathTime - birthValue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Surviving components → essential classes (death = +∞).
|
|
109
|
+
const roots = new Set();
|
|
110
|
+
for (const v of parent.keys())
|
|
111
|
+
roots.add(find(v));
|
|
112
|
+
for (const r of roots) {
|
|
113
|
+
essential++;
|
|
114
|
+
pairs.push({
|
|
115
|
+
dim: 0, birth: birthTime.get(r) ?? 0, death: Infinity,
|
|
116
|
+
persistence: Infinity, birthSimplex: [r],
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
pairs,
|
|
121
|
+
maxFinitePersistence: maxFinite,
|
|
122
|
+
essentialByDim: { 0: essential },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Bottleneck distance between two persistence diagrams (1D matching).
|
|
127
|
+
* Uses Wasserstein-∞ approximation via greedy nearest-neighbour matching
|
|
128
|
+
* (good enough for the AI-memory PAIN-003 drift use case where diagrams
|
|
129
|
+
* are small). Bottleneck distance W_∞ = max_pair |Δb| ∨ |Δd|.
|
|
130
|
+
*/
|
|
131
|
+
export function bottleneckDistance(a, b) {
|
|
132
|
+
// Take only finite-persistence pairs for matching; essential classes
|
|
133
|
+
// count toward the "infinity diagonal".
|
|
134
|
+
const ap = a.pairs.filter((p) => isFinite(p.persistence));
|
|
135
|
+
const bp = b.pairs.filter((p) => isFinite(p.persistence));
|
|
136
|
+
const matched = new Set();
|
|
137
|
+
let worst = 0;
|
|
138
|
+
for (const p1 of ap) {
|
|
139
|
+
let bestIdx = -1;
|
|
140
|
+
let bestDist = Infinity;
|
|
141
|
+
for (let i = 0; i < bp.length; i++) {
|
|
142
|
+
if (matched.has(i))
|
|
143
|
+
continue;
|
|
144
|
+
const p2 = bp[i];
|
|
145
|
+
const d = Math.max(Math.abs(p1.birth - p2.birth), Math.abs(p1.death - p2.death));
|
|
146
|
+
if (d < bestDist) {
|
|
147
|
+
bestDist = d;
|
|
148
|
+
bestIdx = i;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (bestIdx >= 0) {
|
|
152
|
+
matched.add(bestIdx);
|
|
153
|
+
if (bestDist > worst)
|
|
154
|
+
worst = bestDist;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Unmatched — distance to diagonal = persistence/2.
|
|
158
|
+
const diag = p1.persistence / 2;
|
|
159
|
+
if (diag > worst)
|
|
160
|
+
worst = diag;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Account for unmatched pairs in b.
|
|
164
|
+
for (let i = 0; i < bp.length; i++) {
|
|
165
|
+
if (matched.has(i))
|
|
166
|
+
continue;
|
|
167
|
+
const diag = bp[i].persistence / 2;
|
|
168
|
+
if (diag > worst)
|
|
169
|
+
worst = diag;
|
|
170
|
+
}
|
|
171
|
+
return worst;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/chronosheaf/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-b · Renormalization Group flow.
|
|
3
|
+
*
|
|
4
|
+
* Math foundation (Wilson / Kadanoff, 1971):
|
|
5
|
+
*
|
|
6
|
+
* For a scale s ∈ ℝ⁺ and a Hamiltonian (or generic "system state")
|
|
7
|
+
* H_s, the RG operator R_b shifts the scale by a factor b:
|
|
8
|
+
*
|
|
9
|
+
* H_{s + log b} = R_b · H_s, R_b R_{b'} = R_{bb'}.
|
|
10
|
+
*
|
|
11
|
+
* Fixed points H* satisfying R_b H* = H* for some b are
|
|
12
|
+
* SCALE-INVARIANT — they survive every coarse-graining step.
|
|
13
|
+
* Operators (degrees of freedom) split into RELEVANT (eigenvalue
|
|
14
|
+
* |λ| > 1, grow under flow → matter at every scale), MARGINAL
|
|
15
|
+
* (|λ| = 1, neither grow nor decay), IRRELEVANT (|λ| < 1, vanish
|
|
16
|
+
* under flow → noise that washes out).
|
|
17
|
+
*
|
|
18
|
+
* AI-memory mapping (PAIN-002 scale-mismatch + PAIN-003 drift-surface):
|
|
19
|
+
*
|
|
20
|
+
* A coarse-graining is an aggregation step on tool catalog data:
|
|
21
|
+
*
|
|
22
|
+
* state s_0 = full catalog list (~700 tool names)
|
|
23
|
+
* R_2 s_0 = family-grouped (governor/fossil/...) (~20 groups)
|
|
24
|
+
* R_2² s_0 = category-grouped (memory/audit/meta...) (9 cats)
|
|
25
|
+
* R_2³ s_0 = single "all tools" scalar (1 number)
|
|
26
|
+
*
|
|
27
|
+
* Fixed points of this flow are descriptors that DON'T change as we
|
|
28
|
+
* zoom out — they're the right-detail-level for any consumer.
|
|
29
|
+
* The skinny capabilities tool from v2.19.41 is a hand-rolled
|
|
30
|
+
* RG fixed point at scale 2 (category-grouped); CHRONOSHEAF lets
|
|
31
|
+
* callers pick any scale by passing `b`.
|
|
32
|
+
*
|
|
33
|
+
* Implementation: linear coarse-graining on vector-valued states,
|
|
34
|
+
* eigendecomposition via power iteration for the relevance classifier.
|
|
35
|
+
* Pure-function; no fancy numerics required for the AI-memory use case
|
|
36
|
+
* because catalog states are small (≤ 1000 dims).
|
|
37
|
+
*/
|
|
38
|
+
export interface RGState {
|
|
39
|
+
/** Numeric state vector at scale s. */
|
|
40
|
+
vector: number[];
|
|
41
|
+
/** Scale exponent (log_b of physical scale). */
|
|
42
|
+
scale: number;
|
|
43
|
+
/** Optional label for human inspection. */
|
|
44
|
+
label?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface RGStep {
|
|
47
|
+
/** From-scale → to-scale (factor b). */
|
|
48
|
+
factor: number;
|
|
49
|
+
/** Aggregator that merges groups of size `factor` into one component. */
|
|
50
|
+
aggregator: "mean" | "sum" | "max" | "min";
|
|
51
|
+
}
|
|
52
|
+
/** Apply a single RG step: aggregate groups of `factor` adjacent components. */
|
|
53
|
+
export declare function rgStep(s: RGState, step: RGStep): RGState;
|
|
54
|
+
/** Iterate the RG flow until the state stops changing (fixed point) or N steps. */
|
|
55
|
+
export declare function rgFixedPoint(s0: RGState, step: RGStep, maxIter?: number, tol?: number): {
|
|
56
|
+
state: RGState;
|
|
57
|
+
iterations: number;
|
|
58
|
+
reachedFixedPoint: boolean;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Classify operators by their behaviour under the linearised RG flow.
|
|
62
|
+
* We treat the state vector as a perturbation around the fixed point and
|
|
63
|
+
* estimate the leading eigenvalue via power iteration on (R_b)' (linear
|
|
64
|
+
* approximation).
|
|
65
|
+
*/
|
|
66
|
+
export type Relevance = "relevant" | "marginal" | "irrelevant";
|
|
67
|
+
export declare function classifyRelevance(s0: RGState, step: RGStep, perturbation: number[], iterations?: number): {
|
|
68
|
+
eigenvalue: number;
|
|
69
|
+
class: Relevance;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* AI-memory specific: given a catalog snapshot (one number per tool —
|
|
73
|
+
* e.g. recent invocation count), find the SMALLEST scale b at which
|
|
74
|
+
* coarse-graining yields ≤ targetSize components. Used by the skinny-
|
|
75
|
+
* capabilities surface to pick the right family-grouping automatically.
|
|
76
|
+
*/
|
|
77
|
+
export declare function smallestScaleForBudget(s0: RGState, step: RGStep, targetSize: number, maxIter?: number): {
|
|
78
|
+
state: RGState;
|
|
79
|
+
iterations: number;
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=rg_flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rg_flow.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/rg_flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,WAAW,OAAO;IACtB,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAC5C;AAED,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBxD;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAK,EAAE,GAAG,SAAQ,GAAG;IAClF,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAC;CAChE,CAaA;AAQD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAE/D,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,SAAK,GACd;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAwB1C;AAQD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,SAAK,GACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAOxC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-b · Renormalization Group flow.
|
|
3
|
+
*
|
|
4
|
+
* Math foundation (Wilson / Kadanoff, 1971):
|
|
5
|
+
*
|
|
6
|
+
* For a scale s ∈ ℝ⁺ and a Hamiltonian (or generic "system state")
|
|
7
|
+
* H_s, the RG operator R_b shifts the scale by a factor b:
|
|
8
|
+
*
|
|
9
|
+
* H_{s + log b} = R_b · H_s, R_b R_{b'} = R_{bb'}.
|
|
10
|
+
*
|
|
11
|
+
* Fixed points H* satisfying R_b H* = H* for some b are
|
|
12
|
+
* SCALE-INVARIANT — they survive every coarse-graining step.
|
|
13
|
+
* Operators (degrees of freedom) split into RELEVANT (eigenvalue
|
|
14
|
+
* |λ| > 1, grow under flow → matter at every scale), MARGINAL
|
|
15
|
+
* (|λ| = 1, neither grow nor decay), IRRELEVANT (|λ| < 1, vanish
|
|
16
|
+
* under flow → noise that washes out).
|
|
17
|
+
*
|
|
18
|
+
* AI-memory mapping (PAIN-002 scale-mismatch + PAIN-003 drift-surface):
|
|
19
|
+
*
|
|
20
|
+
* A coarse-graining is an aggregation step on tool catalog data:
|
|
21
|
+
*
|
|
22
|
+
* state s_0 = full catalog list (~700 tool names)
|
|
23
|
+
* R_2 s_0 = family-grouped (governor/fossil/...) (~20 groups)
|
|
24
|
+
* R_2² s_0 = category-grouped (memory/audit/meta...) (9 cats)
|
|
25
|
+
* R_2³ s_0 = single "all tools" scalar (1 number)
|
|
26
|
+
*
|
|
27
|
+
* Fixed points of this flow are descriptors that DON'T change as we
|
|
28
|
+
* zoom out — they're the right-detail-level for any consumer.
|
|
29
|
+
* The skinny capabilities tool from v2.19.41 is a hand-rolled
|
|
30
|
+
* RG fixed point at scale 2 (category-grouped); CHRONOSHEAF lets
|
|
31
|
+
* callers pick any scale by passing `b`.
|
|
32
|
+
*
|
|
33
|
+
* Implementation: linear coarse-graining on vector-valued states,
|
|
34
|
+
* eigendecomposition via power iteration for the relevance classifier.
|
|
35
|
+
* Pure-function; no fancy numerics required for the AI-memory use case
|
|
36
|
+
* because catalog states are small (≤ 1000 dims).
|
|
37
|
+
*/
|
|
38
|
+
/** Apply a single RG step: aggregate groups of `factor` adjacent components. */
|
|
39
|
+
export function rgStep(s, step) {
|
|
40
|
+
const b = Math.max(1, Math.floor(step.factor));
|
|
41
|
+
if (b <= 1)
|
|
42
|
+
return { ...s, scale: s.scale + 1 };
|
|
43
|
+
const out = [];
|
|
44
|
+
for (let i = 0; i < s.vector.length; i += b) {
|
|
45
|
+
const block = s.vector.slice(i, Math.min(i + b, s.vector.length));
|
|
46
|
+
let v;
|
|
47
|
+
switch (step.aggregator) {
|
|
48
|
+
case "sum":
|
|
49
|
+
v = block.reduce((a, x) => a + x, 0);
|
|
50
|
+
break;
|
|
51
|
+
case "max":
|
|
52
|
+
v = Math.max(...block);
|
|
53
|
+
break;
|
|
54
|
+
case "min":
|
|
55
|
+
v = Math.min(...block);
|
|
56
|
+
break;
|
|
57
|
+
case "mean":
|
|
58
|
+
default:
|
|
59
|
+
v = block.reduce((a, x) => a + x, 0) / block.length;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
out.push(v);
|
|
63
|
+
}
|
|
64
|
+
const result = { vector: out, scale: s.scale + Math.log2(b) };
|
|
65
|
+
if (s.label !== undefined)
|
|
66
|
+
result.label = s.label;
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/** Iterate the RG flow until the state stops changing (fixed point) or N steps. */
|
|
70
|
+
export function rgFixedPoint(s0, step, maxIter = 50, tol = 1e-12) {
|
|
71
|
+
let cur = s0;
|
|
72
|
+
for (let i = 0; i < maxIter; i++) {
|
|
73
|
+
const next = rgStep(cur, step);
|
|
74
|
+
if (vecClose(cur.vector, next.vector, tol)) {
|
|
75
|
+
return { state: next, iterations: i + 1, reachedFixedPoint: true };
|
|
76
|
+
}
|
|
77
|
+
if (next.vector.length <= 1) {
|
|
78
|
+
return { state: next, iterations: i + 1, reachedFixedPoint: true };
|
|
79
|
+
}
|
|
80
|
+
cur = next;
|
|
81
|
+
}
|
|
82
|
+
return { state: cur, iterations: maxIter, reachedFixedPoint: false };
|
|
83
|
+
}
|
|
84
|
+
function vecClose(a, b, tol) {
|
|
85
|
+
if (a.length !== b.length)
|
|
86
|
+
return false;
|
|
87
|
+
for (let i = 0; i < a.length; i++)
|
|
88
|
+
if (Math.abs((a[i] ?? 0) - (b[i] ?? 0)) > tol)
|
|
89
|
+
return false;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
export function classifyRelevance(s0, step, perturbation, iterations = 20) {
|
|
93
|
+
// Apply RG `iterations` times to the perturbation only; measure growth.
|
|
94
|
+
let cur = [...perturbation];
|
|
95
|
+
let firstNorm = vecNorm(cur);
|
|
96
|
+
if (firstNorm < 1e-15)
|
|
97
|
+
return { eigenvalue: 0, class: "irrelevant" };
|
|
98
|
+
void s0; // RG flow linearised about fixed point — only step shape matters
|
|
99
|
+
let lastNorm = firstNorm;
|
|
100
|
+
let lastRatio = 1;
|
|
101
|
+
for (let k = 0; k < iterations; k++) {
|
|
102
|
+
const next = rgStep({ vector: cur, scale: 0 }, step).vector;
|
|
103
|
+
const nNorm = vecNorm(next);
|
|
104
|
+
if (nNorm < 1e-15) {
|
|
105
|
+
lastRatio = 0;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
lastRatio = nNorm / lastNorm;
|
|
109
|
+
cur = next;
|
|
110
|
+
lastNorm = nNorm;
|
|
111
|
+
if (cur.length <= 1)
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
// Eigenvalue λ ≈ growth ratio per iteration.
|
|
115
|
+
const eigenvalue = lastRatio;
|
|
116
|
+
let cls;
|
|
117
|
+
if (eigenvalue > 1 + 1e-3)
|
|
118
|
+
cls = "relevant";
|
|
119
|
+
else if (eigenvalue < 1 - 1e-3)
|
|
120
|
+
cls = "irrelevant";
|
|
121
|
+
else
|
|
122
|
+
cls = "marginal";
|
|
123
|
+
return { eigenvalue, class: cls };
|
|
124
|
+
}
|
|
125
|
+
function vecNorm(v) {
|
|
126
|
+
let s = 0;
|
|
127
|
+
for (const x of v)
|
|
128
|
+
s += x * x;
|
|
129
|
+
return Math.sqrt(s);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* AI-memory specific: given a catalog snapshot (one number per tool —
|
|
133
|
+
* e.g. recent invocation count), find the SMALLEST scale b at which
|
|
134
|
+
* coarse-graining yields ≤ targetSize components. Used by the skinny-
|
|
135
|
+
* capabilities surface to pick the right family-grouping automatically.
|
|
136
|
+
*/
|
|
137
|
+
export function smallestScaleForBudget(s0, step, targetSize, maxIter = 50) {
|
|
138
|
+
let cur = s0;
|
|
139
|
+
for (let i = 0; i < maxIter; i++) {
|
|
140
|
+
if (cur.vector.length <= targetSize)
|
|
141
|
+
return { state: cur, iterations: i };
|
|
142
|
+
cur = rgStep(cur, step);
|
|
143
|
+
}
|
|
144
|
+
return { state: cur, iterations: maxIter };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=rg_flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rg_flow.js","sourceRoot":"","sources":["../../src/chronosheaf/rg_flow.ts"],"names":[],"mappings":"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"}
|