@principles/core 1.169.0 → 1.171.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 (60) hide show
  1. package/README.md +38 -0
  2. package/dist/index.d.ts +0 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/pain-signal.d.ts +11 -71
  7. package/dist/pain-signal.d.ts.map +1 -1
  8. package/dist/pain-signal.js +10 -120
  9. package/dist/pain-signal.js.map +1 -1
  10. package/dist/principle-tree-ledger.d.ts +4 -87
  11. package/dist/principle-tree-ledger.d.ts.map +1 -1
  12. package/dist/principle-tree-ledger.js +51 -148
  13. package/dist/principle-tree-ledger.js.map +1 -1
  14. package/dist/runtime-v2/__tests__/architecture-regression.test.js +178 -4
  15. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  16. package/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts +12 -0
  17. package/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts.map +1 -0
  18. package/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js +46 -0
  19. package/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js.map +1 -0
  20. package/dist/runtime-v2/__tests__/io-deletion.test.d.ts +12 -0
  21. package/dist/runtime-v2/__tests__/io-deletion.test.d.ts.map +1 -0
  22. package/dist/runtime-v2/__tests__/io-deletion.test.js +92 -0
  23. package/dist/runtime-v2/__tests__/io-deletion.test.js.map +1 -0
  24. package/dist/runtime-v2/__tests__/ledger-codec.test.d.ts +2 -0
  25. package/dist/runtime-v2/__tests__/ledger-codec.test.d.ts.map +1 -0
  26. package/dist/runtime-v2/__tests__/ledger-codec.test.js +133 -0
  27. package/dist/runtime-v2/__tests__/ledger-codec.test.js.map +1 -0
  28. package/dist/runtime-v2/__tests__/ledger-store.test.d.ts +2 -0
  29. package/dist/runtime-v2/__tests__/ledger-store.test.d.ts.map +1 -0
  30. package/dist/runtime-v2/__tests__/ledger-store.test.js +65 -0
  31. package/dist/runtime-v2/__tests__/ledger-store.test.js.map +1 -0
  32. package/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +2 -0
  33. package/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +1 -0
  34. package/dist/runtime-v2/__tests__/pain-signal-unification.test.js +150 -0
  35. package/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +1 -0
  36. package/dist/runtime-v2/index.d.ts +1 -2
  37. package/dist/runtime-v2/index.d.ts.map +1 -1
  38. package/dist/runtime-v2/index.js +4 -2
  39. package/dist/runtime-v2/index.js.map +1 -1
  40. package/dist/runtime-v2/principle-tree/ledger-codec.d.ts +30 -0
  41. package/dist/runtime-v2/principle-tree/ledger-codec.d.ts.map +1 -0
  42. package/dist/runtime-v2/principle-tree/ledger-codec.js +154 -0
  43. package/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -0
  44. package/dist/runtime-v2/types/index.d.ts +2 -0
  45. package/dist/runtime-v2/types/index.d.ts.map +1 -1
  46. package/dist/runtime-v2/types/index.js +1 -0
  47. package/dist/runtime-v2/types/index.js.map +1 -1
  48. package/dist/runtime-v2/types/ledger-store.d.ts +101 -0
  49. package/dist/runtime-v2/types/ledger-store.d.ts.map +1 -0
  50. package/dist/runtime-v2/types/ledger-store.js +15 -0
  51. package/dist/runtime-v2/types/ledger-store.js.map +1 -0
  52. package/dist/runtime-v2/types/pain-signal.d.ts +5 -3
  53. package/dist/runtime-v2/types/pain-signal.d.ts.map +1 -1
  54. package/dist/runtime-v2/types/pain-signal.js +23 -3
  55. package/dist/runtime-v2/types/pain-signal.js.map +1 -1
  56. package/package.json +4 -4
  57. package/dist/io.d.ts +0 -35
  58. package/dist/io.d.ts.map +0 -1
  59. package/dist/io.js +0 -95
  60. package/dist/io.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PRI-443 Phase 5: runtime-v2 barrel I/O cleanup
