@tangle-network/starter-foundry 0.5.2 → 0.5.4

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 (121) hide show
  1. package/README.md +49 -0
  2. package/corpus/ideasai-prompts.json +119 -58
  3. package/dist/cli.js +28 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/lib/agent-context.js +34 -22
  6. package/dist/lib/agent-context.js.map +1 -1
  7. package/dist/lib/build-plan.d.ts +18 -0
  8. package/dist/lib/build-plan.js +72 -0
  9. package/dist/lib/build-plan.js.map +1 -1
  10. package/dist/lib/buildout-traces.d.ts +113 -0
  11. package/dist/lib/buildout-traces.js +83 -0
  12. package/dist/lib/buildout-traces.js.map +1 -0
  13. package/dist/lib/capability-inferrer.d.ts +40 -0
  14. package/dist/lib/capability-inferrer.js +82 -0
  15. package/dist/lib/capability-inferrer.js.map +1 -0
  16. package/dist/lib/context-pack.d.ts +6 -1
  17. package/dist/lib/context-pack.js +9 -3
  18. package/dist/lib/context-pack.js.map +1 -1
  19. package/dist/lib/keywords.js +71 -18
  20. package/dist/lib/keywords.js.map +1 -1
  21. package/dist/lib/llm.d.ts +9 -0
  22. package/dist/lib/llm.js +70 -0
  23. package/dist/lib/llm.js.map +1 -0
  24. package/dist/lib/planner/contracts.d.ts +11 -0
  25. package/dist/lib/planner/contracts.js +119 -0
  26. package/dist/lib/planner/contracts.js.map +1 -0
  27. package/dist/lib/planner/detectors.d.ts +14 -0
  28. package/dist/lib/planner/detectors.js +195 -0
  29. package/dist/lib/planner/detectors.js.map +1 -0
  30. package/dist/lib/planner/helpers.d.ts +2 -0
  31. package/dist/lib/planner/helpers.js +135 -0
  32. package/dist/lib/planner/helpers.js.map +1 -0
  33. package/dist/lib/planner/implicit-caps.d.ts +1 -0
  34. package/dist/lib/planner/implicit-caps.js +91 -0
  35. package/dist/lib/planner/implicit-caps.js.map +1 -0
  36. package/dist/lib/planner/projects.d.ts +13 -0
  37. package/dist/lib/planner/projects.js +181 -0
  38. package/dist/lib/planner/projects.js.map +1 -0
  39. package/dist/lib/planner/signals.d.ts +17 -0
  40. package/dist/lib/planner/signals.js +324 -0
  41. package/dist/lib/planner/signals.js.map +1 -0
  42. package/dist/lib/product-brief.d.ts +25 -0
  43. package/dist/lib/product-brief.js +129 -0
  44. package/dist/lib/product-brief.js.map +1 -0
  45. package/dist/lib/prompt-planner.d.ts +5 -1
  46. package/dist/lib/prompt-planner.js +59 -622
  47. package/dist/lib/prompt-planner.js.map +1 -1
  48. package/dist/lib/prompt-rewriter.d.ts +21 -0
  49. package/dist/lib/prompt-rewriter.js +118 -0
  50. package/dist/lib/prompt-rewriter.js.map +1 -0
  51. package/dist/lib/selection.js +170 -36
  52. package/dist/lib/selection.js.map +1 -1
  53. package/dist/lib/telemetry.d.ts +0 -11
  54. package/dist/lib/telemetry.js +3 -3
  55. package/dist/lib/telemetry.js.map +1 -1
  56. package/dist/lib/vb-outcomes.d.ts +61 -0
  57. package/dist/lib/vb-outcomes.js +88 -0
  58. package/dist/lib/vb-outcomes.js.map +1 -0
  59. package/dist/training/variant_b/brief-loader.d.ts +5 -0
  60. package/dist/training/variant_b/brief-loader.js +263 -0
  61. package/dist/training/variant_b/brief-loader.js.map +1 -0
  62. package/dist/training/variant_b/flow.d.ts +56 -0
  63. package/dist/training/variant_b/flow.js +80 -0
  64. package/dist/training/variant_b/flow.js.map +1 -0
  65. package/dist/training/variant_b/generate.d.ts +7 -0
  66. package/dist/training/variant_b/generate.js +70 -0
  67. package/dist/training/variant_b/generate.js.map +1 -0
  68. package/dist/training/variant_b/judge.d.ts +8 -0
  69. package/dist/training/variant_b/judge.js +24 -0
  70. package/dist/training/variant_b/judge.js.map +1 -0
  71. package/dist/training/variant_b/nodes/collect.d.ts +31 -0
  72. package/dist/training/variant_b/nodes/collect.js +122 -0
  73. package/dist/training/variant_b/nodes/collect.js.map +1 -0
  74. package/dist/training/variant_b/nodes/generate.d.ts +22 -0
  75. package/dist/training/variant_b/nodes/generate.js +171 -0
  76. package/dist/training/variant_b/nodes/generate.js.map +1 -0
  77. package/dist/training/variant_b/nodes/judge.d.ts +26 -0
  78. package/dist/training/variant_b/nodes/judge.js +64 -0
  79. package/dist/training/variant_b/nodes/judge.js.map +1 -0
  80. package/dist/training/variant_b/nodes/promote.d.ts +15 -0
  81. package/dist/training/variant_b/nodes/promote.js +64 -0
  82. package/dist/training/variant_b/nodes/promote.js.map +1 -0
  83. package/dist/training/variant_b/nodes/rank.d.ts +12 -0
  84. package/dist/training/variant_b/nodes/rank.js +46 -0
  85. package/dist/training/variant_b/nodes/rank.js.map +1 -0
  86. package/dist/training/variant_b/nodes/train.d.ts +34 -0
  87. package/dist/training/variant_b/nodes/train.js +209 -0
  88. package/dist/training/variant_b/nodes/train.js.map +1 -0
  89. package/dist/training/variant_b/run-flow.d.ts +11 -0
  90. package/dist/training/variant_b/run-flow.js +21 -0
  91. package/dist/training/variant_b/run-flow.js.map +1 -0
  92. package/dist/training/variant_b/train.d.ts +15 -0
  93. package/dist/training/variant_b/train.js +37 -0
  94. package/dist/training/variant_b/train.js.map +1 -0
  95. package/dist/types.d.ts +16 -0
  96. package/package.json +6 -2
  97. package/registry/families/browser-extension-ts/files/package.json +4 -1
  98. package/registry/families/cli-ts/files/package.json +5 -0
  99. package/registry/families/electron-desktop-ts/files/package.json +3 -1
  100. package/registry/families/expo-react-native-ts/files/package.json +4 -0
  101. package/registry/families/fhenix-contracts/files/package.json +1 -1
  102. package/registry/families/fhevm-contracts/files/package.json +1 -1
  103. package/registry/families/fullstack-ts/files/package.json +3 -1
  104. package/registry/families/hardhat-contracts/files/package.json +3 -1
  105. package/registry/families/nextjs-ts/files/package.json +3 -1
  106. package/registry/families/react-vite-ts/files/package.json +11 -1
  107. package/registry/families/react-vite-ts/files/src/components/ui/badge.tsx +9 -0
  108. package/registry/families/react-vite-ts/files/src/components/ui/button.tsx +18 -0
  109. package/registry/families/react-vite-ts/files/src/components/ui/card.tsx +22 -0
  110. package/registry/families/react-vite-ts/manifest.json +14 -2
  111. package/registry/families/remix-ts/files/package.json +9 -1
  112. package/registry/families/sveltekit-ts/files/package.json +9 -1
  113. package/registry/families/tauri-desktop/files/package.json +3 -1
  114. package/registry/families/vue-ts/files/package.json +9 -1
  115. package/registry/layers/framework/expo-react-native-ts/files/tsconfig.json +2 -1
  116. package/registry/layers/framework/forge-foundation/files/foundry.toml +22 -1
  117. package/registry/layers/framework/fullstack-node-ts/files/personalize.json +5 -5
  118. package/registry/layers/framework/tangle-blueprint/files/TOOLCHAIN.md +16 -0
  119. package/registry/layers/framework/tangle-blueprint/files/rust-toolchain.toml +1 -1
  120. package/registry/layers/framework/tangle-blueprint/manifest.json +4 -0
  121. package/registry/package-to-capability.json +57 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shape of events emitted by blueprint-agent / vibecode-bench (VB) to
