@hongmaple0820/scale-engine 0.40.2 → 0.43.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.
- package/README.md +30 -2
- package/dist/api/cli.js +19 -0
- package/dist/api/cli.js.map +1 -1
- package/dist/api/quickstart.d.ts +11 -0
- package/dist/api/quickstart.js +98 -1
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/fsmDefinitions.js +15 -2
- package/dist/artifact/fsmDefinitions.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/cache/ScanCache.d.ts +41 -0
- package/dist/cache/ScanCache.js +120 -0
- package/dist/cache/ScanCache.js.map +1 -0
- package/dist/capabilities/BrowserQACapability.d.ts +14 -0
- package/dist/capabilities/BrowserQACapability.js +94 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -1
- package/dist/cli/autofixCommands.d.ts +22 -0
- package/dist/cli/autofixCommands.js +32 -0
- package/dist/cli/autofixCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +71 -0
- package/dist/cli/cortexCommands.js +335 -0
- package/dist/cli/cortexCommands.js.map +1 -0
- package/dist/cli/costCommands.d.ts +13 -0
- package/dist/cli/costCommands.js +48 -0
- package/dist/cli/costCommands.js.map +1 -0
- package/dist/cli/orchCommands.d.ts +43 -0
- package/dist/cli/orchCommands.js +135 -0
- package/dist/cli/orchCommands.js.map +1 -0
- package/dist/cli/phaseCommands.js +1 -2
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/qaCommands.d.ts +22 -0
- package/dist/cli/qaCommands.js +84 -0
- package/dist/cli/qaCommands.js.map +1 -0
- package/dist/cli/quickstartCommands.d.ts +17 -0
- package/dist/cli/quickstartCommands.js +47 -0
- package/dist/cli/quickstartCommands.js.map +1 -0
- package/dist/cli/shieldCommands.d.ts +30 -0
- package/dist/cli/shieldCommands.js +212 -0
- package/dist/cli/shieldCommands.js.map +1 -0
- package/dist/cli/tuiCommands.d.ts +7 -0
- package/dist/cli/tuiCommands.js +33 -0
- package/dist/cli/tuiCommands.js.map +1 -0
- package/dist/config/profiles.js +26 -0
- package/dist/config/profiles.js.map +1 -1
- package/dist/cortex/GovernanceMetrics.d.ts +66 -0
- package/dist/cortex/GovernanceMetrics.js +230 -0
- package/dist/cortex/GovernanceMetrics.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +61 -0
- package/dist/cortex/InstinctExtractor.js +184 -0
- package/dist/cortex/InstinctExtractor.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +54 -0
- package/dist/cortex/InstinctStore.js +266 -0
- package/dist/cortex/InstinctStore.js.map +1 -0
- package/dist/cortex/ReflexionEngine.d.ts +34 -0
- package/dist/cortex/ReflexionEngine.js +157 -0
- package/dist/cortex/ReflexionEngine.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +44 -0
- package/dist/cortex/SessionInjector.js +127 -0
- package/dist/cortex/SessionInjector.js.map +1 -0
- package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
- package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
- package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
- package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CodexAdapter.js +52 -0
- package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
- package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CursorAdapter.js +46 -0
- package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
- package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
- package/dist/cortex/adapters/GeminiAdapter.js +48 -0
- package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
- package/dist/eval/BenchmarkPublisher.d.ts +25 -0
- package/dist/eval/BenchmarkPublisher.js +27 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -0
- package/dist/guardrails/DependencyAuditor.js +10 -1
- package/dist/guardrails/DependencyAuditor.js.map +1 -1
- package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
- package/dist/orchestrator/OrchestratorDaemon.js +150 -0
- package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
- package/dist/orchestrator/PolicyLoader.d.ts +80 -0
- package/dist/orchestrator/PolicyLoader.js +229 -0
- package/dist/orchestrator/PolicyLoader.js.map +1 -0
- package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
- package/dist/orchestrator/ReconciliationLoop.js +266 -0
- package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
- package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
- package/dist/orchestrator/TrackerAdapter.js +147 -0
- package/dist/orchestrator/TrackerAdapter.js.map +1 -0
- package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
- package/dist/orchestrator/WorkspaceManager.js +257 -0
- package/dist/orchestrator/WorkspaceManager.js.map +1 -0
- package/dist/qa/BrowserDaemon.d.ts +23 -0
- package/dist/qa/BrowserDaemon.js +79 -0
- package/dist/qa/BrowserDaemon.js.map +1 -0
- package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
- package/dist/qa/E2ETestOrchestrator.js +19 -0
- package/dist/qa/E2ETestOrchestrator.js.map +1 -0
- package/dist/review/CrossModelReviewer.d.ts +35 -0
- package/dist/review/CrossModelReviewer.js +75 -0
- package/dist/review/CrossModelReviewer.js.map +1 -0
- package/dist/review/ReviewAggregator.d.ts +13 -0
- package/dist/review/ReviewAggregator.js +28 -0
- package/dist/review/ReviewAggregator.js.map +1 -0
- package/dist/review/reviewCommands.d.ts +15 -0
- package/dist/review/reviewCommands.js +24 -0
- package/dist/review/reviewCommands.js.map +1 -0
- package/dist/routing/LocalModelProvider.d.ts +11 -0
- package/dist/routing/LocalModelProvider.js +21 -0
- package/dist/routing/LocalModelProvider.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +12 -0
- package/dist/routing/ModelRouter.js +31 -4
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/runtime/AiOsRuntime.d.ts +1 -0
- package/dist/runtime/AiOsRuntime.js +15 -0
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/CostAnalyzer.d.ts +53 -0
- package/dist/runtime/CostAnalyzer.js +160 -0
- package/dist/runtime/CostAnalyzer.js.map +1 -0
- package/dist/runtime/CostOptimizer.d.ts +11 -0
- package/dist/runtime/CostOptimizer.js +21 -0
- package/dist/runtime/CostOptimizer.js.map +1 -0
- package/dist/shield/PolicyCompiler.d.ts +70 -0
- package/dist/shield/PolicyCompiler.js +540 -0
- package/dist/shield/PolicyCompiler.js.map +1 -0
- package/dist/shield/ProtectedPaths.d.ts +39 -0
- package/dist/shield/ProtectedPaths.js +179 -0
- package/dist/shield/ProtectedPaths.js.map +1 -0
- package/dist/shield/ShieldProtocol.d.ts +50 -0
- package/dist/shield/ShieldProtocol.js +103 -0
- package/dist/shield/ShieldProtocol.js.map +1 -0
- package/dist/skills/SkillMdStandard.d.ts +33 -0
- package/dist/skills/SkillMdStandard.js +88 -0
- package/dist/skills/SkillMdStandard.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +9 -1
- package/dist/skills/SkillRegistry.js +20 -0
- package/dist/skills/SkillRegistry.js.map +1 -1
- package/dist/skills/interop/GStackInterop.d.ts +15 -0
- package/dist/skills/interop/GStackInterop.js +34 -0
- package/dist/skills/interop/GStackInterop.js.map +1 -0
- package/dist/skills/interop/OMCInterop.d.ts +15 -0
- package/dist/skills/interop/OMCInterop.js +34 -0
- package/dist/skills/interop/OMCInterop.js.map +1 -0
- package/dist/tui/TuiDashboard.d.ts +3 -0
- package/dist/tui/TuiDashboard.js +120 -0
- package/dist/tui/TuiDashboard.js.map +1 -0
- package/dist/workflow/GateCatalog.d.ts +2 -0
- package/dist/workflow/GateCatalog.js +59 -3
- package/dist/workflow/GateCatalog.js.map +1 -1
- package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
- package/dist/workflow/GovernanceTemplatePacks.js +15 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
- package/dist/workflow/TddLoop.d.ts +2 -0
- package/dist/workflow/TddLoop.js +2 -0
- package/dist/workflow/TddLoop.js.map +1 -1
- package/dist/workflow/UpgradeManager.d.ts +10 -1
- package/dist/workflow/UpgradeManager.js +55 -0
- package/dist/workflow/UpgradeManager.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +8 -0
- package/dist/workflow/VerificationProfile.js +61 -0
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/VerificationSchema.d.ts +46 -0
- package/dist/workflow/VerificationSchema.js +97 -0
- package/dist/workflow/VerificationSchema.js.map +1 -0
- package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
- package/dist/workflow/autofix/AutoFixEngine.js +169 -0
- package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +18 -0
- package/dist/workflow/execution/RalphEngine.js +22 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -1
- package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
- package/dist/workflow/gates/EnhancedGates.js +653 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +3 -0
- package/dist/workflow/gates/GateSystem.js +94 -1
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/types.d.ts +1 -1
- package/docs/README.md +3 -0
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
- package/docs/guides/GETTING_STARTED.md +19 -0
- package/docs/guides/MIGRATION.md +119 -0
- package/docs/workflow/GATES_AND_SCORE.md +34 -1
- package/docs/workflow/README.md +58 -10
- package/package.json +5 -17
- package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
- package/docs/BACKGROUND_HUNTER.md +0 -62
- package/docs/CODE_INTELLIGENCE.md +0 -180
- package/docs/CONTEXT_BUDGET.md +0 -165
- package/docs/DEPENDENCY_AUDIT.md +0 -118
- package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
- package/docs/GITLAB_FLOW.md +0 -125
- package/docs/GOVERNANCE_DASHBOARD.md +0 -92
- package/docs/MEMORY_BRAIN.md +0 -104
- package/docs/MEMORY_FABRIC.md +0 -161
- package/docs/RESOURCE_GOVERNANCE.md +0 -92
- package/docs/RUNTIME_EVIDENCE.md +0 -101
- package/docs/WORKFLOW_EVAL.md +0 -151
- package/image/wechat-public.jpg +0 -0
- package/image/wxPay.jpg +0 -0
- package/image/zfb.jpg +0 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// SCALE Cortex — Governance ROI Metrics
|
|
2
|
+
// 对齐 ECC: multi-hook governance ROI measurement
|
|
3
|
+
// Tracks: gate pass rates, token costs, instinct hit rate, auto-fix success, savings
|
|
4
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// GovernanceMetricsCalculator
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export class GovernanceMetricsCalculator {
|
|
11
|
+
constructor(scaleDir = join(process.cwd(), '.scale')) {
|
|
12
|
+
this.scaleDir = scaleDir;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Compute full governance metrics from observation logs and instinct store.
|
|
16
|
+
*/
|
|
17
|
+
compute(instincts, lookbackDays = 30) {
|
|
18
|
+
const observations = this.loadObservations(lookbackDays);
|
|
19
|
+
const prevObservations = this.loadObservationsRange(lookbackDays, lookbackDays * 2);
|
|
20
|
+
// Gates
|
|
21
|
+
const gateMetrics = this.computeGateMetrics(observations);
|
|
22
|
+
// Instincts
|
|
23
|
+
const instinctMetrics = this.computeInstinctMetrics(instincts);
|
|
24
|
+
// Cost
|
|
25
|
+
const cost = this.computeCostMetrics(observations, instinctMetrics);
|
|
26
|
+
// Auto-fix
|
|
27
|
+
const autoFix = this.computeAutoFixMetrics(observations);
|
|
28
|
+
// Trends
|
|
29
|
+
const trends = this.computeTrends(observations, prevObservations, instinctMetrics);
|
|
30
|
+
return {
|
|
31
|
+
gates: gateMetrics,
|
|
32
|
+
instincts: instinctMetrics,
|
|
33
|
+
cost,
|
|
34
|
+
autoFix,
|
|
35
|
+
trends,
|
|
36
|
+
period: {
|
|
37
|
+
start: new Date(Date.now() - lookbackDays * 86400000).toISOString().slice(0, 10),
|
|
38
|
+
end: new Date().toISOString().slice(0, 10),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Render metrics as a terminal report.
|
|
44
|
+
*/
|
|
45
|
+
render(metrics) {
|
|
46
|
+
const pct = (n) => `${(n * 100).toFixed(1)}%`;
|
|
47
|
+
const usd = (n) => `$${n.toFixed(2)}`;
|
|
48
|
+
return [
|
|
49
|
+
'SCALE Cortex — Governance ROI Report',
|
|
50
|
+
`Period: ${metrics.period.start} → ${metrics.period.end}`,
|
|
51
|
+
'',
|
|
52
|
+
'═══ Gate Performance ═══',
|
|
53
|
+
` Total runs: ${metrics.gates.totalRuns}`,
|
|
54
|
+
` Pass rate: ${pct(metrics.gates.passRate)}`,
|
|
55
|
+
` Fail rate: ${pct(metrics.gates.failRate)}`,
|
|
56
|
+
` Avg duration: ${metrics.gates.avgDurationMs}ms`,
|
|
57
|
+
'',
|
|
58
|
+
'═══ Instinct Performance ═══',
|
|
59
|
+
` Extracted: ${metrics.instincts.totalExtracted}`,
|
|
60
|
+
` Injected: ${metrics.instincts.totalInjected}`,
|
|
61
|
+
` Applied: ${metrics.instincts.totalApplied}`,
|
|
62
|
+
` Hit rate: ${pct(metrics.instincts.hitRate)}`,
|
|
63
|
+
'',
|
|
64
|
+
'═══ Cost Analysis ═══',
|
|
65
|
+
` Total tokens: ${metrics.cost.totalTokens.toLocaleString()}`,
|
|
66
|
+
` Total cost: ${usd(metrics.cost.totalCost)}`,
|
|
67
|
+
` Avg token/gate: ${Math.round(metrics.cost.avgTokensPerGate).toLocaleString()}`,
|
|
68
|
+
` Saved (cache): ${usd(metrics.cost.estimatedSavingsFromCaching)}`,
|
|
69
|
+
` Saved (instinct): ${usd(metrics.cost.estimatedSavingsFromInstincts)}`,
|
|
70
|
+
'',
|
|
71
|
+
'═══ Auto-Fix ═══',
|
|
72
|
+
` Attempts: ${metrics.autoFix.totalAttempts}`,
|
|
73
|
+
` Success rate: ${pct(metrics.autoFix.successRate)}`,
|
|
74
|
+
` Avg attempts: ${metrics.autoFix.avgAttemptsPerFix.toFixed(1)}`,
|
|
75
|
+
` Time saved: ${metrics.autoFix.totalTimeSavedMinutes} min`,
|
|
76
|
+
'',
|
|
77
|
+
'═══ Trends (△ vs previous period) ═══',
|
|
78
|
+
` Pass rate: ${metrics.trends.passRateDelta > 0 ? '+' : ''}${pct(metrics.trends.passRateDelta)}`,
|
|
79
|
+
` Cost: ${metrics.trends.costDelta > 0 ? '+' : ''}${usd(metrics.trends.costDelta)}`,
|
|
80
|
+
` Instinct hit: ${metrics.trends.instinctHitRateDelta > 0 ? '+' : ''}${pct(metrics.trends.instinctHitRateDelta)}`,
|
|
81
|
+
'',
|
|
82
|
+
`ROI Score: ${this.computeROIScore(metrics)}/100`,
|
|
83
|
+
].join('\n');
|
|
84
|
+
}
|
|
85
|
+
// -----------------------------------------------------------------------
|
|
86
|
+
// Internal
|
|
87
|
+
// -----------------------------------------------------------------------
|
|
88
|
+
loadObservations(lookbackDays) {
|
|
89
|
+
return this.loadObservationsRange(0, lookbackDays);
|
|
90
|
+
}
|
|
91
|
+
loadObservationsRange(startDaysAgo, endDaysAgo) {
|
|
92
|
+
const obsDir = join(this.scaleDir, 'observations');
|
|
93
|
+
if (!existsSync(obsDir))
|
|
94
|
+
return [];
|
|
95
|
+
const start = Date.now() - endDaysAgo * 86400000;
|
|
96
|
+
const end = Date.now() - startDaysAgo * 86400000;
|
|
97
|
+
const results = [];
|
|
98
|
+
try {
|
|
99
|
+
for (const file of readdirSync(obsDir)) {
|
|
100
|
+
if (!file.endsWith('.jsonl'))
|
|
101
|
+
continue;
|
|
102
|
+
const lines = readFileSync(join(obsDir, file), 'utf-8').split('\n').filter(Boolean);
|
|
103
|
+
for (const line of lines) {
|
|
104
|
+
try {
|
|
105
|
+
const obs = JSON.parse(line);
|
|
106
|
+
const ts = new Date(obs.timestamp).getTime();
|
|
107
|
+
if (ts >= start && ts < end)
|
|
108
|
+
results.push(obs);
|
|
109
|
+
}
|
|
110
|
+
catch { /* skip */ }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
logger.warn({ err }, 'Failed to load observations');
|
|
116
|
+
}
|
|
117
|
+
return results;
|
|
118
|
+
}
|
|
119
|
+
computeGateMetrics(observations) {
|
|
120
|
+
const byGate = {};
|
|
121
|
+
let totalRuns = 0;
|
|
122
|
+
let totalPassed = 0;
|
|
123
|
+
let totalDuration = 0;
|
|
124
|
+
for (const obs of observations) {
|
|
125
|
+
totalRuns++;
|
|
126
|
+
if (obs.gateStatus === 'PASS')
|
|
127
|
+
totalPassed++;
|
|
128
|
+
if (obs.gateName) {
|
|
129
|
+
if (!byGate[obs.gateName])
|
|
130
|
+
byGate[obs.gateName] = { runs: 0, passed: 0, avgTokens: 0 };
|
|
131
|
+
byGate[obs.gateName].runs++;
|
|
132
|
+
if (obs.gateStatus === 'PASS')
|
|
133
|
+
byGate[obs.gateName].passed++;
|
|
134
|
+
byGate[obs.gateName].avgTokens += obs.tokensUsed ?? 0;
|
|
135
|
+
}
|
|
136
|
+
totalDuration += obs.durationMs ?? 0;
|
|
137
|
+
}
|
|
138
|
+
// Finalize averages
|
|
139
|
+
for (const gate of Object.values(byGate)) {
|
|
140
|
+
gate.avgTokens = gate.runs > 0 ? Math.round(gate.avgTokens / gate.runs) : 0;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
totalRuns,
|
|
144
|
+
passRate: totalRuns > 0 ? totalPassed / totalRuns : 0,
|
|
145
|
+
failRate: totalRuns > 0 ? (totalRuns - totalPassed) / totalRuns : 0,
|
|
146
|
+
avgDurationMs: totalRuns > 0 ? Math.round(totalDuration / totalRuns) : 0,
|
|
147
|
+
byGate,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
computeInstinctMetrics(instincts) {
|
|
151
|
+
const byConfidence = {
|
|
152
|
+
'near-certain (0.9)': { count: 0, hitRate: 0 },
|
|
153
|
+
'strong (0.7)': { count: 0, hitRate: 0 },
|
|
154
|
+
'moderate (0.5)': { count: 0, hitRate: 0 },
|
|
155
|
+
'tentative (0.3)': { count: 0, hitRate: 0 },
|
|
156
|
+
};
|
|
157
|
+
for (const i of instincts) {
|
|
158
|
+
const bucket = i.confidence >= 0.9 ? 'near-certain (0.9)' :
|
|
159
|
+
i.confidence >= 0.7 ? 'strong (0.7)' :
|
|
160
|
+
i.confidence >= 0.5 ? 'moderate (0.5)' : 'tentative (0.3)';
|
|
161
|
+
byConfidence[bucket].count++;
|
|
162
|
+
byConfidence[bucket].hitRate += i.hitRate;
|
|
163
|
+
}
|
|
164
|
+
for (const bucket of Object.values(byConfidence)) {
|
|
165
|
+
bucket.hitRate = bucket.count > 0 ? bucket.hitRate / bucket.count : 0;
|
|
166
|
+
}
|
|
167
|
+
const totalApplied = instincts.reduce((sum, i) => sum + i.appliedCount, 0);
|
|
168
|
+
const totalObs = instincts.reduce((sum, i) => sum + i.observations, 0);
|
|
169
|
+
return {
|
|
170
|
+
totalExtracted: instincts.length,
|
|
171
|
+
totalInjected: instincts.filter(i => i.confidence >= 0.7).length,
|
|
172
|
+
totalApplied,
|
|
173
|
+
hitRate: totalObs > 0 ? totalApplied / totalObs : 0,
|
|
174
|
+
byConfidence,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
computeCostMetrics(observations, _instinctMetrics) {
|
|
178
|
+
const totalTokens = observations.reduce((sum, o) => sum + (o.tokensUsed ?? 0), 0);
|
|
179
|
+
const totalCost = observations.reduce((sum, o) => sum + (o.estimatedCostUsd ?? 0), 0);
|
|
180
|
+
return {
|
|
181
|
+
totalTokens,
|
|
182
|
+
totalCost,
|
|
183
|
+
avgTokensPerGate: observations.length > 0 ? totalTokens / observations.length : 0,
|
|
184
|
+
estimatedSavingsFromCaching: totalCost * 0.15, // ~15% from caching
|
|
185
|
+
estimatedSavingsFromInstincts: totalCost * 0.10, // ~10% from instinct prevention
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
computeAutoFixMetrics(observations) {
|
|
189
|
+
const autoFixObs = observations.filter(o => o.gateName?.includes('auto-fix'));
|
|
190
|
+
const successes = autoFixObs.filter(o => o.gateStatus === 'PASS').length;
|
|
191
|
+
const totalAttempts = autoFixObs.length;
|
|
192
|
+
return {
|
|
193
|
+
totalAttempts,
|
|
194
|
+
successRate: totalAttempts > 0 ? successes / totalAttempts : 0,
|
|
195
|
+
avgAttemptsPerFix: totalAttempts > 0 ? totalAttempts / Math.max(successes, 1) : 0,
|
|
196
|
+
totalTimeSavedMinutes: successes * 5, // ~5 min saved per auto-fix
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
computeTrends(current, previous, instinctMetrics) {
|
|
200
|
+
const currentPassRate = current.length > 0
|
|
201
|
+
? current.filter(o => o.gateStatus === 'PASS').length / current.length
|
|
202
|
+
: 0;
|
|
203
|
+
const prevPassRate = previous.length > 0
|
|
204
|
+
? previous.filter(o => o.gateStatus === 'PASS').length / previous.length
|
|
205
|
+
: 0;
|
|
206
|
+
const currentCost = current.reduce((s, o) => s + (o.estimatedCostUsd ?? 0), 0);
|
|
207
|
+
const prevCost = previous.reduce((s, o) => s + (o.estimatedCostUsd ?? 0), 0);
|
|
208
|
+
return {
|
|
209
|
+
passRateDelta: currentPassRate - prevPassRate,
|
|
210
|
+
costDelta: currentCost - prevCost,
|
|
211
|
+
instinctHitRateDelta: 0, // Requires historical hit rate data
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
computeROIScore(metrics) {
|
|
215
|
+
let score = 50; // baseline
|
|
216
|
+
// Gate pass rate contributes up to 20 points
|
|
217
|
+
score += Math.round(metrics.gates.passRate * 20);
|
|
218
|
+
// Instinct hit rate contributes up to 15 points
|
|
219
|
+
score += Math.round(metrics.instincts.hitRate * 15);
|
|
220
|
+
// Auto-fix success contributes up to 10 points
|
|
221
|
+
score += Math.round(metrics.autoFix.successRate * 10);
|
|
222
|
+
// Positive cost savings contribute up to 5 points
|
|
223
|
+
if (metrics.cost.estimatedSavingsFromCaching > 0)
|
|
224
|
+
score += 3;
|
|
225
|
+
if (metrics.cost.estimatedSavingsFromInstincts > 0)
|
|
226
|
+
score += 2;
|
|
227
|
+
return Math.min(100, Math.max(0, score));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=GovernanceMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GovernanceMetrics.js","sourceRoot":"","sources":["../../src/cortex/GovernanceMetrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface Instinct {
|
|
2
|
+
id: string;
|
|
3
|
+
trigger: string;
|
|
4
|
+
confidence: number;
|
|
5
|
+
domain: string;
|
|
6
|
+
source: string;
|
|
7
|
+
scope: 'project' | 'global';
|
|
8
|
+
projectId?: string;
|
|
9
|
+
action: string;
|
|
10
|
+
evidence: string[];
|
|
11
|
+
observations: number;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
appliedCount: number;
|
|
15
|
+
hitRate: number;
|
|
16
|
+
}
|
|
17
|
+
export interface Observation {
|
|
18
|
+
timestamp: string;
|
|
19
|
+
sessionId: string;
|
|
20
|
+
gateName: string;
|
|
21
|
+
gateStatus: 'PASS' | 'FAIL' | 'WARN';
|
|
22
|
+
errorPattern?: string;
|
|
23
|
+
filePaths: string[];
|
|
24
|
+
rootCause?: string;
|
|
25
|
+
resolution?: string;
|
|
26
|
+
tokensUsed: number;
|
|
27
|
+
modelUsed: string;
|
|
28
|
+
}
|
|
29
|
+
export interface PatternMatch {
|
|
30
|
+
pattern: string;
|
|
31
|
+
count: number;
|
|
32
|
+
observations: Observation[];
|
|
33
|
+
rootCauses: string[];
|
|
34
|
+
resolutions: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare class InstinctExtractor {
|
|
37
|
+
private observationsDir;
|
|
38
|
+
private instinctsDir;
|
|
39
|
+
constructor(baseDir?: string);
|
|
40
|
+
/**
|
|
41
|
+
* Load observations from .scale/observations/ directory.
|
|
42
|
+
*/
|
|
43
|
+
loadObservations(): Observation[];
|
|
44
|
+
/**
|
|
45
|
+
* Detect patterns from observations.
|
|
46
|
+
* Groups failures by error pattern, finds recurring root causes.
|
|
47
|
+
*/
|
|
48
|
+
detectPatterns(observations: Observation[]): PatternMatch[];
|
|
49
|
+
/**
|
|
50
|
+
* Extract instincts from detected patterns.
|
|
51
|
+
*/
|
|
52
|
+
extract(patterns: PatternMatch[]): Instinct[];
|
|
53
|
+
/**
|
|
54
|
+
* Record an observation for future instinct extraction.
|
|
55
|
+
*/
|
|
56
|
+
recordObservation(obs: Observation): void;
|
|
57
|
+
private computeConfidence;
|
|
58
|
+
private inferDomain;
|
|
59
|
+
private generateTrigger;
|
|
60
|
+
private buildAction;
|
|
61
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// SCALE Cortex — Instinct Extractor
|
|
2
|
+
// 对齐 ECC: Observation Log → Pattern Detection → Instinct Creation
|
|
3
|
+
// Confidence scoring: 0.3 tentative → 0.5 moderate → 0.7 strong → 0.9 near-certain
|
|
4
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { logger } from '../core/logger.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// InstinctExtractor
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export class InstinctExtractor {
|
|
12
|
+
constructor(baseDir = join(process.cwd(), '.scale')) {
|
|
13
|
+
this.observationsDir = join(baseDir, 'observations');
|
|
14
|
+
this.instinctsDir = join(baseDir, 'instincts');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load observations from .scale/observations/ directory.
|
|
18
|
+
*/
|
|
19
|
+
loadObservations() {
|
|
20
|
+
if (!existsSync(this.observationsDir))
|
|
21
|
+
return [];
|
|
22
|
+
const observations = [];
|
|
23
|
+
try {
|
|
24
|
+
for (const file of readdirSync(this.observationsDir)) {
|
|
25
|
+
if (!file.endsWith('.jsonl'))
|
|
26
|
+
continue;
|
|
27
|
+
const lines = readFileSync(join(this.observationsDir, file), 'utf-8')
|
|
28
|
+
.split('\n')
|
|
29
|
+
.filter(Boolean);
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
try {
|
|
32
|
+
observations.push(JSON.parse(line));
|
|
33
|
+
}
|
|
34
|
+
catch { /* skip malformed */ }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
logger.warn({ err }, 'Failed to load observations');
|
|
40
|
+
}
|
|
41
|
+
return observations;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect patterns from observations.
|
|
45
|
+
* Groups failures by error pattern, finds recurring root causes.
|
|
46
|
+
*/
|
|
47
|
+
detectPatterns(observations) {
|
|
48
|
+
const failures = observations.filter(o => o.gateStatus === 'FAIL');
|
|
49
|
+
const patterns = new Map();
|
|
50
|
+
for (const obs of failures) {
|
|
51
|
+
const key = obs.errorPattern ?? obs.gateName;
|
|
52
|
+
if (!patterns.has(key)) {
|
|
53
|
+
patterns.set(key, {
|
|
54
|
+
pattern: key,
|
|
55
|
+
count: 0,
|
|
56
|
+
observations: [],
|
|
57
|
+
rootCauses: [],
|
|
58
|
+
resolutions: [],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const match = patterns.get(key);
|
|
62
|
+
match.count++;
|
|
63
|
+
match.observations.push(obs);
|
|
64
|
+
if (obs.rootCause && !match.rootCauses.includes(obs.rootCause)) {
|
|
65
|
+
match.rootCauses.push(obs.rootCause);
|
|
66
|
+
}
|
|
67
|
+
if (obs.resolution && !match.resolutions.includes(obs.resolution)) {
|
|
68
|
+
match.resolutions.push(obs.resolution);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Sort by count descending
|
|
72
|
+
return Array.from(patterns.values()).sort((a, b) => b.count - a.count);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract instincts from detected patterns.
|
|
76
|
+
*/
|
|
77
|
+
extract(patterns) {
|
|
78
|
+
const instincts = [];
|
|
79
|
+
for (const pattern of patterns) {
|
|
80
|
+
if (pattern.count < 1)
|
|
81
|
+
continue;
|
|
82
|
+
// Compute confidence
|
|
83
|
+
const confidence = this.computeConfidence(pattern.count, pattern.rootCauses.length);
|
|
84
|
+
// Determine domain
|
|
85
|
+
const domain = this.inferDomain(pattern.pattern);
|
|
86
|
+
// Generate trigger from pattern
|
|
87
|
+
const trigger = this.generateTrigger(pattern);
|
|
88
|
+
// Build action
|
|
89
|
+
const action = this.buildAction(pattern);
|
|
90
|
+
const id = `instinct-${createHash('sha256').update(pattern.pattern).digest('hex').slice(0, 10)}`;
|
|
91
|
+
instincts.push({
|
|
92
|
+
id,
|
|
93
|
+
trigger,
|
|
94
|
+
confidence,
|
|
95
|
+
domain,
|
|
96
|
+
source: `extracted from ${pattern.count} observations`,
|
|
97
|
+
scope: confidence >= 0.7 ? 'global' : 'project',
|
|
98
|
+
action,
|
|
99
|
+
evidence: pattern.observations.slice(0, 5).map(o => `[${o.timestamp}] ${o.gateName}: ${o.errorPattern ?? 'failure'}`),
|
|
100
|
+
observations: pattern.count,
|
|
101
|
+
createdAt: new Date().toISOString(),
|
|
102
|
+
updatedAt: new Date().toISOString(),
|
|
103
|
+
appliedCount: 0,
|
|
104
|
+
hitRate: 0,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return instincts.sort((a, b) => b.confidence - a.confidence);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Record an observation for future instinct extraction.
|
|
111
|
+
*/
|
|
112
|
+
recordObservation(obs) {
|
|
113
|
+
if (!existsSync(this.observationsDir)) {
|
|
114
|
+
mkdirSync(this.observationsDir, { recursive: true });
|
|
115
|
+
}
|
|
116
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
117
|
+
const file = join(this.observationsDir, `${today}.jsonl`);
|
|
118
|
+
writeFileSync(file, JSON.stringify(obs) + '\n', { flag: 'a' });
|
|
119
|
+
}
|
|
120
|
+
// -----------------------------------------------------------------------
|
|
121
|
+
// Internal
|
|
122
|
+
// -----------------------------------------------------------------------
|
|
123
|
+
computeConfidence(count, rootCauseCount) {
|
|
124
|
+
if (count >= 10 && rootCauseCount >= 3)
|
|
125
|
+
return 0.9; // near-certain
|
|
126
|
+
if (count >= 5)
|
|
127
|
+
return 0.7; // strong
|
|
128
|
+
if (count >= 2)
|
|
129
|
+
return 0.5; // moderate
|
|
130
|
+
return 0.3; // tentative
|
|
131
|
+
}
|
|
132
|
+
inferDomain(pattern) {
|
|
133
|
+
const lower = pattern.toLowerCase();
|
|
134
|
+
if (lower.includes('security') || lower.includes('secret') || lower.includes('vuln'))
|
|
135
|
+
return 'security';
|
|
136
|
+
if (lower.includes('test') || lower.includes('coverage') || lower.includes('assert'))
|
|
137
|
+
return 'testing';
|
|
138
|
+
if (lower.includes('lint') || lower.includes('style') || lower.includes('format'))
|
|
139
|
+
return 'code-quality';
|
|
140
|
+
if (lower.includes('build') || lower.includes('compile') || lower.includes('type'))
|
|
141
|
+
return 'build';
|
|
142
|
+
if (lower.includes('governance') || lower.includes('gate') || lower.includes('policy'))
|
|
143
|
+
return 'governance';
|
|
144
|
+
if (lower.includes('import') || lower.includes('dependency') || lower.includes('module'))
|
|
145
|
+
return 'dependencies';
|
|
146
|
+
return 'general';
|
|
147
|
+
}
|
|
148
|
+
generateTrigger(pattern) {
|
|
149
|
+
// Use the most frequent root cause as trigger
|
|
150
|
+
if (pattern.rootCauses.length > 0) {
|
|
151
|
+
return pattern.rootCauses[0];
|
|
152
|
+
}
|
|
153
|
+
return `gate:${pattern.pattern}`;
|
|
154
|
+
}
|
|
155
|
+
buildAction(pattern) {
|
|
156
|
+
const lines = [
|
|
157
|
+
`## Trigger`,
|
|
158
|
+
`${pattern.pattern}`,
|
|
159
|
+
'',
|
|
160
|
+
`## Observed Behavior`,
|
|
161
|
+
`This failure pattern has been observed ${pattern.count} time(s).`,
|
|
162
|
+
'',
|
|
163
|
+
];
|
|
164
|
+
if (pattern.rootCauses.length > 0) {
|
|
165
|
+
lines.push('## Root Causes');
|
|
166
|
+
for (const rc of pattern.rootCauses.slice(0, 3)) {
|
|
167
|
+
lines.push(`- ${rc}`);
|
|
168
|
+
}
|
|
169
|
+
lines.push('');
|
|
170
|
+
}
|
|
171
|
+
if (pattern.resolutions.length > 0) {
|
|
172
|
+
lines.push('## Known Resolutions');
|
|
173
|
+
for (const r of pattern.resolutions.slice(0, 3)) {
|
|
174
|
+
lines.push(`- ${r}`);
|
|
175
|
+
}
|
|
176
|
+
lines.push('');
|
|
177
|
+
}
|
|
178
|
+
lines.push('## Recommended Action');
|
|
179
|
+
lines.push(`Before performing actions matching "${pattern.pattern}", review the known resolutions above.`);
|
|
180
|
+
lines.push(`If this is a recurrence, escalate by running: scale auto-fix`);
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=InstinctExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstinctExtractor.js","sourceRoot":"","sources":["../../src/cortex/InstinctExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Instinct } from './InstinctExtractor.js';
|
|
2
|
+
export declare class InstinctStore {
|
|
3
|
+
private baseDir;
|
|
4
|
+
constructor(baseDir?: string);
|
|
5
|
+
/**
|
|
6
|
+
* Save an instinct to disk.
|
|
7
|
+
* Deduplication: if an instinct with the same trigger exists, only keep the higher-confidence one.
|
|
8
|
+
*/
|
|
9
|
+
save(instinct: Instinct): string;
|
|
10
|
+
/**
|
|
11
|
+
* Load all instincts from disk.
|
|
12
|
+
*/
|
|
13
|
+
loadAll(): Instinct[];
|
|
14
|
+
/**
|
|
15
|
+
* Get instincts filtered by confidence threshold and scope.
|
|
16
|
+
*/
|
|
17
|
+
query(options: {
|
|
18
|
+
minConfidence?: number;
|
|
19
|
+
domain?: string;
|
|
20
|
+
scope?: 'project' | 'global';
|
|
21
|
+
projectId?: string;
|
|
22
|
+
}): Instinct[];
|
|
23
|
+
/**
|
|
24
|
+
* Get high-confidence instincts for SessionStart injection (0.7+).
|
|
25
|
+
*/
|
|
26
|
+
getInjectionInstincts(projectId?: string): Instinct[];
|
|
27
|
+
/**
|
|
28
|
+
* Find an instinct by trigger pattern.
|
|
29
|
+
*/
|
|
30
|
+
findByTrigger(trigger: string): Instinct | null;
|
|
31
|
+
/**
|
|
32
|
+
* Find an instinct by ID.
|
|
33
|
+
*/
|
|
34
|
+
findById(id: string): Instinct | null;
|
|
35
|
+
/**
|
|
36
|
+
* Delete an instinct by ID.
|
|
37
|
+
*/
|
|
38
|
+
delete(id: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Record an instinct was applied (for hit rate tracking).
|
|
41
|
+
*/
|
|
42
|
+
recordApplication(id: string, success: boolean): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get store statistics.
|
|
45
|
+
*/
|
|
46
|
+
stats(): {
|
|
47
|
+
total: number;
|
|
48
|
+
byDomain: Record<string, number>;
|
|
49
|
+
byConfidence: Record<string, number>;
|
|
50
|
+
};
|
|
51
|
+
private writeInstinctFile;
|
|
52
|
+
private serializeInstinct;
|
|
53
|
+
private parseInstinctFile;
|
|
54
|
+
}
|