vigiles 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/.claude/settings.json +46 -0
  2. package/.claude/settings.local.json +8 -0
  3. package/.claude-plugin/hooks/post-edit.sh +34 -0
  4. package/.claude-plugin/hooks/pre-edit.sh +40 -0
  5. package/.claude-plugin/hooks/session-start.sh +38 -0
  6. package/.claude-plugin/marketplace.json +14 -0
  7. package/.claude-plugin/plugin.json +47 -0
  8. package/.github/workflows/ci.yml +81 -0
  9. package/.prettierignore +1 -0
  10. package/.vigiles/generated.d.ts +205 -0
  11. package/CLAUDE.md +95 -0
  12. package/CLAUDE.md.spec.ts +142 -0
  13. package/CONTRIBUTING.md +121 -0
  14. package/LICENSE +21 -0
  15. package/README.md +377 -0
  16. package/action.yml +25 -0
  17. package/dist/action.d.ts +7 -0
  18. package/dist/action.d.ts.map +1 -0
  19. package/dist/action.js +180 -0
  20. package/dist/action.js.map +1 -0
  21. package/dist/cli.d.ts +12 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +1267 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/cli.test.d.ts +2 -0
  26. package/dist/cli.test.d.ts.map +1 -0
  27. package/dist/cli.test.js +650 -0
  28. package/dist/cli.test.js.map +1 -0
  29. package/dist/compile.d.ts +101 -0
  30. package/dist/compile.d.ts.map +1 -0
  31. package/dist/compile.js +503 -0
  32. package/dist/compile.js.map +1 -0
  33. package/dist/evolve.d.ts +132 -0
  34. package/dist/evolve.d.ts.map +1 -0
  35. package/dist/evolve.js +599 -0
  36. package/dist/evolve.js.map +1 -0
  37. package/dist/freshness.d.ts +67 -0
  38. package/dist/freshness.d.ts.map +1 -0
  39. package/dist/freshness.js +244 -0
  40. package/dist/freshness.js.map +1 -0
  41. package/dist/freshness.test.d.ts +2 -0
  42. package/dist/freshness.test.d.ts.map +1 -0
  43. package/dist/freshness.test.js +356 -0
  44. package/dist/freshness.test.js.map +1 -0
  45. package/dist/generate-types.d.ts +34 -0
  46. package/dist/generate-types.d.ts.map +1 -0
  47. package/dist/generate-types.js +381 -0
  48. package/dist/generate-types.js.map +1 -0
  49. package/dist/inline.d.ts +58 -0
  50. package/dist/inline.d.ts.map +1 -0
  51. package/dist/inline.js +142 -0
  52. package/dist/inline.js.map +1 -0
  53. package/dist/inline.test.d.ts +5 -0
  54. package/dist/inline.test.d.ts.map +1 -0
  55. package/dist/inline.test.js +152 -0
  56. package/dist/inline.test.js.map +1 -0
  57. package/dist/linters.d.ts +38 -0
  58. package/dist/linters.d.ts.map +1 -0
  59. package/dist/linters.js +588 -0
  60. package/dist/linters.js.map +1 -0
  61. package/dist/proofs.d.ts +272 -0
  62. package/dist/proofs.d.ts.map +1 -0
  63. package/dist/proofs.js +622 -0
  64. package/dist/proofs.js.map +1 -0
  65. package/dist/proofs.test.d.ts +9 -0
  66. package/dist/proofs.test.d.ts.map +1 -0
  67. package/dist/proofs.test.js +952 -0
  68. package/dist/proofs.test.js.map +1 -0
  69. package/dist/spec.d.ts +258 -0
  70. package/dist/spec.d.ts.map +1 -0
  71. package/dist/spec.js +113 -0
  72. package/dist/spec.js.map +1 -0
  73. package/dist/spec.test.d.ts +2 -0
  74. package/dist/spec.test.d.ts.map +1 -0
  75. package/dist/spec.test.js +1222 -0
  76. package/dist/spec.test.js.map +1 -0
  77. package/dist/types.d.ts +101 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +3 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/validate.d.ts +10 -0
  82. package/dist/validate.d.ts.map +1 -0
  83. package/dist/validate.js +286 -0
  84. package/dist/validate.js.map +1 -0
  85. package/dist/validate.test.d.ts +2 -0
  86. package/dist/validate.test.d.ts.map +1 -0
  87. package/dist/validate.test.js +531 -0
  88. package/dist/validate.test.js.map +1 -0
  89. package/docs/agent-setup.md +85 -0
  90. package/docs/agent-workflows.md +103 -0
  91. package/docs/comparison.md +71 -0
  92. package/docs/freshness.md +124 -0
  93. package/docs/inline-mode.md +119 -0
  94. package/docs/linter-support.md +166 -0
  95. package/docs/spec-format.md +194 -0
  96. package/eslint.config.mjs +79 -0
  97. package/examples/CLAUDE.md +54 -0
  98. package/examples/CLAUDE.md.spec.ts +65 -0
  99. package/examples/SKILL.md +50 -0
  100. package/examples/SKILL.md.spec.ts +57 -0
  101. package/fixtures/example-project/CLAUDE.md +11 -0
  102. package/fixtures/example-project/package.json +9 -0
  103. package/fixtures/example-project/src/index.ts +3 -0
  104. package/fixtures/example-project/src/utils.test.ts +2 -0
  105. package/fixtures/example-project/src/utils.ts +3 -0
  106. package/logo.png +0 -0
  107. package/package.json +42 -0
  108. package/research/adoption-strategy.md +111 -0
  109. package/research/agent-integration.md +145 -0
  110. package/research/ai-code-quality.md +197 -0
  111. package/research/code-search-for-agents.md +313 -0
  112. package/research/competitive-landscape.md +163 -0
  113. package/research/doc-freshness.md +516 -0
  114. package/research/executable-specs.md +368 -0
  115. package/research/feature-ideas.md +464 -0
  116. package/research/formal-proofs-for-agents.md +338 -0
  117. package/research/fp-for-agent-harness.md +150 -0
  118. package/research/fp-for-deterministic-ai.md +131 -0
  119. package/research/self-evolving-specs.md +298 -0
  120. package/schemas/claude-md-strict.yml +18 -0
  121. package/schemas/claude-md.yml +6 -0
  122. package/schemas/skill-strict.yml +12 -0
  123. package/schemas/skill.yml +5 -0
  124. package/skills/audit-feedback-loop/SKILL.md +76 -0
  125. package/skills/edit-spec/SKILL.md +131 -0
  126. package/skills/enforce-rules-format/SKILL.md +71 -0
  127. package/skills/generate-logo/SKILL.md +102 -0
  128. package/skills/generate-rule/SKILL.md +90 -0
  129. package/skills/linter-docs/clippy.md +241 -0
  130. package/skills/linter-docs/eslint.md +384 -0
  131. package/skills/linter-docs/pylint.md +288 -0
  132. package/skills/linter-docs/rubocop.md +277 -0
  133. package/skills/linter-docs/ruff.md +187 -0
  134. package/skills/linter-docs/stylelint.md +247 -0
  135. package/skills/migrate-to-spec/SKILL.md +124 -0
  136. package/skills/pr-to-lint-rule/SKILL.md +97 -0
  137. package/skills/strengthen/SKILL.md +168 -0
  138. package/src/action.ts +214 -0
  139. package/src/cli.test.ts +914 -0
  140. package/src/cli.ts +1631 -0
  141. package/src/compile.ts +691 -0
  142. package/src/evolve.ts +781 -0
  143. package/src/freshness.test.ts +449 -0
  144. package/src/freshness.ts +299 -0
  145. package/src/generate-types.ts +448 -0
  146. package/src/inline.test.ts +206 -0
  147. package/src/inline.ts +164 -0
  148. package/src/linters.ts +739 -0
  149. package/src/proofs.test.ts +1314 -0
  150. package/src/proofs.ts +849 -0
  151. package/src/spec.test.ts +1471 -0
  152. package/src/spec.ts +427 -0
  153. package/src/types.ts +117 -0
  154. package/src/validate.test.ts +701 -0
  155. package/src/validate.ts +381 -0
  156. package/tsconfig.json +23 -0