3
+ *
4
+ * Verifies that:
5
+ * 1. runtime-v2/index.ts does NOT re-export I/O functions (loadLedger, saveLedger,
6
+ * getLedgerFilePathPublic, updatePrinciple) — these belong in the I/O module
7
+ * 2. runtime-v2/index.ts does NOT re-export LedgerTreeStore from
8
+ * '../principle-tree-ledger.js' — types come from pure modules
9
+ * 3. package.json exposes "./principle-tree-ledger" subpath for direct I/O access
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=barrel-io-cleanup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrel-io-cleanup.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/barrel-io-cleanup.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * PRI-443 Phase 5: runtime-v2 barrel I/O cleanup
3
+ *
4
+ * Verifies that:
5
+ * 1. runtime-v2/index.ts does NOT re-export I/O functions (loadLedger, saveLedger,
6
+ * getLedgerFilePathPublic, updatePrinciple) — these belong in the I/O module
7
+ * 2. runtime-v2/index.ts does NOT re-export LedgerTreeStore from
8
+ * '../principle-tree-ledger.js' — types come from pure modules
9
+ * 3. package.json exposes "./principle-tree-ledger" subpath for direct I/O access
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { readFileSync } from 'fs';
13
+ import { resolve } from 'path';
14
+ const CORE_SRC = resolve(__dirname, '..', '..');
15
+ describe('PRI-443 Phase 5: runtime-v2 barrel I/O cleanup', () => {
16
+ it('runtime-v2/index.ts does NOT re-export I/O functions from principle-tree-ledger', () => {
17
+ const barrelPath = resolve(CORE_SRC, 'runtime-v2', 'index.ts');
18
+ const content = readFileSync(barrelPath, 'utf-8');
19
+ // The I/O functions loadLedger, saveLedger, getLedgerFilePathPublic,
20
+ // updatePrinciple must NOT be re-exported from the runtime-v2 barrel.
21
+ // Consumers should import from @principles/core/principle-tree-ledger instead.
22
+ expect(content).not.toMatch(/export\s*\{[^}]*\bloadLedger\b[^}]*\}\s*from\s*['"]\.\.\/principle-tree-ledger\.js['"]/);
23
+ expect(content).not.toMatch(/export\s*\{[^}]*\bsaveLedger\b[^}]*\}\s*from\s*['"]\.\.\/principle-tree-ledger\.js['"]/);
24
+ expect(content).not.toMatch(/export\s*\{[^}]*\bgetLedgerFilePathPublic\b[^}]*\}\s*from\s*['"]\.\.\/principle-tree-ledger\.js['"]/);
25
+ expect(content).not.toMatch(/export\s*\{[^}]*\bupdatePrinciple\b[^}]*\}\s*from\s*['"]\.\.\/principle-tree-ledger\.js['"]/);
26
+ });
27
+ it('runtime-v2/index.ts does NOT re-export LedgerTreeStore from principle-tree-ledger', () => {
28
+ const barrelPath = resolve(CORE_SRC, 'runtime-v2', 'index.ts');
29
+ const content = readFileSync(barrelPath, 'utf-8');
30
+ // LedgerTreeStore type must come from the pure types module, not the I/O module
31
+ expect(content).not.toMatch(/export\s+type\s*\{[^}]*\bLedgerTreeStore\b[^}]*\}\s*from\s*['"]\.\.\/principle-tree-ledger\.js['"]/);
32
+ });
33
+ it('package.json exposes "./principle-tree-ledger" subpath', () => {
34
+ const pkgPath = resolve(CORE_SRC, '..', 'package.json');
35
+ const parsed = JSON.parse(readFileSync(pkgPath, 'utf-8'));
36
+ if (!parsed || typeof parsed !== 'object' || !Object.hasOwn(parsed, 'exports')) {
37
+ throw new Error('package.json 缺少 exports 字段');
38
+ }
39
+ const pkgExports = parsed.exports;
40
+ if (!pkgExports || typeof pkgExports !== 'object') {
41
+ throw new Error('package.json exports 字段格式非法');
42
+ }
43
+ expect(Object.hasOwn(pkgExports, './principle-tree-ledger')).toBe(true);
44
+ });
45
+ });
46
+ //# sourceMappingURL=barrel-io-cleanup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrel-io-cleanup.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/barrel-io-cleanup.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEhD,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAElD,qEAAqE;QACrE,sEAAsE;QACtE,+EAA+E;QAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,wFAAwF,CAAC,CAAC;QACtH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,wFAAwF,CAAC,CAAC;QACtH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qGAAqG,CAAC,CAAC;QACnI,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,6FAA6F,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAElD,gFAAgF;QAChF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oGAAoG,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,UAAU,GAAI,MAA+B,CAAC,OAAO,CAAC;QAC5D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PRI-443 Phase 4: io.ts deletion guard
3
+ *
4
+ * Verifies that:
5
+ * 1. `src/io.ts` no longer exists in principles-core
6
+ * 2. `atomicWriteFileSync` is NOT re-exported from the top-level barrel
7
+ * 3. `principle-tree-ledger.ts` still performs atomic write+read roundtrips
8
+ * (the inlined private atomicWriteFileSync preserves crash-safe semantics)
9
+ * 4. `package.json` no longer exposes `"./io"` subpath
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=io-deletion.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io-deletion.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/io-deletion.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * PRI-443 Phase 4: io.ts deletion guard
3
+ *
4
+ * Verifies that:
5
+ * 1. `src/io.ts` no longer exists in principles-core
6
+ * 2. `atomicWriteFileSync` is NOT re-exported from the top-level barrel
7
+ * 3. `principle-tree-ledger.ts` still performs atomic write+read roundtrips
8
+ * (the inlined private atomicWriteFileSync preserves crash-safe semantics)
9
+ * 4. `package.json` no longer exposes `"./io"` subpath
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { existsSync, readFileSync, mkdtempSync, rmSync } from 'fs';
13
+ import { tmpdir } from 'os';
14
+ import { join } from 'path';
15
+ import { resolve } from 'path';
16
+ const CORE_SRC = resolve(__dirname, '..', '..');
17
+ describe('PRI-443 Phase 4: io.ts deletion', () => {
18
+ it('src/io.ts does NOT exist in principles-core', () => {
19
+ const ioPath = join(CORE_SRC, 'io.ts');
20
+ expect(existsSync(ioPath)).toBe(false);
21
+ });
22
+ it('index.ts barrel does NOT re-export atomicWriteFileSync', () => {
23
+ const barrelPath = join(CORE_SRC, 'index.ts');
24
+ const content = readFileSync(barrelPath, 'utf-8');
25
+ expect(content).not.toMatch(/export\s*\{[^}]*\batomicWriteFileSync\b[^}]*\}/);
26
+ expect(content).not.toMatch(/from\s+['"]\.\/io\.js['"]/);
27
+ });
28
+ it('package.json does NOT expose "./io" subpath', () => {
29
+ const pkgPath = resolve(CORE_SRC, '..', 'package.json');
30
+ const parsed = JSON.parse(readFileSync(pkgPath, 'utf-8'));
31
+ if (!parsed || typeof parsed !== 'object' || !Object.hasOwn(parsed, 'exports')) {
32
+ throw new Error('package.json 缺少 exports 字段');
33
+ }
34
+ const pkgExports = parsed.exports;
35
+ if (!pkgExports || typeof pkgExports !== 'object') {
36
+ throw new Error('package.json exports 字段格式非法');
37
+ }
38
+ expect(Object.hasOwn(pkgExports, './io')).toBe(false);
39
+ });
40
+ it('principle-tree-ledger.ts inlines atomicWriteFileSync as a private (non-exported) helper', () => {
41
+ const ledgerPath = join(CORE_SRC, 'principle-tree-ledger.ts');
42
+ const content = readFileSync(ledgerPath, 'utf-8');
43
+ // The function must be defined locally (not imported)
44
+ expect(content).not.toMatch(/from\s+['"]\.\/io\.js['"]/);
45
+ // The function must NOT be re-exported (private to the module)
46
+ expect(content).not.toMatch(/export\s*\{[^}]*\batomicWriteFileSync\b[^}]*\}/);
47
+ expect(content).not.toMatch(/export\s+function\s+atomicWriteFileSync/);
48
+ // The function body must be present locally
49
+ expect(content).toMatch(/function\s+atomicWriteFileSync/);
50
+ expect(content).toMatch(/fs\.renameSync/);
51
+ });
52
+ });
53
+ describe('PRI-443 Phase 4: principle-tree-ledger atomic roundtrip', () => {
54
+ it('saveLedger → loadLedger roundtrip preserves data atomically', async () => {
55
+ // Dynamic import to avoid importing io.ts (which should not exist)
56
+ const { loadLedger, addPrincipleToLedger } = await import('../../principle-tree-ledger.js');
57
+ const tmpDir = mkdtempSync(join(tmpdir(), 'pri443-phase4-'));
58
+ try {
59
+ const principle = {
60
+ id: 'pri-test-001',
61
+ version: 1,
62
+ text: 'Always validate user input before processing',
63
+ triggerPattern: 'user_input_received',
64
+ action: 'validate_input',
65
+ status: 'active',
66
+ priority: 'P1',
67
+ scope: 'domain',
68
+ evaluability: 'deterministic',
69
+ valueScore: 0.8,
70
+ adherenceRate: 0.95,
71
+ painPreventedCount: 3,
72
+ derivedFromPainIds: ['pain-1'],
73
+ ruleIds: ['rule-1'],
74
+ conflictsWithPrincipleIds: [],
75
+ createdAt: '2026-06-22T00:00:00.000Z',
76
+ updatedAt: '2026-06-22T00:00:00.000Z',
77
+ };
78
+ addPrincipleToLedger(tmpDir, principle);
79
+ const loaded = loadLedger(tmpDir);
80
+ expect(loaded.tree.principles['pri-test-001']).toBeDefined();
81
+ expect(loaded.tree.principles['pri-test-001']?.text).toBe('Always validate user input before processing');
82
+ expect(loaded.tree.principles['pri-test-001']?.status).toBe('active');
83
+ // Verify the .tmp file was cleaned up (atomic write completed)
84
+ const tmpFile = join(tmpDir, 'principle_training_state.json.tmp');
85
+ expect(existsSync(tmpFile)).toBe(false);
86
+ }
87
+ finally {
88
+ rmSync(tmpDir, { recursive: true, force: true });
89
+ }
90
+ });
91
+ });
92
+ //# sourceMappingURL=io-deletion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io-deletion.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/io-deletion.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ledger-codec.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-codec.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-codec.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * PRI-443: Ledger codec — pure parse/serialize functions, zero I/O.
3
+ *
4
+ * Tests verify:
5
+ * 1. parseHybridLedger correctly parses a valid ledger JSON
6
+ * 2. parseHybridLedger handles missing/malformed data gracefully
7
+ * 3. serializeLedger produces correct JSON output
8
+ * 4. createEmptyTree returns a valid empty tree
9
+ * 5. The module has zero fs/path imports
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { readFileSync } from 'node:fs';
13
+ import { resolve } from 'node:path';
14
+ import { parseHybridLedger, serializeLedger, createEmptyTree, isRecord, stringArray, clampFloat, clampInt, uniqueStrings, } from '../principle-tree/ledger-codec.js';
15
+ describe('PRI-443: ledger-codec.ts pure parse/serialize module', () => {
16
+ it('createEmptyTree returns valid empty tree', () => {
17
+ const tree = createEmptyTree();
18
+ expect(tree.principles).toEqual({});
19
+ expect(tree.rules).toEqual({});
20
+ expect(tree.implementations).toEqual({});
21
+ expect(tree.metrics).toEqual({});
22
+ expect(tree.lastUpdated).toBe(new Date(0).toISOString());
23
+ });
24
+ it('parseHybridLedger parses valid hybrid ledger', () => {
25
+ const raw = {
26
+ trainingStore: {
27
+ 'pri-001': {
28
+ principleId: 'pri-001',
29
+ evaluability: 'manual_only',
30
+ applicableOpportunityCount: 5,
31
+ observedViolationCount: 2,
32
+ complianceRate: 0.6,
33
+ violationTrend: 0.1,
34
+ generatedSampleCount: 3,
35
+ approvedSampleCount: 1,
36
+ includedTrainRunIds: ['run-1'],
37
+ deployedCheckpointIds: ['ckpt-1'],
38
+ internalizationStatus: 'prompt_only',
39
+ },
40
+ },
41
+ _tree: {
42
+ principles: {
43
+ 'pri-001': {
44
+ id: 'pri-001',
45
+ version: 1,
46
+ text: 'Test',
47
+ triggerPattern: 'test',
48
+ action: 'test',
49
+ status: 'active',
50
+ priority: 'P0',
51
+ scope: 'general',
52
+ evaluability: 'manual_only',
53
+ valueScore: 0.5,
54
+ adherenceRate: 0.8,
55
+ painPreventedCount: 0,
56
+ derivedFromPainIds: [],
57
+ ruleIds: [],
58
+ conflictsWithPrincipleIds: [],
59
+ createdAt: '2026-01-01T00:00:00Z',
60
+ updatedAt: '2026-01-01T00:00:00Z',
61
+ },
62
+ },
63
+ rules: {},
64
+ implementations: {},
65
+ metrics: {},
66
+ lastUpdated: '2026-01-01T00:00:00Z',
67
+ },
68
+ };
69
+ const result = parseHybridLedger(raw);
70
+ expect(result.trainingStore['pri-001']).toBeDefined();
71
+ expect(result.trainingStore['pri-001']?.evaluability).toBe('manual_only');
72
+ expect(result.tree.principles['pri-001']?.id).toBe('pri-001');
73
+ });
74
+ it('parseHybridLedger handles null input', () => {
75
+ const result = parseHybridLedger(null);
76
+ expect(result.trainingStore).toEqual({});
77
+ expect(result.tree.principles).toEqual({});
78
+ });
79
+ it('parseHybridLedger handles non-object input', () => {
80
+ const result = parseHybridLedger('not an object');
81
+ expect(result.trainingStore).toEqual({});
82
+ expect(result.tree.principles).toEqual({});
83
+ });
84
+ it('serializeLedger produces correct JSON with TREE_NAMESPACE', () => {
85
+ const store = {
86
+ trainingStore: {},
87
+ tree: {
88
+ principles: {},
89
+ rules: {},
90
+ implementations: {},
91
+ metrics: {},
92
+ lastUpdated: '2026-01-01T00:00:00Z',
93
+ },
94
+ };
95
+ const json = serializeLedger(store);
96
+ const parsed = JSON.parse(json);
97
+ expect(parsed._tree).toBeDefined();
98
+ expect(parsed._tree.lastUpdated).toBeDefined();
99
+ });
100
+ it('isRecord correctly identifies records', () => {
101
+ expect(isRecord({})).toBe(true);
102
+ expect(isRecord(null)).toBe(false);
103
+ expect(isRecord(undefined)).toBe(false);
104
+ expect(isRecord([])).toBe(false);
105
+ expect(isRecord('string')).toBe(false);
106
+ });
107
+ it('stringArray filters non-strings from array', () => {
108
+ expect(stringArray(['a', 1, 'b', null, 'c'])).toEqual(['a', 'b', 'c']);
109
+ expect(stringArray('not array')).toEqual([]);
110
+ });
111
+ it('clampFloat clamps to range with fallback', () => {
112
+ expect(clampFloat(0.5, { min: 0, max: 1, fallback: 0 })).toBe(0.5);
113
+ expect(clampFloat(1.5, { min: 0, max: 1, fallback: 0 })).toBe(1);
114
+ expect(clampFloat(-0.5, { min: 0, max: 1, fallback: 0 })).toBe(0);
115
+ expect(clampFloat(NaN, { min: 0, max: 1, fallback: 0.5 })).toBe(0.5);
116
+ });
117
+ it('clampInt clamps and rounds to range with fallback', () => {
118
+ expect(clampInt(5.7, { min: 0, max: 10, fallback: 0 })).toBe(6);
119
+ expect(clampInt(15, { min: 0, max: 10, fallback: 0 })).toBe(10);
120
+ expect(clampInt('x', { min: 0, max: 10, fallback: 3 })).toBe(3);
121
+ });
122
+ it('uniqueStrings deduplicates', () => {
123
+ expect(uniqueStrings(['a', 'b', 'a', 'c', 'b'])).toEqual(['a', 'b', 'c']);
124
+ });
125
+ it('ledger-codec.ts has zero fs/path imports (pure module)', () => {
126
+ const src = readFileSync(resolve(__dirname, '..', 'principle-tree', 'ledger-codec.ts'), 'utf-8');
127
+ expect(src).not.toMatch(/from\s+['"]fs['"]/);
128
+ expect(src).not.toMatch(/from\s+['"]path['"]/);
129
+ expect(src).not.toMatch(/from\s+['"]node:fs/);
130
+ expect(src).not.toMatch(/from\s+['"]node:path/);
131
+ });
132
+ });
133
+ //# sourceMappingURL=ledger-codec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-codec.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-codec.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ledger-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * PRI-443: Ledger store types module — pure type definitions, zero I/O.
3
+ *
4
+ * Tests verify:
5
+ * 1. All types are importable from the new pure module
6
+ * 2. The module has zero fs/path imports
7
+ * 3. TREE_NAMESPACE constant is available
8
+ */
9
+ import { describe, it, expect } from 'vitest';
10
+ import { readFileSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { TREE_NAMESPACE } from '../types/ledger-store.js';
13
+ describe('PRI-443: ledger-store.ts pure types module', () => {
14
+ it('TREE_NAMESPACE constant is exported and equals _tree', () => {
15
+ expect(TREE_NAMESPACE).toBe('_tree');
16
+ });
17
+ it('LedgerPrinciple extends Principle with optional fields', () => {
18
+ const principle = {
19
+ id: 'pri-001',
20
+ version: 1,
21
+ text: 'Test principle',
22
+ triggerPattern: 'test',
23
+ action: 'test',
24
+ status: 'active',
25
+ priority: 'P0',
26
+ scope: 'general',
27
+ evaluability: 'manual_only',
28
+ valueScore: 0.5,
29
+ adherenceRate: 0.8,
30
+ painPreventedCount: 0,
31
+ derivedFromPainIds: [],
32
+ ruleIds: [],
33
+ conflictsWithPrincipleIds: [],
34
+ createdAt: '2026-01-01T00:00:00Z',
35
+ updatedAt: '2026-01-01T00:00:00Z',
36
+ suggestedRules: ['rule-1'],
37
+ lastTriggeredAt: '2026-01-02T00:00:00Z',
38
+ };
39
+ expect(principle.id).toBe('pri-001');
40
+ expect(principle.suggestedRules).toEqual(['rule-1']);
41
+ expect(principle.lastTriggeredAt).toBe('2026-01-02T00:00:00Z');
42
+ });
43
+ it('HybridLedgerStore has trainingStore and tree', () => {
44
+ const store = {
45
+ trainingStore: {},
46
+ tree: {
47
+ principles: {},
48
+ rules: {},
49
+ implementations: {},
50
+ metrics: {},
51
+ lastUpdated: '2026-01-01T00:00:00Z',
52
+ },
53
+ };
54
+ expect(store.trainingStore).toEqual({});
55
+ expect(store.tree.principles).toEqual({});
56
+ });
57
+ it('ledger-store.ts has zero fs/path imports (pure module)', () => {
58
+ const src = readFileSync(resolve(__dirname, '..', 'types', 'ledger-store.ts'), 'utf-8');
59
+ expect(src).not.toMatch(/from\s+['"]fs['"]/);
60
+ expect(src).not.toMatch(/from\s+['"]path['"]/);
61
+ expect(src).not.toMatch(/from\s+['"]node:fs/);
62
+ expect(src).not.toMatch(/from\s+['"]node:path/);
63
+ });
64
+ });
65
+ //# sourceMappingURL=ledger-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAoB;YACjC,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,GAAG;YACf,aAAa,EAAE,GAAG;YAClB,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,EAAE,EAAE;YACtB,OAAO,EAAE,EAAE;YACX,yBAAyB,EAAE,EAAE;YAC7B,SAAS,EAAE,sBAAsB;YACjC,SAAS,EAAE,sBAAsB;YACjC,cAAc,EAAE,CAAC,QAAQ,CAAC;YAC1B,eAAe,EAAE,sBAAsB;SACxC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAsB;YAC/B,aAAa,EAAE,EAAE;YACjB,IAAI,EAAE;gBACJ,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,eAAe,EAAE,EAAE;gBACnB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,sBAAsB;aACpC;SACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACpD,OAAO,CACR,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pain-signal-unification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-unification.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * PRI-443: Pain signal unification tests.
3
+ *
4
+ * Verifies that the top-level pain-signal.ts re-exports from
5
+ * runtime-v2/types/pain-signal.ts and that the unified schema
6
+ * includes the stricter validations from both versions:
7
+ * - ISO 8601 timestamp format check (from top-level)
8
+ * - Context size limit (from top-level)
9
+ * - version field (from top-level)
10
+ * - isStringRecord type guard instead of `as` (from runtime-v2)
11
+ */
12
+ import { describe, it, expect } from 'vitest';
13
+ import { readFileSync } from 'node:fs';
14
+ import { resolve } from 'node:path';
15
+ import { validatePainSignal, deriveSeverity, PainSignalSchema } from '../../pain-signal.js';
16
+ // Import from runtime-v2 (the canonical source)
17
+ import { validatePainSignal as validatePainSignalV2, PainSignalSchema as PainSignalSchemaV2, } from '../types/pain-signal.js';
18
+ describe('PRI-443: pain-signal.ts unification', () => {
19
+ it('top-level pain-signal.ts re-exports from runtime-v2 (no duplicate code)', () => {
20
+ const src = readFileSync(resolve(__dirname, '..', '..', '..', 'src', 'pain-signal.ts'), 'utf-8');
21
+ // Should NOT contain schema definition — only re-export
22
+ expect(src).not.toMatch(/export\s+const\s+PainSignalSchema\s*=/);
23
+ expect(src).not.toMatch(/export\s+function\s+validatePainSignal\s*\(/);
24
+ // Should contain re-export
25
+ expect(src).toMatch(/from\s+['"]\.\/runtime-v2\/types\/pain-signal\.js['"]/);
26
+ });
27
+ it('top-level and runtime-v2 validatePainSignal are the same function', () => {
28
+ expect(validatePainSignal).toBe(validatePainSignalV2);
29
+ });
30
+ it('top-level and runtime-v2 PainSignalSchema are the same object', () => {
31
+ expect(PainSignalSchema).toBe(PainSignalSchemaV2);
32
+ });
33
+ it('rejects invalid ISO 8601 timestamp', () => {
34
+ const signal = {
35
+ source: 'tool_failure',
36
+ score: 75,
37
+ timestamp: 'not-a-date',
38
+ reason: 'Test',
39
+ sessionId: 'sess-123',
40
+ agentId: 'main',
41
+ traceId: 'trace-abc',
42
+ triggerTextPreview: 'test',
43
+ domain: 'coding',
44
+ severity: 'high',
45
+ context: {},
46
+ };
47
+ const result = validatePainSignal(signal);
48
+ expect(result.valid).toBe(false);
49
+ expect(result.errors.some((e) => e.includes('timestamp'))).toBe(true);
50
+ });
51
+ it('rejects context exceeding 10KB size limit', () => {
52
+ const largeContext = {};
53
+ const bigString = 'x'.repeat(11_000);
54
+ largeContext.big = bigString;
55
+ const signal = {
56
+ source: 'tool_failure',
57
+ score: 75,
58
+ timestamp: '2026-01-01T00:00:00Z',
59
+ reason: 'Test',
60
+ sessionId: 'sess-123',
61
+ agentId: 'main',
62
+ traceId: 'trace-abc',
63
+ triggerTextPreview: 'test',
64
+ domain: 'coding',
65
+ severity: 'high',
66
+ context: largeContext,
67
+ };
68
+ const result = validatePainSignal(signal);
69
+ expect(result.valid).toBe(false);
70
+ expect(result.errors.some((e) => e.includes('Context'))).toBe(true);
71
+ });
72
+ it('rejects context with circular references without crashing (PR review fix)', () => {
73
+ const circularContext = {};
74
+ circularContext.self = circularContext;
75
+ const signal = {
76
+ source: 'tool_failure',
77
+ score: 75,
78
+ timestamp: '2026-01-01T00:00:00Z',
79
+ reason: 'Test',
80
+ sessionId: 'sess-123',
81
+ agentId: 'main',
82
+ traceId: 'trace-abc',
83
+ triggerTextPreview: 'test',
84
+ domain: 'coding',
85
+ severity: 'high',
86
+ context: circularContext,
87
+ };
88
+ const result = validatePainSignal(signal);
89
+ expect(result.valid).toBe(false);
90
+ expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
91
+ });
92
+ it('rejects context with BigInt values without crashing (PR review fix)', () => {
93
+ const signal = {
94
+ source: 'tool_failure',
95
+ score: 75,
96
+ timestamp: '2026-01-01T00:00:00Z',
97
+ reason: 'Test',
98
+ sessionId: 'sess-123',
99
+ agentId: 'main',
100
+ traceId: 'trace-abc',
101
+ triggerTextPreview: 'test',
102
+ domain: 'coding',
103
+ severity: 'high',
104
+ context: { bigNum: BigInt(123) },
105
+ };
106
+ const result = validatePainSignal(signal);
107
+ expect(result.valid).toBe(false);
108
+ expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
109
+ });
110
+ it('accepts signal with optional sessionId/agentId/traceId missing', () => {
111
+ const signal = {
112
+ source: 'tool_failure',
113
+ score: 75,
114
+ timestamp: '2026-01-01T00:00:00Z',
115
+ reason: 'Test',
116
+ triggerTextPreview: 'test',
117
+ domain: 'coding',
118
+ severity: 'high',
119
+ context: {},
120
+ };
121
+ const result = validatePainSignal(signal);
122
+ expect(result.valid).toBe(true);
123
+ });
124
+ it('includes version field in validated signal', () => {
125
+ const signal = {
126
+ source: 'tool_failure',
127
+ score: 75,
128
+ timestamp: '2026-01-01T00:00:00Z',
129
+ reason: 'Test',
130
+ sessionId: 'sess-123',
131
+ agentId: 'main',
132
+ traceId: 'trace-abc',
133
+ triggerTextPreview: 'test',
134
+ domain: 'coding',
135
+ severity: 'high',
136
+ context: {},
137
+ };
138
+ const result = validatePainSignal(signal);
139
+ expect(result.valid).toBe(true);
140
+ expect(result.signal?.version).toBe('0.1.0');
141
+ });
142
+ it('PainSeverity type is exported', () => {
143
+ const s = 'low';
144
+ expect(s).toBe('low');
145
+ });
146
+ it('deriveSeverity is exported and works', () => {
147
+ expect(deriveSeverity(95)).toBe('critical');
148
+ });
149
+ });
150
+ //# sourceMappingURL=pain-signal-unification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-unification.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":"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"}
@@ -134,7 +134,6 @@ export type { PainChainTrace, PainChainTraceLatencyMs, PainChainReadModelOptions
134
134
  export { EvolutionQueueItemMigrator } from './store/task-migration.js';
135
135
  export { migrateWorkspaceGuidance, containsStalePlanMdGuidance, STALE_PLAN_MD_PATTERNS } from './workspace-guidance-migration.js';
136
136
  export type { MigrationResult as WorkspaceGuidanceMigrationResult } from './workspace-guidance-migration.js';
137
- export { loadLedger, saveLedger, getLedgerFilePathPublic, updatePrinciple } from '../principle-tree-ledger.js';
138
137
  export { PruningReadModel, removeOrphanReferencesFromLedger } from './pruning-read-model.js';
139
138
  export type { PrinciplePruningSignal, PruningHealthSummary, PruningReadModelOptions, PruningRiskLevel, OrphanDerivedCandidate, OrphanDetectionResult, RemovedOrphanReference } from './pruning-read-model.js';
140
139
  export { appendPruningReview, listPruningReviews } from './pruning-review-log.js';
@@ -195,7 +194,7 @@ export type { LifecycleRoute, LifecycleRouteEvidenceSummary, LifecycleRouteRecom
195
194
  export { recommendLifecycleRoute } from './internalization/routing-policy.js';
196
195
  export type { LifecycleDatasource } from './internalization/lifecycle-datasource.js';
197
196
  export { buildLifecycleReadModel } from './internalization/lifecycle-read-model.js';
198
- export type { LedgerTreeStore } from '../principle-tree-ledger.js';
197
+ export type { LedgerTreeStore } from './types/ledger-store.js';
199
198
  export type { InternalizationChannel, PeerRunnerKind, DiagnosticianStageKind, RunnerKind, PIArtifactKind, PIArtifactValidationStatus, ArtifactRef, LineageRef, PIArtifact, PITaskRecord, } from './internalization/peer-runner-contracts.js';
200
199
  export { PEER_RUNNER_KINDS, DIAGNOSTICIAN_STAGE_KINDS, INTERNALIZATION_CHANNELS, PI_ARTIFACT_KINDS, isPeerRunnerKind, isDiagnosticianStageKind, isRunnerKind, isInternalizationChannel, isPIArtifactKind, isTerminalTaskStatus, isValidPITaskRecord, createMinimalPITaskRecord, } from './internalization/peer-runner-contracts.js';
201
200
  export { ALLOWED_EDGES, DIAGNOSTICIAN_EDGES, validateEdge, validateDiagEdge, getDiagSuccessors, isAcyclic, getAllowedSuccessors, getAllowedPredecessors, } from './internalization/internalization-job-graph.js';