claude-mycelium 2.0.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 (207) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/README.md +304 -0
  3. package/dist/coordination/gradient-cache.d.ts +48 -0
  4. package/dist/coordination/gradient-cache.d.ts.map +1 -0
  5. package/dist/coordination/gradient-cache.js +145 -0
  6. package/dist/coordination/gradient-cache.js.map +1 -0
  7. package/dist/coordination/index.d.ts +10 -0
  8. package/dist/coordination/index.d.ts.map +1 -0
  9. package/dist/coordination/index.js +10 -0
  10. package/dist/coordination/index.js.map +1 -0
  11. package/dist/core/agent-executor.d.ts +31 -0
  12. package/dist/core/agent-executor.d.ts.map +1 -0
  13. package/dist/core/agent-executor.js +257 -0
  14. package/dist/core/agent-executor.js.map +1 -0
  15. package/dist/core/change-applier.d.ts +10 -0
  16. package/dist/core/change-applier.d.ts.map +1 -0
  17. package/dist/core/change-applier.js +32 -0
  18. package/dist/core/change-applier.js.map +1 -0
  19. package/dist/core/gradient.d.ts +60 -0
  20. package/dist/core/gradient.d.ts.map +1 -0
  21. package/dist/core/gradient.js +191 -0
  22. package/dist/core/gradient.js.map +1 -0
  23. package/dist/core/index.d.ts +24 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +24 -0
  26. package/dist/core/index.js.map +1 -0
  27. package/dist/core/mode-selector.d.ts +44 -0
  28. package/dist/core/mode-selector.d.ts.map +1 -0
  29. package/dist/core/mode-selector.js +208 -0
  30. package/dist/core/mode-selector.js.map +1 -0
  31. package/dist/core/signals/centrality.d.ts +44 -0
  32. package/dist/core/signals/centrality.d.ts.map +1 -0
  33. package/dist/core/signals/centrality.js +264 -0
  34. package/dist/core/signals/centrality.js.map +1 -0
  35. package/dist/core/signals/churn.d.ts +41 -0
  36. package/dist/core/signals/churn.d.ts.map +1 -0
  37. package/dist/core/signals/churn.js +188 -0
  38. package/dist/core/signals/churn.js.map +1 -0
  39. package/dist/core/signals/complexity.d.ts +29 -0
  40. package/dist/core/signals/complexity.d.ts.map +1 -0
  41. package/dist/core/signals/complexity.js +169 -0
  42. package/dist/core/signals/complexity.js.map +1 -0
  43. package/dist/core/signals/debt.d.ts +27 -0
  44. package/dist/core/signals/debt.d.ts.map +1 -0
  45. package/dist/core/signals/debt.js +80 -0
  46. package/dist/core/signals/debt.js.map +1 -0
  47. package/dist/core/signals/errors.d.ts +32 -0
  48. package/dist/core/signals/errors.d.ts.map +1 -0
  49. package/dist/core/signals/errors.js +73 -0
  50. package/dist/core/signals/errors.js.map +1 -0
  51. package/dist/core/signals/index.d.ts +19 -0
  52. package/dist/core/signals/index.d.ts.map +1 -0
  53. package/dist/core/signals/index.js +19 -0
  54. package/dist/core/signals/index.js.map +1 -0
  55. package/dist/cost/cost-tracker.d.ts +90 -0
  56. package/dist/cost/cost-tracker.d.ts.map +1 -0
  57. package/dist/cost/cost-tracker.js +305 -0
  58. package/dist/cost/cost-tracker.js.map +1 -0
  59. package/dist/cost/index.d.ts +56 -0
  60. package/dist/cost/index.d.ts.map +1 -0
  61. package/dist/cost/index.js +111 -0
  62. package/dist/cost/index.js.map +1 -0
  63. package/dist/index.d.ts +35 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +40 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/llm/anthropic-client.d.ts +52 -0
  68. package/dist/llm/anthropic-client.d.ts.map +1 -0
  69. package/dist/llm/anthropic-client.js +310 -0
  70. package/dist/llm/anthropic-client.js.map +1 -0
  71. package/dist/llm/index.d.ts +27 -0
  72. package/dist/llm/index.d.ts.map +1 -0
  73. package/dist/llm/index.js +34 -0
  74. package/dist/llm/index.js.map +1 -0
  75. package/dist/prompts/complexity-reducer.d.ts +7 -0
  76. package/dist/prompts/complexity-reducer.d.ts.map +1 -0
  77. package/dist/prompts/complexity-reducer.js +55 -0
  78. package/dist/prompts/complexity-reducer.js.map +1 -0
  79. package/dist/prompts/debt-payer.d.ts +7 -0
  80. package/dist/prompts/debt-payer.d.ts.map +1 -0
  81. package/dist/prompts/debt-payer.js +55 -0
  82. package/dist/prompts/debt-payer.js.map +1 -0
  83. package/dist/prompts/error-reducer.d.ts +7 -0
  84. package/dist/prompts/error-reducer.d.ts.map +1 -0
  85. package/dist/prompts/error-reducer.js +54 -0
  86. package/dist/prompts/error-reducer.js.map +1 -0
  87. package/dist/prompts/index.d.ts +22 -0
  88. package/dist/prompts/index.d.ts.map +1 -0
  89. package/dist/prompts/index.js +112 -0
  90. package/dist/prompts/index.js.map +1 -0
  91. package/dist/prompts/stabilizer.d.ts +7 -0
  92. package/dist/prompts/stabilizer.d.ts.map +1 -0
  93. package/dist/prompts/stabilizer.js +55 -0
  94. package/dist/prompts/stabilizer.js.map +1 -0
  95. package/dist/prompts/types.d.ts +14 -0
  96. package/dist/prompts/types.d.ts.map +1 -0
  97. package/dist/prompts/types.js +5 -0
  98. package/dist/prompts/types.js.map +1 -0
  99. package/dist/trace/index.d.ts +51 -0
  100. package/dist/trace/index.d.ts.map +1 -0
  101. package/dist/trace/index.js +60 -0
  102. package/dist/trace/index.js.map +1 -0
  103. package/dist/trace/trace-event.d.ts +72 -0
  104. package/dist/trace/trace-event.d.ts.map +1 -0
  105. package/dist/trace/trace-event.js +244 -0
  106. package/dist/trace/trace-event.js.map +1 -0
  107. package/dist/types/index.d.ts +206 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +6 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/utils/ci-provider.d.ts +43 -0
  112. package/dist/utils/ci-provider.d.ts.map +1 -0
  113. package/dist/utils/ci-provider.js +130 -0
  114. package/dist/utils/ci-provider.js.map +1 -0
  115. package/dist/utils/config.d.ts +31 -0
  116. package/dist/utils/config.d.ts.map +1 -0
  117. package/dist/utils/config.js +85 -0
  118. package/dist/utils/config.js.map +1 -0
  119. package/dist/utils/error-provider.d.ts +51 -0
  120. package/dist/utils/error-provider.d.ts.map +1 -0
  121. package/dist/utils/error-provider.js +123 -0
  122. package/dist/utils/error-provider.js.map +1 -0
  123. package/dist/utils/file-utils.d.ts +18 -0
  124. package/dist/utils/file-utils.d.ts.map +1 -0
  125. package/dist/utils/file-utils.js +95 -0
  126. package/dist/utils/file-utils.js.map +1 -0
  127. package/dist/utils/index.d.ts +10 -0
  128. package/dist/utils/index.d.ts.map +1 -0
  129. package/dist/utils/index.js +10 -0
  130. package/dist/utils/index.js.map +1 -0
  131. package/dist/utils/logger.d.ts +36 -0
  132. package/dist/utils/logger.d.ts.map +1 -0
  133. package/dist/utils/logger.js +74 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/docs/IMPLEMENTATION-STATUS.md +199 -0
  136. package/docs/PHASE-0-COMPLETE.md +252 -0
  137. package/docs/PHASE-1-COMPLETE.md +204 -0
  138. package/docs/PHASE-2-COMPLETE.md +233 -0
  139. package/docs/PHASE2_COMPLETION_CHECKLIST.md +290 -0
  140. package/docs/PHASE2_INTEGRATION_SUMMARY.md +255 -0
  141. package/docs/PHASE2_QUICK_REFERENCE.md +365 -0
  142. package/docs/PHASE2_TEST_RESULTS.md +282 -0
  143. package/docs/ROADMAP.md +746 -0
  144. package/docs/SNAPSHOT.md +376 -0
  145. package/docs/adrs/ADR-001-signal-computation.md +76 -0
  146. package/docs/adrs/ADR-002-inhibitor-signals.md +108 -0
  147. package/docs/adrs/ADR-003-llm-integration.md +156 -0
  148. package/docs/adrs/ADR-004-process-architecture.md +175 -0
  149. package/docs/adrs/ADR-005-testing-strategy.md +243 -0
  150. package/docs/pitch.md +94 -0
  151. package/docs/specs/fourth-spec.md +1973 -0
  152. package/docs/specs/initial-spec.md +2096 -0
  153. package/docs/specs/second-spec.md +2690 -0
  154. package/package.json +50 -0
  155. package/src/coordination/gradient-cache.ts +185 -0
  156. package/src/coordination/index.ts +10 -0
  157. package/src/core/agent-executor.ts +327 -0
  158. package/src/core/change-applier.ts +338 -0
  159. package/src/core/gradient.ts +258 -0
  160. package/src/core/index.ts +24 -0
  161. package/src/core/mode-selector.ts +243 -0
  162. package/src/core/signals/centrality.ts +328 -0
  163. package/src/core/signals/churn.ts +239 -0
  164. package/src/core/signals/complexity.ts +206 -0
  165. package/src/core/signals/debt.ts +111 -0
  166. package/src/core/signals/errors.ts +93 -0
  167. package/src/core/signals/index.ts +19 -0
  168. package/src/cost/cost-tracker.ts +410 -0
  169. package/src/cost/index.ts +143 -0
  170. package/src/index.ts +43 -0
  171. package/src/llm/anthropic-client.ts +415 -0
  172. package/src/llm/index.ts +43 -0
  173. package/src/prompts/complexity-reducer.ts +59 -0
  174. package/src/prompts/debt-payer.ts +59 -0
  175. package/src/prompts/error-reducer.ts +58 -0
  176. package/src/prompts/index.ts +128 -0
  177. package/src/prompts/stabilizer.ts +59 -0
  178. package/src/prompts/types.ts +15 -0
  179. package/src/trace/README.md +178 -0
  180. package/src/trace/index.ts +88 -0
  181. package/src/trace/trace-event.ts +324 -0
  182. package/src/types/index.ts +271 -0
  183. package/src/utils/ci-provider.ts +145 -0
  184. package/src/utils/config.ts +95 -0
  185. package/src/utils/error-provider.ts +138 -0
  186. package/src/utils/file-utils.ts +111 -0
  187. package/src/utils/index.ts +10 -0
  188. package/src/utils/logger.ts +94 -0
  189. package/test-8d713cc8-f4b7-403d-8153-57573172b94c.ts +3 -0
  190. package/tests/coordination/gradient-cache.test.ts +270 -0
  191. package/tests/core/agent-executor.test.ts +217 -0
  192. package/tests/core/change-applier.test.ts +336 -0
  193. package/tests/core/gradient.test.ts +263 -0
  194. package/tests/core/mode-selector.test.ts +239 -0
  195. package/tests/core/signals/centrality.test.ts +512 -0
  196. package/tests/core/signals/churn.test.ts +355 -0
  197. package/tests/core/signals/complexity.test.ts +284 -0
  198. package/tests/core/signals/debt.test.ts +437 -0
  199. package/tests/core/signals/errors.test.ts +350 -0
  200. package/tests/cost/cost-tracker.test.ts +475 -0
  201. package/tests/integration/phase2.test.ts +405 -0
  202. package/tests/llm/anthropic-client.test.ts +437 -0
  203. package/tests/prompts/prompts.test.ts +266 -0
  204. package/tests/trace/trace-event.test.ts +666 -0
  205. package/tests/utils/file-utils.test.ts +148 -0
  206. package/tsconfig.json +24 -0
  207. package/vitest.config.ts +28 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Prompt Templates