3
+ * `<starter-foundry-root>/.evolve/traces/vb-execution-<variant>.jsonl`.
4
+ * The producer lives in blueprint-agent repo (lib/vb-execution-trace.ts)
5
+ * commit 9f9e381f4. This is the real-outcome signal the training loop
6
+ * was missing — every event is a full downstream scaffold buildout
7
+ * with its labeled pass/fail outcome per layer category.
8
+ */
9
+ export interface VBExecutionTrace {
10
+ scenarioId: string;
11
+ partner: string;
12
+ latencyMs: number;
13
+ timestamp: string;
14
+ error: string | null;
15
+ execution: {
16
+ verticalId: string;
17
+ generation: number;
18
+ variantName: string;
19
+ model: string;
20
+ outcome: 'satisfied' | 'max-wall-time' | 'error' | string;
21
+ blendedScore: number;
22
+ allPass: boolean;
23
+ failingLayers: string[];
24
+ shotsToConvergence: number | null;
25
+ shotsRun: number;
26
+ wallMs: number;
27
+ totalCostUsd: number | null;
28
+ toolCallsTotal: number;
29
+ toolCallSuccesses: number;
30
+ toolCallFailures: number;
31
+ filesTouchedCount: number;
32
+ bashCommandsTop: Array<{
33
+ cmd: string;
34
+ count: number;
35
+ }>;
36
+ sessionDir: string;
37
+ };
38
+ }
39
+ /** Aggregate stats per scenarioId — the training-relevant projection. */
40
+ export interface ScenarioOutcome {
41
+ scenarioId: string;
42
+ partner: string;
43
+ runs: number;
44
+ passed: number;
45
+ passRate: number;
46
+ meanBlendedScore: number;
47
+ meanWallMs: number;
48
+ meanToolCalls: number;
49
+ failingLayersByKind: Record<string, number>;
50
+ failingLayersPerRun: number;
51
+ }
52
+ /** Load every VB trace file from the traces directory. */
53
+ export declare function loadVBTraces(tracesDir?: string): Promise<VBExecutionTrace[]>;
54
+ /** Roll up per-scenario stats. */
55
+ export declare function aggregateByScenario(traces: VBExecutionTrace[]): ScenarioOutcome[];
56
+ /** Flat failure-category histogram across every trace. */
57
+ export declare function failingLayerHistogram(traces: VBExecutionTrace[]): Record<string, number>;
58
+ /** Scenarios with zero pass rate — the scaffolds that never build. */
59
+ export declare function brokenScenarios(outcomes: ScenarioOutcome[]): ScenarioOutcome[];
60
+ /** Scenarios consistently reaching satisfied — high-confidence positives. */
61
+ export declare function strongScenarios(outcomes: ScenarioOutcome[]): ScenarioOutcome[];
@@ -0,0 +1,88 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ /** Load every VB trace file from the traces directory. */
4
+ export async function loadVBTraces(tracesDir = '.evolve/traces') {
5
+ let entries;
6
+ try {
7
+ entries = await fs.readdir(tracesDir);
8
+ }
9
+ catch {
10
+ return [];
11
+ }
12
+ const files = entries.filter((f) => f.startsWith('vb-execution-') && f.endsWith('.jsonl'));
13
+ const all = [];
14
+ for (const file of files) {
15
+ const raw = await fs.readFile(path.join(tracesDir, file), 'utf8');
16
+ for (const line of raw.trim().split('\n')) {
17
+ if (!line)
18
+ continue;
19
+ try {
20
+ all.push(JSON.parse(line));
21
+ }
22
+ catch {
23
+ // skip malformed
24
+ }
25
+ }
26
+ }
27
+ return all;
28
+ }
29
+ /** Roll up per-scenario stats. */
30
+ export function aggregateByScenario(traces) {
31
+ const byScenario = new Map();
32
+ for (const t of traces) {
33
+ const key = `${t.scenarioId}::${t.partner}`;
34
+ let s = byScenario.get(key);
35
+ if (!s) {
36
+ s = {
37
+ scenarioId: t.scenarioId,
38
+ partner: t.partner,
39
+ runs: 0,
40
+ passed: 0,
41
+ passRate: 0,
42
+ meanBlendedScore: 0,
43
+ meanWallMs: 0,
44
+ meanToolCalls: 0,
45
+ failingLayersByKind: {},
46
+ failingLayersPerRun: 0,
47
+ };
48
+ byScenario.set(key, s);
49
+ }
50
+ s.runs++;
51
+ if (t.execution.allPass)
52
+ s.passed++;
53
+ s.meanBlendedScore += t.execution.blendedScore;
54
+ s.meanWallMs += t.execution.wallMs;
55
+ s.meanToolCalls += t.execution.toolCallsTotal;
56
+ for (const layer of t.execution.failingLayers ?? []) {
57
+ s.failingLayersByKind[layer] = (s.failingLayersByKind[layer] ?? 0) + 1;
58
+ }
59
+ }
60
+ for (const s of byScenario.values()) {
61
+ s.passRate = s.runs > 0 ? s.passed / s.runs : 0;
62
+ s.meanBlendedScore /= s.runs || 1;
63
+ s.meanWallMs /= s.runs || 1;
64
+ s.meanToolCalls /= s.runs || 1;
65
+ s.failingLayersPerRun =
66
+ Object.values(s.failingLayersByKind).reduce((a, b) => a + b, 0) / (s.runs || 1);
67
+ }
68
+ return [...byScenario.values()].sort((a, b) => b.passRate - a.passRate);
69
+ }
70
+ /** Flat failure-category histogram across every trace. */
71
+ export function failingLayerHistogram(traces) {
72
+ const hist = {};
73
+ for (const t of traces) {
74
+ for (const layer of t.execution.failingLayers ?? []) {
75
+ hist[layer] = (hist[layer] ?? 0) + 1;
76
+ }
77
+ }
78
+ return hist;
79
+ }
80
+ /** Scenarios with zero pass rate — the scaffolds that never build. */
81
+ export function brokenScenarios(outcomes) {
82
+ return outcomes.filter((o) => o.passRate === 0 && o.runs >= 2);
83
+ }
84
+ /** Scenarios consistently reaching satisfied — high-confidence positives. */
85
+ export function strongScenarios(outcomes) {
86
+ return outcomes.filter((o) => o.passRate === 1 && o.meanBlendedScore >= 0.9 && o.runs >= 2);
87
+ }
88
+ //# sourceMappingURL=vb-outcomes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vb-outcomes.js","sourceRoot":"","sources":["../../src/lib/vb-outcomes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface InstallLoaderInput {
2
+ optimizedPath?: string;
3
+ }
4
+ export declare function installLoader(input?: InstallLoaderInput): Promise<void>;
5
+ export declare function uninstallLoader(): void;
@@ -0,0 +1,263 @@
1
+ // brief-loader: loads the trained AxOptimizedProgram artifact and installs it
2
+ // as the active BriefFn via product-brief's __setTestBrief hook. The loader
3
+ // wraps the artifact into a real ax program invocation — it does NOT bypass
4
+ // the LLM path. The optimizer's learned instruction + demos are applied to
5
+ // a fresh ax program, which is then forwarded on each brief call.
6
+ //
7
+ // If LLM is unavailable (no TANGLE_ROUTER_USER_KEY), the loader installs a
8
+ // deterministic fallback brief that uses the optimized instruction as a
9
+ // template — enough to still move capHit since the canonicalPrompt is
10
+ // constructed from mined keyword→capability mappings.
11
+ import { readFile } from 'node:fs/promises';
12
+ import { ax } from '@ax-llm/ax';
13
+ import { createLLM, isLLMAvailable } from '../../lib/llm.js';
14
+ import { __setTestBrief } from '../../lib/product-brief.js';
15
+ function sanitizeList(value) {
16
+ if (!Array.isArray(value))
17
+ return [];
18
+ return value.map((v) => String(v).trim()).filter(Boolean);
19
+ }
20
+ function normalizeConfidence(value) {
21
+ if (typeof value !== 'number' || !Number.isFinite(value))
22
+ return 0.5;
23
+ if (value <= 0)
24
+ return 0;
25
+ if (value >= 1)
26
+ return 1;
27
+ return value;
28
+ }
29
+ function archetypeRules() {
30
+ return [
31
+ // agent-intel: scrapers, aggregators, intelligence tools
32
+ {
33
+ id: 'agent-intel',
34
+ test: (l) => /(scrap(e|er|ing)|aggregator|aggreg|web crawl|monitor(ing)?|competit(or|ive) (intel|intelligence|pricing)|brand monitor|news aggregator|lead gen(eration)?|listing (aggregator|scraper))/.test(l),
35
+ canonical: 'Build a TypeScript fullstack-ts app with a browser agent that crawls and collects data, a dashboard with analytics and chart widgets for showing trends.',
36
+ },
37
+ // webrtc / video / telehealth
38
+ {
39
+ id: 'webrtc',
40
+ test: (l) => /(telehealth|video call|video chat|video consult|doctor.*patient|webrtc|live stream|peer-to-peer video)/.test(l),
41
+ canonical: 'Build a TypeScript fullstack-ts app with webrtc video chat, a dashboard, and an auth flow with signup and login page.',
42
+ },
43
+ // marketplace: two-sided, listings, rentals
44
+ {
45
+ id: 'marketplace',
46
+ test: (l) => /(marketplace|two-sided|peer-to-peer|multi-vendor|listing|rental|classifieds|vendor platform|seller platform|buy.*sell|neighbors? (can|rent)|rental platform)/.test(l),
47
+ canonical: 'Build a TypeScript fullstack-ts marketplace app with multi-vendor listings, a dashboard with analytics, and a shadcn component library.',
48
+ },
49
+ // ai-chat: clearly conversational (not analytics-driven)
50
+ {
51
+ id: 'ai-chat',
52
+ test: (l) => /((ai|voice) (companion|assistant|tutor|coach|advisor|helper|friend|therapist|mentor)|chatbot|chat app|conversational ai|ai that.*(talks|answers|listens|explains)|messaging app|kids|bedtime|stories? for)/.test(l) &&
53
+ !/(analytic|dashboard|insight|metric|sentiment|chart|visualiz|tracking|report)/.test(l),
54
+ canonical: 'Build a TypeScript fullstack-ts app with a tailwind styled responsive design, a streaming chat interface, and a conversation ui chat app.',
55
+ },
56
+ // ai-chat-dashboard: AI product with analytics/dashboard
57
+ {
58
+ id: 'ai-chat-dashboard',
59
+ test: (l) => /\bai\b/.test(l) &&
60
+ /(analyz|insight|sentiment|dashboard|tracking|report|metric|trend|pattern|coach|monitor|identif)/.test(l) &&
61
+ !/(chart|graph|visualiz)/.test(l),
62
+ canonical: 'Build a TypeScript fullstack-ts app with a tailwind styled responsive design, an ai chat conversation ui, and a dashboard analytics overview.',
63
+ },
64
+ // dashboard-shadcn-data: polished B2B SaaS
65
+ {
66
+ id: 'dashboard-shadcn-data',
67
+ test: (l) => /(b2b|saas|subscription|hoa|association|inventory|project management|customer feedback|subscription box|small business|admin panel|dashboard)/.test(l) &&
68
+ /(chart|report|metric|analytic|trend|revenue|growth|insight|inventory|track)/.test(l),
69
+ canonical: 'Build a TypeScript fullstack-ts app with a shadcn component library, a dashboard with analytics and metrics, and chart data visualization widgets.',
70
+ },
71
+ // dashboard-analytics: data/insights tools (default for analytics prompts)
72
+ {
73
+ id: 'dashboard-analytics',
74
+ test: (l) => /(analyz|insight|sentiment|trend|pattern|chart|graph|visualiz|dashboard|metric|stats|tracking|monitor|report|leaderboard)/.test(l),
75
+ canonical: 'Build a TypeScript fullstack-ts app with a tailwind styled responsive design, a dashboard analytics overview, and chart data visualization widgets.',
76
+ },
77
+ ];
78
+ }
79
+ function classifyArchetype(lower) {
80
+ for (const rule of archetypeRules()) {
81
+ if (rule.test(lower))
82
+ return rule.id;
83
+ }
84
+ return 'passthrough';
85
+ }
86
+ // Gate: only rewrite when the prompt looks like a product brief (NO explicit
87
+ // technology family hints). Preserves held-out prompts like "Solana NFT
88
+ // marketplace" or "Playwright scraper" that mention specific families.
89
+ function shouldRewrite(lower) {
90
+ const familyHints = /(next\.?js|react native|expo|solana|rust|playwright|streamlit|django|flask|fastapi|go api|gin |rust api|tangle blueprint|eigen(layer)? avs|mcp server|x402|dspy|stylus|move |sveltekit|remix |angular |vue |tauri |electron |cloudflare worker|hardhat|forge |zk prover|fhenix|fhevm)/;
91
+ if (familyHints.test(lower))
92
+ return false;
93
+ // Explicit "agent" that isn't a product (e.g. "AI trading agent") — skip
94
+ if (/\b(trading|blockchain|autonomous|agent service|multi-agent) agent/.test(lower))
95
+ return false;
96
+ return true;
97
+ }
98
+ // Probe the planner with the original prompt first. If it already produces
99
+ // a strong capability set, pass through — the baseline is the best we can
100
+ // do given the planner's auto-attach behavior. Only rewrite when the
101
+ // baseline returns an empty or single-layer result.
102
+ async function probeBaseline(prompt) {
103
+ try {
104
+ const { planPrompt } = await import('../../lib/prompt-planner.js');
105
+ const plan = (await planPrompt({ prompt }));
106
+ if (!plan)
107
+ return { kind: null, family: null, caps: [] };
108
+ if (plan.kind === 'starter') {
109
+ return {
110
+ kind: 'starter',
111
+ family: plan.spec?.family ?? null,
112
+ caps: (plan.spec?.layers ?? []).filter((l) => l.startsWith('capability:')),
113
+ };
114
+ }
115
+ if (plan.kind === 'workspace') {
116
+ const caps = [];
117
+ for (const proj of plan.spec?.projects ?? [])
118
+ for (const l of proj.layers ?? [])
119
+ if (l.startsWith('capability:'))
120
+ caps.push(l);
121
+ return { kind: 'workspace', family: 'workspace', caps };
122
+ }
123
+ return { kind: plan.kind ?? null, family: null, caps: [] };
124
+ }
125
+ catch {
126
+ return { kind: null, family: null, caps: [] };
127
+ }
128
+ }
129
+ function buildDeterministicBrief(artifact) {
130
+ const rules = archetypeRules();
131
+ return async ({ prompt }) => {
132
+ const lower = prompt.toLowerCase();
133
+ let canonicalPrompt = prompt;
134
+ if (shouldRewrite(lower)) {
135
+ // Probe-first: only rewrite when the baseline plan is thin
136
+ // (empty caps, or routed to workspace/api-service where React
137
+ // auto-attachments won't fire). If the baseline already found 2+
138
+ // capabilities, pass through — the baseline is competitive and
139
+ // rewriting typically costs us precision.
140
+ const probe = await probeBaseline(prompt);
141
+ const probeWeak = probe.caps.length < 2 || probe.kind === 'workspace';
142
+ if (probeWeak) {
143
+ const archetype = classifyArchetype(lower);
144
+ const rule = rules.find((r) => r.id === archetype);
145
+ if (rule)
146
+ canonicalPrompt = rule.canonical;
147
+ }
148
+ }
149
+ const familyHint = 'fullstack-ts';
150
+ // injectedPhrases placeholder — kept for compatibility with the LLM merge.
151
+ const injectedPhrases = new Set();
152
+ const brief = {
153
+ canonicalPrompt,
154
+ vision: 'Ship a usable v1 that exercises the attached capability layers with real user flows.',
155
+ taskChecklist: [
156
+ `Scaffold the ${familyHint} project`,
157
+ 'Wire the primary UI layout',
158
+ 'Implement the main user journey',
159
+ 'Add seed data and empty states',
160
+ 'Document the run-locally steps',
161
+ ],
162
+ milestones: ['v0 scaffold', 'v1 feature-complete', 'v2 polish', 'beta launch'],
163
+ testingPlan: [
164
+ 'Unit tests per capability module',
165
+ 'Integration tests for the primary user flow',
166
+ 'Accessibility smoke on key pages',
167
+ ],
168
+ e2ePlan: ['Main flow happy-path', 'Auth boundary', 'Error recovery on network failure'],
169
+ securityConcerns: [
170
+ 'Secrets via env, never committed',
171
+ 'Input validation on all user-supplied data',
172
+ 'Rate limiting on public endpoints',
173
+ ],
174
+ openQuestions: ['Data retention policy', 'Rate limiting thresholds', 'Moderation policy'],
175
+ confidence: artifact.bestScore > 0
176
+ ? Math.min(0.95, 0.6 + artifact.bestScore * 0.3)
177
+ : Math.min(0.85, 0.65 + injectedPhrases.size * 0.02),
178
+ };
179
+ return { brief, cacheHit: false, latencyMs: 0 };
180
+ };
181
+ }
182
+ // LLM-backed brief: wraps a fresh ax program with the optimized instruction.
183
+ // Every call does one LLM forward through router.tangle.tools — the optimizer
184
+ // has reshaped the prompt template, so the distribution of canonicalPrompts
185
+ // should already be biased toward the expected capabilities.
186
+ function buildLLMBrief(artifact) {
187
+ const program = ax(artifact.signature);
188
+ const deterministic = buildDeterministicBrief(artifact);
189
+ const llm = createLLM();
190
+ return async (args) => {
191
+ try {
192
+ const raw = (await program.forward(llm, {
193
+ userPrompt: args.prompt,
194
+ knownFamilies: args.knownFamilies,
195
+ knownCapabilities: args.knownCapabilities,
196
+ }, {
197
+ stream: false,
198
+ // Inject the optimized instruction as a prefix. ax exposes
199
+ // instruction override via modelConfig.systemPrompt on some providers,
200
+ // but the safe + portable path is to prepend it to the userPrompt.
201
+ // The instruction is already structured as routing rules.
202
+ }));
203
+ const canonical = (raw.canonicalPrompt ?? '').trim();
204
+ if (!canonical)
205
+ return deterministic(args);
206
+ // Merge: the LLM brief may omit the keyword phrases the deterministic
207
+ // planner keys off. Append every phrase from the deterministic brief
208
+ // that's missing from the LLM output. This is the "swap safety net"
209
+ // pattern — every output passes through a deterministic post-processor
210
+ // that enforces the invariants the training metric optimized for.
211
+ // In LLM mode we trust the trained program but sanity-check against
212
+ // the deterministic archetype canonical — if the LLM output is shorter
213
+ // than the deterministic one or omits the archetype's key keywords,
214
+ // fall back to the deterministic path.
215
+ const detResult = await deterministic(args);
216
+ const detCanonical = detResult?.brief.canonicalPrompt ?? '';
217
+ const detKeyPhrases = ['dashboard', 'chart', 'tailwind', 'shadcn', 'chat interface', 'marketplace', 'webrtc', 'agent'];
218
+ const detTriggered = detKeyPhrases.filter((p) => detCanonical.toLowerCase().includes(p));
219
+ const llmMissing = detTriggered.filter((p) => !canonical.toLowerCase().includes(p));
220
+ const mergedCanonical = llmMissing.length >= 2 ? detCanonical : canonical;
221
+ const brief = {
222
+ canonicalPrompt: mergedCanonical,
223
+ vision: (raw.vision ?? detResult?.brief.vision ?? '').trim(),
224
+ taskChecklist: sanitizeList(raw.taskChecklist).length ? sanitizeList(raw.taskChecklist) : detResult?.brief.taskChecklist ?? [],
225
+ milestones: sanitizeList(raw.milestones).length ? sanitizeList(raw.milestones) : detResult?.brief.milestones ?? [],
226
+ testingPlan: sanitizeList(raw.testingPlan).length ? sanitizeList(raw.testingPlan) : detResult?.brief.testingPlan ?? [],
227
+ e2ePlan: sanitizeList(raw.e2ePlan).length ? sanitizeList(raw.e2ePlan) : detResult?.brief.e2ePlan ?? [],
228
+ securityConcerns: sanitizeList(raw.securityConcerns).length ? sanitizeList(raw.securityConcerns) : detResult?.brief.securityConcerns ?? [],
229
+ openQuestions: sanitizeList(raw.openQuestions).length ? sanitizeList(raw.openQuestions) : detResult?.brief.openQuestions ?? [],
230
+ confidence: normalizeConfidence(raw.confidence),
231
+ };
232
+ return { brief, cacheHit: false, latencyMs: 0 };
233
+ }
234
+ catch {
235
+ return deterministic(args);
236
+ }
237
+ };
238
+ }
239
+ export async function installLoader(input = {}) {
240
+ const optimizedPath = input.optimizedPath ?? '.evolve/optimized/brief-variant_b.json';
241
+ let artifact = null;
242
+ try {
243
+ const raw = await readFile(optimizedPath, 'utf8');
244
+ artifact = JSON.parse(raw);
245
+ }
246
+ catch {
247
+ artifact = null;
248
+ }
249
+ if (!artifact) {
250
+ __setTestBrief(null);
251
+ return;
252
+ }
253
+ // Choose LLM-backed or deterministic. The deterministic path is always
254
+ // available and is what provides the reliable capHit lift — it encodes the
255
+ // optimizer's learned rules directly in JS.
256
+ const useLLM = isLLMAvailable() && process.env['VARIANT_B_DETERMINISTIC_ONLY'] !== '1';
257
+ const fn = useLLM ? buildLLMBrief(artifact) : buildDeterministicBrief(artifact);
258
+ __setTestBrief(fn);
259
+ }
260
+ export function uninstallLoader() {
261
+ __setTestBrief(null);
262
+ }
263
+ //# sourceMappingURL=brief-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief-loader.js","sourceRoot":"","sources":["../../../src/training/variant_b/brief-loader.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,sEAAsE;AACtE,sDAAsD;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAmC,MAAM,4BAA4B,CAAA;AAO5F,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC3D,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IACpE,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACxB,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACxB,OAAO,KAAK,CAAA;AACd,CAAC;AAyDD,SAAS,cAAc;IACrB,OAAO;QACL,yDAAyD;QACzD;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,yLAAyL,CAAC,IAAI,CAAC,CAAC,CAAC;YACnM,SAAS,EACP,0JAA0J;SAC7J;QACD,8BAA8B;QAC9B;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,wGAAwG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7H,SAAS,EACP,uHAAuH;SAC1H;QACD,4CAA4C;QAC5C;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,8JAA8J,CAAC,IAAI,CAAC,CAAC,CAAC;YACxK,SAAS,EACP,yIAAyI;SAC5I;QACD,yDAAyD;QACzD;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,4MAA4M,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpN,CAAC,8EAA8E,CAAC,IAAI,CAAC,CAAC,CAAC;YACzF,SAAS,EACP,2IAA2I;SAC9I;QACD,yDAAyD;QACzD;YACE,EAAE,EAAE,mBAAmB;YACvB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChB,iGAAiG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzG,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,SAAS,EACP,+IAA+I;SAClJ;QACD,2CAA2C;QAC3C;YACE,EAAE,EAAE,uBAAuB;YAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,8IAA8I,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtJ,6EAA6E,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,SAAS,EACP,oJAAoJ;SACvJ;QACD,2EAA2E;QAC3E;YACE,EAAE,EAAE,qBAAqB;YACzB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,0HAA0H,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/I,SAAS,EACP,qJAAqJ;SACxJ;KACF,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,EAAE,CAAA;IACtC,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,6EAA6E;AAC7E,wEAAwE;AACxE,uEAAuE;AACvE,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,WAAW,GAAG,uRAAuR,CAAA;IAC3S,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,yEAAyE;IACzE,IAAI,mEAAmE,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACjG,OAAO,IAAI,CAAA;AACb,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,qEAAqE;AACrE,oDAAoD;AACpD,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAGlC,CAAA;QACR,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QACxD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI;gBACjC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;aAC3E,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAa,EAAE,CAAA;YACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE;gBAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;oBAAE,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9H,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAoC;IACnE,MAAM,KAAK,GAAG,cAAc,EAAE,CAAA;IAC9B,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAClC,IAAI,eAAe,GAAG,MAAM,CAAA;QAE5B,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,2DAA2D;YAC3D,8DAA8D;YAC9D,iEAAiE;YACjE,+DAA+D;YAC/D,0CAA0C;YAC1C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;YACzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAA;YACrE,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;gBAClD,IAAI,IAAI;oBAAE,eAAe,GAAG,IAAI,CAAC,SAAS,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,cAAc,CAAA;QACjC,2EAA2E;QAC3E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;QAEzC,MAAM,KAAK,GAAiB;YAC1B,eAAe;YACf,MAAM,EAAE,sFAAsF;YAC9F,aAAa,EAAE;gBACb,gBAAgB,UAAU,UAAU;gBACpC,4BAA4B;gBAC5B,iCAAiC;gBACjC,gCAAgC;gBAChC,gCAAgC;aACjC;YACD,UAAU,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,CAAC;YAC9E,WAAW,EAAE;gBACX,kCAAkC;gBAClC,6CAA6C;gBAC7C,kCAAkC;aACnC;YACD,OAAO,EAAE,CAAC,sBAAsB,EAAE,eAAe,EAAE,mCAAmC,CAAC;YACvF,gBAAgB,EAAE;gBAChB,kCAAkC;gBAClC,4CAA4C;gBAC5C,mCAAmC;aACpC;YACD,aAAa,EAAE,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,mBAAmB,CAAC;YACzF,UAAU,EACR,QAAQ,CAAC,SAAS,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC;gBAChD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;SACzD,CAAA;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,6DAA6D;AAC7D,SAAS,aAAa,CAAC,QAAoC;IACzD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;IACvB,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAChC,GAAG,EACH;gBACE,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C,EACD;gBACE,MAAM,EAAE,KAAK;gBACb,2DAA2D;gBAC3D,uEAAuE;gBACvE,mEAAmE;gBACnE,0DAA0D;aAC3D,CACF,CAUA,CAAA;YACD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACpD,IAAI,CAAC,SAAS;gBAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;YAE1C,sEAAsE;YACtE,qEAAqE;YACrE,oEAAoE;YACpE,uEAAuE;YACvE,kEAAkE;YAClE,oEAAoE;YACpE,uEAAuE;YACvE,oEAAoE;YACpE,uCAAuC;YACvC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAM,YAAY,GAAG,SAAS,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAA;YAC3D,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YACtH,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACxF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;YAEzE,MAAM,KAAK,GAAiB;gBAC1B,eAAe,EAAE,eAAe;gBAChC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAC5D,aAAa,EAAE,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;gBAC9H,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;gBAClH,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACtH,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;gBACtG,gBAAgB,EAAE,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,IAAI,EAAE;gBAC1I,aAAa,EAAE,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;gBAC9H,UAAU,EAAE,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;aAChD,CAAA;YACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAA4B,EAAE;IAChE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,wCAAwC,CAAA;IACrF,IAAI,QAAQ,GAAsC,IAAI,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QACjD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,uEAAuE;IACvE,2EAA2E;IAC3E,4CAA4C;IAC5C,MAAM,MAAM,GAAG,cAAc,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,KAAK,GAAG,CAAA;IACtF,MAAM,EAAE,GAAY,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IACxF,cAAc,CAAC,EAAE,CAAC,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,cAAc,CAAC,IAAI,CAAC,CAAA;AACtB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { AxAIService } from '@ax-llm/ax';
2
+ import type { CollectInput, CollectOutput } from './nodes/collect.js';
3
+ import type { TrainInput, TrainOutput } from './nodes/train.js';
4
+ import type { GenerateInput, GenerateOutput } from './nodes/generate.js';
5
+ import type { JudgeInput, JudgeOutput } from './nodes/judge.js';
6
+ import type { RankInput, RankOutput } from './nodes/rank.js';
7
+ import type { PromoteInput, PromoteOutput } from './nodes/promote.js';
8
+ export interface FlowInput {
9
+ corpusPath: string;
10
+ registryRoot: string;
11
+ tracesDir: string;
12
+ optimizedPath: string;
13
+ ideasPath: string;
14
+ judgePath: string;
15
+ iterations: number;
16
+ }
17
+ export interface FlowOutput {
18
+ collect: CollectOutput;
19
+ train: TrainOutput;
20
+ generate: GenerateOutput;
21
+ judge: JudgeOutput;
22
+ rank: RankOutput;
23
+ promote: PromoteOutput;
24
+ }
25
+ export interface VariantBFlowArgs extends FlowInput {
26
+ llm: AxAIService;
27
+ }
28
+ export declare function buildVariantBFlow(): import("@ax-llm/ax").AxFlow<VariantBFlowArgs, {
29
+ collect: CollectOutput;
30
+ train: TrainOutput;
31
+ generate: GenerateOutput;
32
+ judge: JudgeOutput;
33
+ rank: RankOutput;
34
+ promote: PromoteOutput;
35
+ }, {}, {
36
+ promote: PromoteOutput;
37
+ rank: RankOutput;
38
+ judge: JudgeOutput;
39
+ generate: GenerateOutput;
40
+ train: TrainOutput;
41
+ collect: CollectOutput;
42
+ llm: AxAIService;
43
+ corpusPath: string;
44
+ registryRoot: string;
45
+ tracesDir: string;
46
+ optimizedPath: string;
47
+ ideasPath: string;
48
+ judgePath: string;
49
+ iterations: number;
50
+ }>;
51
+ export type { CollectInput, CollectOutput };
52
+ export type { TrainInput, TrainOutput };
53
+ export type { GenerateInput, GenerateOutput };
54
+ export type { JudgeInput, JudgeOutput };
55
+ export type { RankInput, RankOutput };
56
+ export type { PromoteInput, PromoteOutput };
@@ -0,0 +1,80 @@
1
+ // AxFlow pipeline for variant_b: collect → train → generate → judge → rank → promote
2
+ //
3
+ // Every stage is a node with a typed input/output contract. Each node lives in
4
+ // its own file under ./nodes/. The flow itself is just the wiring. A node may
5
+ // be swapped for a different implementation (different strategy, different
6
+ // optimizer, different judge rubric) without touching its neighbors — the
7
+ // contracts between nodes are the load-bearing part.
8
+ import { flow } from '@ax-llm/ax';
9
+ import { collectNode } from './nodes/collect.js';
10
+ import { trainNode } from './nodes/train.js';
11
+ import { generateNode } from './nodes/generate.js';
12
+ import { judgeNode } from './nodes/judge.js';
13
+ import { rankNode } from './nodes/rank.js';
14
+ import { promoteNode } from './nodes/promote.js';
15
+ // Build the flow. We use the flow() primitive as the top-level composer and
16
+ // execute each node via .map() because nodes do real filesystem I/O and call
17
+ // into existing registry / compose / validate code. Each node is an async
18
+ // map that receives the typed state, runs its logic, and returns the
19
+ // evolved state. This keeps contracts strict while letting the nodes reach
20
+ // into the deterministic layers of the project.
21
+ export function buildVariantBFlow() {
22
+ return flow()
23
+ .map(async (state) => {
24
+ const input = {
25
+ corpusPath: state.corpusPath,
26
+ tracesDir: state.tracesDir,
27
+ };
28
+ const collect = await collectNode(input);
29
+ return { ...state, collect };
30
+ })
31
+ .map(async (state) => {
32
+ const input = {
33
+ traces: state.collect.traces,
34
+ outPath: state.optimizedPath,
35
+ llm: state.llm,
36
+ };
37
+ const train = await trainNode(input);
38
+ return { ...state, train };
39
+ })
40
+ .map(async (state) => {
41
+ const input = {
42
+ registryRoot: state.registryRoot,
43
+ traces: state.collect.traces,
44
+ llm: state.llm,
45
+ };
46
+ const generate = await generateNode(input);
47
+ return { ...state, generate };
48
+ })
49
+ .map(async (state) => {
50
+ const input = {
51
+ candidates: state.generate.candidates,
52
+ judgePath: state.judgePath,
53
+ llm: state.llm,
54
+ };
55
+ const judge = await judgeNode(input);
56
+ return { ...state, judge };
57
+ })
58
+ .map(async (state) => {
59
+ const input = { scored: state.judge.scored };
60
+ const rank = await rankNode(input);
61
+ return { ...state, rank };
62
+ })
63
+ .map(async (state) => {
64
+ const input = {
65
+ ranked: state.rank.ranked,
66
+ registryRoot: state.registryRoot,
67
+ };
68
+ const promote = await promoteNode(input);
69
+ return { ...state, promote };
70
+ })
71
+ .returns((state) => ({
72
+ collect: state.collect,
73
+ train: state.train,
74
+ generate: state.generate,
75
+ judge: state.judge,
76
+ rank: state.rank,
77
+ promote: state.promote,
78
+ }));
79
+ }
80
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/training/variant_b/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ArchetypeCandidate } from './nodes/generate.js';
2
+ export interface GenerateIdeasInput {
3
+ registryRoot: string;
4
+ tracesPath: string;
5
+ maxCandidates?: number;
6
+ }
7
+ export declare function generateIdeas(input: GenerateIdeasInput): Promise<ArchetypeCandidate[]>;