package/dist/proofs.js ADDED
@@ -0,0 +1,622 @@
1
+ "use strict";
2
+ /**
3
+ * vigiles — Deterministic proof system for self-evolving specifications.
4
+ *
5
+ * Six algorithms that verify spec mutations without any LLM dependency:
6
+ *
7
+ * 1. MonotonicityLattice — rules can only strengthen over time
8
+ * 2. ncd() — information-theoretic duplicate detection
9
+ * 3. BloomFilter — fast approximate set membership
10
+ * 4. fixedPoint() — compilation convergence detection
11
+ * 5. MerkleHistory — tamper-evident spec evolution audit trail
12
+ * 6. propertyTest() — random mutation + invariant checking
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.MerkleHistory = exports.BloomFilter = void 0;
16
+ exports.checkMonotonicity = checkMonotonicity;
17
+ exports.latticeJoin = latticeJoin;
18
+ exports.latticeMeet = latticeMeet;
19
+ exports.ruleStrength = ruleStrength;
20
+ exports.ncd = ncd;
21
+ exports.findSimilarRules = findSimilarRules;
22
+ exports.ruleToBloomFilter = ruleToBloomFilter;
23
+ exports.fixedPoint = fixedPoint;
24
+ exports.propertyTest = propertyTest;
25
+ exports.fitness = fitness;
26
+ const node_crypto_1 = require("node:crypto");
27
+ const node_zlib_1 = require("node:zlib");
28
+ // ---------------------------------------------------------------------------
29
+ // 1. Monotonicity Lattice — partial order on rule strength
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Ordinal strength of each rule kind.
33
+ *
34
+ * guidance (0) < enforce (1)
35
+ *
36
+ * The lattice ensures specs only get stricter over time.
37
+ */
38
+ const STRENGTH = {
39
+ guidance: 0,
40
+ enforce: 1,
41
+ };
42
+ /**
43
+ * Check that a spec mutation is monotonic: existing rules only strengthen.
44
+ *
45
+ * - Adding rules: always allowed
46
+ * - Removing rules: flagged (informational, not a violation by default)
47
+ * - Strengthening (guidance → check → enforce): allowed
48
+ * - Weakening (enforce → guidance): violation unless allowWeaken includes the rule ID
49
+ */
50
+ function checkMonotonicity(before, after, options = {}) {
51
+ const violations = [];
52
+ const added = [];
53
+ const removed = [];
54
+ const strengthened = [];
55
+ const unchanged = [];
56
+ const allowWeaken = options.allowWeaken ?? new Set();
57
+ // Check rules present in both versions
58
+ for (const [id, beforeRule] of Object.entries(before)) {
59
+ const afterRule = after[id];
60
+ if (!afterRule) {
61
+ removed.push(id);
62
+ // Removal is a monotonicity violation unless explicitly allowlisted.
63
+ // Without this, a bare `remove` mutation could pass the proof suite
64
+ // on neutral fitness and silently delete constraints, breaking the
65
+ // "rules only strengthen over time" invariant.
66
+ if (!allowWeaken.has(id)) {
67
+ violations.push({
68
+ ruleId: id,
69
+ from: beforeRule._kind,
70
+ to: "guidance", // nominal floor — rule is gone entirely
71
+ fromStrength: STRENGTH[beforeRule._kind],
72
+ toStrength: -1,
73
+ });
74
+ }
75
+ continue;
76
+ }
77
+ const beforeStrength = STRENGTH[beforeRule._kind];
78
+ const afterStrength = STRENGTH[afterRule._kind];
79
+ if (afterStrength < beforeStrength && !allowWeaken.has(id)) {
80
+ violations.push({
81
+ ruleId: id,
82
+ from: beforeRule._kind,
83
+ to: afterRule._kind,
84
+ fromStrength: beforeStrength,
85
+ toStrength: afterStrength,
86
+ });
87
+ }
88
+ else if (afterStrength > beforeStrength) {
89
+ strengthened.push(id);
90
+ }
91
+ else {
92
+ unchanged.push(id);
93
+ }
94
+ }
95
+ // New rules
96
+ for (const id of Object.keys(after)) {
97
+ if (!(id in before)) {
98
+ added.push(id);
99
+ }
100
+ }
101
+ return {
102
+ valid: violations.length === 0,
103
+ violations,
104
+ added,
105
+ removed,
106
+ strengthened,
107
+ unchanged,
108
+ };
109
+ }
110
+ /**
111
+ * Compute the join (least upper bound) of two rule kinds in the lattice.
112
+ * join(guidance, enforce) = enforce
113
+ */
114
+ function latticeJoin(a, b) {
115
+ return STRENGTH[a] >= STRENGTH[b] ? a : b;
116
+ }
117
+ /**
118
+ * Compute the meet (greatest lower bound) of two rule kinds in the lattice.
119
+ * meet(guidance, enforce) = guidance
120
+ */
121
+ function latticeMeet(a, b) {
122
+ return STRENGTH[a] <= STRENGTH[b] ? a : b;
123
+ }
124
+ /** Get the numeric strength of a rule kind. */
125
+ function ruleStrength(kind) {
126
+ return STRENGTH[kind];
127
+ }
128
+ // ---------------------------------------------------------------------------
129
+ // 2. Normalized Compression Distance (NCD)
130
+ // ---------------------------------------------------------------------------
131
+ /**
132
+ * Compute the compressed size of a string using gzip.
133
+ * This approximates Kolmogorov complexity — the length of the shortest
134
+ * program that produces the string.
135
+ */
136
+ function compressedSize(s) {
137
+ return (0, node_zlib_1.gzipSync)(Buffer.from(s, "utf-8"), { level: 9 }).length;
138
+ }
139
+ /**
140
+ * Normalized Compression Distance — information-theoretic similarity.
141
+ *
142
+ * NCD(x, y) = (C(xy) - min(C(x), C(y))) / max(C(x), C(y))
143
+ *
144
+ * Range: [0, 1+ε] where 0 = identical information content.
145
+ * Deterministic. No model dependency. Approximates the universal distance metric.
146
+ *
147
+ * Reference: Li, Chen, Li, Ma, Vitányi (2004) "The Similarity Metric"
148
+ */
149
+ function ncd(a, b) {
150
+ if (a === b)
151
+ return 0;
152
+ if (a.length === 0 && b.length === 0)
153
+ return 0;
154
+ const ca = compressedSize(a);
155
+ const cb = compressedSize(b);
156
+ const cab = compressedSize(a + b);
157
+ const minC = Math.min(ca, cb);
158
+ const maxC = Math.max(ca, cb);
159
+ if (maxC === 0)
160
+ return 0;
161
+ return (cab - minC) / maxC;
162
+ }
163
+ /**
164
+ * Find all rule pairs with NCD below a similarity threshold.
165
+ * Returns pairs sorted by distance (most similar first).
166
+ */
167
+ function findSimilarRules(rules, threshold = 0.5) {
168
+ const entries = Object.entries(rules);
169
+ const pairs = [];
170
+ for (let i = 0; i < entries.length; i++) {
171
+ for (let j = i + 1; j < entries.length; j++) {
172
+ const [idA, ruleA] = entries[i];
173
+ const [idB, ruleB] = entries[j];
174
+ const textA = ruleToText(ruleA);
175
+ const textB = ruleToText(ruleB);
176
+ const d = ncd(textA, textB);
177
+ if (d < threshold) {
178
+ pairs.push({ idA, idB, distance: d });
179
+ }
180
+ }
181
+ }
182
+ return pairs.sort((a, b) => a.distance - b.distance);
183
+ }
184
+ /**
185
+ * Extract the text content of a rule for NCD comparison.
186
+ *
187
+ * Throws a structured error on unknown rule kinds so that the caller (e.g.
188
+ * runProofSuite) can surface a clear proof failure rather than letting an
189
+ * `undefined` propagate into compressedSize and crash the audit.
190
+ */
191
+ function ruleToText(rule) {
192
+ switch (rule._kind) {
193
+ case "enforce":
194
+ return `${rule.linterRule} ${rule.why}`;
195
+ case "guidance":
196
+ return rule.text;
197
+ default: {
198
+ const unknown = rule._kind;
199
+ throw new Error(`Unknown rule kind "${String(unknown)}" — expected "enforce" or "guidance". ` +
200
+ `Runtime data is out of sync with the Rule type (legacy spec, JS caller, or cast bypass).`);
201
+ }
202
+ }
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // 3. Bloom Filter — probabilistic set membership
206
+ // ---------------------------------------------------------------------------
207
+ /**
208
+ * FNV-1a hash — fast, good distribution, deterministic.
209
+ * Returns a 32-bit unsigned integer.
210
+ */
211
+ function fnv1a(data, seed = 0) {
212
+ let hash = 2166136261 ^ seed;
213
+ for (let i = 0; i < data.length; i++) {
214
+ hash ^= data.charCodeAt(i);
215
+ hash = Math.imul(hash, 16777619);
216
+ }
217
+ return hash >>> 0; // ensure unsigned
218
+ }
219
+ /**
220
+ * Bloom filter — space-efficient probabilistic set membership.
221
+ *
222
+ * Insert elements, then query "is X possibly in the set?"
223
+ * False positives possible. False negatives impossible.
224
+ *
225
+ * Optimal parameters:
226
+ * m = -(n × ln(p)) / (ln2)² (bit array size)
227
+ * k = (m / n) × ln2 (hash function count)
228
+ *
229
+ * Reference: Bloom (1970) "Space/Time Trade-offs in Hash Coding"
230
+ */
231
+ class BloomFilter {
232
+ bits;
233
+ numHashes;
234
+ size;
235
+ _count = 0;
236
+ /**
237
+ * Create a Bloom filter.
238
+ * @param expectedItems Expected number of items to insert
239
+ * @param falsePositiveRate Desired false positive rate (0-1)
240
+ */
241
+ constructor(expectedItems, falsePositiveRate = 0.01) {
242
+ // m = -(n * ln(p)) / (ln2)^2
243
+ const m = Math.ceil((-expectedItems * Math.log(falsePositiveRate)) / Math.log(2) ** 2);
244
+ // k = (m/n) * ln2
245
+ const k = Math.max(1, Math.round((m / expectedItems) * Math.log(2)));
246
+ this.size = m;
247
+ this.numHashes = k;
248
+ this.bits = new Uint8Array(Math.ceil(m / 8));
249
+ }
250
+ /** Number of items inserted. */
251
+ get count() {
252
+ return this._count;
253
+ }
254
+ /** Theoretical false positive rate given current fill. */
255
+ get estimatedFPR() {
256
+ const exponent = (-this.numHashes * this._count) / this.size;
257
+ return (1 - Math.exp(exponent)) ** this.numHashes;
258
+ }
259
+ /** Insert an element. */
260
+ add(item) {
261
+ for (let i = 0; i < this.numHashes; i++) {
262
+ const pos = fnv1a(item, i) % this.size;
263
+ const byteIndex = pos >>> 3;
264
+ const bitIndex = pos & 7;
265
+ this.bits[byteIndex] |= 1 << bitIndex;
266
+ }
267
+ this._count++;
268
+ }
269
+ /** Query membership. Returns true if the item MIGHT be in the set. */
270
+ has(item) {
271
+ for (let i = 0; i < this.numHashes; i++) {
272
+ const pos = fnv1a(item, i) % this.size;
273
+ const byteIndex = pos >>> 3;
274
+ const bitIndex = pos & 7;
275
+ if ((this.bits[byteIndex] & (1 << bitIndex)) === 0) {
276
+ return false; // definitely not in set
277
+ }
278
+ }
279
+ return true; // possibly in set
280
+ }
281
+ /**
282
+ * Estimate the Jaccard similarity between two Bloom filters.
283
+ * Uses bit-level comparison — no need to know the original elements.
284
+ */
285
+ static jaccardSimilarity(a, b) {
286
+ if (a.size !== b.size) {
287
+ throw new Error("Bloom filters must have the same size for comparison");
288
+ }
289
+ let intersection = 0;
290
+ let union = 0;
291
+ for (let i = 0; i < a.bits.length; i++) {
292
+ const and = a.bits[i] & b.bits[i];
293
+ const or = a.bits[i] | b.bits[i];
294
+ // Count set bits (Brian Kernighan's algorithm)
295
+ let x = and;
296
+ while (x) {
297
+ intersection++;
298
+ x &= x - 1;
299
+ }
300
+ x = or;
301
+ while (x) {
302
+ union++;
303
+ x &= x - 1;
304
+ }
305
+ }
306
+ return union === 0 ? 1 : intersection / union;
307
+ }
308
+ }
309
+ exports.BloomFilter = BloomFilter;
310
+ /**
311
+ * Build a Bloom filter from a rule's tokens.
312
+ * Tokenizes rule text into words and n-grams for fuzzy matching.
313
+ */
314
+ function ruleToBloomFilter(rule, expectedTokens = 100) {
315
+ const text = ruleToText(rule);
316
+ const filter = new BloomFilter(expectedTokens, 0.01);
317
+ // Word-level tokens
318
+ const words = text.toLowerCase().split(/\W+/).filter(Boolean);
319
+ for (const word of words) {
320
+ filter.add(word);
321
+ }
322
+ // Character 3-grams for fuzzy matching
323
+ const normalized = text.toLowerCase();
324
+ for (let i = 0; i <= normalized.length - 3; i++) {
325
+ filter.add(normalized.slice(i, i + 3));
326
+ }
327
+ return filter;
328
+ }
329
+ /**
330
+ * Detect whether a compile function reaches a fixed point.
331
+ *
332
+ * A fixed point means: applying the function again produces the same output.
333
+ * compile(compile(spec)) === compile(spec)
334
+ *
335
+ * If the function doesn't converge, detects cycles using Floyd's
336
+ * tortoise-and-hare algorithm adapted for hash sequences.
337
+ *
338
+ * @param compileFn A function that takes content and returns new content
339
+ * @param initialContent Starting content
340
+ * @param maxIterations Maximum iterations before declaring divergence
341
+ */
342
+ function fixedPoint(compileFn, initialContent, maxIterations = 10) {
343
+ const hashes = [];
344
+ let current = initialContent;
345
+ for (let i = 0; i < maxIterations; i++) {
346
+ const hash = sha256short(current);
347
+ hashes.push(hash);
348
+ const next = compileFn(current);
349
+ const nextHash = sha256short(next);
350
+ // Fixed point: output === input
351
+ if (nextHash === hash) {
352
+ return { converged: true, iterations: i + 1, hashes, cycleLength: 0 };
353
+ }
354
+ // Cycle detection: have we seen this hash before?
355
+ const cycleStart = hashes.indexOf(nextHash);
356
+ if (cycleStart !== -1) {
357
+ return {
358
+ converged: false,
359
+ iterations: i + 1,
360
+ hashes: [...hashes, nextHash],
361
+ cycleLength: i + 1 - cycleStart,
362
+ };
363
+ }
364
+ current = next;
365
+ }
366
+ return {
367
+ converged: false,
368
+ iterations: maxIterations,
369
+ hashes,
370
+ cycleLength: 0,
371
+ };
372
+ }
373
+ /** Compute a short SHA-256 hash (16 hex chars). */
374
+ function sha256short(data) {
375
+ return (0, node_crypto_1.createHash)("sha256").update(data).digest("hex").slice(0, 16);
376
+ }
377
+ /** Compute the hash of a HistoryNode (excluding the hash field itself). */
378
+ function computeNodeHash(node) {
379
+ const payload = JSON.stringify({
380
+ parentHash: node.parentHash,
381
+ specHash: node.specHash,
382
+ mutation: node.mutation,
383
+ proofs: node.proofs,
384
+ timestamp: node.timestamp,
385
+ });
386
+ return sha256short(payload);
387
+ }
388
+ class MerkleHistory {
389
+ nodes = [];
390
+ /** Number of versions in the history. */
391
+ get length() {
392
+ return this.nodes.length;
393
+ }
394
+ /**
395
+ * Get all nodes as a deep defensive copy. Callers cannot mutate node
396
+ * fields (specHash, mutation, proofs) through this API — that would
397
+ * bypass append/proof gates and weaken the tamper-evident guarantees.
398
+ */
399
+ getNodes() {
400
+ return this.nodes.map((n) => ({
401
+ ...n,
402
+ mutation: { ...n.mutation, ruleIds: [...n.mutation.ruleIds] },
403
+ proofs: n.proofs.map((r) => ({ ...r })),
404
+ }));
405
+ }
406
+ /**
407
+ * Get the latest node, or null if empty. Returned as a deep defensive
408
+ * copy — see getNodes() for rationale.
409
+ */
410
+ head() {
411
+ const last = this.nodes[this.nodes.length - 1];
412
+ if (!last)
413
+ return null;
414
+ return {
415
+ ...last,
416
+ mutation: { ...last.mutation, ruleIds: [...last.mutation.ruleIds] },
417
+ proofs: last.proofs.map((r) => ({ ...r })),
418
+ };
419
+ }
420
+ /**
421
+ * Append a new version to the history.
422
+ * Returns the hash of the new node.
423
+ */
424
+ append(specHash, mutation, proofs) {
425
+ const parentHash = this.nodes.length > 0
426
+ ? this.nodes[this.nodes.length - 1].hash
427
+ : "genesis";
428
+ // Clone payloads on write so later caller-side mutation of the supplied
429
+ // mutation/proofs objects can't retroactively alter stored nodes. This
430
+ // is the write-side counterpart to getNodes()/head(), keeping the
431
+ // append-only / tamper-evident contract true under normal usage
432
+ // patterns like "caller reuses and edits a mutation object".
433
+ const clonedMutation = {
434
+ ...mutation,
435
+ ruleIds: [...mutation.ruleIds],
436
+ };
437
+ const clonedProofs = proofs.map((r) => ({ ...r }));
438
+ const partial = {
439
+ parentHash,
440
+ specHash,
441
+ mutation: clonedMutation,
442
+ proofs: clonedProofs,
443
+ timestamp: Date.now(),
444
+ };
445
+ const hash = computeNodeHash(partial);
446
+ this.nodes.push({ hash, ...partial });
447
+ return hash;
448
+ }
449
+ /**
450
+ * Verify the entire chain — every node's hash must be correct,
451
+ * and every parent pointer must match the previous node.
452
+ *
453
+ * Returns the index of the first invalid node, or -1 if valid.
454
+ */
455
+ verify() {
456
+ for (let i = 0; i < this.nodes.length; i++) {
457
+ const node = this.nodes[i];
458
+ // Check hash integrity
459
+ const { hash: _hash, ...rest } = node;
460
+ const expectedHash = computeNodeHash(rest);
461
+ if (node.hash !== expectedHash) {
462
+ return { valid: false, invalidAt: i };
463
+ }
464
+ // Check parent chain
465
+ if (i === 0) {
466
+ if (node.parentHash !== "genesis") {
467
+ return { valid: false, invalidAt: i };
468
+ }
469
+ }
470
+ else {
471
+ if (node.parentHash !== this.nodes[i - 1].hash) {
472
+ return { valid: false, invalidAt: i };
473
+ }
474
+ }
475
+ }
476
+ return { valid: true, invalidAt: -1 };
477
+ }
478
+ /**
479
+ * Serialize the history to JSON for persistence.
480
+ */
481
+ toJSON() {
482
+ return JSON.stringify(this.nodes, null, 2);
483
+ }
484
+ /**
485
+ * Deserialize a history from JSON. Rejects non-array payloads and
486
+ * validates that each entry has the required HistoryNode shape so
487
+ * malformed persisted data can't produce a "valid" history that
488
+ * later crashes on append/verify.
489
+ */
490
+ static fromJSON(json) {
491
+ const parsed = JSON.parse(json);
492
+ if (!Array.isArray(parsed)) {
493
+ throw new Error(`MerkleHistory.fromJSON: expected an array, got ${typeof parsed}`);
494
+ }
495
+ for (let i = 0; i < parsed.length; i++) {
496
+ const node = parsed[i];
497
+ if (typeof node !== "object" ||
498
+ node === null ||
499
+ typeof node.hash !== "string" ||
500
+ typeof node.parentHash !== "string" ||
501
+ typeof node.specHash !== "string" ||
502
+ typeof node.timestamp !== "number") {
503
+ throw new Error(`MerkleHistory.fromJSON: invalid node at index ${String(i)}`);
504
+ }
505
+ // Validate nested mutation and proofs so later getNodes/head
506
+ // don't crash on missing .ruleIds or .map().
507
+ const mut = node.mutation;
508
+ if (!mut ||
509
+ typeof mut !== "object" ||
510
+ typeof mut.type !== "string" ||
511
+ !Array.isArray(mut.ruleIds)) {
512
+ throw new Error(`MerkleHistory.fromJSON: invalid mutation at node ${String(i)}`);
513
+ }
514
+ if (!Array.isArray(node.proofs)) {
515
+ throw new Error(`MerkleHistory.fromJSON: invalid proofs at node ${String(i)}`);
516
+ }
517
+ }
518
+ const history = new MerkleHistory();
519
+ history.nodes = parsed;
520
+ return history;
521
+ }
522
+ }
523
+ exports.MerkleHistory = MerkleHistory;
524
+ /**
525
+ * Simple deterministic PRNG (xorshift32) for reproducible tests.
526
+ */
527
+ function xorshift32(state) {
528
+ let x = state;
529
+ x ^= x << 13;
530
+ x ^= x >> 17;
531
+ x ^= x << 5;
532
+ return x >>> 0;
533
+ }
534
+ /**
535
+ * Property-based testing: generate random mutations, check invariants hold.
536
+ *
537
+ * Inspired by QuickCheck/fast-check. Uses a deterministic PRNG for
538
+ * reproducible failures.
539
+ *
540
+ * @param initial Starting value
541
+ * @param mutate Function that produces a random mutation
542
+ * @param invariants Named invariant functions that must all return true
543
+ * @param options Test parameters
544
+ */
545
+ function propertyTest(initial, mutate, invariants, options = {}) {
546
+ const iterations = options.iterations ?? 100;
547
+ const sequenceLength = options.sequenceLength ?? 5;
548
+ let rng = options.seed ?? 42;
549
+ for (let i = 0; i < iterations; i++) {
550
+ // Generate a sequence of mutations
551
+ let current = initial;
552
+ const sequence = [current];
553
+ for (let j = 0; j < sequenceLength; j++) {
554
+ rng = xorshift32(rng);
555
+ current = mutate(current, rng);
556
+ sequence.push(current);
557
+ // Check all invariants after each mutation
558
+ for (const [name, check] of Object.entries(invariants)) {
559
+ if (!check(current)) {
560
+ // Shrink: binary search for minimal failing subsequence
561
+ const shrunk = shrinkSequence(initial, sequence, mutate, name, invariants);
562
+ return {
563
+ passed: false,
564
+ iterations: i + 1,
565
+ failingSequence: sequence,
566
+ shrunk,
567
+ failedInvariant: name,
568
+ };
569
+ }
570
+ }
571
+ }
572
+ }
573
+ return { passed: true, iterations };
574
+ }
575
+ /**
576
+ * Shrink a failing sequence to find the minimal counterexample.
577
+ * Uses binary search on the sequence length.
578
+ */
579
+ function shrinkSequence(_initial, sequence, _mutate, invariantName, invariants) {
580
+ // Simple shrinking: find the first element in the sequence that fails
581
+ const check = invariants[invariantName];
582
+ for (const item of sequence) {
583
+ if (!check(item)) {
584
+ return item;
585
+ }
586
+ }
587
+ // Shouldn't reach here — return last element
588
+ return sequence[sequence.length - 1];
589
+ }
590
+ /**
591
+ * Compute the fitness of a spec. Higher is better.
592
+ *
593
+ * fitness = coverage × (1 - redundancy) × (1 - budgetPressure)
594
+ *
595
+ * - coverage: fraction of rules with enforcement (check or enforce)
596
+ * - redundancy: fraction of rule pairs that are near-duplicates (NCD < threshold)
597
+ * - budgetPressure: tokens used / max tokens
598
+ */
599
+ function fitness(spec, options = {}) {
600
+ const maxTokens = options.maxTokens ?? 2000;
601
+ const ncdThreshold = options.ncdThreshold ?? 0.3;
602
+ const rules = Object.values(spec.rules);
603
+ const total = rules.length;
604
+ if (total === 0) {
605
+ return { score: 0, coverage: 0, redundancy: 0, budgetPressure: 0 };
606
+ }
607
+ // Coverage: fraction with teeth (enforce vs guidance)
608
+ const enforced = rules.filter((r) => r._kind === "enforce").length;
609
+ const coverage = enforced / total;
610
+ // Redundancy: fraction of pairs that are near-duplicates
611
+ const similarPairs = findSimilarRules(spec.rules, ncdThreshold);
612
+ const totalPairs = (total * (total - 1)) / 2;
613
+ const redundancy = totalPairs > 0 ? similarPairs.length / totalPairs : 0;
614
+ // Budget pressure: rough token estimate (~4 chars per token)
615
+ const ruleTexts = rules.map(ruleToText);
616
+ const totalChars = ruleTexts.reduce((sum, t) => sum + t.length, 0);
617
+ const estimatedTokens = Math.ceil(totalChars / 4);
618
+ const budgetPressure = Math.min(1, estimatedTokens / maxTokens);
619
+ const score = coverage * (1 - redundancy) * (1 - budgetPressure);
620
+ return { score, coverage, redundancy, budgetPressure };
621
+ }
622
+ //# sourceMappingURL=proofs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../src/proofs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tests for the proof system and evolution engine.
3
+ *
4
+ * Covers: monotonicity lattice, NCD, Bloom filter, fixed-point convergence,
5
+ * Merkle history, property-based testing, fitness function, and the
6
+ * evolution engine.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=proofs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs.test.d.ts","sourceRoot":"","sources":["../src/proofs.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}