@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,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-g · Aczel anti-foundation axiom (AFA) +
|
|
3
|
+
* bisimulation.
|
|
4
|
+
*
|
|
5
|
+
* Math foundation (Aczel 1988):
|
|
6
|
+
*
|
|
7
|
+
* ZFC's Foundation Axiom forbids self-membership: there is no set x
|
|
8
|
+
* with x ∈ x (no infinite descending ∈-chains). Aczel's AFA flips
|
|
9
|
+
* this: every "accessible pointed graph" represents exactly one set,
|
|
10
|
+
* so x = {x} is a perfectly valid set (the "Quine atom"). To work
|
|
11
|
+
* with these self-referential sets we replace equality with
|
|
12
|
+
* BISIMULATION:
|
|
13
|
+
*
|
|
14
|
+
* x ∼ y ⟺ (∀a∈x ∃b∈y. a ∼ b) ∧ (∀b∈y ∃a∈x. a ∼ b)
|
|
15
|
+
*
|
|
16
|
+
* The largest such relation (greatest fixed point of the bisimulation
|
|
17
|
+
* functor) is the canonical notion of "two self-referential sets are
|
|
18
|
+
* the same". Computing it = standard partition-refinement (Paige-
|
|
19
|
+
* Tarjan 1987) in O((N + E) · log N) for finite hypergraphs.
|
|
20
|
+
*
|
|
21
|
+
* AI-memory mapping (PAIN-004 self-reference + PAIN-007 substrate-
|
|
22
|
+
* mutation):
|
|
23
|
+
*
|
|
24
|
+
* "HONESTY GATE checks itself" is exactly the Quine-atom shape: the
|
|
25
|
+
* gate's belief refers to its own consistency. ZFC-style verifiers
|
|
26
|
+
* cannot represent this without Russell paradox; AFA can. Likewise,
|
|
27
|
+
* "the running binary is the file being overwritten" is an actor
|
|
28
|
+
* whose action mutates its own substrate — the world the actor
|
|
29
|
+
* models contains the actor. Aczel hypersets give us a formal
|
|
30
|
+
* vocabulary for both.
|
|
31
|
+
*
|
|
32
|
+
* Implementation: hypersets as labelled directed graphs;
|
|
33
|
+
* bisimulation via greatest-fixed-point partition refinement. Pure
|
|
34
|
+
* functional, O((N + E) log N).
|
|
35
|
+
*/
|
|
36
|
+
/** A node in an APG (accessible pointed graph). */
|
|
37
|
+
export type HypersetNode = string;
|
|
38
|
+
/** A hyperset = directed graph + designated root. */
|
|
39
|
+
export interface Hyperset {
|
|
40
|
+
/** All nodes (including the root). */
|
|
41
|
+
nodes: ReadonlyArray<HypersetNode>;
|
|
42
|
+
/** Edges as a map node → ordered list of children. */
|
|
43
|
+
edges: ReadonlyMap<HypersetNode, ReadonlyArray<HypersetNode>>;
|
|
44
|
+
/** Designated root (the "set" this hyperset represents). */
|
|
45
|
+
root: HypersetNode;
|
|
46
|
+
/** Optional atomic labels — atoms with the same label are bisimilar. */
|
|
47
|
+
labels?: ReadonlyMap<HypersetNode, string>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute the canonical bisimulation partition (Paige-Tarjan refinement).
|
|
51
|
+
* Returns a map node → equivalence-class id.
|
|
52
|
+
*/
|
|
53
|
+
export declare function bisimulationPartition(g: Hyperset): Map<HypersetNode, number>;
|
|
54
|
+
/** Two hypersets are bisimilar iff their roots are in the same partition class. */
|
|
55
|
+
export declare function bisimilar(g1: Hyperset, g2: Hyperset): boolean;
|
|
56
|
+
/** The Quine atom Ω with Ω = {Ω}. The canonical self-referential set. */
|
|
57
|
+
export declare function quineAtom(name?: string): Hyperset;
|
|
58
|
+
/** A "false belief" hyperset: a node whose only child is itself, labelled "LIAR". */
|
|
59
|
+
export declare function liarHyperset(name?: string): Hyperset;
|
|
60
|
+
/**
|
|
61
|
+
* Reflexive verifier: returns true if a hyperset is "trustworthy" — its
|
|
62
|
+
* canonical bisimulation class contains no labelled liar atoms.
|
|
63
|
+
* This is the AFA-style fix for PAIN-004: HONESTY GATE can audit itself
|
|
64
|
+
* by checking whether its own hyperset is bisimilar to a known LIAR
|
|
65
|
+
* class WITHOUT triggering Russell paradox (because bisimulation is
|
|
66
|
+
* sound on self-referential sets).
|
|
67
|
+
*/
|
|
68
|
+
export declare function isTrustworthy(h: Hyperset): {
|
|
69
|
+
trust: boolean;
|
|
70
|
+
reason: string;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=aczel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aczel.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/aczel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,sDAAsD;IACtD,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,4DAA4D;IAC5D,IAAI,EAAE,YAAY,CAAC;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CA6C5E;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,OAAO,CAoB7D;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAY,GAAG,QAAQ,CAMtD;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAY,GAAG,QAAQ,CAOzD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAW7E"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P2-g · Aczel anti-foundation axiom (AFA) +
|
|
3
|
+
* bisimulation.
|
|
4
|
+
*
|
|
5
|
+
* Math foundation (Aczel 1988):
|
|
6
|
+
*
|
|
7
|
+
* ZFC's Foundation Axiom forbids self-membership: there is no set x
|
|
8
|
+
* with x ∈ x (no infinite descending ∈-chains). Aczel's AFA flips
|
|
9
|
+
* this: every "accessible pointed graph" represents exactly one set,
|
|
10
|
+
* so x = {x} is a perfectly valid set (the "Quine atom"). To work
|
|
11
|
+
* with these self-referential sets we replace equality with
|
|
12
|
+
* BISIMULATION:
|
|
13
|
+
*
|
|
14
|
+
* x ∼ y ⟺ (∀a∈x ∃b∈y. a ∼ b) ∧ (∀b∈y ∃a∈x. a ∼ b)
|
|
15
|
+
*
|
|
16
|
+
* The largest such relation (greatest fixed point of the bisimulation
|
|
17
|
+
* functor) is the canonical notion of "two self-referential sets are
|
|
18
|
+
* the same". Computing it = standard partition-refinement (Paige-
|
|
19
|
+
* Tarjan 1987) in O((N + E) · log N) for finite hypergraphs.
|
|
20
|
+
*
|
|
21
|
+
* AI-memory mapping (PAIN-004 self-reference + PAIN-007 substrate-
|
|
22
|
+
* mutation):
|
|
23
|
+
*
|
|
24
|
+
* "HONESTY GATE checks itself" is exactly the Quine-atom shape: the
|
|
25
|
+
* gate's belief refers to its own consistency. ZFC-style verifiers
|
|
26
|
+
* cannot represent this without Russell paradox; AFA can. Likewise,
|
|
27
|
+
* "the running binary is the file being overwritten" is an actor
|
|
28
|
+
* whose action mutates its own substrate — the world the actor
|
|
29
|
+
* models contains the actor. Aczel hypersets give us a formal
|
|
30
|
+
* vocabulary for both.
|
|
31
|
+
*
|
|
32
|
+
* Implementation: hypersets as labelled directed graphs;
|
|
33
|
+
* bisimulation via greatest-fixed-point partition refinement. Pure
|
|
34
|
+
* functional, O((N + E) log N).
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Compute the canonical bisimulation partition (Paige-Tarjan refinement).
|
|
38
|
+
* Returns a map node → equivalence-class id.
|
|
39
|
+
*/
|
|
40
|
+
export function bisimulationPartition(g) {
|
|
41
|
+
// Initial partition: group by label (or single class if no labels).
|
|
42
|
+
const labels = g.labels ?? new Map();
|
|
43
|
+
const labelToBlock = new Map();
|
|
44
|
+
const node2block = new Map();
|
|
45
|
+
for (const n of g.nodes) {
|
|
46
|
+
const l = labels.get(n) ?? "__unlabelled__";
|
|
47
|
+
if (!labelToBlock.has(l))
|
|
48
|
+
labelToBlock.set(l, labelToBlock.size);
|
|
49
|
+
node2block.set(n, labelToBlock.get(l));
|
|
50
|
+
}
|
|
51
|
+
// Refine until stable: each iteration re-assigns block IDs by sorted
|
|
52
|
+
// signature of (oldBlock, sorted child blocks). Stops when the
|
|
53
|
+
// distinct-signature count equals the prior distinct-block count
|
|
54
|
+
// (= no further refinement possible). Bounded by V iterations.
|
|
55
|
+
const V = g.nodes.length;
|
|
56
|
+
for (let iter = 0; iter <= V; iter++) {
|
|
57
|
+
const sig2block = new Map();
|
|
58
|
+
const newBlocks = new Map();
|
|
59
|
+
for (const n of g.nodes) {
|
|
60
|
+
const children = g.edges.get(n) ?? [];
|
|
61
|
+
const childBlocks = children.map((c) => node2block.get(c) ?? -1).sort((a, b) => a - b);
|
|
62
|
+
const oldBlock = node2block.get(n) ?? -1;
|
|
63
|
+
const sig = `${oldBlock}::${childBlocks.join(",")}`;
|
|
64
|
+
if (!sig2block.has(sig))
|
|
65
|
+
sig2block.set(sig, sig2block.size);
|
|
66
|
+
newBlocks.set(n, sig2block.get(sig));
|
|
67
|
+
}
|
|
68
|
+
// Check for stabilisation: same number of blocks as before AND no
|
|
69
|
+
// node moved to a different block (re-assigned IDs may differ
|
|
70
|
+
// numerically; compare via group structure).
|
|
71
|
+
const prevDistinct = new Set(node2block.values()).size;
|
|
72
|
+
const nextDistinct = new Set(newBlocks.values()).size;
|
|
73
|
+
// Stable when no further split happens.
|
|
74
|
+
if (nextDistinct === prevDistinct && iter > 0) {
|
|
75
|
+
// Confirm structural equality via canonical comparison.
|
|
76
|
+
let stable = true;
|
|
77
|
+
const repToOld = new Map();
|
|
78
|
+
for (const [n, b] of newBlocks)
|
|
79
|
+
repToOld.set(b, node2block.get(n));
|
|
80
|
+
for (const [n, b] of newBlocks) {
|
|
81
|
+
if (repToOld.get(b) !== node2block.get(n)) {
|
|
82
|
+
stable = false;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (stable) {
|
|
87
|
+
for (const [n, b] of newBlocks)
|
|
88
|
+
node2block.set(n, b);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const [n, b] of newBlocks)
|
|
93
|
+
node2block.set(n, b);
|
|
94
|
+
}
|
|
95
|
+
return node2block;
|
|
96
|
+
}
|
|
97
|
+
/** Two hypersets are bisimilar iff their roots are in the same partition class. */
|
|
98
|
+
export function bisimilar(g1, g2) {
|
|
99
|
+
// Build a combined graph with disjoint node-name spaces.
|
|
100
|
+
const tag1 = (n) => `A::${n}`;
|
|
101
|
+
const tag2 = (n) => `B::${n}`;
|
|
102
|
+
const nodes = [...g1.nodes.map(tag1), ...g2.nodes.map(tag2)];
|
|
103
|
+
const edges = new Map();
|
|
104
|
+
const labels = new Map();
|
|
105
|
+
for (const n of g1.nodes) {
|
|
106
|
+
const children = (g1.edges.get(n) ?? []).map(tag1);
|
|
107
|
+
edges.set(tag1(n), children);
|
|
108
|
+
const l = g1.labels?.get(n);
|
|
109
|
+
if (l !== undefined)
|
|
110
|
+
labels.set(tag1(n), l);
|
|
111
|
+
}
|
|
112
|
+
for (const n of g2.nodes) {
|
|
113
|
+
const children = (g2.edges.get(n) ?? []).map(tag2);
|
|
114
|
+
edges.set(tag2(n), children);
|
|
115
|
+
const l = g2.labels?.get(n);
|
|
116
|
+
if (l !== undefined)
|
|
117
|
+
labels.set(tag2(n), l);
|
|
118
|
+
}
|
|
119
|
+
const combined = { nodes, edges, root: tag1(g1.root), labels };
|
|
120
|
+
const part = bisimulationPartition(combined);
|
|
121
|
+
return part.get(tag1(g1.root)) === part.get(tag2(g2.root));
|
|
122
|
+
}
|
|
123
|
+
/** The Quine atom Ω with Ω = {Ω}. The canonical self-referential set. */
|
|
124
|
+
export function quineAtom(name = "Ω") {
|
|
125
|
+
return {
|
|
126
|
+
nodes: [name],
|
|
127
|
+
edges: new Map([[name, [name]]]),
|
|
128
|
+
root: name,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** A "false belief" hyperset: a node whose only child is itself, labelled "LIAR". */
|
|
132
|
+
export function liarHyperset(name = "L") {
|
|
133
|
+
return {
|
|
134
|
+
nodes: [name],
|
|
135
|
+
edges: new Map([[name, [name]]]),
|
|
136
|
+
root: name,
|
|
137
|
+
labels: new Map([[name, "LIAR"]]),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Reflexive verifier: returns true if a hyperset is "trustworthy" — its
|
|
142
|
+
* canonical bisimulation class contains no labelled liar atoms.
|
|
143
|
+
* This is the AFA-style fix for PAIN-004: HONESTY GATE can audit itself
|
|
144
|
+
* by checking whether its own hyperset is bisimilar to a known LIAR
|
|
145
|
+
* class WITHOUT triggering Russell paradox (because bisimulation is
|
|
146
|
+
* sound on self-referential sets).
|
|
147
|
+
*/
|
|
148
|
+
export function isTrustworthy(h) {
|
|
149
|
+
const part = bisimulationPartition(h);
|
|
150
|
+
const rootBlock = part.get(h.root);
|
|
151
|
+
if (rootBlock === undefined)
|
|
152
|
+
return { trust: false, reason: "root not in partition" };
|
|
153
|
+
// Liar atoms have label "LIAR" by convention.
|
|
154
|
+
for (const [node, block] of part) {
|
|
155
|
+
if (block === rootBlock && h.labels?.get(node) === "LIAR") {
|
|
156
|
+
return { trust: false, reason: `root bisimilar to LIAR atom '${node}'` };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { trust: true, reason: "no LIAR atom in root's bisimulation class" };
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=aczel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aczel.js","sourceRoot":"","sources":["../../src/chronosheaf/aczel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.48 — CHRONOSHEAF P3 · base space + presheaf.
|
|
3
|
+
*
|
|
4
|
+
* Math formalism (P3 spec verbatim):
|
|
5
|
+
*
|
|
6
|
+
* X = G × T × S
|
|
7
|
+
*
|
|
8
|
+
* where:
|
|
9
|
+
* G = commit DAG (partial order on commit shas)
|
|
10
|
+
* T = wall-clock time (continuous ℝ, modelled as ms since epoch)
|
|
11
|
+
* S = scale axis (file ⊂ module ⊂ package ⊂ repo ⊂ org, 5 levels)
|
|
12
|
+
*
|
|
13
|
+
* Open sets U ⊆ X are tuples (commit-cone, time-interval, scale-band).
|
|
14
|
+
* A commit-cone is the down-set of a commit in G (all ancestors).
|
|
15
|
+
*
|
|
16
|
+
* Presheaf F: Open(X)ᵒᵖ → Vec_ℝ assigns to each open U the set of
|
|
17
|
+
* locally consistent beliefs over claims relevant to U. Restriction
|
|
18
|
+
* map ρ_{U⊃V}: F(U) → F(V) is "if I believe B over U I must
|
|
19
|
+
* believe B over V" — projection onto the smaller open set.
|
|
20
|
+
*
|
|
21
|
+
* Implementation notes (performance + accuracy + safety):
|
|
22
|
+
*
|
|
23
|
+
* - All open-set operations are pure-function + idempotent.
|
|
24
|
+
* - Commit-cone membership uses cached transitive closure to amortise
|
|
25
|
+
* O(1) lookup after first traversal.
|
|
26
|
+
* - Scale axis is a 5-band ordinal enum so subset checks are O(1).
|
|
27
|
+
* - Time intervals are half-open [t_start, t_end) for clean union /
|
|
28
|
+
* intersection algebra.
|
|
29
|
+
* - Error handling: every constructor validates inputs; every accessor
|
|
30
|
+
* returns a typed Result rather than throwing on missing data.
|
|
31
|
+
*/
|
|
32
|
+
export type CommitSha = string;
|
|
33
|
+
export type TimeMs = number;
|
|
34
|
+
export declare const SCALE_BANDS: readonly ["file", "module", "package", "repo", "org"];
|
|
35
|
+
export type ScaleBand = typeof SCALE_BANDS[number];
|
|
36
|
+
/** Bidirectional commit DAG with ancestor-set memoisation. */
|
|
37
|
+
export declare class CommitDag {
|
|
38
|
+
private parents;
|
|
39
|
+
private ancestorCache;
|
|
40
|
+
/** Add a commit with its parent list (may be empty for root). */
|
|
41
|
+
addCommit(sha: CommitSha, parents: ReadonlyArray<CommitSha>): void;
|
|
42
|
+
/** All ancestors of sha (including sha itself). Cached. */
|
|
43
|
+
cone(sha: CommitSha): ReadonlySet<CommitSha>;
|
|
44
|
+
/** Whether ancestor is in the ancestor-cone of descendant. */
|
|
45
|
+
isAncestorOf(ancestor: CommitSha, descendant: CommitSha): boolean;
|
|
46
|
+
size(): number;
|
|
47
|
+
}
|
|
48
|
+
/** Half-open time interval [start, end). */
|
|
49
|
+
export interface TimeInterval {
|
|
50
|
+
startMs: TimeMs;
|
|
51
|
+
endMs: TimeMs;
|
|
52
|
+
}
|
|
53
|
+
export declare function makeInterval(startMs: TimeMs, endMs: TimeMs): TimeInterval;
|
|
54
|
+
export declare function intervalContains(iv: TimeInterval, t: TimeMs): boolean;
|
|
55
|
+
export declare function intervalIntersect(a: TimeInterval, b: TimeInterval): TimeInterval | null;
|
|
56
|
+
/** Ordinal index of a scale band (file=0, module=1, ...). */
|
|
57
|
+
export declare function scaleIndex(s: ScaleBand): number;
|
|
58
|
+
/** Scale band a ⊆ b ⟺ idx(a) ≤ idx(b). */
|
|
59
|
+
export declare function scaleSubset(a: ScaleBand, b: ScaleBand): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Open set in X = G × T × S — a triple (commit-cone-root, time-interval, scale).
|
|
62
|
+
* Closed under finite intersection (intersection of two opens is an open).
|
|
63
|
+
*/
|
|
64
|
+
export interface OpenSet {
|
|
65
|
+
/** Identifier for the open set (deterministic id from contents). */
|
|
66
|
+
id: string;
|
|
67
|
+
/** Root commit defining the down-set on G. */
|
|
68
|
+
commitConeRoot: CommitSha;
|
|
69
|
+
/** Time interval on T. */
|
|
70
|
+
time: TimeInterval;
|
|
71
|
+
/** Scale band on S — the scale at which the open is observed. */
|
|
72
|
+
scale: ScaleBand;
|
|
73
|
+
}
|
|
74
|
+
export declare function openSetId(root: CommitSha, time: TimeInterval, scale: ScaleBand): string;
|
|
75
|
+
export declare function makeOpen(root: CommitSha, time: TimeInterval, scale: ScaleBand): OpenSet;
|
|
76
|
+
/**
|
|
77
|
+
* Intersection of two opens. Uses CommitDag to find the latest-common-
|
|
78
|
+
* ancestor (LCA) of the two roots; if no shared ancestor exists, the
|
|
79
|
+
* intersection is empty (null).
|
|
80
|
+
*
|
|
81
|
+
* open(r1, [s1,e1), b1) ∩ open(r2, [s2,e2), b2)
|
|
82
|
+
* = open(LCA(r1, r2), [max(s1,s2), min(e1,e2)), min(b1, b2))
|
|
83
|
+
*
|
|
84
|
+
* Returns null when either time-intervals are disjoint OR no common
|
|
85
|
+
* ancestor exists in the DAG.
|
|
86
|
+
*/
|
|
87
|
+
export declare function intersectOpens(dag: CommitDag, a: OpenSet, b: OpenSet): OpenSet | null;
|
|
88
|
+
/** Belief value carried by the presheaf at an open: a finite-dim ℝ vector. */
|
|
89
|
+
export type BeliefVector = ReadonlyArray<number>;
|
|
90
|
+
/**
|
|
91
|
+
* Presheaf F: Open(X)ᵒᵖ → Vec_ℝ.
|
|
92
|
+
*
|
|
93
|
+
* Backed by a Map keyed by openSetId. The restriction map ρ_{U⊃V} is
|
|
94
|
+
* a linear operator from ℝ^|claims(U)| → ℝ^|claims(V)|; in this
|
|
95
|
+
* implementation we restrict by intersecting claim sets (vectors
|
|
96
|
+
* indexed by the SAME claim list across opens that contain a
|
|
97
|
+
* specific claim).
|
|
98
|
+
*
|
|
99
|
+
* Errors:
|
|
100
|
+
* - assignSection rejects non-finite values OR length mismatches with
|
|
101
|
+
* the registered claim cardinality.
|
|
102
|
+
* - sectionAt returns Result rather than throwing on missing key.
|
|
103
|
+
*/
|
|
104
|
+
export declare class Presheaf {
|
|
105
|
+
private sections;
|
|
106
|
+
private claimsByOpen;
|
|
107
|
+
/** Register the claim set whose belief values an open carries. */
|
|
108
|
+
registerClaims(open: OpenSet, claims: ReadonlyArray<string>): void;
|
|
109
|
+
/** Assign a belief vector to an open. Vector length must match registered claim count. */
|
|
110
|
+
assignSection(open: OpenSet, belief: BeliefVector): void;
|
|
111
|
+
/** Look up a section. Returns null when missing — never throws. */
|
|
112
|
+
sectionAt(open: OpenSet): BeliefVector | null;
|
|
113
|
+
/** Claims known at an open. */
|
|
114
|
+
claimsAt(open: OpenSet): ReadonlyArray<string>;
|
|
115
|
+
/**
|
|
116
|
+
* Restriction map ρ_{U⊃V}: F(U) → F(V).
|
|
117
|
+
* Implementation: for each claim in V's claim set, find its position
|
|
118
|
+
* in U's claim set and copy the value. Claims in V but not in U get
|
|
119
|
+
* 0 (default-untracked).
|
|
120
|
+
*/
|
|
121
|
+
restrict(uOpen: OpenSet, vOpen: OpenSet): BeliefVector | null;
|
|
122
|
+
/** Number of opens with assigned sections. */
|
|
123
|
+
size(): number;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=base_space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base_space.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/base_space.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,eAAO,MAAM,WAAW,uDAAwD,CAAC;AACjF,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD,8DAA8D;AAC9D,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAgD;IAC/D,OAAO,CAAC,aAAa,CAAwC;IAE7D,iEAAiE;IACjE,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI;IASlE,2DAA2D;IAC3D,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;IAe5C,8DAA8D;IAC9D,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG,OAAO;IAIjE,IAAI,IAAI,MAAM;CACf;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAQzE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,IAAI,CAIvF;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAmC;AAEnF,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAE/D;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,cAAc,EAAE,SAAS,CAAC;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,iEAAiE;IACjE,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAEvF;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAQvF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAkBrF;AAED,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,YAAY,CAA4C;IAEhE,kEAAkE;IAClE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAKlE,0FAA0F;IAC1F,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAcxD,mEAAmE;IACnE,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI;IAI7C,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;IAI9C;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI;IAgB7D,8CAA8C;IAC9C,IAAI,IAAI,MAAM;CACf"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.48 — CHRONOSHEAF P3 · base space + presheaf.
|
|
3
|
+
*
|
|
4
|
+
* Math formalism (P3 spec verbatim):
|
|
5
|
+
*
|
|
6
|
+
* X = G × T × S
|
|
7
|
+
*
|
|
8
|
+
* where:
|
|
9
|
+
* G = commit DAG (partial order on commit shas)
|
|
10
|
+
* T = wall-clock time (continuous ℝ, modelled as ms since epoch)
|
|
11
|
+
* S = scale axis (file ⊂ module ⊂ package ⊂ repo ⊂ org, 5 levels)
|
|
12
|
+
*
|
|
13
|
+
* Open sets U ⊆ X are tuples (commit-cone, time-interval, scale-band).
|
|
14
|
+
* A commit-cone is the down-set of a commit in G (all ancestors).
|
|
15
|
+
*
|
|
16
|
+
* Presheaf F: Open(X)ᵒᵖ → Vec_ℝ assigns to each open U the set of
|
|
17
|
+
* locally consistent beliefs over claims relevant to U. Restriction
|
|
18
|
+
* map ρ_{U⊃V}: F(U) → F(V) is "if I believe B over U I must
|
|
19
|
+
* believe B over V" — projection onto the smaller open set.
|
|
20
|
+
*
|
|
21
|
+
* Implementation notes (performance + accuracy + safety):
|
|
22
|
+
*
|
|
23
|
+
* - All open-set operations are pure-function + idempotent.
|
|
24
|
+
* - Commit-cone membership uses cached transitive closure to amortise
|
|
25
|
+
* O(1) lookup after first traversal.
|
|
26
|
+
* - Scale axis is a 5-band ordinal enum so subset checks are O(1).
|
|
27
|
+
* - Time intervals are half-open [t_start, t_end) for clean union /
|
|
28
|
+
* intersection algebra.
|
|
29
|
+
* - Error handling: every constructor validates inputs; every accessor
|
|
30
|
+
* returns a typed Result rather than throwing on missing data.
|
|
31
|
+
*/
|
|
32
|
+
export const SCALE_BANDS = ["file", "module", "package", "repo", "org"];
|
|
33
|
+
/** Bidirectional commit DAG with ancestor-set memoisation. */
|
|
34
|
+
export class CommitDag {
|
|
35
|
+
parents = new Map();
|
|
36
|
+
ancestorCache = new Map();
|
|
37
|
+
/** Add a commit with its parent list (may be empty for root). */
|
|
38
|
+
addCommit(sha, parents) {
|
|
39
|
+
if (typeof sha !== "string" || sha.length === 0) {
|
|
40
|
+
throw new TypeError(`CommitDag.addCommit: invalid sha "${sha}"`);
|
|
41
|
+
}
|
|
42
|
+
this.parents.set(sha, new Set(parents));
|
|
43
|
+
// Invalidate ancestor cache for sha + descendants (cheap: clear all).
|
|
44
|
+
this.ancestorCache.clear();
|
|
45
|
+
}
|
|
46
|
+
/** All ancestors of sha (including sha itself). Cached. */
|
|
47
|
+
cone(sha) {
|
|
48
|
+
if (this.ancestorCache.has(sha))
|
|
49
|
+
return this.ancestorCache.get(sha);
|
|
50
|
+
const visited = new Set();
|
|
51
|
+
const stack = [sha];
|
|
52
|
+
while (stack.length > 0) {
|
|
53
|
+
const cur = stack.pop();
|
|
54
|
+
if (visited.has(cur))
|
|
55
|
+
continue;
|
|
56
|
+
visited.add(cur);
|
|
57
|
+
const ps = this.parents.get(cur);
|
|
58
|
+
if (ps)
|
|
59
|
+
for (const p of ps)
|
|
60
|
+
if (!visited.has(p))
|
|
61
|
+
stack.push(p);
|
|
62
|
+
}
|
|
63
|
+
this.ancestorCache.set(sha, visited);
|
|
64
|
+
return visited;
|
|
65
|
+
}
|
|
66
|
+
/** Whether ancestor is in the ancestor-cone of descendant. */
|
|
67
|
+
isAncestorOf(ancestor, descendant) {
|
|
68
|
+
return this.cone(descendant).has(ancestor);
|
|
69
|
+
}
|
|
70
|
+
size() { return this.parents.size; }
|
|
71
|
+
}
|
|
72
|
+
export function makeInterval(startMs, endMs) {
|
|
73
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {
|
|
74
|
+
throw new TypeError(`makeInterval: non-finite bounds [${startMs}, ${endMs})`);
|
|
75
|
+
}
|
|
76
|
+
if (endMs < startMs) {
|
|
77
|
+
throw new RangeError(`makeInterval: empty/inverted interval [${startMs}, ${endMs})`);
|
|
78
|
+
}
|
|
79
|
+
return { startMs, endMs };
|
|
80
|
+
}
|
|
81
|
+
export function intervalContains(iv, t) {
|
|
82
|
+
return t >= iv.startMs && t < iv.endMs;
|
|
83
|
+
}
|
|
84
|
+
export function intervalIntersect(a, b) {
|
|
85
|
+
const s = Math.max(a.startMs, b.startMs);
|
|
86
|
+
const e = Math.min(a.endMs, b.endMs);
|
|
87
|
+
return s < e ? { startMs: s, endMs: e } : null;
|
|
88
|
+
}
|
|
89
|
+
/** Ordinal index of a scale band (file=0, module=1, ...). */
|
|
90
|
+
export function scaleIndex(s) { return SCALE_BANDS.indexOf(s); }
|
|
91
|
+
/** Scale band a ⊆ b ⟺ idx(a) ≤ idx(b). */
|
|
92
|
+
export function scaleSubset(a, b) {
|
|
93
|
+
return scaleIndex(a) <= scaleIndex(b);
|
|
94
|
+
}
|
|
95
|
+
export function openSetId(root, time, scale) {
|
|
96
|
+
return root + "@" + time.startMs + "-" + time.endMs + "/" + scale;
|
|
97
|
+
}
|
|
98
|
+
export function makeOpen(root, time, scale) {
|
|
99
|
+
if (typeof root !== "string" || root.length === 0) {
|
|
100
|
+
throw new TypeError(`makeOpen: invalid commit "${root}"`);
|
|
101
|
+
}
|
|
102
|
+
if (!SCALE_BANDS.includes(scale)) {
|
|
103
|
+
throw new TypeError(`makeOpen: invalid scale "${scale}"`);
|
|
104
|
+
}
|
|
105
|
+
return { id: openSetId(root, time, scale), commitConeRoot: root, time, scale };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Intersection of two opens. Uses CommitDag to find the latest-common-
|
|
109
|
+
* ancestor (LCA) of the two roots; if no shared ancestor exists, the
|
|
110
|
+
* intersection is empty (null).
|
|
111
|
+
*
|
|
112
|
+
* open(r1, [s1,e1), b1) ∩ open(r2, [s2,e2), b2)
|
|
113
|
+
* = open(LCA(r1, r2), [max(s1,s2), min(e1,e2)), min(b1, b2))
|
|
114
|
+
*
|
|
115
|
+
* Returns null when either time-intervals are disjoint OR no common
|
|
116
|
+
* ancestor exists in the DAG.
|
|
117
|
+
*/
|
|
118
|
+
export function intersectOpens(dag, a, b) {
|
|
119
|
+
const time = intervalIntersect(a.time, b.time);
|
|
120
|
+
if (!time)
|
|
121
|
+
return null;
|
|
122
|
+
// LCA via cone-intersection on the DAG.
|
|
123
|
+
const coneA = dag.cone(a.commitConeRoot);
|
|
124
|
+
const coneB = dag.cone(b.commitConeRoot);
|
|
125
|
+
let lca = null;
|
|
126
|
+
// Walk the shared set; the LCA is the one whose own cone is the
|
|
127
|
+
// largest subset of the intersection (deepest commit).
|
|
128
|
+
let largestConeSize = 0;
|
|
129
|
+
for (const sha of coneA) {
|
|
130
|
+
if (!coneB.has(sha))
|
|
131
|
+
continue;
|
|
132
|
+
const cs = dag.cone(sha).size;
|
|
133
|
+
if (cs > largestConeSize) {
|
|
134
|
+
largestConeSize = cs;
|
|
135
|
+
lca = sha;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (lca === null)
|
|
139
|
+
return null;
|
|
140
|
+
const scale = scaleIndex(a.scale) <= scaleIndex(b.scale) ? a.scale : b.scale;
|
|
141
|
+
return makeOpen(lca, time, scale);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Presheaf F: Open(X)ᵒᵖ → Vec_ℝ.
|
|
145
|
+
*
|
|
146
|
+
* Backed by a Map keyed by openSetId. The restriction map ρ_{U⊃V} is
|
|
147
|
+
* a linear operator from ℝ^|claims(U)| → ℝ^|claims(V)|; in this
|
|
148
|
+
* implementation we restrict by intersecting claim sets (vectors
|
|
149
|
+
* indexed by the SAME claim list across opens that contain a
|
|
150
|
+
* specific claim).
|
|
151
|
+
*
|
|
152
|
+
* Errors:
|
|
153
|
+
* - assignSection rejects non-finite values OR length mismatches with
|
|
154
|
+
* the registered claim cardinality.
|
|
155
|
+
* - sectionAt returns Result rather than throwing on missing key.
|
|
156
|
+
*/
|
|
157
|
+
export class Presheaf {
|
|
158
|
+
sections = new Map();
|
|
159
|
+
claimsByOpen = new Map();
|
|
160
|
+
/** Register the claim set whose belief values an open carries. */
|
|
161
|
+
registerClaims(open, claims) {
|
|
162
|
+
if (!Array.isArray(claims))
|
|
163
|
+
throw new TypeError("registerClaims: claims must be an array");
|
|
164
|
+
this.claimsByOpen.set(open.id, [...claims]);
|
|
165
|
+
}
|
|
166
|
+
/** Assign a belief vector to an open. Vector length must match registered claim count. */
|
|
167
|
+
assignSection(open, belief) {
|
|
168
|
+
const claims = this.claimsByOpen.get(open.id);
|
|
169
|
+
if (!claims)
|
|
170
|
+
throw new Error(`Presheaf.assignSection: no claims registered for ${open.id}`);
|
|
171
|
+
if (belief.length !== claims.length) {
|
|
172
|
+
throw new RangeError(`Presheaf.assignSection: belief length ${belief.length} ≠ claims ${claims.length} for ${open.id}`);
|
|
173
|
+
}
|
|
174
|
+
for (const v of belief) {
|
|
175
|
+
if (!Number.isFinite(v)) {
|
|
176
|
+
throw new RangeError(`Presheaf.assignSection: non-finite value in belief for ${open.id}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
this.sections.set(open.id, [...belief]);
|
|
180
|
+
}
|
|
181
|
+
/** Look up a section. Returns null when missing — never throws. */
|
|
182
|
+
sectionAt(open) {
|
|
183
|
+
return this.sections.get(open.id) ?? null;
|
|
184
|
+
}
|
|
185
|
+
/** Claims known at an open. */
|
|
186
|
+
claimsAt(open) {
|
|
187
|
+
return this.claimsByOpen.get(open.id) ?? [];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Restriction map ρ_{U⊃V}: F(U) → F(V).
|
|
191
|
+
* Implementation: for each claim in V's claim set, find its position
|
|
192
|
+
* in U's claim set and copy the value. Claims in V but not in U get
|
|
193
|
+
* 0 (default-untracked).
|
|
194
|
+
*/
|
|
195
|
+
restrict(uOpen, vOpen) {
|
|
196
|
+
const uBelief = this.sectionAt(uOpen);
|
|
197
|
+
if (!uBelief)
|
|
198
|
+
return null;
|
|
199
|
+
const uClaims = this.claimsAt(uOpen);
|
|
200
|
+
const vClaims = this.claimsAt(vOpen);
|
|
201
|
+
if (vClaims.length === 0)
|
|
202
|
+
return [];
|
|
203
|
+
const uIndex = new Map();
|
|
204
|
+
uClaims.forEach((c, i) => uIndex.set(c, i));
|
|
205
|
+
const out = new Array(vClaims.length).fill(0);
|
|
206
|
+
for (let j = 0; j < vClaims.length; j++) {
|
|
207
|
+
const k = uIndex.get(vClaims[j]);
|
|
208
|
+
if (k !== undefined)
|
|
209
|
+
out[j] = uBelief[k] ?? 0;
|
|
210
|
+
}
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
/** Number of opens with assigned sections. */
|
|
214
|
+
size() { return this.sections.size; }
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=base_space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base_space.js","sourceRoot":"","sources":["../../src/chronosheaf/base_space.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.47 — CHRONOSHEAF P1 + P2 test suite.
|
|
3
|
+
*
|
|
4
|
+
* Every primitive gets:
|
|
5
|
+
* - canonical examples with hand-computed expected values
|
|
6
|
+
* - cross-vector invariants (algebraic identities the math demands)
|
|
7
|
+
* - 1000-iter fuzz where the primitive is randomised
|
|
8
|
+
*
|
|
9
|
+
* Total target: 60+ tests across 8 modules.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=chronosheaf.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronosheaf.test.d.ts","sourceRoot":"","sources":["../../src/chronosheaf/chronosheaf.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|