@codeledger/engine 0.7.1 → 0.7.3

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 (129) hide show
  1. package/dist/claims/claims.d.ts +14 -0
  2. package/dist/claims/claims.d.ts.map +1 -0
  3. package/dist/claims/claims.js +125 -0
  4. package/dist/claims/claims.js.map +1 -0
  5. package/dist/claims/index.d.ts +2 -0
  6. package/dist/claims/index.d.ts.map +1 -0
  7. package/dist/claims/index.js +2 -0
  8. package/dist/claims/index.js.map +1 -0
  9. package/dist/dashboard/index.d.ts +3 -0
  10. package/dist/dashboard/index.d.ts.map +1 -0
  11. package/dist/dashboard/index.js +3 -0
  12. package/dist/dashboard/index.js.map +1 -0
  13. package/dist/dashboard/metrics.d.ts +24 -0
  14. package/dist/dashboard/metrics.d.ts.map +1 -0
  15. package/dist/dashboard/metrics.js +358 -0
  16. package/dist/dashboard/metrics.js.map +1 -0
  17. package/dist/dashboard/store.d.ts +26 -0
  18. package/dist/dashboard/store.d.ts.map +1 -0
  19. package/dist/dashboard/store.js +97 -0
  20. package/dist/dashboard/store.js.map +1 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +19 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/integration/ambient-coordinator.d.ts +75 -0
  26. package/dist/integration/ambient-coordinator.d.ts.map +1 -0
  27. package/dist/integration/ambient-coordinator.js +183 -0
  28. package/dist/integration/ambient-coordinator.js.map +1 -0
  29. package/dist/integration/index.d.ts +4 -0
  30. package/dist/integration/index.d.ts.map +1 -0
  31. package/dist/integration/index.js +3 -0
  32. package/dist/integration/index.js.map +1 -0
  33. package/dist/integration/warning-throttle.d.ts +63 -0
  34. package/dist/integration/warning-throttle.d.ts.map +1 -0
  35. package/dist/integration/warning-throttle.js +347 -0
  36. package/dist/integration/warning-throttle.js.map +1 -0
  37. package/dist/intervention/escalation.d.ts +23 -0
  38. package/dist/intervention/escalation.d.ts.map +1 -0
  39. package/dist/intervention/escalation.js +149 -0
  40. package/dist/intervention/escalation.js.map +1 -0
  41. package/dist/intervention/generator.d.ts +12 -0
  42. package/dist/intervention/generator.d.ts.map +1 -0
  43. package/dist/intervention/generator.js +191 -0
  44. package/dist/intervention/generator.js.map +1 -0
  45. package/dist/intervention/index.d.ts +4 -0
  46. package/dist/intervention/index.d.ts.map +1 -0
  47. package/dist/intervention/index.js +4 -0
  48. package/dist/intervention/index.js.map +1 -0
  49. package/dist/intervention/signal-aggregator.d.ts +26 -0
  50. package/dist/intervention/signal-aggregator.d.ts.map +1 -0
  51. package/dist/intervention/signal-aggregator.js +274 -0
  52. package/dist/intervention/signal-aggregator.js.map +1 -0
  53. package/dist/layer-d/conflict-detector.d.ts +12 -0
  54. package/dist/layer-d/conflict-detector.d.ts.map +1 -0
  55. package/dist/layer-d/conflict-detector.js +150 -0
  56. package/dist/layer-d/conflict-detector.js.map +1 -0
  57. package/dist/layer-d/index.d.ts +3 -0
  58. package/dist/layer-d/index.d.ts.map +1 -0
  59. package/dist/layer-d/index.js +3 -0
  60. package/dist/layer-d/index.js.map +1 -0
  61. package/dist/layer-d/surface-extractor.d.ts +10 -0
  62. package/dist/layer-d/surface-extractor.d.ts.map +1 -0
  63. package/dist/layer-d/surface-extractor.js +96 -0
  64. package/dist/layer-d/surface-extractor.js.map +1 -0
  65. package/dist/policy-domains/domains.d.ts +31 -0
  66. package/dist/policy-domains/domains.d.ts.map +1 -0
  67. package/dist/policy-domains/domains.js +445 -0
  68. package/dist/policy-domains/domains.js.map +1 -0
  69. package/dist/policy-domains/index.d.ts +8 -0
  70. package/dist/policy-domains/index.d.ts.map +1 -0
  71. package/dist/policy-domains/index.js +8 -0
  72. package/dist/policy-domains/index.js.map +1 -0
  73. package/dist/pulse/index.d.ts +2 -0
  74. package/dist/pulse/index.d.ts.map +1 -0
  75. package/dist/pulse/index.js +2 -0
  76. package/dist/pulse/index.js.map +1 -0
  77. package/dist/pulse/pulse.d.ts +20 -0
  78. package/dist/pulse/pulse.d.ts.map +1 -0
  79. package/dist/pulse/pulse.js +253 -0
  80. package/dist/pulse/pulse.js.map +1 -0
  81. package/dist/severity/index.d.ts +2 -0
  82. package/dist/severity/index.d.ts.map +1 -0
  83. package/dist/severity/index.js +2 -0
  84. package/dist/severity/index.js.map +1 -0
  85. package/dist/severity/severity.d.ts +48 -0
  86. package/dist/severity/severity.d.ts.map +1 -0
  87. package/dist/severity/severity.js +134 -0
  88. package/dist/severity/severity.js.map +1 -0
  89. package/dist/staleness/index.d.ts +2 -0
  90. package/dist/staleness/index.d.ts.map +1 -0
  91. package/dist/staleness/index.js +2 -0
  92. package/dist/staleness/index.js.map +1 -0
  93. package/dist/staleness/jit-staleness.d.ts +29 -0
  94. package/dist/staleness/jit-staleness.d.ts.map +1 -0
  95. package/dist/staleness/jit-staleness.js +240 -0
  96. package/dist/staleness/jit-staleness.js.map +1 -0
  97. package/dist/team-policy/index.d.ts +1 -1
  98. package/dist/team-policy/index.d.ts.map +1 -1
  99. package/dist/team-policy/index.js +1 -1
  100. package/dist/team-policy/index.js.map +1 -1
  101. package/dist/team-policy/policy.d.ts +7 -0
  102. package/dist/team-policy/policy.d.ts.map +1 -1
  103. package/dist/team-policy/policy.js +38 -0
  104. package/dist/team-policy/policy.js.map +1 -1
  105. package/dist/trust/approval.d.ts +16 -0
  106. package/dist/trust/approval.d.ts.map +1 -0
  107. package/dist/trust/approval.js +183 -0
  108. package/dist/trust/approval.js.map +1 -0
  109. package/dist/trust/capsule.d.ts +36 -0
  110. package/dist/trust/capsule.d.ts.map +1 -0
  111. package/dist/trust/capsule.js +206 -0
  112. package/dist/trust/capsule.js.map +1 -0
  113. package/dist/trust/index.d.ts +6 -0
  114. package/dist/trust/index.d.ts.map +1 -0
  115. package/dist/trust/index.js +6 -0
  116. package/dist/trust/index.js.map +1 -0
  117. package/dist/trust/learning-feedback.d.ts +18 -0
  118. package/dist/trust/learning-feedback.d.ts.map +1 -0
  119. package/dist/trust/learning-feedback.js +146 -0
  120. package/dist/trust/learning-feedback.js.map +1 -0
  121. package/dist/trust/risk-scoring.d.ts +16 -0
  122. package/dist/trust/risk-scoring.d.ts.map +1 -0
  123. package/dist/trust/risk-scoring.js +142 -0
  124. package/dist/trust/risk-scoring.js.map +1 -0
  125. package/dist/trust/timeline.d.ts +42 -0
  126. package/dist/trust/timeline.d.ts.map +1 -0
  127. package/dist/trust/timeline.js +154 -0
  128. package/dist/trust/timeline.js.map +1 -0
  129. package/package.json +6 -2
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Command Capsule — Execution Governance Engine
3
+ *
4
+ * First-class domain object for governed execution.
5
+ * Lifecycle: draft → pending_policy → pending_approval → approved → executing → completed/failed
6
+ *
7
+ * Integrates with:
8
+ * - IOLE (intent signatures)
9
+ * - Team Policy (policy evaluation)
10
+ * - ECL-Lite (outcome recording)
11
+ * - Provenance (causal traceability)
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, appendFileSync, readdirSync } from 'node:fs';
15
+ import { join, dirname } from 'node:path';
16
+ const CAPSULE_DIR = '.codeledger/capsules';
17
+ const CAPSULE_LOG = '.codeledger/capsule-events.jsonl';
18
+ // ─── Valid State Transitions ───────────────────────────────────────────────
19
+ const VALID_TRANSITIONS = {
20
+ draft: ['pending_policy'],
21
+ pending_policy: ['pending_approval', 'approved', 'rejected'],
22
+ pending_approval: ['approved', 'rejected'],
23
+ approved: ['executing', 'revoked'],
24
+ rejected: ['draft'], // allow revision
25
+ executing: ['completed', 'failed'],
26
+ completed: [],
27
+ failed: ['draft'], // allow retry via revision
28
+ revoked: [],
29
+ };
30
+ // ─── Capsule Creation ──────────────────────────────────────────────────────
31
+ /** Create a new Command Capsule in draft state */
32
+ export function createCapsule(action, createdBy, intentSignature) {
33
+ const now = new Date().toISOString();
34
+ const id = `capsule-${randomUUID().slice(0, 12)}`;
35
+ return {
36
+ id,
37
+ state: 'draft',
38
+ action,
39
+ risk: { score: 0, level: 'low', factors: [], assessedAt: now },
40
+ policyIds: [],
41
+ approvalRequirements: [],
42
+ approvalDecisions: [],
43
+ preconditions: [],
44
+ postconditions: [],
45
+ transitions: [{ from: 'draft', to: 'draft', trigger: 'created', actor: createdBy, timestamp: now }],
46
+ intentSignature,
47
+ createdBy,
48
+ createdAt: now,
49
+ updatedAt: now,
50
+ };
51
+ }
52
+ // ─── State Machine ─────────────────────────────────────────────────────────
53
+ /** Transition a capsule to a new state (validates transition) */
54
+ export function transitionCapsule(capsule, to, trigger, actor, metadata) {
55
+ const allowed = VALID_TRANSITIONS[capsule.state] ?? [];
56
+ if (!allowed.includes(to)) {
57
+ throw new Error(`Invalid transition: ${capsule.state} → ${to}. Allowed: [${allowed.join(', ')}]`);
58
+ }
59
+ const now = new Date().toISOString();
60
+ const transition = {
61
+ from: capsule.state,
62
+ to,
63
+ trigger,
64
+ actor,
65
+ timestamp: now,
66
+ metadata,
67
+ };
68
+ return {
69
+ ...capsule,
70
+ state: to,
71
+ transitions: [...capsule.transitions, transition],
72
+ updatedAt: now,
73
+ };
74
+ }
75
+ // ─── Policy Evaluation ─────────────────────────────────────────────────────
76
+ /** Submit capsule for policy evaluation */
77
+ export function submitForPolicy(capsule, policyIds, requirements, actor) {
78
+ let updated = { ...capsule, policyIds, approvalRequirements: requirements };
79
+ updated = transitionCapsule(updated, 'pending_policy', 'policy_submitted', actor);
80
+ // If no approval required, auto-advance to approved
81
+ if (requirements.length === 0) {
82
+ updated = transitionCapsule(updated, 'approved', 'no_approval_required', 'system');
83
+ }
84
+ else {
85
+ updated = transitionCapsule(updated, 'pending_approval', 'approval_required', 'system');
86
+ }
87
+ return updated;
88
+ }
89
+ // ─── Approval ──────────────────────────────────────────────────────────────
90
+ /** Record an approval decision */
91
+ export function recordApproval(capsule, decision) {
92
+ if (capsule.state !== 'pending_approval') {
93
+ throw new Error(`Cannot approve capsule in state: ${capsule.state}`);
94
+ }
95
+ const updated = {
96
+ ...capsule,
97
+ approvalDecisions: [...capsule.approvalDecisions, decision],
98
+ updatedAt: new Date().toISOString(),
99
+ };
100
+ // Check if all requirements are satisfied
101
+ const allSatisfied = updated.approvalRequirements.every((req) => updated.approvalDecisions.some((d) => d.policyId === req.policyId && d.decision === 'approved'));
102
+ const anyRejected = updated.approvalDecisions.some((d) => d.decision === 'rejected');
103
+ if (anyRejected) {
104
+ return transitionCapsule(updated, 'rejected', 'approval_rejected', decision.approver);
105
+ }
106
+ if (allSatisfied) {
107
+ return transitionCapsule(updated, 'approved', 'all_approvals_received', 'system');
108
+ }
109
+ return updated;
110
+ }
111
+ /** Revoke a previously approved capsule */
112
+ export function revokeCapsule(capsule, actor, reason) {
113
+ if (capsule.state !== 'approved') {
114
+ throw new Error(`Cannot revoke capsule in state: ${capsule.state}`);
115
+ }
116
+ return transitionCapsule(capsule, 'revoked', `revoked: ${reason}`, actor);
117
+ }
118
+ // ─── Execution ─────────────────────────────────────────────────────────────
119
+ /** Begin execution of an approved capsule */
120
+ export function beginExecution(capsule, actor) {
121
+ return transitionCapsule(capsule, 'executing', 'execution_started', actor);
122
+ }
123
+ /** Record execution outcome */
124
+ export function completeExecution(capsule, outcome, actor) {
125
+ const targetState = outcome.status === 'failure' ? 'failed' : 'completed';
126
+ let updated = { ...capsule, outcome, updatedAt: new Date().toISOString() };
127
+ updated = transitionCapsule(updated, targetState, `execution_${outcome.status}`, actor);
128
+ return updated;
129
+ }
130
+ // ─── Condition Evaluation ──────────────────────────────────────────────────
131
+ /** Evaluate a precondition or postcondition */
132
+ export function evaluateCondition(condition, passed, message) {
133
+ return {
134
+ ...condition,
135
+ result: {
136
+ passed,
137
+ message,
138
+ evaluatedAt: new Date().toISOString(),
139
+ },
140
+ };
141
+ }
142
+ /** Check if all required preconditions pass */
143
+ export function checkPreconditions(capsule) {
144
+ const requiredPre = capsule.preconditions.filter((c) => c.required);
145
+ const failures = requiredPre.filter((c) => c.result && !c.result.passed);
146
+ return {
147
+ passed: failures.length === 0 && requiredPre.every((c) => c.result?.passed),
148
+ failures,
149
+ };
150
+ }
151
+ /** Check if all required postconditions pass */
152
+ export function checkPostconditions(capsule) {
153
+ const requiredPost = capsule.postconditions.filter((c) => c.required);
154
+ const failures = requiredPost.filter((c) => c.result && !c.result.passed);
155
+ return {
156
+ passed: failures.length === 0 && requiredPost.every((c) => c.result?.passed),
157
+ failures,
158
+ };
159
+ }
160
+ // ─── Persistence ───────────────────────────────────────────────────────────
161
+ /** Save a capsule to disk */
162
+ export function saveCapsule(repoRoot, capsule) {
163
+ const dir = join(repoRoot, CAPSULE_DIR);
164
+ if (!existsSync(dir))
165
+ mkdirSync(dir, { recursive: true });
166
+ const filePath = join(dir, `${capsule.id}.json`);
167
+ writeFileSync(filePath, JSON.stringify(capsule, null, 2) + '\n', 'utf-8');
168
+ }
169
+ /** Load a capsule from disk */
170
+ export function loadCapsule(repoRoot, capsuleId) {
171
+ const filePath = join(repoRoot, CAPSULE_DIR, `${capsuleId}.json`);
172
+ if (!existsSync(filePath))
173
+ return null;
174
+ try {
175
+ return JSON.parse(readFileSync(filePath, 'utf-8'));
176
+ }
177
+ catch {
178
+ return null;
179
+ }
180
+ }
181
+ /** List all capsule IDs */
182
+ export function listCapsules(repoRoot) {
183
+ const dir = join(repoRoot, CAPSULE_DIR);
184
+ if (!existsSync(dir))
185
+ return [];
186
+ return readdirSync(dir)
187
+ .filter((f) => f.endsWith('.json'))
188
+ .map((f) => f.replace('.json', ''));
189
+ }
190
+ // ─── Event Recording (append-only audit trail) ────────────────────────────
191
+ /** Record a capsule event to the append-only log */
192
+ export function recordCapsuleEvent(repoRoot, capsuleId, event, actor, metadata) {
193
+ const logPath = join(repoRoot, CAPSULE_LOG);
194
+ const dir = dirname(logPath);
195
+ if (!existsSync(dir))
196
+ mkdirSync(dir, { recursive: true });
197
+ const entry = {
198
+ capsuleId,
199
+ event,
200
+ actor,
201
+ timestamp: new Date().toISOString(),
202
+ metadata: metadata ?? {},
203
+ };
204
+ appendFileSync(logPath, JSON.stringify(entry) + '\n', 'utf-8');
205
+ }
206
+ //# sourceMappingURL=capsule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capsule.js","sourceRoot":"","sources":["../../src/trust/capsule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { createCapsule, transitionCapsule, submitForPolicy, recordApproval, revokeCapsule, beginExecution, completeExecution, evaluateCondition, checkPreconditions, checkPostconditions, saveCapsule, loadCapsule, listCapsules, recordCapsuleEvent, } from './capsule.js';
2
+ export { DEFAULT_APPROVAL_POLICY, loadApprovalPolicy, findMatchingAuthorities, deriveApprovalRequirements, validateApproval, explainApproverSelection, } from './approval.js';
3
+ export { DEFAULT_RISK_CONFIG, DEFAULT_SENSITIVITY_MAP, assessRisk, } from './risk-scoring.js';
4
+ export { assembleTimeline, verifyTimelineReplayability, } from './timeline.js';
5
+ export { computeLearningSignal, recommendPolicyAdjustments, recordLearningSignal, readLearningSignals, aggregateLearning, } from './learning-feedback.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trust/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createCapsule, transitionCapsule, submitForPolicy, recordApproval, revokeCapsule, beginExecution, completeExecution, evaluateCondition, checkPreconditions, checkPostconditions, saveCapsule, loadCapsule, listCapsules, recordCapsuleEvent, } from './capsule.js';
2
+ export { DEFAULT_APPROVAL_POLICY, loadApprovalPolicy, findMatchingAuthorities, deriveApprovalRequirements, validateApproval, explainApproverSelection, } from './approval.js';
3
+ export { DEFAULT_RISK_CONFIG, DEFAULT_SENSITIVITY_MAP, assessRisk, } from './risk-scoring.js';
4
+ export { assembleTimeline, verifyTimelineReplayability, } from './timeline.js';
5
+ export { computeLearningSignal, recommendPolicyAdjustments, recordLearningSignal, readLearningSignals, aggregateLearning, } from './learning-feedback.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trust/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { LearningSignal, PolicyAdjustment, CommandCapsule } from '@codeledger/types';
2
+ /** Compute a learning signal from a completed capsule */
3
+ export declare function computeLearningSignal(capsule: CommandCapsule): LearningSignal | null;
4
+ /** Generate policy adjustment recommendations from learning signals */
5
+ export declare function recommendPolicyAdjustments(signals: LearningSignal[], _currentPolicyRules: string[]): PolicyAdjustment[];
6
+ /** Record a learning signal to the append-only log */
7
+ export declare function recordLearningSignal(repoRoot: string, signal: LearningSignal): void;
8
+ /** Read all learning signals from the log */
9
+ export declare function readLearningSignals(repoRoot: string): LearningSignal[];
10
+ /** Compute aggregate learning metrics for a given intent */
11
+ export declare function aggregateLearning(signals: LearningSignal[], intentSignature: string): {
12
+ totalSignals: number;
13
+ positiveCount: number;
14
+ negativeCount: number;
15
+ avgMagnitude: number;
16
+ trend: 'improving' | 'degrading' | 'stable';
17
+ };
18
+ //# sourceMappingURL=learning-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-feedback.d.ts","sourceRoot":"","sources":["../../src/trust/learning-feedback.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEhB,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAM3B,yDAAyD;AACzD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,CAsCpF;AAID,uEAAuE;AACvE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,cAAc,EAAE,EACzB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,gBAAgB,EAAE,CAoDpB;AAID,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAKnF;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAYtE;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG;IACrF,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC7C,CAuBA"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Learning Feedback Loop
3
+ *
4
+ * Closes the gap between execution outcomes and policy governance.
5
+ * Computes learning signals from outcomes and generates
6
+ * policy adjustment recommendations.
7
+ *
8
+ * Data flow:
9
+ * Outcome → Learning Signal → Policy Adjustment Recommendation
10
+ * ECL-Lite weights → risk score influence → future capsule evaluation
11
+ */
12
+ import { readFileSync, appendFileSync, existsSync, mkdirSync } from 'node:fs';
13
+ import { join, dirname } from 'node:path';
14
+ const LEARNING_LOG = '.codeledger/learning-signals.jsonl';
15
+ // ─── Signal Computation ────────────────────────────────────────────────────
16
+ /** Compute a learning signal from a completed capsule */
17
+ export function computeLearningSignal(capsule) {
18
+ if (!capsule.outcome)
19
+ return null;
20
+ const direction = capsule.outcome.status === 'success' ? 'positive' : 'negative';
21
+ // Magnitude based on:
22
+ // - Risk level (higher risk outcomes carry more learning weight)
23
+ // - Number of targets affected
24
+ // - Whether preconditions/postconditions passed
25
+ const riskMultiplier = {
26
+ low: 0.25,
27
+ medium: 0.5,
28
+ high: 0.75,
29
+ critical: 1.0,
30
+ };
31
+ const baseWeight = riskMultiplier[capsule.risk.level] ?? 0.5;
32
+ const scopeFactor = Math.min(capsule.action.targets.length / 10, 1.0);
33
+ const conditionFactor = capsule.postconditions.some((c) => c.result && !c.result.passed) ? 0.8 : 1.0;
34
+ const magnitude = Math.round(baseWeight * (0.6 + 0.2 * scopeFactor + 0.2 * conditionFactor) * 100) / 100;
35
+ const factors = [];
36
+ factors.push(`risk_level:${capsule.risk.level}`);
37
+ factors.push(`targets:${capsule.action.targets.length}`);
38
+ if (capsule.outcome.testResults) {
39
+ factors.push(`tests:${capsule.outcome.testResults.passed}p/${capsule.outcome.testResults.failed}f`);
40
+ }
41
+ return {
42
+ intentSignature: capsule.intentSignature ?? capsule.id,
43
+ capsuleId: capsule.id,
44
+ direction,
45
+ magnitude,
46
+ factors,
47
+ recordedAt: new Date().toISOString(),
48
+ };
49
+ }
50
+ // ─── Policy Adjustment ─────────────────────────────────────────────────────
51
+ /** Generate policy adjustment recommendations from learning signals */
52
+ export function recommendPolicyAdjustments(signals, _currentPolicyRules) {
53
+ const adjustments = [];
54
+ // Group signals by intent
55
+ const byIntent = new Map();
56
+ for (const s of signals) {
57
+ const existing = byIntent.get(s.intentSignature) ?? [];
58
+ existing.push(s);
59
+ byIntent.set(s.intentSignature, existing);
60
+ }
61
+ for (const [intent, intentSignals] of byIntent) {
62
+ const negative = intentSignals.filter(s => s.direction === 'negative');
63
+ const total = intentSignals.length;
64
+ if (total < 3)
65
+ continue; // Need enough data to recommend
66
+ const failureRate = negative.length / total;
67
+ const avgNegMagnitude = negative.length > 0
68
+ ? negative.reduce((sum, s) => sum + s.magnitude, 0) / negative.length
69
+ : 0;
70
+ // High failure rate with high magnitude → tighten policy
71
+ if (failureRate > 0.5 && avgNegMagnitude > 0.5) {
72
+ adjustments.push({
73
+ ruleId: `intent:${intent}`,
74
+ adjustment: 'tighten',
75
+ reason: `${(failureRate * 100).toFixed(0)}% failure rate with avg magnitude ${avgNegMagnitude.toFixed(2)}`,
76
+ confidence: Math.min(failureRate * avgNegMagnitude * 2, 1.0),
77
+ suggestedChange: {
78
+ increaseApprovalThreshold: true,
79
+ addRequiredReview: true,
80
+ },
81
+ });
82
+ }
83
+ // Very low failure rate → consider relaxing
84
+ if (failureRate < 0.1 && total >= 5) {
85
+ adjustments.push({
86
+ ruleId: `intent:${intent}`,
87
+ adjustment: 'relax',
88
+ reason: `${(failureRate * 100).toFixed(0)}% failure rate over ${total} executions`,
89
+ confidence: Math.min((1 - failureRate) * 0.8, 1.0),
90
+ suggestedChange: {
91
+ reduceApprovalRequirements: true,
92
+ lowerRiskThreshold: true,
93
+ },
94
+ });
95
+ }
96
+ }
97
+ return adjustments.sort((a, b) => b.confidence - a.confidence);
98
+ }
99
+ // ─── Persistence ───────────────────────────────────────────────────────────
100
+ /** Record a learning signal to the append-only log */
101
+ export function recordLearningSignal(repoRoot, signal) {
102
+ const logPath = join(repoRoot, LEARNING_LOG);
103
+ const dir = dirname(logPath);
104
+ if (!existsSync(dir))
105
+ mkdirSync(dir, { recursive: true });
106
+ appendFileSync(logPath, JSON.stringify(signal) + '\n', 'utf-8');
107
+ }
108
+ /** Read all learning signals from the log */
109
+ export function readLearningSignals(repoRoot) {
110
+ const logPath = join(repoRoot, LEARNING_LOG);
111
+ if (!existsSync(logPath))
112
+ return [];
113
+ try {
114
+ const lines = readFileSync(logPath, 'utf-8').trim().split('\n');
115
+ return lines
116
+ .filter((line) => line.trim())
117
+ .map((line) => JSON.parse(line));
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ /** Compute aggregate learning metrics for a given intent */
124
+ export function aggregateLearning(signals, intentSignature) {
125
+ const filtered = signals.filter(s => s.intentSignature === intentSignature);
126
+ if (filtered.length === 0) {
127
+ return { totalSignals: 0, positiveCount: 0, negativeCount: 0, avgMagnitude: 0, trend: 'stable' };
128
+ }
129
+ const positive = filtered.filter(s => s.direction === 'positive').length;
130
+ const negative = filtered.filter(s => s.direction === 'negative').length;
131
+ const avgMag = filtered.reduce((sum, s) => sum + s.magnitude, 0) / filtered.length;
132
+ // Trend: compare first half vs second half
133
+ const midpoint = Math.floor(filtered.length / 2);
134
+ if (midpoint > 0) {
135
+ const firstHalf = filtered.slice(0, midpoint);
136
+ const secondHalf = filtered.slice(midpoint);
137
+ const firstFailRate = firstHalf.filter(s => s.direction === 'negative').length / firstHalf.length;
138
+ const secondFailRate = secondHalf.filter(s => s.direction === 'negative').length / secondHalf.length;
139
+ if (secondFailRate < firstFailRate - 0.15)
140
+ return { totalSignals: filtered.length, positiveCount: positive, negativeCount: negative, avgMagnitude: Math.round(avgMag * 100) / 100, trend: 'improving' };
141
+ if (secondFailRate > firstFailRate + 0.15)
142
+ return { totalSignals: filtered.length, positiveCount: positive, negativeCount: negative, avgMagnitude: Math.round(avgMag * 100) / 100, trend: 'degrading' };
143
+ }
144
+ return { totalSignals: filtered.length, positiveCount: positive, negativeCount: negative, avgMagnitude: Math.round(avgMag * 100) / 100, trend: 'stable' };
145
+ }
146
+ //# sourceMappingURL=learning-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-feedback.js","sourceRoot":"","sources":["../../src/trust/learning-feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Risk Scoring Engine
3
+ *
4
+ * Computes risk for Command Capsules based on:
5
+ * - Action scope (number and sensitivity of targets)
6
+ * - Historical failure rate (from ECL-Lite)
7
+ * - Target sensitivity (security, data, infra files)
8
+ * - Change magnitude
9
+ * - Test coverage gaps
10
+ */
11
+ import type { CapsuleRiskAssessment, ActionSpec, RiskScoringConfig, SensitivityMap } from '@codeledger/types';
12
+ export declare const DEFAULT_RISK_CONFIG: RiskScoringConfig;
13
+ export declare const DEFAULT_SENSITIVITY_MAP: SensitivityMap;
14
+ /** Compute risk assessment for a capsule's action */
15
+ export declare function assessRisk(action: ActionSpec, failureRate?: number, testedFiles?: Set<string>, config?: RiskScoringConfig, sensitivityMap?: SensitivityMap): CapsuleRiskAssessment;
16
+ //# sourceMappingURL=risk-scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scoring.d.ts","sourceRoot":"","sources":["../../src/trust/risk-scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,qBAAqB,EAErB,UAAU,EACV,iBAAiB,EACjB,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,mBAAmB,EAAE,iBAMjC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,cAerC,CAAC;AA+EF,qDAAqD;AACrD,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,WAAW,GAAE,MAAU,EACvB,WAAW,GAAE,GAAG,CAAC,MAAM,CAAa,EACpC,MAAM,GAAE,iBAAuC,EAC/C,cAAc,GAAE,cAAwC,GACvD,qBAAqB,CAqDvB"}
@@ -0,0 +1,142 @@
1
+ // ─── Defaults ──────────────────────────────────────────────────────────────
2
+ export const DEFAULT_RISK_CONFIG = {
3
+ scopeWeight: 0.20,
4
+ failureHistoryWeight: 0.25,
5
+ sensitivityWeight: 0.30,
6
+ magnitudeWeight: 0.15,
7
+ coverageGapWeight: 0.10,
8
+ };
9
+ export const DEFAULT_SENSITIVITY_MAP = {
10
+ patterns: [
11
+ { glob: '**/auth/**', level: 'critical' },
12
+ { glob: '**/security/**', level: 'critical' },
13
+ { glob: '**/crypto/**', level: 'critical' },
14
+ { glob: '**/.env*', level: 'critical' },
15
+ { glob: '**/credentials*', level: 'critical' },
16
+ { glob: '**/payment/**', level: 'high' },
17
+ { glob: '**/billing/**', level: 'high' },
18
+ { glob: '**/migration*', level: 'high' },
19
+ { glob: '**/schema*', level: 'high' },
20
+ { glob: '**/api/**', level: 'medium' },
21
+ { glob: '**/config/**', level: 'medium' },
22
+ { glob: '**/infra/**', level: 'medium' },
23
+ ],
24
+ };
25
+ // ─── Scoring ───────────────────────────────────────────────────────────────
26
+ /** Score the scope of an action (0-1) */
27
+ function scoreScope(action) {
28
+ const count = action.targets.length;
29
+ if (count <= 1)
30
+ return 0.1;
31
+ if (count <= 3)
32
+ return 0.3;
33
+ if (count <= 7)
34
+ return 0.5;
35
+ if (count <= 15)
36
+ return 0.7;
37
+ return 0.9;
38
+ }
39
+ /** Score historical failure rate (0-1) */
40
+ function scoreFailureHistory(failureRate) {
41
+ // failureRate is 0.0 to 1.0 from ECL-Lite
42
+ return Math.min(failureRate * 1.2, 1.0);
43
+ }
44
+ /** Score target sensitivity (0-1) */
45
+ function scoreSensitivity(targets, sensitivityMap) {
46
+ const levels = {
47
+ low: 0.1,
48
+ medium: 0.4,
49
+ high: 0.7,
50
+ critical: 1.0,
51
+ };
52
+ let maxScore = 0;
53
+ for (const target of targets) {
54
+ for (const entry of sensitivityMap.patterns) {
55
+ // Simple pattern matching
56
+ const pattern = entry.glob.replace(/\*\*/g, '').replace(/\*/g, '');
57
+ if (target.includes(pattern.replace(/\//g, '/').replace(/^\/|\/$/g, ''))) {
58
+ const score = levels[entry.level] ?? 0;
59
+ maxScore = Math.max(maxScore, score);
60
+ }
61
+ }
62
+ }
63
+ return maxScore;
64
+ }
65
+ /** Score change magnitude (0-1) */
66
+ function scoreMagnitude(action) {
67
+ const sideEffects = action.sideEffects.length;
68
+ if (sideEffects === 0)
69
+ return 0.1;
70
+ if (sideEffects <= 2)
71
+ return 0.3;
72
+ if (sideEffects <= 5)
73
+ return 0.6;
74
+ return 0.9;
75
+ }
76
+ /** Score test coverage gap (0-1) */
77
+ function scoreCoverageGap(targets, testedFiles) {
78
+ if (targets.length === 0)
79
+ return 0;
80
+ const untestedCount = targets.filter(t => !testedFiles.has(t)).length;
81
+ return untestedCount / targets.length;
82
+ }
83
+ /** Classify risk level from score */
84
+ function classifyRisk(score) {
85
+ if (score >= 0.75)
86
+ return 'critical';
87
+ if (score >= 0.5)
88
+ return 'high';
89
+ if (score >= 0.25)
90
+ return 'medium';
91
+ return 'low';
92
+ }
93
+ // ─── Public API ────────────────────────────────────────────────────────────
94
+ /** Compute risk assessment for a capsule's action */
95
+ export function assessRisk(action, failureRate = 0, testedFiles = new Set(), config = DEFAULT_RISK_CONFIG, sensitivityMap = DEFAULT_SENSITIVITY_MAP) {
96
+ const factors = [];
97
+ const scopeScore = scoreScope(action);
98
+ factors.push({
99
+ name: 'scope',
100
+ weight: config.scopeWeight,
101
+ score: scopeScore,
102
+ description: `${action.targets.length} target(s) affected`,
103
+ });
104
+ const failScore = scoreFailureHistory(failureRate);
105
+ factors.push({
106
+ name: 'failure_history',
107
+ weight: config.failureHistoryWeight,
108
+ score: failScore,
109
+ description: `Historical failure rate: ${(failureRate * 100).toFixed(0)}%`,
110
+ });
111
+ const sensScore = scoreSensitivity(action.targets, sensitivityMap);
112
+ factors.push({
113
+ name: 'sensitivity',
114
+ weight: config.sensitivityWeight,
115
+ score: sensScore,
116
+ description: sensScore > 0.5 ? 'High-sensitivity targets detected' : 'Normal sensitivity',
117
+ });
118
+ const magScore = scoreMagnitude(action);
119
+ factors.push({
120
+ name: 'magnitude',
121
+ weight: config.magnitudeWeight,
122
+ score: magScore,
123
+ description: `${action.sideEffects.length} side effect(s)`,
124
+ });
125
+ const covScore = scoreCoverageGap(action.targets, testedFiles);
126
+ factors.push({
127
+ name: 'coverage_gap',
128
+ weight: config.coverageGapWeight,
129
+ score: covScore,
130
+ description: covScore > 0.5 ? 'Significant test coverage gap' : 'Adequate test coverage',
131
+ });
132
+ // Weighted sum
133
+ const totalScore = factors.reduce((sum, f) => sum + f.weight * f.score, 0);
134
+ const clampedScore = Math.min(Math.max(totalScore, 0), 1);
135
+ return {
136
+ score: Math.round(clampedScore * 1000) / 1000,
137
+ level: classifyRisk(clampedScore),
138
+ factors,
139
+ assessedAt: new Date().toISOString(),
140
+ };
141
+ }
142
+ //# sourceMappingURL=risk-scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scoring.js","sourceRoot":"","sources":["../../src/trust/risk-scoring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Unified Execution Timeline
3
+ *
4
+ * Assembles a complete execution timeline from authoritative data sources:
5
+ * - Intent: from IOLE IntentSignature
6
+ * - Context: from ContextBundle
7
+ * - Policy: from TeamPolicyEvaluation
8
+ * - Approval: from CommandCapsule.approvalDecisions
9
+ * - Execution: from ECL-Lite entries
10
+ * - Outcome: from CapsuleOutcome
11
+ * - Learning: from ECL weight index
12
+ *
13
+ * Each stage is classified as AUTHORITATIVE, DERIVED, or SYNTHETIC.
14
+ * The timeline is replayable from stored data alone.
15
+ */
16
+ import type { ExecutionTimeline, CommandCapsule } from '@codeledger/types';
17
+ /** Assemble a timeline from a Command Capsule and its associated data */
18
+ export declare function assembleTimeline(capsule: CommandCapsule, contextData?: {
19
+ bundleId: string;
20
+ fileCount: number;
21
+ tokens: number;
22
+ }, policyData?: {
23
+ triggered: string[];
24
+ satisfied: string[];
25
+ violated: string[];
26
+ }, eclData?: {
27
+ intentSignature: string;
28
+ outcome: string;
29
+ expansionLevel: number;
30
+ }, learningData?: {
31
+ successWeight: number;
32
+ failureWeight: number;
33
+ }): ExecutionTimeline;
34
+ /** Replay a timeline — verify it can be reconstructed from stored data */
35
+ export declare function verifyTimelineReplayability(timeline: ExecutionTimeline): {
36
+ replayable: boolean;
37
+ syntheticCount: number;
38
+ authoritativeCount: number;
39
+ derivedCount: number;
40
+ issues: string[];
41
+ };
42
+ //# sourceMappingURL=timeline.d.ts.map