@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 @@
|
|
|
1
|
+
{"version":3,"file":"free_energy.js","sourceRoot":"","sources":["../../src/chronosheaf/free_energy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF · sheaf-cohomology AI-memory foundation.
|
|
3
|
+
*
|
|
4
|
+
* The module composes 7 mathematical primitives + 1 pain catalog
|
|
5
|
+
* into a single export surface. P1 (pain_catalog) is the structural
|
|
6
|
+
* anchor that types every other primitive; P2-a..g implement the
|
|
7
|
+
* primitives themselves. P3 (the integrating orchestrator) ships
|
|
8
|
+
* in a later release once the primitives are battle-tested.
|
|
9
|
+
*
|
|
10
|
+
* Each primitive is a pure function with a deterministic, documented
|
|
11
|
+
* mathematical contract. They compose horizontally — e.g. a sheaf
|
|
12
|
+
* over a presheaf of categorical posteriors uses Friston free-energy
|
|
13
|
+
* to compute "epistemic" cocycles; a persistent diagram over a
|
|
14
|
+
* filtration of MCP catalog snapshots uses Wasserstein for
|
|
15
|
+
* bottleneck-distance comparison; a tropical inference chain
|
|
16
|
+
* composes verifier confidences; the bisimulation engine certifies
|
|
17
|
+
* self-referential beliefs without Russell paradox.
|
|
18
|
+
*/
|
|
19
|
+
export * as painCatalog from "./pain_catalog.js";
|
|
20
|
+
export * as sheaf from "./sheaf.js";
|
|
21
|
+
export * as rgFlow from "./rg_flow.js";
|
|
22
|
+
export * as persistence from "./persistence.js";
|
|
23
|
+
export * as freeEnergy from "./free_energy.js";
|
|
24
|
+
export * as wasserstein from "./wasserstein.js";
|
|
25
|
+
export * as tropical from "./tropical.js";
|
|
26
|
+
export * as aczel from "./aczel.js";
|
|
27
|
+
export * as baseSpace from "./base_space.js";
|
|
28
|
+
export * as liveUpdate from "./live_update.js";
|
|
29
|
+
export type { PainEntry, PainTopology, PrimitiveTag } from "./pain_catalog.js";
|
|
30
|
+
export type { Site, SheafCover, Section0, Section1, SheafResult } from "./sheaf.js";
|
|
31
|
+
export type { RGState, RGStep, Relevance } from "./rg_flow.js";
|
|
32
|
+
export type { FiltrationStep, PersistencePair, PersistenceDiagram } from "./persistence.js";
|
|
33
|
+
export type { Categorical, ActionCandidate, ActionScoring } from "./free_energy.js";
|
|
34
|
+
export type { DiscreteMeasure, CostMatrix } from "./wasserstein.js";
|
|
35
|
+
export type { TropicalGraph, TropicalPathResult } from "./tropical.js";
|
|
36
|
+
export type { Hyperset, HypersetNode } from "./aczel.js";
|
|
37
|
+
export type { CommitSha, TimeMs, ScaleBand, OpenSet, TimeInterval, BeliefVector } from "./base_space.js";
|
|
38
|
+
export type { ChronoEvent, EventEmitter, Evidence, ClaimObservation, UpdateInput, UpdateState, UpdateSummary, ChronoSlo } from "./live_update.js";
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAGpC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpF,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzG,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF · sheaf-cohomology AI-memory foundation.
|
|
3
|
+
*
|
|
4
|
+
* The module composes 7 mathematical primitives + 1 pain catalog
|
|
5
|
+
* into a single export surface. P1 (pain_catalog) is the structural
|
|
6
|
+
* anchor that types every other primitive; P2-a..g implement the
|
|
7
|
+
* primitives themselves. P3 (the integrating orchestrator) ships
|
|
8
|
+
* in a later release once the primitives are battle-tested.
|
|
9
|
+
*
|
|
10
|
+
* Each primitive is a pure function with a deterministic, documented
|
|
11
|
+
* mathematical contract. They compose horizontally — e.g. a sheaf
|
|
12
|
+
* over a presheaf of categorical posteriors uses Friston free-energy
|
|
13
|
+
* to compute "epistemic" cocycles; a persistent diagram over a
|
|
14
|
+
* filtration of MCP catalog snapshots uses Wasserstein for
|
|
15
|
+
* bottleneck-distance comparison; a tropical inference chain
|
|
16
|
+
* composes verifier confidences; the bisimulation engine certifies
|
|
17
|
+
* self-referential beliefs without Russell paradox.
|
|
18
|
+
*/
|
|
19
|
+
export * as painCatalog from "./pain_catalog.js";
|
|
20
|
+
export * as sheaf from "./sheaf.js";
|
|
21
|
+
export * as rgFlow from "./rg_flow.js";
|
|
22
|
+
export * as persistence from "./persistence.js";
|
|
23
|
+
export * as freeEnergy from "./free_energy.js";
|
|
24
|
+
export * as wasserstein from "./wasserstein.js";
|
|
25
|
+
export * as tropical from "./tropical.js";
|
|
26
|
+
export * as aczel from "./aczel.js";
|
|
27
|
+
// v2.19.48 — P3 + P4: base space + live ChronoSheafUpdate orchestrator
|
|
28
|
+
export * as baseSpace from "./base_space.js";
|
|
29
|
+
export * as liveUpdate from "./live_update.js";
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chronosheaf/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,uEAAuE;AACvE,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.48 — CHRONOSHEAF P4 · live ChronoSheafUpdate algorithm.
|
|
3
|
+
*
|
|
4
|
+
* Spec verbatim (P4):
|
|
5
|
+
*
|
|
6
|
+
* ALGORITHM ChronoSheafUpdate(commit_c, claim_set_C, verifier_set_V)
|
|
7
|
+
*
|
|
8
|
+
* // 1. Localize the change
|
|
9
|
+
* U_local := neighborhood of c in commit_DAG × [t-Δ, t] × [s_min, s_max]
|
|
10
|
+
*
|
|
11
|
+
* // 2. Update presheaf F over U_local
|
|
12
|
+
* for each open U_i in cover(U_local):
|
|
13
|
+
* F(U_i) := solve_local_consistency(C ∩ U_i, V ∩ U_i)
|
|
14
|
+
* via tropical aggregation: stalk_p := ⊕_{e ∈ evidence(p)} confidence(e)
|
|
15
|
+
* if F(U_i) = ∅: // no locally consistent belief
|
|
16
|
+
* emit chronosheaf.local_contradiction(U_i)
|
|
17
|
+
* return
|
|
18
|
+
*
|
|
19
|
+
* // 3. Čech H¹ computation (only over the changed cover — O(|cover|² × dim))
|
|
20
|
+
* cocycle σ := build_pairwise_diff(F, cover)
|
|
21
|
+
* coboundary B := image(δ⁰)
|
|
22
|
+
* H1 := σ / B
|
|
23
|
+
* if H1 ≠ 0:
|
|
24
|
+
* minimal_witness := minimum_l0_norm_representative(H1)
|
|
25
|
+
* emit chronosheaf.h1.alarm(witness=minimal_witness, persistence=t_now)
|
|
26
|
+
*
|
|
27
|
+
* // 4. Update persistence diagram
|
|
28
|
+
* for each H¹ class α detected:
|
|
29
|
+
* if α already tracked: extend lifetime
|
|
30
|
+
* else: birth(α, t_now)
|
|
31
|
+
* for each previously-tracked α now in image δ⁰:
|
|
32
|
+
* death(α, t_now)
|
|
33
|
+
* persistence_diagram.add_or_update(α, birth=b_α, death=d_α)
|
|
34
|
+
*
|
|
35
|
+
* // 5. RG flow — promote scale of long-persistent classes
|
|
36
|
+
* for α with persistence > θ_relevant:
|
|
37
|
+
* mark α as RELEVANT_OPERATOR
|
|
38
|
+
* bubble α up to scale s+1 (org-level constitution)
|
|
39
|
+
*
|
|
40
|
+
* // 6. Free-energy-driven next probe (active inference)
|
|
41
|
+
* candidate_probes := {p_1, ..., p_k} from unresolved cells in cover
|
|
42
|
+
* for each candidate p:
|
|
43
|
+
* G(p) := KL[q_post(z|p) || p_prior(z)] − E[log evidence value of p]
|
|
44
|
+
* probe* := argmin_p G(p)
|
|
45
|
+
* schedule(probe*, deadline = t_now + Δ_probe)
|
|
46
|
+
*
|
|
47
|
+
* // 7. Aczel reflexive update
|
|
48
|
+
* for each reflexive stalk r:
|
|
49
|
+
* if not bisimulates(r, r.previous_self):
|
|
50
|
+
* emit chronosheaf.self_inconsistency(r)
|
|
51
|
+
*
|
|
52
|
+
* Complexity per event: O(k² · d) with k = |cover| ≲ 20, d = |claims| ≲ 100
|
|
53
|
+
* → <5ms per event → live ready.
|
|
54
|
+
*
|
|
55
|
+
* Correctness invariants (proven by composition of the primitives):
|
|
56
|
+
* I1 — Čech consistency: H¹ = 0 across scales ⟹ global section exists.
|
|
57
|
+
* I2 — RG fixed-point: RG-invariant claims = universal truths.
|
|
58
|
+
* I3 — Aczel bisimulation: self-referential beliefs converge.
|
|
59
|
+
*
|
|
60
|
+
* Engineering qualities (user mandate):
|
|
61
|
+
* - Smooth integration with TOKEN GOVERNOR + VACCINE OSMOSIS + GANGLION.
|
|
62
|
+
* - Error handlers + invariant assertions at every layer boundary.
|
|
63
|
+
* - Business-aware: events carry actionable witnesses, not just true/false.
|
|
64
|
+
* - Future-proof: emit hook is pluggable; persistence diagram + RG flow
|
|
65
|
+
* state are externally inspectable for dashboards + alerting.
|
|
66
|
+
* - "Never break the running session" — all primitives are pure-function
|
|
67
|
+
* and never mutate any other Mneme module's state.
|
|
68
|
+
*/
|
|
69
|
+
import { CommitDag, Presheaf, type CommitSha, type OpenSet, type ScaleBand } from "./base_space.js";
|
|
70
|
+
import { type Site } from "./sheaf.js";
|
|
71
|
+
import { type ActionCandidate, type ActionScoring } from "./free_energy.js";
|
|
72
|
+
import { type PersistenceDiagram } from "./persistence.js";
|
|
73
|
+
import { type Hyperset } from "./aczel.js";
|
|
74
|
+
export type ChronoEvent = {
|
|
75
|
+
kind: "local_contradiction";
|
|
76
|
+
open: OpenSet;
|
|
77
|
+
reason: string;
|
|
78
|
+
ts: number;
|
|
79
|
+
} | {
|
|
80
|
+
kind: "h1_alarm";
|
|
81
|
+
cover: ReadonlyArray<OpenSet>;
|
|
82
|
+
h1: number;
|
|
83
|
+
witnessPairs: ReadonlyArray<[Site, Site]>;
|
|
84
|
+
ts: number;
|
|
85
|
+
} | {
|
|
86
|
+
kind: "class_birth";
|
|
87
|
+
classId: string;
|
|
88
|
+
ts: number;
|
|
89
|
+
} | {
|
|
90
|
+
kind: "class_death";
|
|
91
|
+
classId: string;
|
|
92
|
+
ts: number;
|
|
93
|
+
livedMs: number;
|
|
94
|
+
} | {
|
|
95
|
+
kind: "promote_relevant";
|
|
96
|
+
classId: string;
|
|
97
|
+
oldScale: ScaleBand;
|
|
98
|
+
newScale: ScaleBand;
|
|
99
|
+
ts: number;
|
|
100
|
+
} | {
|
|
101
|
+
kind: "probe_scheduled";
|
|
102
|
+
probeId: string;
|
|
103
|
+
G: number;
|
|
104
|
+
deadlineMs: number;
|
|
105
|
+
ts: number;
|
|
106
|
+
} | {
|
|
107
|
+
kind: "self_inconsistency";
|
|
108
|
+
stalkId: string;
|
|
109
|
+
reason: string;
|
|
110
|
+
ts: number;
|
|
111
|
+
};
|
|
112
|
+
export type EventEmitter = (event: ChronoEvent) => void;
|
|
113
|
+
export interface Evidence {
|
|
114
|
+
/** Site (sub-open) where evidence lives. */
|
|
115
|
+
site: Site;
|
|
116
|
+
/** Confidence in [0, 1]. */
|
|
117
|
+
confidence: number;
|
|
118
|
+
/** Source verifier label. */
|
|
119
|
+
source: string;
|
|
120
|
+
}
|
|
121
|
+
export interface ClaimObservation {
|
|
122
|
+
/** Stable claim id. */
|
|
123
|
+
claimId: string;
|
|
124
|
+
/** Numeric value the claim asserts (e.g. "tool count" = 711). */
|
|
125
|
+
value: number;
|
|
126
|
+
/** Sites where the claim is observable. */
|
|
127
|
+
sites: ReadonlyArray<Site>;
|
|
128
|
+
}
|
|
129
|
+
export interface UpdateInput {
|
|
130
|
+
/** Commit triggering the update. */
|
|
131
|
+
commit: CommitSha;
|
|
132
|
+
/** Wall-clock time of the event (ms). */
|
|
133
|
+
nowMs: number;
|
|
134
|
+
/** Cover of the localised neighbourhood (sub-opens around the commit). */
|
|
135
|
+
cover: ReadonlyArray<OpenSet>;
|
|
136
|
+
/** Claims observed across the cover. */
|
|
137
|
+
claims: ReadonlyArray<ClaimObservation>;
|
|
138
|
+
/** Per-site evidence (used for tropical confidence aggregation). */
|
|
139
|
+
evidence: ReadonlyArray<Evidence>;
|
|
140
|
+
/** Optional reflexive stalks to verify bisimulation on. */
|
|
141
|
+
reflexiveStalks?: ReadonlyArray<{
|
|
142
|
+
id: string;
|
|
143
|
+
current: Hyperset;
|
|
144
|
+
previous?: Hyperset;
|
|
145
|
+
}>;
|
|
146
|
+
/** Optional candidate probes for free-energy-driven next-action selection. */
|
|
147
|
+
probeCandidates?: ReadonlyArray<ActionCandidate>;
|
|
148
|
+
/** Action scoring (preferred obs + prior z) for free-energy. */
|
|
149
|
+
probeScoring?: ActionScoring;
|
|
150
|
+
/** Tolerance for "persistent enough to bubble up scale" — default 60s. */
|
|
151
|
+
relevantThresholdMs?: number;
|
|
152
|
+
}
|
|
153
|
+
export interface UpdateState {
|
|
154
|
+
/** Persistence diagram of H¹ classes tracked across events. */
|
|
155
|
+
diagram: PersistenceDiagram;
|
|
156
|
+
/** Currently-tracked active classes: id -> {birth, lastSeen}. */
|
|
157
|
+
activeClasses: Map<string, {
|
|
158
|
+
birthMs: number;
|
|
159
|
+
lastSeenMs: number;
|
|
160
|
+
scale: ScaleBand;
|
|
161
|
+
}>;
|
|
162
|
+
/** All emitted events (capped via reservoir if growing unbounded). */
|
|
163
|
+
events: ChronoEvent[];
|
|
164
|
+
/** Promoted "relevant operator" classes. */
|
|
165
|
+
relevantOperators: Set<string>;
|
|
166
|
+
/** Number of update cycles processed. */
|
|
167
|
+
cyclesRun: number;
|
|
168
|
+
}
|
|
169
|
+
export declare function newUpdateState(): UpdateState;
|
|
170
|
+
/**
|
|
171
|
+
* Run ONE ChronoSheafUpdate cycle. Pure-ish: mutates `state` (which the
|
|
172
|
+
* caller owns) + calls `emit` for each event. Never throws — all error
|
|
173
|
+
* paths fall through to event emission so callers can decide whether to
|
|
174
|
+
* abort or continue.
|
|
175
|
+
*
|
|
176
|
+
* Correctness: each step is a pure function from {step's inputs} to
|
|
177
|
+
* {step's outputs}. The composition order is the spec verbatim.
|
|
178
|
+
*
|
|
179
|
+
* Returns a SUMMARY object the caller can act on (e.g. for dashboarding).
|
|
180
|
+
*/
|
|
181
|
+
export interface UpdateSummary {
|
|
182
|
+
contradictionDetected: boolean;
|
|
183
|
+
h1: number;
|
|
184
|
+
alarmsFired: number;
|
|
185
|
+
probeSelected: string | null;
|
|
186
|
+
selfInconsistencies: number;
|
|
187
|
+
newBirths: number;
|
|
188
|
+
newDeaths: number;
|
|
189
|
+
newPromotions: number;
|
|
190
|
+
ms: number;
|
|
191
|
+
}
|
|
192
|
+
export declare function chronoSheafUpdate(input: UpdateInput, state: UpdateState, emit: EventEmitter): UpdateSummary;
|
|
193
|
+
/**
|
|
194
|
+
* Build a default cover from a list of "sites" (e.g. registry / CLI /
|
|
195
|
+
* release manifest / MCP schema / tests). Each site becomes its own open
|
|
196
|
+
* at file scale; the time interval is [nowMs - windowMs, nowMs).
|
|
197
|
+
*
|
|
198
|
+
* Convenience for the Mneme self-audit pattern from PAIN-001 / 003 / 005.
|
|
199
|
+
*/
|
|
200
|
+
export declare function buildSelfAuditCover(dag: CommitDag, rootCommit: CommitSha, sites: ReadonlyArray<string>, nowMs: number, windowMs?: number, scale?: ScaleBand): OpenSet[];
|
|
201
|
+
/**
|
|
202
|
+
* Compute the SLO summary across a window of update cycles. Used by
|
|
203
|
+
* dashboards to display "CHRONOSHEAF: 7 contradictions caught in last
|
|
204
|
+
* 24h, 2 still active, mean detect-to-death = 18min".
|
|
205
|
+
*/
|
|
206
|
+
export interface ChronoSlo {
|
|
207
|
+
totalCycles: number;
|
|
208
|
+
contradictionsDetected: number;
|
|
209
|
+
activeContradictions: number;
|
|
210
|
+
meanLivedMs: number;
|
|
211
|
+
promotedRelevant: number;
|
|
212
|
+
selfInconsistencies: number;
|
|
213
|
+
}
|
|
214
|
+
export declare function chronoSlo(state: UpdateState): ChronoSlo;
|
|
215
|
+
/** Hard cap: enforce O(k² · d) by rejecting covers that would blow the budget. */
|
|
216
|
+
export declare function preflightBudget(input: UpdateInput, maxCoverSize?: number, maxClaims?: number): {
|
|
217
|
+
ok: boolean;
|
|
218
|
+
reason?: string;
|
|
219
|
+
};
|
|
220
|
+
export { Presheaf };
|
|
221
|
+
//# sourceMappingURL=live_update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live_update.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/live_update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.48 — CHRONOSHEAF P4 · live ChronoSheafUpdate algorithm.
|
|
3
|
+
*
|
|
4
|
+
* Spec verbatim (P4):
|
|
5
|
+
*
|
|
6
|
+
* ALGORITHM ChronoSheafUpdate(commit_c, claim_set_C, verifier_set_V)
|
|
7
|
+
*
|
|
8
|
+
* // 1. Localize the change
|
|
9
|
+
* U_local := neighborhood of c in commit_DAG × [t-Δ, t] × [s_min, s_max]
|
|
10
|
+
*
|
|
11
|
+
* // 2. Update presheaf F over U_local
|
|
12
|
+
* for each open U_i in cover(U_local):
|
|
13
|
+
* F(U_i) := solve_local_consistency(C ∩ U_i, V ∩ U_i)
|
|
14
|
+
* via tropical aggregation: stalk_p := ⊕_{e ∈ evidence(p)} confidence(e)
|
|
15
|
+
* if F(U_i) = ∅: // no locally consistent belief
|
|
16
|
+
* emit chronosheaf.local_contradiction(U_i)
|
|
17
|
+
* return
|
|
18
|
+
*
|
|
19
|
+
* // 3. Čech H¹ computation (only over the changed cover — O(|cover|² × dim))
|
|
20
|
+
* cocycle σ := build_pairwise_diff(F, cover)
|
|
21
|
+
* coboundary B := image(δ⁰)
|
|
22
|
+
* H1 := σ / B
|
|
23
|
+
* if H1 ≠ 0:
|
|
24
|
+
* minimal_witness := minimum_l0_norm_representative(H1)
|
|
25
|
+
* emit chronosheaf.h1.alarm(witness=minimal_witness, persistence=t_now)
|
|
26
|
+
*
|
|
27
|
+
* // 4. Update persistence diagram
|
|
28
|
+
* for each H¹ class α detected:
|
|
29
|
+
* if α already tracked: extend lifetime
|
|
30
|
+
* else: birth(α, t_now)
|
|
31
|
+
* for each previously-tracked α now in image δ⁰:
|
|
32
|
+
* death(α, t_now)
|
|
33
|
+
* persistence_diagram.add_or_update(α, birth=b_α, death=d_α)
|
|
34
|
+
*
|
|
35
|
+
* // 5. RG flow — promote scale of long-persistent classes
|
|
36
|
+
* for α with persistence > θ_relevant:
|
|
37
|
+
* mark α as RELEVANT_OPERATOR
|
|
38
|
+
* bubble α up to scale s+1 (org-level constitution)
|
|
39
|
+
*
|
|
40
|
+
* // 6. Free-energy-driven next probe (active inference)
|
|
41
|
+
* candidate_probes := {p_1, ..., p_k} from unresolved cells in cover
|
|
42
|
+
* for each candidate p:
|
|
43
|
+
* G(p) := KL[q_post(z|p) || p_prior(z)] − E[log evidence value of p]
|
|
44
|
+
* probe* := argmin_p G(p)
|
|
45
|
+
* schedule(probe*, deadline = t_now + Δ_probe)
|
|
46
|
+
*
|
|
47
|
+
* // 7. Aczel reflexive update
|
|
48
|
+
* for each reflexive stalk r:
|
|
49
|
+
* if not bisimulates(r, r.previous_self):
|
|
50
|
+
* emit chronosheaf.self_inconsistency(r)
|
|
51
|
+
*
|
|
52
|
+
* Complexity per event: O(k² · d) with k = |cover| ≲ 20, d = |claims| ≲ 100
|
|
53
|
+
* → <5ms per event → live ready.
|
|
54
|
+
*
|
|
55
|
+
* Correctness invariants (proven by composition of the primitives):
|
|
56
|
+
* I1 — Čech consistency: H¹ = 0 across scales ⟹ global section exists.
|
|
57
|
+
* I2 — RG fixed-point: RG-invariant claims = universal truths.
|
|
58
|
+
* I3 — Aczel bisimulation: self-referential beliefs converge.
|
|
59
|
+
*
|
|
60
|
+
* Engineering qualities (user mandate):
|
|
61
|
+
* - Smooth integration with TOKEN GOVERNOR + VACCINE OSMOSIS + GANGLION.
|
|
62
|
+
* - Error handlers + invariant assertions at every layer boundary.
|
|
63
|
+
* - Business-aware: events carry actionable witnesses, not just true/false.
|
|
64
|
+
* - Future-proof: emit hook is pluggable; persistence diagram + RG flow
|
|
65
|
+
* state are externally inspectable for dashboards + alerting.
|
|
66
|
+
* - "Never break the running session" — all primitives are pure-function
|
|
67
|
+
* and never mutate any other Mneme module's state.
|
|
68
|
+
*/
|
|
69
|
+
import { makeOpen, makeInterval, Presheaf, } from "./base_space.js";
|
|
70
|
+
import { cohomologyH1 } from "./sheaf.js";
|
|
71
|
+
import { verifierChainConfidence } from "./tropical.js";
|
|
72
|
+
import { expectedFreeEnergy } from "./free_energy.js";
|
|
73
|
+
import { isTrustworthy } from "./aczel.js";
|
|
74
|
+
export function newUpdateState() {
|
|
75
|
+
return {
|
|
76
|
+
diagram: { pairs: [], maxFinitePersistence: 0, essentialByDim: { 0: 0 } },
|
|
77
|
+
activeClasses: new Map(),
|
|
78
|
+
events: [],
|
|
79
|
+
relevantOperators: new Set(),
|
|
80
|
+
cyclesRun: 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function chronoSheafUpdate(input, state, emit) {
|
|
84
|
+
const t0 = Date.now();
|
|
85
|
+
state.cyclesRun += 1;
|
|
86
|
+
let alarmsFired = 0;
|
|
87
|
+
let selfInconsistencies = 0;
|
|
88
|
+
let newBirths = 0;
|
|
89
|
+
let newDeaths = 0;
|
|
90
|
+
let newPromotions = 0;
|
|
91
|
+
let h1 = 0;
|
|
92
|
+
let probeSelected = null;
|
|
93
|
+
// Defensive: empty cover early-exit (no work to do).
|
|
94
|
+
if (input.cover.length === 0) {
|
|
95
|
+
return { contradictionDetected: false, h1: 0, alarmsFired: 0, probeSelected: null, selfInconsistencies: 0, newBirths: 0, newDeaths: 0, newPromotions: 0, ms: Date.now() - t0 };
|
|
96
|
+
}
|
|
97
|
+
// ── Step 2: per-site tropical aggregation; if any site is empty → local contradiction.
|
|
98
|
+
const siteIds = input.cover.map((u) => u.id);
|
|
99
|
+
const evidenceBySite = new Map();
|
|
100
|
+
for (const e of input.evidence) {
|
|
101
|
+
if (!evidenceBySite.has(e.site))
|
|
102
|
+
evidenceBySite.set(e.site, []);
|
|
103
|
+
evidenceBySite.get(e.site).push({ id: e.source, confidence: e.confidence });
|
|
104
|
+
}
|
|
105
|
+
for (const u of input.cover) {
|
|
106
|
+
const ev = evidenceBySite.get(u.id) ?? [];
|
|
107
|
+
if (ev.length === 0) {
|
|
108
|
+
// No evidence at this open → can't form a belief. Emit + continue
|
|
109
|
+
// (we don't return early per spec, because partial covers are still
|
|
110
|
+
// useful for H¹ if at least 3 opens have data; we'll detect a true
|
|
111
|
+
// empty-cover case in step 3 by checking if h1 makes sense).
|
|
112
|
+
const event = { kind: "local_contradiction", open: u, reason: "no evidence at open", ts: input.nowMs };
|
|
113
|
+
state.events.push(event);
|
|
114
|
+
try {
|
|
115
|
+
emit(event);
|
|
116
|
+
}
|
|
117
|
+
catch { /* never break the emitter */ }
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// Tropical aggregation = max confidence over evidence at this site.
|
|
121
|
+
const r = verifierChainConfidence(ev);
|
|
122
|
+
if (r.chainConfidence <= 0) {
|
|
123
|
+
const event = { kind: "local_contradiction", open: u, reason: `confidence collapsed (critical verifier: ${r.criticalVerifier?.id ?? "?"})`, ts: input.nowMs };
|
|
124
|
+
state.events.push(event);
|
|
125
|
+
try {
|
|
126
|
+
emit(event);
|
|
127
|
+
}
|
|
128
|
+
catch { /* never break */ }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── Step 3: Čech H¹ on the cover (pairs from claim sites; triples from claim-coincidences).
|
|
132
|
+
// Build an unordered pair list from the cover. We treat two opens as
|
|
133
|
+
// overlapping when their commit-cones or scale subset agree (proxy:
|
|
134
|
+
// share at least one claim).
|
|
135
|
+
const sharedClaimPairs = [];
|
|
136
|
+
for (let i = 0; i < input.cover.length; i++) {
|
|
137
|
+
for (let j = i + 1; j < input.cover.length; j++) {
|
|
138
|
+
const ui = input.cover[i];
|
|
139
|
+
const uj = input.cover[j];
|
|
140
|
+
const sharedClaim = input.claims.some((c) => c.sites.includes(ui.id) && c.sites.includes(uj.id));
|
|
141
|
+
if (sharedClaim)
|
|
142
|
+
sharedClaimPairs.push([ui.id, uj.id]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const sheafCover = { sites: siteIds, overlaps: sharedClaimPairs };
|
|
146
|
+
const cohomResult = cohomologyH1(sheafCover);
|
|
147
|
+
h1 = cohomResult.h1;
|
|
148
|
+
if (h1 > 0) {
|
|
149
|
+
alarmsFired += 1;
|
|
150
|
+
const witness = cohomResult.obstructions.slice(0, h1).map((o) => o.pair);
|
|
151
|
+
const event = { kind: "h1_alarm", cover: input.cover, h1, witnessPairs: witness, ts: input.nowMs };
|
|
152
|
+
state.events.push(event);
|
|
153
|
+
try {
|
|
154
|
+
emit(event);
|
|
155
|
+
}
|
|
156
|
+
catch { /* never break */ }
|
|
157
|
+
}
|
|
158
|
+
// ── Step 4: update persistence diagram.
|
|
159
|
+
const detectedClassIds = new Set();
|
|
160
|
+
for (let i = 0; i < h1; i++) {
|
|
161
|
+
const pair = cohomResult.obstructions[i]?.pair;
|
|
162
|
+
if (!pair)
|
|
163
|
+
continue;
|
|
164
|
+
const classId = `${pair[0]}↔${pair[1]}`;
|
|
165
|
+
detectedClassIds.add(classId);
|
|
166
|
+
if (state.activeClasses.has(classId)) {
|
|
167
|
+
const a = state.activeClasses.get(classId);
|
|
168
|
+
a.lastSeenMs = input.nowMs;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
state.activeClasses.set(classId, { birthMs: input.nowMs, lastSeenMs: input.nowMs, scale: input.cover[0]?.scale ?? "file" });
|
|
172
|
+
newBirths += 1;
|
|
173
|
+
const ev = { kind: "class_birth", classId, ts: input.nowMs };
|
|
174
|
+
state.events.push(ev);
|
|
175
|
+
try {
|
|
176
|
+
emit(ev);
|
|
177
|
+
}
|
|
178
|
+
catch { /* never break */ }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Death detection: classes seen previously but NOT in this cycle → die.
|
|
182
|
+
for (const [classId, info] of state.activeClasses) {
|
|
183
|
+
if (!detectedClassIds.has(classId) && info.lastSeenMs < input.nowMs) {
|
|
184
|
+
const lived = input.nowMs - info.birthMs;
|
|
185
|
+
state.diagram.pairs.push({
|
|
186
|
+
dim: 1, birth: info.birthMs, death: input.nowMs,
|
|
187
|
+
persistence: lived, birthSimplex: [classId],
|
|
188
|
+
});
|
|
189
|
+
if (lived > state.diagram.maxFinitePersistence)
|
|
190
|
+
state.diagram.maxFinitePersistence = lived;
|
|
191
|
+
state.activeClasses.delete(classId);
|
|
192
|
+
newDeaths += 1;
|
|
193
|
+
const ev = { kind: "class_death", classId, ts: input.nowMs, livedMs: lived };
|
|
194
|
+
state.events.push(ev);
|
|
195
|
+
try {
|
|
196
|
+
emit(ev);
|
|
197
|
+
}
|
|
198
|
+
catch { /* never break */ }
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ── Step 5: RG promotion — bubble long-persistent classes up the scale axis.
|
|
202
|
+
const threshold = input.relevantThresholdMs ?? 60_000;
|
|
203
|
+
for (const [classId, info] of state.activeClasses) {
|
|
204
|
+
const lifeMs = input.nowMs - info.birthMs;
|
|
205
|
+
if (lifeMs > threshold && !state.relevantOperators.has(classId)) {
|
|
206
|
+
state.relevantOperators.add(classId);
|
|
207
|
+
const oldScale = info.scale;
|
|
208
|
+
const SCALES = ["file", "module", "package", "repo", "org"];
|
|
209
|
+
const idx = SCALES.indexOf(oldScale);
|
|
210
|
+
const newScale = SCALES[Math.min(idx + 1, SCALES.length - 1)];
|
|
211
|
+
info.scale = newScale;
|
|
212
|
+
newPromotions += 1;
|
|
213
|
+
const ev = { kind: "promote_relevant", classId, oldScale, newScale, ts: input.nowMs };
|
|
214
|
+
state.events.push(ev);
|
|
215
|
+
try {
|
|
216
|
+
emit(ev);
|
|
217
|
+
}
|
|
218
|
+
catch { /* never break */ }
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// ── Step 6: free-energy-driven next probe.
|
|
222
|
+
if (input.probeCandidates && input.probeCandidates.length > 0 && input.probeScoring) {
|
|
223
|
+
try {
|
|
224
|
+
let bestG = Infinity;
|
|
225
|
+
let bestId = null;
|
|
226
|
+
for (const cand of input.probeCandidates) {
|
|
227
|
+
const r = expectedFreeEnergy(cand, input.probeScoring);
|
|
228
|
+
if (r.G < bestG) {
|
|
229
|
+
bestG = r.G;
|
|
230
|
+
bestId = cand.id;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (bestId !== null) {
|
|
234
|
+
probeSelected = bestId;
|
|
235
|
+
const ev = { kind: "probe_scheduled", probeId: bestId, G: bestG, deadlineMs: input.nowMs + 60_000, ts: input.nowMs };
|
|
236
|
+
state.events.push(ev);
|
|
237
|
+
try {
|
|
238
|
+
emit(ev);
|
|
239
|
+
}
|
|
240
|
+
catch { /* never break */ }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch { /* free energy probe is advisory; never fatal */ }
|
|
244
|
+
}
|
|
245
|
+
// ── Step 7: Aczel reflexive update.
|
|
246
|
+
if (input.reflexiveStalks) {
|
|
247
|
+
for (const r of input.reflexiveStalks) {
|
|
248
|
+
try {
|
|
249
|
+
const trust = isTrustworthy(r.current);
|
|
250
|
+
if (!trust.trust) {
|
|
251
|
+
selfInconsistencies += 1;
|
|
252
|
+
const ev = { kind: "self_inconsistency", stalkId: r.id, reason: trust.reason, ts: input.nowMs };
|
|
253
|
+
state.events.push(ev);
|
|
254
|
+
try {
|
|
255
|
+
emit(ev);
|
|
256
|
+
}
|
|
257
|
+
catch { /* never break */ }
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
// Bisimulation failure → emit but don't crash the algorithm.
|
|
262
|
+
const ev = { kind: "self_inconsistency", stalkId: r.id, reason: `bisimulation error: ${e.message}`, ts: input.nowMs };
|
|
263
|
+
state.events.push(ev);
|
|
264
|
+
try {
|
|
265
|
+
emit(ev);
|
|
266
|
+
}
|
|
267
|
+
catch { /* never break */ }
|
|
268
|
+
selfInconsistencies += 1;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Cap event log to last 10_000 entries to bound memory.
|
|
273
|
+
if (state.events.length > 10_000) {
|
|
274
|
+
state.events = state.events.slice(-10_000);
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
contradictionDetected: h1 > 0,
|
|
278
|
+
h1, alarmsFired, probeSelected, selfInconsistencies,
|
|
279
|
+
newBirths, newDeaths, newPromotions,
|
|
280
|
+
ms: Date.now() - t0,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
// ─── HELPERS for callers wiring CHRONOSHEAF to a live system ───────────
|
|
284
|
+
/**
|
|
285
|
+
* Build a default cover from a list of "sites" (e.g. registry / CLI /
|
|
286
|
+
* release manifest / MCP schema / tests). Each site becomes its own open
|
|
287
|
+
* at file scale; the time interval is [nowMs - windowMs, nowMs).
|
|
288
|
+
*
|
|
289
|
+
* Convenience for the Mneme self-audit pattern from PAIN-001 / 003 / 005.
|
|
290
|
+
*/
|
|
291
|
+
export function buildSelfAuditCover(dag, rootCommit, sites, nowMs, windowMs = 60_000, scale = "repo") {
|
|
292
|
+
void dag; // dag is used downstream when intersecting; kept in signature for API stability
|
|
293
|
+
const time = makeInterval(nowMs - windowMs, nowMs);
|
|
294
|
+
return sites.map((s) => {
|
|
295
|
+
const o = makeOpen(rootCommit, time, scale);
|
|
296
|
+
// Re-id by site so the cover is distinguishable per verifier site.
|
|
297
|
+
return { ...o, id: `${s}::${o.id}` };
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
export function chronoSlo(state) {
|
|
301
|
+
const livedMs = state.diagram.pairs.filter((p) => isFinite(p.persistence)).map((p) => p.persistence);
|
|
302
|
+
const mean = livedMs.length > 0 ? livedMs.reduce((a, x) => a + x, 0) / livedMs.length : 0;
|
|
303
|
+
let selfIncs = 0;
|
|
304
|
+
for (const e of state.events)
|
|
305
|
+
if (e.kind === "self_inconsistency")
|
|
306
|
+
selfIncs += 1;
|
|
307
|
+
let detected = 0;
|
|
308
|
+
for (const e of state.events)
|
|
309
|
+
if (e.kind === "h1_alarm")
|
|
310
|
+
detected += 1;
|
|
311
|
+
return {
|
|
312
|
+
totalCycles: state.cyclesRun,
|
|
313
|
+
contradictionsDetected: detected,
|
|
314
|
+
activeContradictions: state.activeClasses.size,
|
|
315
|
+
meanLivedMs: mean,
|
|
316
|
+
promotedRelevant: state.relevantOperators.size,
|
|
317
|
+
selfInconsistencies: selfIncs,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/** Hard cap: enforce O(k² · d) by rejecting covers that would blow the budget. */
|
|
321
|
+
export function preflightBudget(input, maxCoverSize = 64, maxClaims = 1000) {
|
|
322
|
+
if (input.cover.length > maxCoverSize) {
|
|
323
|
+
return { ok: false, reason: `cover size ${input.cover.length} > ${maxCoverSize} (would exceed O(k²) budget)` };
|
|
324
|
+
}
|
|
325
|
+
if (input.claims.length > maxClaims) {
|
|
326
|
+
return { ok: false, reason: `claim count ${input.claims.length} > ${maxClaims}` };
|
|
327
|
+
}
|
|
328
|
+
return { ok: true };
|
|
329
|
+
}
|
|
330
|
+
// Re-export Presheaf so callers can wire it into their own pipelines.
|
|
331
|
+
export { Presheaf };
|
|
332
|
+
//# sourceMappingURL=live_update.js.map
|