create-principles-disciple 1.92.0 → 1.93.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 (136) hide show
  1. package/console/dist/server/config/AuthConfig.js +6 -0
  2. package/console/dist/server/index.js +31 -16
  3. package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +6 -3
  4. package/console/dist/server/models/ConsoleLifecycleDatasource.js +1 -1
  5. package/console/dist/server/routes/activations.js +4 -0
  6. package/console/dist/server/routes/approvals.js +24 -4
  7. package/console/dist/server/routes/feedback-reports.js +7 -5
  8. package/console/dist/server/routes/lifecycle.js +6 -1
  9. package/console/dist/server/routes/principles.js +10 -2
  10. package/console/dist/server/routes/workspaces.js +4 -0
  11. package/console/dist/ui/components/ui/charts.js +4 -1
  12. package/console/dist/ui/components/ui/markdown.js +9 -5
  13. package/console/dist/ui/utils/enum-labels.js +4 -1
  14. package/console/dist/web/assets/app.js +5 -2
  15. package/core/dist/index.d.ts +0 -1
  16. package/core/dist/index.d.ts.map +1 -1
  17. package/core/dist/index.js +0 -2
  18. package/core/dist/index.js.map +1 -1
  19. package/core/dist/pain-signal.d.ts +11 -71
  20. package/core/dist/pain-signal.d.ts.map +1 -1
  21. package/core/dist/pain-signal.js +10 -120
  22. package/core/dist/pain-signal.js.map +1 -1
  23. package/core/dist/principle-tree-ledger.d.ts +4 -87
  24. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  25. package/core/dist/principle-tree-ledger.js +51 -148
  26. package/core/dist/principle-tree-ledger.js.map +1 -1
  27. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +178 -4
  28. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  29. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts +12 -0
  30. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts.map +1 -0
  31. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js +46 -0
  32. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js.map +1 -0
  33. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts +12 -0
  34. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts.map +1 -0
  35. package/core/dist/runtime-v2/__tests__/io-deletion.test.js +92 -0
  36. package/core/dist/runtime-v2/__tests__/io-deletion.test.js.map +1 -0
  37. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts +2 -0
  38. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts.map +1 -0
  39. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js +429 -0
  40. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js.map +1 -0
  41. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts +2 -0
  42. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts.map +1 -0
  43. package/core/dist/runtime-v2/__tests__/ledger-store.test.js +65 -0
  44. package/core/dist/runtime-v2/__tests__/ledger-store.test.js.map +1 -0
  45. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +146 -0
  46. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  47. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +2 -0
  48. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +1 -0
  49. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js +150 -0
  50. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +1 -0
  51. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js +199 -0
  52. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js.map +1 -1
  53. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +156 -0
  54. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  55. package/core/dist/runtime-v2/index.d.ts +1 -2
  56. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  57. package/core/dist/runtime-v2/index.js +4 -2
  58. package/core/dist/runtime-v2/index.js.map +1 -1
  59. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts +30 -0
  60. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts.map +1 -0
  61. package/core/dist/runtime-v2/principle-tree/ledger-codec.js +154 -0
  62. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -0
  63. package/core/dist/runtime-v2/types/index.d.ts +2 -0
  64. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  65. package/core/dist/runtime-v2/types/index.js +1 -0
  66. package/core/dist/runtime-v2/types/index.js.map +1 -1
  67. package/core/dist/runtime-v2/types/ledger-store.d.ts +101 -0
  68. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -0
  69. package/core/dist/runtime-v2/types/ledger-store.js +15 -0
  70. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -0
  71. package/core/dist/runtime-v2/types/pain-signal.d.ts +5 -3
  72. package/core/dist/runtime-v2/types/pain-signal.d.ts.map +1 -1
  73. package/core/dist/runtime-v2/types/pain-signal.js +23 -3
  74. package/core/dist/runtime-v2/types/pain-signal.js.map +1 -1
  75. package/core/package.json +3 -3
  76. package/dist/installer.d.ts.map +1 -1
  77. package/dist/installer.js +9 -3
  78. package/dist/installer.js.map +1 -1
  79. package/dist/mvp-config.d.ts.map +1 -1
  80. package/dist/mvp-config.js +3 -2
  81. package/dist/mvp-config.js.map +1 -1
  82. package/dist/utils/env.d.ts.map +1 -1
  83. package/dist/utils/env.js +10 -4
  84. package/dist/utils/env.js.map +1 -1
  85. package/package.json +1 -1
  86. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js +11 -3
  87. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js.map +1 -1
  88. package/pd-cli/dist/commands/candidate.d.ts.map +1 -1
  89. package/pd-cli/dist/commands/candidate.js +2 -1
  90. package/pd-cli/dist/commands/candidate.js.map +1 -1
  91. package/pd-cli/dist/commands/health.d.ts.map +1 -1
  92. package/pd-cli/dist/commands/health.js +2 -1
  93. package/pd-cli/dist/commands/health.js.map +1 -1
  94. package/pd-cli/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
  95. package/pd-cli/dist/commands/runtime-internalization-integrity.js +3 -1
  96. package/pd-cli/dist/commands/runtime-internalization-integrity.js.map +1 -1
  97. package/pd-cli/dist/commands/runtime-uat.d.ts.map +1 -1
  98. package/pd-cli/dist/commands/runtime-uat.js +4 -1
  99. package/pd-cli/dist/commands/runtime-uat.js.map +1 -1
  100. package/pd-cli/dist/legacy/session-history-import.js +7 -5
  101. package/pd-cli/dist/legacy/session-history-import.js.map +1 -1
  102. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +13 -2
  103. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  104. package/pd-cli/dist/services/pain-flood-simulation-runner.d.ts.map +1 -1
  105. package/pd-cli/dist/services/pain-flood-simulation-runner.js +6 -2
  106. package/pd-cli/dist/services/pain-flood-simulation-runner.js.map +1 -1
  107. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts.map +1 -1
  108. package/pd-cli/dist/services/runtime-adapter-resolver.js +6 -4
  109. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  110. package/plugin/dist/commands/capabilities.js +3 -2
  111. package/plugin/dist/commands/disable-impl.js +1 -1
  112. package/plugin/dist/commands/focus.js +10 -2
  113. package/plugin/dist/commands/rollback-impl.js +1 -1
  114. package/plugin/dist/commands/thinking-os.js +5 -1
  115. package/plugin/dist/core/correction-cue-learner.js +2 -0
  116. package/plugin/dist/core/event-log.js +17 -10
  117. package/plugin/dist/core/focus-history.js +1 -1
  118. package/plugin/dist/core/hygiene/tracker.js +3 -3
  119. package/plugin/dist/core/principle-compiler/compiler.js +2 -0
  120. package/plugin/dist/core/replay-engine.js +1 -1
  121. package/plugin/dist/core/rule-host.js +3 -1
  122. package/plugin/dist/core/thinking-os-parser.js +13 -4
  123. package/plugin/dist/hooks/trajectory-collector.d.ts +20 -4
  124. package/plugin/dist/hooks/trajectory-collector.js +95 -156
  125. package/plugin/dist/index.js +7 -2
  126. package/plugin/dist/openclaw-sdk.d.ts +4 -1
  127. package/plugin/dist/service/evolution-worker.js +7 -3
  128. package/plugin/dist/service/internalization-auto-consumer-service.js +2 -1
  129. package/plugin/dist/service/runtime-summary-service.js +8 -1
  130. package/plugin/dist/service/workflow-watchdog.js +2 -1
  131. package/plugin/dist/utils/retry.js +7 -2
  132. package/plugin/dist/utils/session-key.js +4 -1
  133. package/core/dist/io.d.ts +0 -35
  134. package/core/dist/io.d.ts.map +0 -1
  135. package/core/dist/io.js +0 -95
  136. package/core/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,429 @@
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
+ // PRI-443 regression tests — ledger-codec edge cases
133
+ it('parseLegacyTrainingStore handles malformed evaluability', () => {
134
+ const raw = {
135
+ 'pri-001': {
136
+ principleId: 'pri-001',
137
+ evaluability: 'invalid_value',
138
+ applicableOpportunityCount: 5,
139
+ observedViolationCount: 2,
140
+ complianceRate: 0.6,
141
+ violationTrend: 0.1,
142
+ generatedSampleCount: 3,
143
+ approvedSampleCount: 1,
144
+ includedTrainRunIds: ['run-1'],
145
+ deployedCheckpointIds: ['ckpt-1'],
146
+ internalizationStatus: 'prompt_only',
147
+ },
148
+ };
149
+ const result = parseHybridLedger(raw);
150
+ expect(result.trainingStore['pri-001']).toBeDefined();
151
+ // Invalid evaluability should fallback to 'manual_only'
152
+ expect(result.trainingStore['pri-001']?.evaluability).toBe('manual_only');
153
+ });
154
+ it('parseLegacyTrainingStore handles malformed internalizationStatus', () => {
155
+ const raw = {
156
+ 'pri-002': {
157
+ principleId: 'pri-002',
158
+ evaluability: 'deterministic',
159
+ applicableOpportunityCount: 5,
160
+ observedViolationCount: 2,
161
+ complianceRate: 0.6,
162
+ violationTrend: 0.1,
163
+ generatedSampleCount: 3,
164
+ approvedSampleCount: 1,
165
+ includedTrainRunIds: ['run-1'],
166
+ deployedCheckpointIds: ['ckpt-1'],
167
+ internalizationStatus: 'invalid_status',
168
+ },
169
+ };
170
+ const result = parseHybridLedger(raw);
171
+ expect(result.trainingStore['pri-002']).toBeDefined();
172
+ // Invalid internalizationStatus should fallback to 'prompt_only'
173
+ expect(result.trainingStore['pri-002']?.internalizationStatus).toBe('prompt_only');
174
+ });
175
+ it('parseLegacyTrainingStore handles negative counts (clamped to 0)', () => {
176
+ const raw = {
177
+ 'pri-003': {
178
+ principleId: 'pri-003',
179
+ evaluability: 'deterministic',
180
+ applicableOpportunityCount: -5,
181
+ observedViolationCount: -2,
182
+ complianceRate: 0.6,
183
+ violationTrend: 0.1,
184
+ generatedSampleCount: -3,
185
+ approvedSampleCount: -1,
186
+ includedTrainRunIds: ['run-1'],
187
+ deployedCheckpointIds: ['ckpt-1'],
188
+ internalizationStatus: 'prompt_only',
189
+ },
190
+ };
191
+ const result = parseHybridLedger(raw);
192
+ expect(result.trainingStore['pri-003']).toBeDefined();
193
+ // Negative counts should be clamped to 0
194
+ expect(result.trainingStore['pri-003']?.applicableOpportunityCount).toBe(0);
195
+ expect(result.trainingStore['pri-003']?.observedViolationCount).toBe(0);
196
+ expect(result.trainingStore['pri-003']?.generatedSampleCount).toBe(0);
197
+ expect(result.trainingStore['pri-003']?.approvedSampleCount).toBe(0);
198
+ });
199
+ it('parseLegacyTrainingStore handles out-of-range complianceRate (clamped to [0, 1])', () => {
200
+ const raw = {
201
+ 'pri-004': {
202
+ principleId: 'pri-004',
203
+ evaluability: 'deterministic',
204
+ applicableOpportunityCount: 5,
205
+ observedViolationCount: 2,
206
+ complianceRate: 1.5, // Out of range (> 1)
207
+ violationTrend: -2.0, // Out of range (< -1)
208
+ generatedSampleCount: 3,
209
+ approvedSampleCount: 1,
210
+ includedTrainRunIds: ['run-1'],
211
+ deployedCheckpointIds: ['ckpt-1'],
212
+ internalizationStatus: 'prompt_only',
213
+ },
214
+ };
215
+ const result = parseHybridLedger(raw);
216
+ expect(result.trainingStore['pri-004']).toBeDefined();
217
+ // complianceRate should be clamped to [0, 1]
218
+ expect(result.trainingStore['pri-004']?.complianceRate).toBe(1);
219
+ // violationTrend should be clamped to [-1, 1]
220
+ expect(result.trainingStore['pri-004']?.violationTrend).toBe(-1);
221
+ });
222
+ it('parseLegacyTrainingStore handles non-array includedTrainRunIds', () => {
223
+ const raw = {
224
+ 'pri-005': {
225
+ principleId: 'pri-005',
226
+ evaluability: 'deterministic',
227
+ applicableOpportunityCount: 5,
228
+ observedViolationCount: 2,
229
+ complianceRate: 0.6,
230
+ violationTrend: 0.1,
231
+ generatedSampleCount: 3,
232
+ approvedSampleCount: 1,
233
+ includedTrainRunIds: 'not-an-array',
234
+ deployedCheckpointIds: null,
235
+ internalizationStatus: 'prompt_only',
236
+ },
237
+ };
238
+ const result = parseHybridLedger(raw);
239
+ expect(result.trainingStore['pri-005']).toBeDefined();
240
+ // Non-array should be converted to empty array
241
+ expect(result.trainingStore['pri-005']?.includedTrainRunIds).toEqual([]);
242
+ expect(result.trainingStore['pri-005']?.deployedCheckpointIds).toEqual([]);
243
+ });
244
+ it('parseLegacyTrainingStore skips entries with mismatched principleId', () => {
245
+ const raw = {
246
+ 'pri-006': {
247
+ principleId: 'different-id', // Mismatched!
248
+ evaluability: 'deterministic',
249
+ applicableOpportunityCount: 5,
250
+ observedViolationCount: 2,
251
+ complianceRate: 0.6,
252
+ violationTrend: 0.1,
253
+ generatedSampleCount: 3,
254
+ approvedSampleCount: 1,
255
+ includedTrainRunIds: ['run-1'],
256
+ deployedCheckpointIds: ['ckpt-1'],
257
+ internalizationStatus: 'prompt_only',
258
+ },
259
+ };
260
+ const result = parseHybridLedger(raw);
261
+ // Entry with mismatched principleId should be skipped
262
+ expect(result.trainingStore['pri-006']).toBeUndefined();
263
+ });
264
+ it('parseLegacyTrainingStore skips TREE_NAMESPACE entries', () => {
265
+ const raw = {
266
+ '_tree': {
267
+ principleId: '_tree',
268
+ evaluability: 'deterministic',
269
+ applicableOpportunityCount: 5,
270
+ observedViolationCount: 2,
271
+ complianceRate: 0.6,
272
+ violationTrend: 0.1,
273
+ generatedSampleCount: 3,
274
+ approvedSampleCount: 1,
275
+ includedTrainRunIds: ['run-1'],
276
+ deployedCheckpointIds: ['ckpt-1'],
277
+ internalizationStatus: 'prompt_only',
278
+ },
279
+ };
280
+ const result = parseHybridLedger(raw);
281
+ // TREE_NAMESPACE entries should be skipped in trainingStore
282
+ expect(result.trainingStore._tree).toBeUndefined();
283
+ });
284
+ it('parsePrinciples handles missing ruleIds', () => {
285
+ const raw = {
286
+ 'pri-007': {
287
+ id: 'pri-007',
288
+ version: 1,
289
+ text: 'Test',
290
+ triggerPattern: 'test',
291
+ action: 'test',
292
+ status: 'active',
293
+ priority: 'P0',
294
+ scope: 'general',
295
+ evaluability: 'manual_only',
296
+ valueScore: 0.5,
297
+ adherenceRate: 0.8,
298
+ painPreventedCount: 0,
299
+ derivedFromPainIds: [],
300
+ conflictsWithPrincipleIds: [],
301
+ createdAt: '2026-01-01T00:00:00Z',
302
+ updatedAt: '2026-01-01T00:00:00Z',
303
+ // ruleIds is missing
304
+ },
305
+ };
306
+ const result = parseHybridLedger({ _tree: { principles: raw } });
307
+ expect(result.tree.principles['pri-007']).toBeDefined();
308
+ // Missing ruleIds should be converted to empty array
309
+ expect(result.tree.principles['pri-007']?.ruleIds).toEqual([]);
310
+ });
311
+ it('parseRules handles missing implementationIds', () => {
312
+ const raw = {
313
+ 'rule-001': {
314
+ id: 'rule-001',
315
+ principleId: 'pri-001',
316
+ version: 1,
317
+ text: 'Test rule',
318
+ status: 'active',
319
+ createdAt: '2026-01-01T00:00:00Z',
320
+ updatedAt: '2026-01-01T00:00:00Z',
321
+ // implementationIds is missing
322
+ },
323
+ };
324
+ const result = parseHybridLedger({ _tree: { rules: raw } });
325
+ expect(result.tree.rules['rule-001']).toBeDefined();
326
+ // Missing implementationIds should be converted to empty array
327
+ expect(result.tree.rules['rule-001']?.implementationIds).toEqual([]);
328
+ });
329
+ it('parseRules handles missing principleId (defaults to empty string)', () => {
330
+ const raw = {
331
+ 'rule-002': {
332
+ id: 'rule-002',
333
+ // principleId is missing
334
+ version: 1,
335
+ text: 'Test rule',
336
+ status: 'active',
337
+ createdAt: '2026-01-01T00:00:00Z',
338
+ updatedAt: '2026-01-01T00:00:00Z',
339
+ implementationIds: [],
340
+ },
341
+ };
342
+ const result = parseHybridLedger({ _tree: { rules: raw } });
343
+ expect(result.tree.rules['rule-002']).toBeDefined();
344
+ // Missing principleId should default to empty string
345
+ expect(result.tree.rules['rule-002']?.principleId).toBe('');
346
+ });
347
+ it('parseImplementations skips entries without ruleId', () => {
348
+ const raw = {
349
+ 'impl-001': {
350
+ id: 'impl-001',
351
+ // ruleId is missing
352
+ code: 'function evaluate() { return { decision: "allow" }; }',
353
+ createdAt: '2026-01-01T00:00:00Z',
354
+ updatedAt: '2026-01-01T00:00:00Z',
355
+ },
356
+ };
357
+ const result = parseHybridLedger({ _tree: { implementations: raw } });
358
+ // Entry without ruleId should be skipped
359
+ expect(result.tree.implementations['impl-001']).toBeUndefined();
360
+ });
361
+ it('serializeLedger preserves TREE_NAMESPACE key', () => {
362
+ const store = {
363
+ trainingStore: {
364
+ 'pri-001': {
365
+ principleId: 'pri-001',
366
+ evaluability: 'manual_only',
367
+ applicableOpportunityCount: 5,
368
+ observedViolationCount: 2,
369
+ complianceRate: 0.6,
370
+ violationTrend: 0.1,
371
+ generatedSampleCount: 3,
372
+ approvedSampleCount: 1,
373
+ includedTrainRunIds: ['run-1'],
374
+ deployedCheckpointIds: ['ckpt-1'],
375
+ internalizationStatus: 'prompt_only',
376
+ },
377
+ },
378
+ tree: {
379
+ principles: {},
380
+ rules: {},
381
+ implementations: {},
382
+ metrics: {},
383
+ lastUpdated: '2026-01-01T00:00:00Z',
384
+ },
385
+ };
386
+ const json = serializeLedger(store);
387
+ const parsed = JSON.parse(json);
388
+ // TREE_NAMESPACE key should be present
389
+ expect(parsed._tree).toBeDefined();
390
+ // trainingStore entries should be at top level
391
+ expect(parsed['pri-001']).toBeDefined();
392
+ // TREE_NAMESPACE should NOT contain trainingStore entries
393
+ expect(parsed._tree['pri-001']).toBeUndefined();
394
+ });
395
+ it('parseHybridLedger handles deeply nested malformed data', () => {
396
+ const raw = {
397
+ trainingStore: {
398
+ 'pri-001': null, // Malformed entry
399
+ },
400
+ _tree: {
401
+ principles: {
402
+ 'pri-002': undefined, // Malformed entry
403
+ },
404
+ rules: {
405
+ 'rule-001': 'not-an-object', // Malformed entry
406
+ },
407
+ implementations: {
408
+ 'impl-001': [], // Malformed entry
409
+ },
410
+ metrics: {
411
+ 'metric-001': { principleId: 'pri-001' }, // Valid entry (Record)
412
+ },
413
+ lastUpdated: null, // Non-string value (triggers fallback)
414
+ },
415
+ };
416
+ const result = parseHybridLedger(raw);
417
+ // All malformed entries should be skipped/converted gracefully
418
+ expect(result.trainingStore['pri-001']).toBeUndefined();
419
+ expect(result.tree.principles['pri-002']).toBeUndefined();
420
+ expect(result.tree.rules['rule-001']).toBeUndefined();
421
+ expect(result.tree.implementations['impl-001']).toBeUndefined();
422
+ // Valid metric entry should be preserved
423
+ expect(result.tree.metrics['metric-001']).toBeDefined();
424
+ expect(result.tree.metrics['metric-001']?.principleId).toBe('pri-001');
425
+ // Non-string lastUpdated should fallback to epoch
426
+ expect(result.tree.lastUpdated).toBe(new Date(0).toISOString());
427
+ });
428
+ });
429
+ //# 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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"}