3
+ * Per initial-spec §4.1
4
+ *
5
+ * Mode-specific prompts for guiding agents.
6
+ * Each prompt provides context and instructions for a specific improvement mode.
7
+ */
8
+
9
+ import { readFile } from 'fs/promises';
10
+ import type { Mode, GradientScore } from '../types/index.js';
11
+ import type { PromptContext } from './types.js';
12
+
13
+ export { generatePrompt as generateErrorReducerPrompt } from './error-reducer.js';
14
+ export { generatePrompt as generateComplexityReducerPrompt } from './complexity-reducer.js';
15
+ export { generatePrompt as generateDebtPayerPrompt } from './debt-payer.js';
16
+ export { generatePrompt as generateStabilizerPrompt } from './stabilizer.js';
17
+
18
+ export type { PromptContext } from './types.js';
19
+
20
+ /**
21
+ * Build complete prompt for agent (system + user)
22
+ * Used by agent-executor
23
+ */
24
+ export async function buildPrompt(
25
+ file: string,
26
+ mode: Mode,
27
+ gradient: GradientScore
28
+ ): Promise<{ system: string; user: string }> {
29
+ // Read file content
30
+ const content = await readFile(file, 'utf-8');
31
+
32
+ // Build context
33
+ const context: PromptContext = {
34
+ file,
35
+ content,
36
+ gradient,
37
+ mode,
38
+ };
39
+
40
+ // Generate mode-specific prompt
41
+ let userPrompt: string;
42
+ switch (mode) {
43
+ case 'error_reducer': {
44
+ const { generatePrompt } = await import('./error-reducer.js');
45
+ userPrompt = generatePrompt(context);
46
+ break;
47
+ }
48
+ case 'complexity_reducer': {
49
+ const { generatePrompt } = await import('./complexity-reducer.js');
50
+ userPrompt = generatePrompt(context);
51
+ break;
52
+ }
53
+ case 'debt_payer': {
54
+ const { generatePrompt } = await import('./debt-payer.js');
55
+ userPrompt = generatePrompt(context);
56
+ break;
57
+ }
58
+ case 'stabilizer': {
59
+ const { generatePrompt } = await import('./stabilizer.js');
60
+ userPrompt = generatePrompt(context);
61
+ break;
62
+ }
63
+ case 'explorer': {
64
+ // Explorer mode - use generic improvement prompt
65
+ userPrompt = buildExplorerPrompt(context);
66
+ break;
67
+ }
68
+ default:
69
+ throw new Error(`Unknown mode: ${mode}`);
70
+ }
71
+
72
+ // System prompt is common across all modes
73
+ const systemPrompt = `You are a code improvement agent. Your task is to analyze and improve code files.
74
+
75
+ CRITICAL OUTPUT FORMAT:
76
+ 1. Brief analysis (2-3 sentences)
77
+ 2. Complete modified file in code fence:
78
+
79
+ \`\`\`typescript
80
+ // complete modified code here
81
+ \`\`\`
82
+
83
+ RULES:
84
+ - Output COMPLETE file, not just changes
85
+ - Make MINIMAL changes for your mode's focus
86
+ - PRESERVE all existing functionality
87
+ - Do NOT add comments explaining changes
88
+ - Do NOT introduce new dependencies`;
89
+
90
+ return {
91
+ system: systemPrompt,
92
+ user: userPrompt,
93
+ };
94
+ }
95
+
96
+ /**
97
+ * Build explorer mode prompt
98
+ */
99
+ function buildExplorerPrompt(context: PromptContext): string {
100
+ const { file, content, gradient } = context;
101
+
102
+ return `# Task
103
+ You are exploring \`${file}\` to find novel improvement opportunities.
104
+
105
+ ## File Context
106
+ **Gradient**: ${gradient.score.toFixed(3)}
107
+ **Dominant issue**: ${gradient.dominantSignal.name} = ${gradient.dominantSignal.value.toFixed(3)}
108
+
109
+ ## Explorer Mode Instructions
110
+ This file has resisted conventional improvements. You have permission to:
111
+ - Challenge fundamental assumptions
112
+ - Suggest structural changes (within limits)
113
+ - Try unconventional approaches
114
+
115
+ **Constraints**:
116
+ - Maximum 50 lines changed
117
+ - Cannot change public API signatures
118
+ - Cannot remove validation logic
119
+ - Changes will be flagged for human review
120
+
121
+ ## Current File Content
122
+ \`\`\`typescript
123
+ ${content}
124
+ \`\`\`
125
+
126
+ ## Your Task
127
+ Explore creative improvements to this file while respecting the constraints.`;
128
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Stabilizer Prompt
3
+ * Focus: Reduce churn with tests and documentation
4
+ */
5
+
6
+ import { getModeInstructions } from '../core/mode-selector.js';
7
+ import type { PromptContext } from './types.js';
8
+
9
+ export function generatePrompt(context: PromptContext): string {
10
+ const { file, content, gradient, rank, totalFiles } = context;
11
+ const { dominantSignal, signals, score } = gradient;
12
+
13
+ const rankInfo = rank && totalFiles
14
+ ? `(ranked #${rank} of ${totalFiles})`
15
+ : '';
16
+
17
+ return `# Task
18
+ You are improving \`${file}\` in mode \`stabilizer\`.
19
+
20
+ ## File Context
21
+ **Current gradient**: ${score.toFixed(3)} ${rankInfo}
22
+ **Dominant issue**: ${dominantSignal.name} = ${dominantSignal.value.toFixed(3)}
23
+
24
+ ${getModeInstructions('stabilizer')}
25
+
26
+ ## Current File Content
27
+ \`\`\`typescript
28
+ ${content}
29
+ \`\`\`
30
+
31
+ ## Your Task
32
+ Improve stability to reduce future changes:
33
+
34
+ 1. Identify stability issues:
35
+ - Missing tests
36
+ - Unclear behavior that requires frequent changes
37
+ - Weak interfaces that allow misuse
38
+ - Magic numbers without constants
39
+ - Poor encapsulation
40
+
41
+ 2. Make stability improvements:
42
+ - Add unit tests for untested code
43
+ - Document unclear behavior
44
+ - Improve interfaces to prevent misuse
45
+ - Extract constants from magic numbers
46
+ - Improve encapsulation
47
+
48
+ 3. Avoid major changes:
49
+ - Do NOT refactor internals (use complexity_reducer for that)
50
+ - Do NOT change public APIs without good reason
51
+ - Do NOT remove existing tests
52
+
53
+ **Important**:
54
+ - Make minimal, focused changes
55
+ - Preserve existing functionality
56
+ - Add tests if removing code
57
+ - Keep the same file structure
58
+ - Explain what you changed and why`;
59
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Prompt Template Types
3
+ */
4
+
5
+ import type { Mode } from '../types/index.js';
6
+ import type { GradientScore } from '../core/gradient.js';
7
+
8
+ export interface PromptContext {
9
+ file: string;
10
+ content: string;
11
+ gradient: GradientScore;
12
+ mode: Mode;
13
+ rank?: number;
14
+ totalFiles?: number;
15
+ }
@@ -0,0 +1,178 @@
1
+ # Trace Event System
2
+
3
+ The trace event system records all agent actions for learning and analysis. Every agent intervention produces a trace event that captures what happened, how much it cost, and whether it improved the codebase.
4
+
5
+ ## Storage
6
+
7
+ Traces are stored in `.agent-meta/traces.jsonl` using JSON Lines format (one trace per line). This format enables:
8
+ - Fast append-only writes (important for concurrent agents)
9
+ - Easy streaming/parsing (no need to load entire file)
10
+ - Simple archival (just move lines to archive files)
11
+
12
+ ## Schema
13
+
14
+ ```typescript
15
+ interface TraceEvent {
16
+ id: string; // UUID
17
+ timestamp: string; // ISO 8601
18
+ agent_id: string; // Agent that performed the action
19
+ file_path: string; // File that was modified
20
+ mode: Mode; // Agent mode used
21
+ gradient_before: number; // File gradient before intervention
22
+ gradient_after: number; // File gradient after intervention
23
+ gradient_delta: number; // Improvement (before - after)
24
+ changes_made: string[]; // List of changes
25
+ tokens_used: number; // Total tokens consumed
26
+ cost_usd: number; // Estimated cost in USD
27
+ duration_ms: number; // Duration in milliseconds
28
+ success: boolean; // Whether intervention succeeded
29
+ error?: string; // Error message if failed
30
+ }
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ ### Recording Traces
36
+
37
+ ```typescript
38
+ import { recordTrace, createTraceEvent } from './trace/trace-event.js';
39
+
40
+ const trace = createTraceEvent({
41
+ agent_id: 'agent-123',
42
+ file_path: 'src/auth.ts',
43
+ mode: 'error_reducer',
44
+ gradient_before: 0.8,
45
+ gradient_after: 0.6,
46
+ changes_made: ['fix null check', 'add error handling'],
47
+ tokens_used: 1000,
48
+ cost_usd: 0.05,
49
+ duration_ms: 30000,
50
+ success: true,
51
+ });
52
+
53
+ await recordTrace(trace);
54
+ ```
55
+
56
+ ### Reading Traces
57
+
58
+ ```typescript
59
+ import { readTraces } from './trace/trace-event.js';
60
+
61
+ // Get all traces (newest first)
62
+ const all = await readTraces();
63
+
64
+ // Filter by file
65
+ const authTraces = await readTraces({ file: 'src/auth.ts' });
66
+
67
+ // Filter by mode
68
+ const errorReducers = await readTraces({ mode: 'error_reducer' });
69
+
70
+ // Filter by date
71
+ const recent = await readTraces({
72
+ since: new Date('2025-01-01'),
73
+ limit: 10
74
+ });
75
+ ```
76
+
77
+ ### Calculating Efficiency
78
+
79
+ Efficiency measures gradient improvement per dollar spent:
80
+
81
+ ```typescript
82
+ import { getRecentEfficiency } from './trace/trace-event.js';
83
+
84
+ // Get efficiency for last 5 traces
85
+ const efficiency = await getRecentEfficiency('src/auth.ts', 5);
86
+
87
+ if (efficiency !== null && efficiency < 0.15) {
88
+ console.log('Poor efficiency - consider quarantining this file');
89
+ }
90
+ ```
91
+
92
+ ### Statistics
93
+
94
+ ```typescript
95
+ import { getTraceStats } from './trace/trace-event.js';
96
+
97
+ const traces = await readTraces({ file: 'src/auth.ts' });
98
+ const stats = getTraceStats(traces);
99
+
100
+ console.log(`Total cost: $${stats.totalCost.toFixed(2)}`);
101
+ console.log(`Average improvement: ${stats.avgDelta.toFixed(3)}`);
102
+ console.log(`Success rate: ${(stats.successRate * 100).toFixed(1)}%`);
103
+ ```
104
+
105
+ ### Cost Calculation
106
+
107
+ ```typescript
108
+ import { calculateCost } from './trace/trace-event.js';
109
+
110
+ // Calculate cost from token usage
111
+ const cost = calculateCost(
112
+ 1_000_000, // tokens in
113
+ 500_000, // tokens out
114
+ 'claude-sonnet-4'
115
+ );
116
+ // Returns: $10.50
117
+ ```
118
+
119
+ ## Cleanup
120
+
121
+ The system automatically cleans up old traces to keep file size manageable:
122
+ - Keeps last 1000 traces in main file
123
+ - Archives older traces to dated files in `.agent-meta/traces-archive/`
124
+ - Runs cleanup every 100 traces
125
+
126
+ ## Concurrent Access
127
+
128
+ The trace system is designed for concurrent access by multiple agents:
129
+ - Append-only writes (no locks needed)
130
+ - Each trace is a single line (atomic writes)
131
+ - Read operations tolerate partially written lines (skip corrupted)
132
+
133
+ ## Metrics
134
+
135
+ Key metrics calculated from traces:
136
+
137
+ 1. **Efficiency**: `gradient_delta / cost_usd`
138
+ - Higher is better
139
+ - Below 0.15 indicates poor performance
140
+
141
+ 2. **Success Rate**: Percentage of traces with `success: true`
142
+ - Should be > 90%
143
+
144
+ 3. **Cost per Improvement**: `total_cost / total_delta`
145
+ - Lower is better
146
+ - Used for budget optimization
147
+
148
+ ## Example Trace
149
+
150
+ ```json
151
+ {
152
+ "id": "550e8400-e29b-41d4-a716-446655440000",
153
+ "timestamp": "2025-01-30T18:30:00.000Z",
154
+ "agent_id": "agent-abc123",
155
+ "file_path": "src/auth.ts",
156
+ "mode": "error_reducer",
157
+ "gradient_before": 0.72,
158
+ "gradient_after": 0.58,
159
+ "gradient_delta": 0.14,
160
+ "changes_made": [
161
+ "fix null check in validateToken()",
162
+ "add error handling for expired tokens"
163
+ ],
164
+ "tokens_used": 1523,
165
+ "cost_usd": 0.0456,
166
+ "duration_ms": 32451,
167
+ "success": true
168
+ }
169
+ ```
170
+
171
+ ## Integration
172
+
173
+ Traces feed into several system components:
174
+
175
+ - **Quarantine System**: Uses efficiency to detect files resisting improvement
176
+ - **Explorer Mode**: Triggered by low system-wide efficiency
177
+ - **Cost Tracking**: Aggregates costs by mode, file, and time period
178
+ - **Learning**: Trains on successful patterns for future routing
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Trace Module - Event Tracking System
3
+ *
4
+ * Per Phase 2 specification, this tracks:
5
+ * - Agent execution traces with timing
6
+ * - File changes (additions, deletions, modifications)
7
+ * - Gradient measurements (before/after)
8
+ * - Cost metrics (tokens, USD)
9
+ * - CI pass/fail status
10
+ *
11
+ * Traces are stored as JSON Lines format for efficient querying.
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * import { recordTraceEvent } from './trace/index.js';
16
+ * await recordTraceEvent({ ... });
17
+ * ```
18
+ */
19
+
20
+ import { v4 as uuidv4 } from 'uuid';
21
+ import { logDebug } from '../utils/logger.js';
22
+ import type { TraceEvent, ChangeSet } from '../types/index.js';
23
+
24
+ /**
25
+ * Create a trace event for an agent execution
26
+ */
27
+ export function createTraceEvent(data: {
28
+ filePath: string;
29
+ mode: string;
30
+ gradientBefore: number;
31
+ gradientAfter: number;
32
+ metabolicCost: number;
33
+ efficiency: number;
34
+ ciPassed: boolean;
35
+ changes: ChangeSet;
36
+ costRecord: {
37
+ tokens_in: number;
38
+ tokens_out: number;
39
+ model: string;
40
+ estimated_usd: number;
41
+ };
42
+ notes?: string[];
43
+ taskId?: string;
44
+ agentId?: string;
45
+ }): TraceEvent {
46
+ const now = new Date().toISOString();
47
+
48
+ return {
49
+ id: uuidv4(),
50
+ timestamp: now,
51
+ file_path: data.filePath,
52
+ mode: data.mode as any,
53
+ gradient_before: data.gradientBefore,
54
+ gradient_after: data.gradientAfter,
55
+ gradient_delta: data.gradientAfter - data.gradientBefore,
56
+ metabolic_cost: data.metabolicCost,
57
+ efficiency: data.efficiency,
58
+ ci_passed: data.ciPassed,
59
+ changes: data.changes,
60
+ notes: data.notes || [],
61
+ task_id: data.taskId,
62
+ agent_id: data.agentId,
63
+ cost: data.costRecord,
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Record a trace event to the trace log
69
+ * In Phase 2, we store this in memory; in Phase 3+ it goes to persistent storage
70
+ */
71
+ export async function recordTraceEvent(event: TraceEvent): Promise<void> {
72
+ logDebug('Trace event recorded', {
73
+ event_id: event.id,
74
+ file: event.file_path,
75
+ mode: event.mode,
76
+ gradient_delta: event.gradient_delta.toFixed(3),
77
+ cost_usd: event.cost.estimated_usd.toFixed(4),
78
+ });
79
+
80
+ // In Phase 2, trace events are collected in memory
81
+ // In Phase 3+, they will be written to persistent storage (JSON Lines format)
82
+ // For now, this is a no-op that validates the event structure
83
+ }
84
+
85
+ /**
86
+ * Export trace event type and utilities for Phase 2 integration
87
+ */
88
+ export type { TraceEvent, ChangeSet } from '../types/index.js';