@hongmaple0820/scale-engine 0.40.2 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +30 -2
  2. package/dist/api/cli.js +43 -2
  3. package/dist/api/cli.js.map +1 -1
  4. package/dist/api/quickstart.d.ts +11 -0
  5. package/dist/api/quickstart.js +98 -1
  6. package/dist/api/quickstart.js.map +1 -1
  7. package/dist/artifact/fsmDefinitions.js +15 -2
  8. package/dist/artifact/fsmDefinitions.js.map +1 -1
  9. package/dist/artifact/types.d.ts +1 -1
  10. package/dist/artifact/types.js.map +1 -1
  11. package/dist/cache/ScanCache.d.ts +41 -0
  12. package/dist/cache/ScanCache.js +120 -0
  13. package/dist/cache/ScanCache.js.map +1 -0
  14. package/dist/capabilities/BrowserQACapability.d.ts +14 -0
  15. package/dist/capabilities/BrowserQACapability.js +94 -0
  16. package/dist/capabilities/BrowserQACapability.js.map +1 -1
  17. package/dist/cli/autofixCommands.d.ts +22 -0
  18. package/dist/cli/autofixCommands.js +32 -0
  19. package/dist/cli/autofixCommands.js.map +1 -0
  20. package/dist/cli/cortexCommands.d.ts +71 -0
  21. package/dist/cli/cortexCommands.js +335 -0
  22. package/dist/cli/cortexCommands.js.map +1 -0
  23. package/dist/cli/costCommands.d.ts +13 -0
  24. package/dist/cli/costCommands.js +48 -0
  25. package/dist/cli/costCommands.js.map +1 -0
  26. package/dist/cli/orchCommands.d.ts +43 -0
  27. package/dist/cli/orchCommands.js +135 -0
  28. package/dist/cli/orchCommands.js.map +1 -0
  29. package/dist/cli/phaseCommands.js +1 -2
  30. package/dist/cli/phaseCommands.js.map +1 -1
  31. package/dist/cli/qaCommands.d.ts +22 -0
  32. package/dist/cli/qaCommands.js +84 -0
  33. package/dist/cli/qaCommands.js.map +1 -0
  34. package/dist/cli/quickstartCommands.d.ts +17 -0
  35. package/dist/cli/quickstartCommands.js +47 -0
  36. package/dist/cli/quickstartCommands.js.map +1 -0
  37. package/dist/cli/shieldCommands.d.ts +30 -0
  38. package/dist/cli/shieldCommands.js +212 -0
  39. package/dist/cli/shieldCommands.js.map +1 -0
  40. package/dist/cli/tuiCommands.d.ts +7 -0
  41. package/dist/cli/tuiCommands.js +33 -0
  42. package/dist/cli/tuiCommands.js.map +1 -0
  43. package/dist/codegraph/CodeIntelligence.d.ts +27 -0
  44. package/dist/codegraph/CodeIntelligence.js +316 -3
  45. package/dist/codegraph/CodeIntelligence.js.map +1 -1
  46. package/dist/config/profiles.js +26 -0
  47. package/dist/config/profiles.js.map +1 -1
  48. package/dist/cortex/GovernanceMetrics.d.ts +66 -0
  49. package/dist/cortex/GovernanceMetrics.js +230 -0
  50. package/dist/cortex/GovernanceMetrics.js.map +1 -0
  51. package/dist/cortex/InstinctExtractor.d.ts +61 -0
  52. package/dist/cortex/InstinctExtractor.js +184 -0
  53. package/dist/cortex/InstinctExtractor.js.map +1 -0
  54. package/dist/cortex/InstinctStore.d.ts +54 -0
  55. package/dist/cortex/InstinctStore.js +266 -0
  56. package/dist/cortex/InstinctStore.js.map +1 -0
  57. package/dist/cortex/ReflexionEngine.d.ts +34 -0
  58. package/dist/cortex/ReflexionEngine.js +157 -0
  59. package/dist/cortex/ReflexionEngine.js.map +1 -0
  60. package/dist/cortex/SessionInjector.d.ts +44 -0
  61. package/dist/cortex/SessionInjector.js +127 -0
  62. package/dist/cortex/SessionInjector.js.map +1 -0
  63. package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
  64. package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
  65. package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
  66. package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
  67. package/dist/cortex/adapters/CodexAdapter.js +52 -0
  68. package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
  69. package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
  70. package/dist/cortex/adapters/CursorAdapter.js +46 -0
  71. package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
  72. package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
  73. package/dist/cortex/adapters/GeminiAdapter.js +48 -0
  74. package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
  75. package/dist/dashboard/DashboardServer.d.ts +33 -13
  76. package/dist/dashboard/DashboardServer.js +314 -182
  77. package/dist/dashboard/DashboardServer.js.map +1 -1
  78. package/dist/dashboard/index.d.ts +2 -2
  79. package/dist/dashboard/index.js +1 -1
  80. package/dist/dashboard/index.js.map +1 -1
  81. package/dist/dashboard/server.d.ts +8 -22
  82. package/dist/dashboard/server.js +2 -83
  83. package/dist/dashboard/server.js.map +1 -1
  84. package/dist/eval/BenchmarkPublisher.d.ts +25 -0
  85. package/dist/eval/BenchmarkPublisher.js +27 -0
  86. package/dist/eval/BenchmarkPublisher.js.map +1 -0
  87. package/dist/guardrails/DependencyAuditor.js +10 -1
  88. package/dist/guardrails/DependencyAuditor.js.map +1 -1
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.js +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
  93. package/dist/orchestrator/OrchestratorDaemon.js +150 -0
  94. package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
  95. package/dist/orchestrator/PolicyLoader.d.ts +80 -0
  96. package/dist/orchestrator/PolicyLoader.js +229 -0
  97. package/dist/orchestrator/PolicyLoader.js.map +1 -0
  98. package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
  99. package/dist/orchestrator/ReconciliationLoop.js +266 -0
  100. package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
  101. package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
  102. package/dist/orchestrator/TrackerAdapter.js +147 -0
  103. package/dist/orchestrator/TrackerAdapter.js.map +1 -0
  104. package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
  105. package/dist/orchestrator/WorkspaceManager.js +257 -0
  106. package/dist/orchestrator/WorkspaceManager.js.map +1 -0
  107. package/dist/qa/BrowserDaemon.d.ts +23 -0
  108. package/dist/qa/BrowserDaemon.js +79 -0
  109. package/dist/qa/BrowserDaemon.js.map +1 -0
  110. package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
  111. package/dist/qa/E2ETestOrchestrator.js +19 -0
  112. package/dist/qa/E2ETestOrchestrator.js.map +1 -0
  113. package/dist/review/CrossModelReviewer.d.ts +35 -0
  114. package/dist/review/CrossModelReviewer.js +75 -0
  115. package/dist/review/CrossModelReviewer.js.map +1 -0
  116. package/dist/review/ReviewAggregator.d.ts +13 -0
  117. package/dist/review/ReviewAggregator.js +28 -0
  118. package/dist/review/ReviewAggregator.js.map +1 -0
  119. package/dist/review/reviewCommands.d.ts +15 -0
  120. package/dist/review/reviewCommands.js +24 -0
  121. package/dist/review/reviewCommands.js.map +1 -0
  122. package/dist/routing/LocalModelProvider.d.ts +11 -0
  123. package/dist/routing/LocalModelProvider.js +21 -0
  124. package/dist/routing/LocalModelProvider.js.map +1 -0
  125. package/dist/routing/ModelRouter.d.ts +12 -0
  126. package/dist/routing/ModelRouter.js +31 -4
  127. package/dist/routing/ModelRouter.js.map +1 -1
  128. package/dist/runtime/AiOsRuntime.d.ts +1 -0
  129. package/dist/runtime/AiOsRuntime.js +15 -0
  130. package/dist/runtime/AiOsRuntime.js.map +1 -1
  131. package/dist/runtime/CostAnalyzer.d.ts +53 -0
  132. package/dist/runtime/CostAnalyzer.js +160 -0
  133. package/dist/runtime/CostAnalyzer.js.map +1 -0
  134. package/dist/runtime/CostOptimizer.d.ts +11 -0
  135. package/dist/runtime/CostOptimizer.js +21 -0
  136. package/dist/runtime/CostOptimizer.js.map +1 -0
  137. package/dist/shield/PolicyCompiler.d.ts +70 -0
  138. package/dist/shield/PolicyCompiler.js +540 -0
  139. package/dist/shield/PolicyCompiler.js.map +1 -0
  140. package/dist/shield/ProtectedPaths.d.ts +39 -0
  141. package/dist/shield/ProtectedPaths.js +179 -0
  142. package/dist/shield/ProtectedPaths.js.map +1 -0
  143. package/dist/shield/ShieldProtocol.d.ts +50 -0
  144. package/dist/shield/ShieldProtocol.js +103 -0
  145. package/dist/shield/ShieldProtocol.js.map +1 -0
  146. package/dist/skills/SkillMdStandard.d.ts +33 -0
  147. package/dist/skills/SkillMdStandard.js +88 -0
  148. package/dist/skills/SkillMdStandard.js.map +1 -0
  149. package/dist/skills/SkillRegistry.d.ts +9 -1
  150. package/dist/skills/SkillRegistry.js +20 -0
  151. package/dist/skills/SkillRegistry.js.map +1 -1
  152. package/dist/skills/interop/GStackInterop.d.ts +15 -0
  153. package/dist/skills/interop/GStackInterop.js +34 -0
  154. package/dist/skills/interop/GStackInterop.js.map +1 -0
  155. package/dist/skills/interop/OMCInterop.d.ts +15 -0
  156. package/dist/skills/interop/OMCInterop.js +34 -0
  157. package/dist/skills/interop/OMCInterop.js.map +1 -0
  158. package/dist/topology/DomainMapper.d.ts +23 -0
  159. package/dist/topology/DomainMapper.js +179 -0
  160. package/dist/topology/DomainMapper.js.map +1 -0
  161. package/dist/topology/LayerClassifier.d.ts +8 -0
  162. package/dist/topology/LayerClassifier.js +109 -0
  163. package/dist/topology/LayerClassifier.js.map +1 -0
  164. package/dist/topology/TourGenerator.d.ts +18 -0
  165. package/dist/topology/TourGenerator.js +120 -0
  166. package/dist/topology/TourGenerator.js.map +1 -0
  167. package/dist/topology/index.d.ts +3 -0
  168. package/dist/topology/index.js +4 -0
  169. package/dist/topology/index.js.map +1 -0
  170. package/dist/tui/TuiDashboard.d.ts +3 -0
  171. package/dist/tui/TuiDashboard.js +120 -0
  172. package/dist/tui/TuiDashboard.js.map +1 -0
  173. package/dist/workflow/GateCatalog.d.ts +2 -0
  174. package/dist/workflow/GateCatalog.js +59 -3
  175. package/dist/workflow/GateCatalog.js.map +1 -1
  176. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  177. package/dist/workflow/GovernanceTemplatePacks.js +15 -0
  178. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  179. package/dist/workflow/TddLoop.d.ts +2 -0
  180. package/dist/workflow/TddLoop.js +2 -0
  181. package/dist/workflow/TddLoop.js.map +1 -1
  182. package/dist/workflow/UpgradeManager.d.ts +10 -1
  183. package/dist/workflow/UpgradeManager.js +55 -0
  184. package/dist/workflow/UpgradeManager.js.map +1 -1
  185. package/dist/workflow/VerificationProfile.d.ts +8 -0
  186. package/dist/workflow/VerificationProfile.js +61 -0
  187. package/dist/workflow/VerificationProfile.js.map +1 -1
  188. package/dist/workflow/VerificationSchema.d.ts +46 -0
  189. package/dist/workflow/VerificationSchema.js +97 -0
  190. package/dist/workflow/VerificationSchema.js.map +1 -0
  191. package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
  192. package/dist/workflow/autofix/AutoFixEngine.js +169 -0
  193. package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
  194. package/dist/workflow/execution/RalphEngine.d.ts +18 -0
  195. package/dist/workflow/execution/RalphEngine.js +22 -0
  196. package/dist/workflow/execution/RalphEngine.js.map +1 -1
  197. package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
  198. package/dist/workflow/gates/EnhancedGates.js +653 -0
  199. package/dist/workflow/gates/EnhancedGates.js.map +1 -0
  200. package/dist/workflow/gates/GateSystem.d.ts +3 -0
  201. package/dist/workflow/gates/GateSystem.js +94 -1
  202. package/dist/workflow/gates/GateSystem.js.map +1 -1
  203. package/dist/workflow/types.d.ts +1 -1
  204. package/docs/README.md +3 -0
  205. package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
  206. package/docs/guides/GETTING_STARTED.md +19 -0
  207. package/docs/guides/MIGRATION.md +119 -0
  208. package/docs/workflow/GATES_AND_SCORE.md +34 -1
  209. package/docs/workflow/README.md +58 -10
  210. package/package.json +7 -17
  211. package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
  212. package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
  213. package/docs/BACKGROUND_HUNTER.md +0 -62
  214. package/docs/CODE_INTELLIGENCE.md +0 -180
  215. package/docs/CONTEXT_BUDGET.md +0 -165
  216. package/docs/DEPENDENCY_AUDIT.md +0 -118
  217. package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
  218. package/docs/GITLAB_FLOW.md +0 -125
  219. package/docs/GOVERNANCE_DASHBOARD.md +0 -92
  220. package/docs/MEMORY_BRAIN.md +0 -104
  221. package/docs/MEMORY_FABRIC.md +0 -161
  222. package/docs/RESOURCE_GOVERNANCE.md +0 -92
  223. package/docs/RUNTIME_EVIDENCE.md +0 -101
  224. package/docs/WORKFLOW_EVAL.md +0 -151
  225. package/image/wechat-public.jpg +0 -0
  226. package/image/wxPay.jpg +0 -0
  227. 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
+ }