@codeledger/engine 0.7.2 → 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.
- package/dist/claims/claims.d.ts +14 -0
- package/dist/claims/claims.d.ts.map +1 -0
- package/dist/claims/claims.js +125 -0
- package/dist/claims/claims.js.map +1 -0
- package/dist/claims/index.d.ts +2 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +2 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/metrics.d.ts +24 -0
- package/dist/dashboard/metrics.d.ts.map +1 -0
- package/dist/dashboard/metrics.js +358 -0
- package/dist/dashboard/metrics.js.map +1 -0
- package/dist/dashboard/store.d.ts +26 -0
- package/dist/dashboard/store.d.ts.map +1 -0
- package/dist/dashboard/store.js +97 -0
- package/dist/dashboard/store.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/ambient-coordinator.d.ts +75 -0
- package/dist/integration/ambient-coordinator.d.ts.map +1 -0
- package/dist/integration/ambient-coordinator.js +183 -0
- package/dist/integration/ambient-coordinator.js.map +1 -0
- package/dist/integration/index.d.ts +4 -0
- package/dist/integration/index.d.ts.map +1 -0
- package/dist/integration/index.js +3 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/integration/warning-throttle.d.ts +63 -0
- package/dist/integration/warning-throttle.d.ts.map +1 -0
- package/dist/integration/warning-throttle.js +347 -0
- package/dist/integration/warning-throttle.js.map +1 -0
- package/dist/intervention/escalation.d.ts +23 -0
- package/dist/intervention/escalation.d.ts.map +1 -0
- package/dist/intervention/escalation.js +149 -0
- package/dist/intervention/escalation.js.map +1 -0
- package/dist/intervention/generator.d.ts +12 -0
- package/dist/intervention/generator.d.ts.map +1 -0
- package/dist/intervention/generator.js +191 -0
- package/dist/intervention/generator.js.map +1 -0
- package/dist/intervention/index.d.ts +4 -0
- package/dist/intervention/index.d.ts.map +1 -0
- package/dist/intervention/index.js +4 -0
- package/dist/intervention/index.js.map +1 -0
- package/dist/intervention/signal-aggregator.d.ts +26 -0
- package/dist/intervention/signal-aggregator.d.ts.map +1 -0
- package/dist/intervention/signal-aggregator.js +274 -0
- package/dist/intervention/signal-aggregator.js.map +1 -0
- package/dist/layer-d/conflict-detector.d.ts +12 -0
- package/dist/layer-d/conflict-detector.d.ts.map +1 -0
- package/dist/layer-d/conflict-detector.js +150 -0
- package/dist/layer-d/conflict-detector.js.map +1 -0
- package/dist/layer-d/index.d.ts +3 -0
- package/dist/layer-d/index.d.ts.map +1 -0
- package/dist/layer-d/index.js +3 -0
- package/dist/layer-d/index.js.map +1 -0
- package/dist/layer-d/surface-extractor.d.ts +10 -0
- package/dist/layer-d/surface-extractor.d.ts.map +1 -0
- package/dist/layer-d/surface-extractor.js +96 -0
- package/dist/layer-d/surface-extractor.js.map +1 -0
- package/dist/policy-domains/domains.d.ts +31 -0
- package/dist/policy-domains/domains.d.ts.map +1 -0
- package/dist/policy-domains/domains.js +445 -0
- package/dist/policy-domains/domains.js.map +1 -0
- package/dist/policy-domains/index.d.ts +8 -0
- package/dist/policy-domains/index.d.ts.map +1 -0
- package/dist/policy-domains/index.js +8 -0
- package/dist/policy-domains/index.js.map +1 -0
- package/dist/pulse/index.d.ts +2 -0
- package/dist/pulse/index.d.ts.map +1 -0
- package/dist/pulse/index.js +2 -0
- package/dist/pulse/index.js.map +1 -0
- package/dist/pulse/pulse.d.ts +20 -0
- package/dist/pulse/pulse.d.ts.map +1 -0
- package/dist/pulse/pulse.js +253 -0
- package/dist/pulse/pulse.js.map +1 -0
- package/dist/severity/index.d.ts +2 -0
- package/dist/severity/index.d.ts.map +1 -0
- package/dist/severity/index.js +2 -0
- package/dist/severity/index.js.map +1 -0
- package/dist/severity/severity.d.ts +48 -0
- package/dist/severity/severity.d.ts.map +1 -0
- package/dist/severity/severity.js +134 -0
- package/dist/severity/severity.js.map +1 -0
- package/dist/staleness/index.d.ts +2 -0
- package/dist/staleness/index.d.ts.map +1 -0
- package/dist/staleness/index.js +2 -0
- package/dist/staleness/index.js.map +1 -0
- package/dist/staleness/jit-staleness.d.ts +29 -0
- package/dist/staleness/jit-staleness.d.ts.map +1 -0
- package/dist/staleness/jit-staleness.js +240 -0
- package/dist/staleness/jit-staleness.js.map +1 -0
- package/dist/team-policy/index.d.ts +1 -1
- package/dist/team-policy/index.d.ts.map +1 -1
- package/dist/team-policy/index.js +1 -1
- package/dist/team-policy/index.js.map +1 -1
- package/dist/team-policy/policy.d.ts +7 -0
- package/dist/team-policy/policy.d.ts.map +1 -1
- package/dist/team-policy/policy.js +38 -0
- package/dist/team-policy/policy.js.map +1 -1
- package/dist/trust/approval.d.ts +16 -0
- package/dist/trust/approval.d.ts.map +1 -0
- package/dist/trust/approval.js +183 -0
- package/dist/trust/approval.js.map +1 -0
- package/dist/trust/capsule.d.ts +36 -0
- package/dist/trust/capsule.d.ts.map +1 -0
- package/dist/trust/capsule.js +206 -0
- package/dist/trust/capsule.js.map +1 -0
- package/dist/trust/index.d.ts +6 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +6 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/learning-feedback.d.ts +18 -0
- package/dist/trust/learning-feedback.d.ts.map +1 -0
- package/dist/trust/learning-feedback.js +146 -0
- package/dist/trust/learning-feedback.js.map +1 -0
- package/dist/trust/risk-scoring.d.ts +16 -0
- package/dist/trust/risk-scoring.d.ts.map +1 -0
- package/dist/trust/risk-scoring.js +142 -0
- package/dist/trust/risk-scoring.js.map +1 -0
- package/dist/trust/timeline.d.ts +42 -0
- package/dist/trust/timeline.d.ts.map +1 -0
- package/dist/trust/timeline.js +154 -0
- package/dist/trust/timeline.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intervention Generator — Architecture Intervention Engine
|
|
3
|
+
*
|
|
4
|
+
* Takes escalation result + aggregated signals and generates prioritized,
|
|
5
|
+
* actionable interventions with agent-ready execution templates.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Map a signal category to a default action type.
|
|
10
|
+
*/
|
|
11
|
+
function categoryToActionType(category) {
|
|
12
|
+
switch (category) {
|
|
13
|
+
case 'drift_spike':
|
|
14
|
+
return 'refactor';
|
|
15
|
+
case 'duplication_pressure':
|
|
16
|
+
return 'consolidate_duplicates';
|
|
17
|
+
case 'governance_breakdown':
|
|
18
|
+
return 'update_policy';
|
|
19
|
+
case 'architectural_violation':
|
|
20
|
+
return 'fix_violation';
|
|
21
|
+
case 'test_gap':
|
|
22
|
+
return 'add_test';
|
|
23
|
+
case 'scope_creep':
|
|
24
|
+
return 'refactor';
|
|
25
|
+
case 'sot_instability':
|
|
26
|
+
return 'fix_violation';
|
|
27
|
+
case 'coverage_gap':
|
|
28
|
+
return 'add_test';
|
|
29
|
+
case 'extension_failure':
|
|
30
|
+
return 'extend_existing';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Assign priority (1-5, 1 = highest) based on severity and escalation level.
|
|
35
|
+
*/
|
|
36
|
+
function assignPriority(severity, escalationLevel) {
|
|
37
|
+
const PRIORITY_LEVELS = ['critical', 'high', 'medium', 'low'];
|
|
38
|
+
const severityIndex = {
|
|
39
|
+
critical: 0,
|
|
40
|
+
high: 1,
|
|
41
|
+
medium: 2,
|
|
42
|
+
low: 3,
|
|
43
|
+
};
|
|
44
|
+
let idx = severityIndex[severity] ?? 3;
|
|
45
|
+
// Blocking escalation promotes priority by 1 (but never below 0)
|
|
46
|
+
if (escalationLevel === 'blocking' && idx > 0) {
|
|
47
|
+
idx -= 1;
|
|
48
|
+
}
|
|
49
|
+
return PRIORITY_LEVELS[idx];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate a human-readable title for an intervention.
|
|
53
|
+
*/
|
|
54
|
+
function generateTitle(category) {
|
|
55
|
+
switch (category) {
|
|
56
|
+
case 'drift_spike':
|
|
57
|
+
return 'Address task drift before continuing';
|
|
58
|
+
case 'duplication_pressure':
|
|
59
|
+
return 'Consolidate duplicate implementations';
|
|
60
|
+
case 'governance_breakdown':
|
|
61
|
+
return 'Update governance policy';
|
|
62
|
+
case 'architectural_violation':
|
|
63
|
+
return 'Fix architectural violation';
|
|
64
|
+
case 'test_gap':
|
|
65
|
+
return 'Add missing test coverage';
|
|
66
|
+
case 'scope_creep':
|
|
67
|
+
return 'Reduce scope to original intent';
|
|
68
|
+
case 'sot_instability':
|
|
69
|
+
return 'Stabilize source-of-truth assignments';
|
|
70
|
+
case 'coverage_gap':
|
|
71
|
+
return 'Improve discovery adoption coverage';
|
|
72
|
+
case 'extension_failure':
|
|
73
|
+
return 'Fix extension-only implementation violations';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generate a suggested fix description from the signal.
|
|
78
|
+
*/
|
|
79
|
+
function generateSuggestedFix(signal) {
|
|
80
|
+
const files = signal.affected_files;
|
|
81
|
+
const fileList = files.length > 0 ? files.slice(0, 3).join(', ') : 'affected files';
|
|
82
|
+
switch (signal.category) {
|
|
83
|
+
case 'drift_spike':
|
|
84
|
+
return `Re-align implementation with original task intent. Review ${fileList} for scope deviation.`;
|
|
85
|
+
case 'duplication_pressure':
|
|
86
|
+
return files.length >= 2
|
|
87
|
+
? `Merge duplicate logic from ${files.slice(1).join(', ')} into ${files[0] ?? 'primary file'} to eliminate redundancy.`
|
|
88
|
+
: `Consolidate duplicated code in ${fileList}.`;
|
|
89
|
+
case 'governance_breakdown':
|
|
90
|
+
return `Update team policy to cover the gap described: ${signal.description}`;
|
|
91
|
+
case 'architectural_violation':
|
|
92
|
+
return `Fix the violation in ${fileList}: ${signal.description}`;
|
|
93
|
+
case 'test_gap':
|
|
94
|
+
return `Add test coverage for ${fileList} to close the testing gap.`;
|
|
95
|
+
case 'scope_creep':
|
|
96
|
+
return `Remove or defer changes in ${fileList} that fall outside the current task scope.`;
|
|
97
|
+
case 'sot_instability':
|
|
98
|
+
return `Stabilize the source-of-truth for ${fileList}. Ensure canonical ownership is consistent across discovery runs.`;
|
|
99
|
+
case 'coverage_gap':
|
|
100
|
+
return `Run discovery before implementing tasks affecting ${fileList}. Increase adoption of the discovery gate.`;
|
|
101
|
+
case 'extension_failure':
|
|
102
|
+
return `Refactor changes in ${fileList} to extend the existing system instead of creating parallel implementations.`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Generate an agent-ready execution template for a given intervention.
|
|
107
|
+
* These are plain-text prompts an AI agent can execute directly.
|
|
108
|
+
*/
|
|
109
|
+
function generateAgentTemplate(intervention) {
|
|
110
|
+
const fileSection = intervention.affected_files.length > 0
|
|
111
|
+
? `\nFiles to modify:\n${intervention.affected_files.map((file) => ` - ${file}`).join('\n')}`
|
|
112
|
+
: '';
|
|
113
|
+
return `Task: ${intervention.title}
|
|
114
|
+
Priority: P${intervention.priority}
|
|
115
|
+
Category: ${intervention.category}
|
|
116
|
+
Action type: ${intervention.action_type}
|
|
117
|
+
${fileSection}
|
|
118
|
+
|
|
119
|
+
Instructions:
|
|
120
|
+
${intervention.suggested_fix}
|
|
121
|
+
|
|
122
|
+
Constraints:
|
|
123
|
+
- Do not introduce new dependencies
|
|
124
|
+
- Preserve existing public API contracts
|
|
125
|
+
- Add or update tests for any changed behavior
|
|
126
|
+
- Follow existing code conventions in the repository`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate prioritized interventions from escalation result and aggregated signals.
|
|
130
|
+
*
|
|
131
|
+
* Each intervention is actionable: it includes a title, description, affected files,
|
|
132
|
+
* a suggested fix, and optionally an agent-ready execution template.
|
|
133
|
+
*
|
|
134
|
+
* Interventions are sorted by priority (1 = highest), then by affected file count
|
|
135
|
+
* (more impacted first).
|
|
136
|
+
*/
|
|
137
|
+
export function generateInterventions(escalation, signals) {
|
|
138
|
+
if (signals.length === 0 || escalation.level === 'none') {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const interventions = signals.map((signal) => {
|
|
142
|
+
const priority = assignPriority(signal.severity, escalation.level);
|
|
143
|
+
const title = generateTitle(signal.category);
|
|
144
|
+
const actionType = categoryToActionType(signal.category);
|
|
145
|
+
const suggestedFix = generateSuggestedFix(signal);
|
|
146
|
+
const id = createHash('sha256')
|
|
147
|
+
.update(`${signal.category}:${signal.id}:${signal.description}`)
|
|
148
|
+
.digest('hex')
|
|
149
|
+
.slice(0, 12);
|
|
150
|
+
const intervention = {
|
|
151
|
+
id: `int_${id}`,
|
|
152
|
+
priority,
|
|
153
|
+
title,
|
|
154
|
+
description: signal.description,
|
|
155
|
+
action_type: actionType,
|
|
156
|
+
category: signal.category,
|
|
157
|
+
affected_files: signal.affected_files,
|
|
158
|
+
affected_systems: [],
|
|
159
|
+
suggested_fix: suggestedFix,
|
|
160
|
+
suggested_actions: [suggestedFix],
|
|
161
|
+
estimated_impact: severity2impact(signal.severity),
|
|
162
|
+
};
|
|
163
|
+
// Generate agent template
|
|
164
|
+
intervention.agent_template = generateAgentTemplate(intervention);
|
|
165
|
+
return intervention;
|
|
166
|
+
});
|
|
167
|
+
// Sort by priority ascending (critical first), then by affected file count descending
|
|
168
|
+
const PRIORITY_RANK = {
|
|
169
|
+
critical: 0,
|
|
170
|
+
high: 1,
|
|
171
|
+
medium: 2,
|
|
172
|
+
low: 3,
|
|
173
|
+
};
|
|
174
|
+
interventions.sort((a, b) => {
|
|
175
|
+
const pa = PRIORITY_RANK[a.priority] ?? 3;
|
|
176
|
+
const pb = PRIORITY_RANK[b.priority] ?? 3;
|
|
177
|
+
if (pa !== pb)
|
|
178
|
+
return pa - pb;
|
|
179
|
+
return b.affected_files.length - a.affected_files.length;
|
|
180
|
+
});
|
|
181
|
+
return interventions;
|
|
182
|
+
}
|
|
183
|
+
function severity2impact(severity) {
|
|
184
|
+
switch (severity) {
|
|
185
|
+
case 'critical': return 15;
|
|
186
|
+
case 'high': return 10;
|
|
187
|
+
case 'medium': return 5;
|
|
188
|
+
case 'low': return 2;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/intervention/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/intervention/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intervention/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AggregatedSignal } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Normalize severity from various subsystem formats to the unified scale.
|
|
4
|
+
*
|
|
5
|
+
* Detection subsystems use different scales:
|
|
6
|
+
* - Drift: NONE / MINOR / MAJOR / CRITICAL
|
|
7
|
+
* - Review Intelligence: P0 / P1 / P2
|
|
8
|
+
* - Severity matrix: HIGH / MEDIUM / LOW
|
|
9
|
+
* - Policy: error / warning / info
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeSeverity(raw: string): AggregatedSignal['severity'];
|
|
12
|
+
/**
|
|
13
|
+
* Deduplicate signals: when two signals share the same affected file set
|
|
14
|
+
* (sorted) and category, merge them — keeping the higher severity and
|
|
15
|
+
* concatenating descriptions.
|
|
16
|
+
*/
|
|
17
|
+
export declare function deduplicateSignals(signals: AggregatedSignal[]): AggregatedSignal[];
|
|
18
|
+
/**
|
|
19
|
+
* Aggregate signals from all detection subsystems into a unified,
|
|
20
|
+
* deduplicated signal list with normalized severity.
|
|
21
|
+
*
|
|
22
|
+
* @param dataDir - Path to the `.codeledger` data directory
|
|
23
|
+
* @returns Deduplicated, severity-normalized signals sorted by severity descending
|
|
24
|
+
*/
|
|
25
|
+
export declare function aggregateSignals(dataDir: string): Promise<AggregatedSignal[]>;
|
|
26
|
+
//# sourceMappingURL=signal-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-aggregator.d.ts","sourceRoot":"","sources":["../../src/intervention/signal-aggregator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;AAchF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAsB3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAkClF;AA6MD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiCnF"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal Aggregator — Architecture Intervention Engine
|
|
3
|
+
*
|
|
4
|
+
* Collects signals from all detection subsystems (drift, discovery,
|
|
5
|
+
* review intelligence, layer-d, policy, verify) into a unified,
|
|
6
|
+
* deduplicated signal list with normalized severity.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
/**
|
|
12
|
+
* Normalize severity from various subsystem formats to the unified scale.
|
|
13
|
+
*
|
|
14
|
+
* Detection subsystems use different scales:
|
|
15
|
+
* - Drift: NONE / MINOR / MAJOR / CRITICAL
|
|
16
|
+
* - Review Intelligence: P0 / P1 / P2
|
|
17
|
+
* - Severity matrix: HIGH / MEDIUM / LOW
|
|
18
|
+
* - Policy: error / warning / info
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeSeverity(raw) {
|
|
21
|
+
const upper = raw.toUpperCase().trim();
|
|
22
|
+
switch (upper) {
|
|
23
|
+
case 'CRITICAL':
|
|
24
|
+
case 'P0':
|
|
25
|
+
return 'critical';
|
|
26
|
+
case 'HIGH':
|
|
27
|
+
case 'MAJOR':
|
|
28
|
+
case 'P1':
|
|
29
|
+
case 'ERROR':
|
|
30
|
+
return 'high';
|
|
31
|
+
case 'MEDIUM':
|
|
32
|
+
case 'MINOR':
|
|
33
|
+
case 'P2':
|
|
34
|
+
case 'WARNING':
|
|
35
|
+
return 'medium';
|
|
36
|
+
case 'LOW':
|
|
37
|
+
case 'NONE':
|
|
38
|
+
case 'INFO':
|
|
39
|
+
default:
|
|
40
|
+
return 'low';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Deduplicate signals: when two signals share the same affected file set
|
|
45
|
+
* (sorted) and category, merge them — keeping the higher severity and
|
|
46
|
+
* concatenating descriptions.
|
|
47
|
+
*/
|
|
48
|
+
export function deduplicateSignals(signals) {
|
|
49
|
+
const SEVERITY_ORDER = {
|
|
50
|
+
critical: 4,
|
|
51
|
+
high: 3,
|
|
52
|
+
medium: 2,
|
|
53
|
+
low: 1,
|
|
54
|
+
};
|
|
55
|
+
const map = new Map();
|
|
56
|
+
for (const signal of signals) {
|
|
57
|
+
const filesKey = [...signal.affected_files].sort().join('|');
|
|
58
|
+
const dedupeKey = `${signal.category}::${filesKey}`;
|
|
59
|
+
const existing = map.get(dedupeKey);
|
|
60
|
+
if (existing) {
|
|
61
|
+
// Keep higher severity
|
|
62
|
+
if (SEVERITY_ORDER[signal.severity] > SEVERITY_ORDER[existing.severity]) {
|
|
63
|
+
existing.severity = signal.severity;
|
|
64
|
+
}
|
|
65
|
+
// Merge descriptions if different
|
|
66
|
+
if (!existing.description.includes(signal.description)) {
|
|
67
|
+
existing.description = `${existing.description}; ${signal.description}`;
|
|
68
|
+
}
|
|
69
|
+
// Merge metadata
|
|
70
|
+
if (signal.metadata) {
|
|
71
|
+
existing.metadata = { ...existing.metadata, ...signal.metadata };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
map.set(dedupeKey, { ...signal });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return [...map.values()];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Collect drift signals from .codeledger/cache/ directory.
|
|
82
|
+
*/
|
|
83
|
+
function collectDriftSignals(dataDir) {
|
|
84
|
+
const signals = [];
|
|
85
|
+
const driftPath = join(dataDir, 'cache', 'drift-result.json');
|
|
86
|
+
if (!existsSync(driftPath))
|
|
87
|
+
return signals;
|
|
88
|
+
try {
|
|
89
|
+
const raw = JSON.parse(readFileSync(driftPath, 'utf-8'));
|
|
90
|
+
if (raw.drift_level && raw.drift_level !== 'NONE') {
|
|
91
|
+
const topReasons = (raw.reasons ?? [])
|
|
92
|
+
.filter((r) => r.distance > 0.1)
|
|
93
|
+
.map((r) => r.field);
|
|
94
|
+
signals.push({
|
|
95
|
+
source: 'drift',
|
|
96
|
+
severity: raw.drift_level,
|
|
97
|
+
category: 'drift_spike',
|
|
98
|
+
description: `Drift detected (score: ${raw.drift_score ?? 0}, level: ${raw.drift_level}). Top drift fields: ${topReasons.join(', ') || 'none'}`,
|
|
99
|
+
affected_files: [],
|
|
100
|
+
metadata: { drift_score: raw.drift_score, drift_level: raw.drift_level },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Malformed drift data — skip
|
|
106
|
+
}
|
|
107
|
+
return signals;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Collect review intelligence signals from verify results.
|
|
111
|
+
*/
|
|
112
|
+
function collectReviewIntelligenceSignals(dataDir) {
|
|
113
|
+
const signals = [];
|
|
114
|
+
const verifyPath = join(dataDir, 'cache', 'verify-result.json');
|
|
115
|
+
if (!existsSync(verifyPath))
|
|
116
|
+
return signals;
|
|
117
|
+
try {
|
|
118
|
+
const raw = JSON.parse(readFileSync(verifyPath, 'utf-8'));
|
|
119
|
+
const findings = raw.review_intelligence?.findings ?? [];
|
|
120
|
+
for (const finding of findings) {
|
|
121
|
+
if (finding.disposition === 'baselined' || finding.disposition === 'suppressed')
|
|
122
|
+
continue;
|
|
123
|
+
const category = mapRuleToCategory(finding.rule_id ?? '');
|
|
124
|
+
signals.push({
|
|
125
|
+
source: 'review_intelligence',
|
|
126
|
+
severity: finding.severity ?? 'P2',
|
|
127
|
+
category,
|
|
128
|
+
description: finding.message ?? `Violation: ${finding.rule_id ?? 'unknown'}`,
|
|
129
|
+
affected_files: finding.file ? [`${finding.file}${finding.line ? `:${finding.line}` : ''}`] : [],
|
|
130
|
+
metadata: { rule_id: finding.rule_id },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Malformed verify data — skip
|
|
136
|
+
}
|
|
137
|
+
return signals;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Map a review intelligence rule_id to an intervention category.
|
|
141
|
+
*/
|
|
142
|
+
function mapRuleToCategory(ruleId) {
|
|
143
|
+
if (ruleId.includes('runtime_validation'))
|
|
144
|
+
return 'architectural_violation';
|
|
145
|
+
if (ruleId.includes('outbound_io'))
|
|
146
|
+
return 'architectural_violation';
|
|
147
|
+
if (ruleId.includes('test_integrity'))
|
|
148
|
+
return 'test_gap';
|
|
149
|
+
if (ruleId.includes('architecture_graph'))
|
|
150
|
+
return 'architectural_violation';
|
|
151
|
+
if (ruleId.includes('platform_helpers'))
|
|
152
|
+
return 'duplication_pressure';
|
|
153
|
+
if (ruleId.includes('build_runtime'))
|
|
154
|
+
return 'governance_breakdown';
|
|
155
|
+
return 'architectural_violation';
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Collect discovery (overlap/duplication) signals.
|
|
159
|
+
*/
|
|
160
|
+
function collectDiscoverySignals(dataDir) {
|
|
161
|
+
const signals = [];
|
|
162
|
+
const discoveryPath = join(dataDir, 'cache', 'discovery-result.json');
|
|
163
|
+
if (!existsSync(discoveryPath))
|
|
164
|
+
return signals;
|
|
165
|
+
try {
|
|
166
|
+
const raw = JSON.parse(readFileSync(discoveryPath, 'utf-8'));
|
|
167
|
+
if (raw.overlap === 'STRONG_OVERLAP' || raw.overlap === 'FEATURE_ALREADY_EXISTS') {
|
|
168
|
+
const affectedFiles = (raw.matches ?? []).map((m) => m.file);
|
|
169
|
+
signals.push({
|
|
170
|
+
source: 'discovery',
|
|
171
|
+
severity: raw.overlap === 'FEATURE_ALREADY_EXISTS' ? 'HIGH' : 'MEDIUM',
|
|
172
|
+
category: 'duplication_pressure',
|
|
173
|
+
description: raw.duplication_risk ?? `Duplication detected: ${raw.overlap}`,
|
|
174
|
+
affected_files: affectedFiles,
|
|
175
|
+
metadata: { overlap: raw.overlap },
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Malformed discovery data — skip
|
|
181
|
+
}
|
|
182
|
+
return signals;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Collect Layer D (semantic conflict) signals.
|
|
186
|
+
*/
|
|
187
|
+
function collectLayerDSignals(dataDir) {
|
|
188
|
+
const signals = [];
|
|
189
|
+
const layerDPath = join(dataDir, 'cache', 'layer-d-result.json');
|
|
190
|
+
if (!existsSync(layerDPath))
|
|
191
|
+
return signals;
|
|
192
|
+
try {
|
|
193
|
+
const raw = JSON.parse(readFileSync(layerDPath, 'utf-8'));
|
|
194
|
+
for (const conflict of raw.conflicts ?? []) {
|
|
195
|
+
const sev = (conflict.severity ?? 0) >= 0.7 ? 'HIGH' : (conflict.severity ?? 0) >= 0.4 ? 'MEDIUM' : 'LOW';
|
|
196
|
+
signals.push({
|
|
197
|
+
source: 'layer_d',
|
|
198
|
+
severity: sev,
|
|
199
|
+
category: 'architectural_violation',
|
|
200
|
+
description: conflict.description ?? `Semantic conflict on ${conflict.affectedSymbol ?? 'unknown'}`,
|
|
201
|
+
affected_files: conflict.file ? [conflict.file] : [],
|
|
202
|
+
metadata: { symbol: conflict.affectedSymbol, severity_score: conflict.severity },
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Malformed layer-d data — skip
|
|
208
|
+
}
|
|
209
|
+
return signals;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Collect policy violation signals.
|
|
213
|
+
*/
|
|
214
|
+
function collectPolicySignals(dataDir) {
|
|
215
|
+
const signals = [];
|
|
216
|
+
const policyPath = join(dataDir, 'cache', 'policy-result.json');
|
|
217
|
+
if (!existsSync(policyPath))
|
|
218
|
+
return signals;
|
|
219
|
+
try {
|
|
220
|
+
const raw = JSON.parse(readFileSync(policyPath, 'utf-8'));
|
|
221
|
+
for (const violation of raw.violations ?? []) {
|
|
222
|
+
signals.push({
|
|
223
|
+
source: 'policy',
|
|
224
|
+
severity: violation.severity ?? 'WARNING',
|
|
225
|
+
category: 'governance_breakdown',
|
|
226
|
+
description: violation.message ?? `Policy violation: ${violation.rule ?? 'unknown'}`,
|
|
227
|
+
affected_files: violation.files ?? [],
|
|
228
|
+
metadata: { rule: violation.rule },
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Malformed policy data — skip
|
|
234
|
+
}
|
|
235
|
+
return signals;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Aggregate signals from all detection subsystems into a unified,
|
|
239
|
+
* deduplicated signal list with normalized severity.
|
|
240
|
+
*
|
|
241
|
+
* @param dataDir - Path to the `.codeledger` data directory
|
|
242
|
+
* @returns Deduplicated, severity-normalized signals sorted by severity descending
|
|
243
|
+
*/
|
|
244
|
+
export async function aggregateSignals(dataDir) {
|
|
245
|
+
const rawSignals = [
|
|
246
|
+
...collectDriftSignals(dataDir),
|
|
247
|
+
...collectReviewIntelligenceSignals(dataDir),
|
|
248
|
+
...collectDiscoverySignals(dataDir),
|
|
249
|
+
...collectLayerDSignals(dataDir),
|
|
250
|
+
...collectPolicySignals(dataDir),
|
|
251
|
+
];
|
|
252
|
+
const now = Date.now();
|
|
253
|
+
const normalized = rawSignals.map((raw) => ({
|
|
254
|
+
id: randomUUID(),
|
|
255
|
+
source: raw.source,
|
|
256
|
+
severity: normalizeSeverity(raw.severity),
|
|
257
|
+
category: raw.category,
|
|
258
|
+
description: raw.description,
|
|
259
|
+
affected_files: raw.affected_files,
|
|
260
|
+
timestamp: now,
|
|
261
|
+
metadata: raw.metadata,
|
|
262
|
+
}));
|
|
263
|
+
const deduplicated = deduplicateSignals(normalized);
|
|
264
|
+
// Sort by severity: critical > high > medium > low
|
|
265
|
+
const SEVERITY_ORDER = {
|
|
266
|
+
critical: 4,
|
|
267
|
+
high: 3,
|
|
268
|
+
medium: 2,
|
|
269
|
+
low: 1,
|
|
270
|
+
};
|
|
271
|
+
deduplicated.sort((a, b) => SEVERITY_ORDER[b.severity] - SEVERITY_ORDER[a.severity]);
|
|
272
|
+
return deduplicated;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=signal-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-aggregator.js","sourceRoot":"","sources":["../../src/intervention/signal-aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer D — Semantic/Signature Conflict Detector
|
|
3
|
+
*
|
|
4
|
+
* Compares public surfaces across sessions to detect breaking changes
|
|
5
|
+
* that affect other sessions' dependency surfaces.
|
|
6
|
+
*/
|
|
7
|
+
import type { PublicSurfaceEntry, SessionPublicSurface, SignatureChange, LayerDAnalysis } from '@codeledger/types';
|
|
8
|
+
/** Detect signature changes between two surfaces of the same file */
|
|
9
|
+
export declare function detectSignatureChanges(previous: PublicSurfaceEntry[], current: PublicSurfaceEntry[]): SignatureChange[];
|
|
10
|
+
/** Detect Layer D conflicts across multiple sessions */
|
|
11
|
+
export declare function detectLayerDConflicts(sessions: SessionPublicSurface[], dependencySurfaces: Map<string, string[]>): LayerDAnalysis;
|
|
12
|
+
//# sourceMappingURL=conflict-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../../src/layer-d/conflict-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EAEf,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAE3B,qEAAqE;AACrE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,EAAE,kBAAkB,EAAE,GAC5B,eAAe,EAAE,CA8CnB;AA4BD,wDAAwD;AACxD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACxC,cAAc,CAkDhB"}
|