helixevo 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +14 -6
- package/dashboard/app/api/run/route.ts +19 -1
- package/dashboard/app/commands/page.tsx +28 -4
- package/dashboard/app/guide/page.tsx +44 -5
- package/dashboard/app/page.tsx +166 -6
- package/dashboard/app/proof/client.tsx +56 -3
- package/dashboard/app/topology/client.tsx +39 -0
- package/dashboard/lib/data.ts +177 -0
- package/dashboard/lib/release-spotlight.ts +10 -10
- package/dist/cli.js +1249 -225
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ All notable changes to HelixEvo are documented here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.8.0] - 2026-03-25
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- Persisted `topology-optimize-status.json` so the dashboard and CLI can distinguish full optimize refresh from partial/degraded conflict enrichment
|
|
11
|
+
- Persisted `llm-runtime-state.json` so HelixEvo can track default provider, per-provider health, last execution, and explicit fallback truth across Claude Code, Codex, and Ollama
|
|
12
|
+
- New provider-control layer that keeps Claude Code as default while adding optional Codex and Ollama support for shared prompt-in / text-out operations
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `graph --optimize` now refreshes the topology review queue first and reports partial-vs-full enrichment truthfully instead of hiding useful structural backlog behind brittle enrichment failures
|
|
16
|
+
- Dashboard run actions now prefer the local built CLI when available, improving live control coherence during local execution
|
|
17
|
+
- Overview, Topology, and Proof now provide stronger next-step guidance around degraded optimize runs and measuring/regressed proof states
|
|
18
|
+
- `status`, Overview, Commands, Guide, and README now expose provider-control truth, including Claude default state, optional Codex/Ollama support, and explicit fallback/degraded behavior
|
|
19
|
+
- Claude-backed web search and research remain explicitly Claude-scoped rather than pretending provider symmetry where it does not exist yet
|
|
20
|
+
|
|
7
21
|
## [0.7.0] - 2026-03-25
|
|
8
22
|
|
|
9
23
|
### Added
|
package/README.md
CHANGED
|
@@ -21,15 +21,21 @@ Every proposed change goes through:
|
|
|
21
21
|
- **[Bun](https://bun.sh)** — used for building (`curl -fsSL https://bun.sh/install | bash`)
|
|
22
22
|
- **[Claude CLI](https://docs.anthropic.com/en/docs/claude-code)** — installed and authenticated
|
|
23
23
|
- Requires a **Claude Max plan** subscription
|
|
24
|
-
-
|
|
24
|
+
- Claude Code remains the **default provider** for HelixEvo
|
|
25
25
|
- Prefer `claude auth login` managed credentials over exporting a hardcoded `CLAUDE_CODE_OAUTH_TOKEN`
|
|
26
26
|
- HelixEvo now retries once without an inherited `CLAUDE_CODE_OAUTH_TOKEN` if that override is stale but local Claude auth is valid
|
|
27
|
+
- **Optional providers**
|
|
28
|
+
- **Codex CLI** (`codex`) for GPT Codex on shared prompt-in / text-out paths
|
|
29
|
+
- **Ollama** (`ollama` + local daemon) for shared local-model prompt-in / text-out paths
|
|
30
|
+
- Claude-only web-search and research tooling remain explicitly Claude-scoped
|
|
27
31
|
|
|
28
32
|
Verify prerequisites:
|
|
29
33
|
```bash
|
|
30
34
|
node --version # v18+
|
|
31
35
|
bun --version # any
|
|
32
|
-
claude --version #
|
|
36
|
+
claude --version # default provider
|
|
37
|
+
codex --version # optional
|
|
38
|
+
ollama --version # optional
|
|
33
39
|
```
|
|
34
40
|
|
|
35
41
|
## Install
|
|
@@ -92,9 +98,9 @@ helixevo dashboard
|
|
|
92
98
|
| `helixevo graph` | View skill network in terminal |
|
|
93
99
|
| `helixevo ontology` | Refresh, review, adopt, and inspect ontology concepts plus semantic control coverage |
|
|
94
100
|
| `helixevo topology` | Prepare, apply, roll back, and inspect reviewed topology execution |
|
|
95
|
-
| `helixevo research` | Proactive web research for skill improvement |
|
|
101
|
+
| `helixevo research` | Proactive web research for skill improvement (Claude-scoped web-tool path) |
|
|
96
102
|
| `helixevo dashboard [--port <n>]` | Open web dashboard, preferring localhost:3847 and falling forward if occupied |
|
|
97
|
-
| `helixevo status` | Show system health |
|
|
103
|
+
| `helixevo status` | Show system health plus provider-control truth |
|
|
98
104
|
| `helixevo report` | Generate evolution report |
|
|
99
105
|
|
|
100
106
|
### Common options
|
|
@@ -110,7 +116,7 @@ helixevo graph # TUI view (instant, cached)
|
|
|
110
116
|
helixevo graph --mermaid # Open in browser as Mermaid diagram
|
|
111
117
|
helixevo graph --obsidian ~/vault # Sync to Obsidian vault
|
|
112
118
|
helixevo graph --rebuild # Re-infer relationships (LLM call)
|
|
113
|
-
helixevo graph --optimize #
|
|
119
|
+
helixevo graph --optimize # Refresh topology review queue first, then report full vs partial conflict enrichment
|
|
114
120
|
helixevo ontology --status # Show ontology kernel / frontier / extension / adoption state
|
|
115
121
|
helixevo ontology --status --verbose
|
|
116
122
|
# Show top active concepts, unused extensions, and deprecation-sensitive concepts
|
|
@@ -148,8 +154,10 @@ All data is stored in `~/.helix/`:
|
|
|
148
154
|
├── pressure-interventions.jsonl # Routed intervention ledger across response lanes
|
|
149
155
|
├── transfer-events.jsonl # Promotion / transfer evidence across motifs and projects
|
|
150
156
|
├── governance-state.json # Operator steering for active governance mode
|
|
157
|
+
├── llm-runtime-state.json # Default provider, per-provider health, last execution, and fallback truth
|
|
151
158
|
├── topology-review-candidates.json # Persisted structural review queue
|
|
152
159
|
├── topology-review-decisions.jsonl # Operator accept/reject/defer decision ledger
|
|
160
|
+
├── topology-optimize-status.json # Last full/partial optimize refresh status + queue/enrichment summary
|
|
153
161
|
├── topology-overrides.json # Applied safe structural topology overrides
|
|
154
162
|
├── topology-snapshots.json # Snapshot refs for reviewed execution and rollback
|
|
155
163
|
├── topology-apply-plans.json # Prepared reviewed topology plans
|
|
@@ -189,7 +197,7 @@ helixevo dashboard --port 3900
|
|
|
189
197
|
```
|
|
190
198
|
|
|
191
199
|
**Tabs:**
|
|
192
|
-
- **Overview** — Premium control cockpit with frontier signals, brain foundation, semantic backbone, ontology adoption visibility, proof review visibility, pressure counts, topology review visibility, and prepared/applied structural state
|
|
200
|
+
- **Overview** — Premium control cockpit with frontier signals, brain foundation, provider-control truth, semantic backbone, ontology adoption visibility, proof review visibility, pressure counts, topology review visibility, and prepared/applied structural state
|
|
193
201
|
- **Skill Network** — Interactive graph, premium inspector, co-evolution routing signals, and topology review/execution handoff links
|
|
194
202
|
- **Co-Evolution** — Operator cockpit for routed pressure response, governance mode visibility, promotion queues, transfer evidence, semantic route influence, and topology handoff
|
|
195
203
|
- **Ontology** — Semantic control surface for kernel visibility, frontier concept review, approved ontology extensions, adoption coverage, deprecation risk, and native ontology change events
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server'
|
|
2
2
|
import { spawn, type ChildProcess } from 'child_process'
|
|
3
|
+
import { existsSync } from 'fs'
|
|
4
|
+
import { join } from 'path'
|
|
3
5
|
|
|
4
6
|
export const dynamic = 'force-dynamic'
|
|
5
7
|
|
|
@@ -46,6 +48,21 @@ function buildCommandEntry(body: { command: string; project?: string; path?: str
|
|
|
46
48
|
return null
|
|
47
49
|
}
|
|
48
50
|
|
|
51
|
+
function resolveRunRunner(): { cmd: string; argsPrefix: string[] } {
|
|
52
|
+
const candidates = [
|
|
53
|
+
join(process.cwd(), '..', 'dist', 'cli.js'),
|
|
54
|
+
join(process.cwd(), 'dist', 'cli.js'),
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
for (const candidate of candidates) {
|
|
58
|
+
if (existsSync(candidate)) {
|
|
59
|
+
return { cmd: process.execPath, argsPrefix: [candidate] }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { cmd: 'helixevo', argsPrefix: [] }
|
|
64
|
+
}
|
|
65
|
+
|
|
49
66
|
let activeProcess: ChildProcess | null = null
|
|
50
67
|
let activeCommand: string | null = null
|
|
51
68
|
|
|
@@ -71,7 +88,8 @@ export async function POST(request: Request) {
|
|
|
71
88
|
|
|
72
89
|
const stream = new ReadableStream({
|
|
73
90
|
start(controller) {
|
|
74
|
-
const
|
|
91
|
+
const runner = resolveRunRunner()
|
|
92
|
+
const child = spawn(runner.cmd, [...runner.argsPrefix, ...entry.args], {
|
|
75
93
|
env: { ...process.env },
|
|
76
94
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
77
95
|
})
|
|
@@ -111,7 +111,7 @@ const COMMANDS: CommandInfo[] = [
|
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
113
|
name: 'graph',
|
|
114
|
-
description: 'Visualize and manage the skill network graph. Shows relationships between skills (depends, enhances, conflicts, co-evolves), and graph optimize now
|
|
114
|
+
description: 'Visualize and manage the skill network graph. Shows relationships between skills (depends, enhances, conflicts, co-evolves), and graph optimize now refreshes a truthful topology review queue first, then reports whether conflict enrichment completed fully or only partially.',
|
|
115
115
|
usage: 'helixevo graph [options]',
|
|
116
116
|
examples: [
|
|
117
117
|
{ cmd: 'helixevo graph', desc: 'Show skill network in terminal (instant)' },
|
|
@@ -130,6 +130,7 @@ const COMMANDS: CommandInfo[] = [
|
|
|
130
130
|
category: 'network',
|
|
131
131
|
needsLLM: true,
|
|
132
132
|
runnable: { command: 'graph-rebuild', label: 'Rebuild Graph', icon: 'M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1', color: 'var(--purple)' },
|
|
133
|
+
note: 'graph --optimize now distinguishes queue refresh from conflict enrichment. In degraded mode it can still surface a real review queue while clearly marking enrichment as partial rather than silently pretending full optimize succeeded.',
|
|
133
134
|
},
|
|
134
135
|
{
|
|
135
136
|
name: 'ontology',
|
|
@@ -178,7 +179,7 @@ const COMMANDS: CommandInfo[] = [
|
|
|
178
179
|
},
|
|
179
180
|
{
|
|
180
181
|
name: 'research',
|
|
181
|
-
description: 'Proactive skill discovery via web research. Identifies gaps in your skill network, generates hypotheses, searches the web for solutions, and creates draft skills from discoveries.',
|
|
182
|
+
description: 'Proactive skill discovery via web research. Identifies gaps in your skill network, generates hypotheses, searches the web for solutions, and creates draft skills from discoveries. This lane remains explicitly Claude-scoped because it depends on Claude tool-enabled web search rather than provider-neutral prompting.',
|
|
182
183
|
usage: 'helixevo research [options]',
|
|
183
184
|
examples: [
|
|
184
185
|
{ cmd: 'helixevo research', desc: 'Run proactive research' },
|
|
@@ -244,11 +245,11 @@ const COMMANDS: CommandInfo[] = [
|
|
|
244
245
|
category: 'analysis',
|
|
245
246
|
needsLLM: false,
|
|
246
247
|
runnable: { command: 'proof', label: 'Open Proof State', icon: 'M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z', color: 'var(--blue)' },
|
|
247
|
-
note: 'Proof stays bounded and reviewable.
|
|
248
|
+
note: 'Proof stays bounded and reviewable. Measuring means live but not yet proven, regressed means explicit negative evidence, and verified strengthens review trust without pretending stronger causal certainty than the evidence supports.',
|
|
248
249
|
},
|
|
249
250
|
{
|
|
250
251
|
name: 'status',
|
|
251
|
-
description: 'Quick overview of system state: total skills, frontier size, failure count, skill tests, and
|
|
252
|
+
description: 'Quick overview of system state: total skills, frontier size, failure count, skill tests, provider control health, and the last recorded provider execution. Like a health check but without deep model analysis.',
|
|
252
253
|
usage: 'helixevo status',
|
|
253
254
|
examples: [
|
|
254
255
|
{ cmd: 'helixevo status', desc: 'Show system status' },
|
|
@@ -411,6 +412,7 @@ export default function CommandsPage() {
|
|
|
411
412
|
{ label: `${COMMANDS.length} commands`, tone: 'blue' },
|
|
412
413
|
{ label: `${stats.llmCommands} need LLM access`, tone: 'purple' },
|
|
413
414
|
{ label: `${stats.runnableCommands} runnable here`, tone: 'green' },
|
|
415
|
+
{ label: 'Claude default • Codex + Ollama optional', tone: 'blue' },
|
|
414
416
|
{ label: `${stats.optionFlags} documented flags`, tone: 'yellow' },
|
|
415
417
|
]}
|
|
416
418
|
actions={
|
|
@@ -429,6 +431,28 @@ export default function CommandsPage() {
|
|
|
429
431
|
<MetricCard label="Flags documented" value={stats.optionFlags} sublabel="Total option flags surfaced across the current command reference." tone="yellow" />
|
|
430
432
|
</div>
|
|
431
433
|
|
|
434
|
+
<SectionFrame
|
|
435
|
+
eyebrow="Provider control"
|
|
436
|
+
title="Claude default, Codex and Ollama optional"
|
|
437
|
+
description="Shared prompt-in / text-out operations now run through provider control. Claude Code remains the default provider, while Codex and Ollama can be enabled for supported operations. Claude-only web search and research tooling stay explicitly Claude-scoped."
|
|
438
|
+
tone="blue"
|
|
439
|
+
>
|
|
440
|
+
<div className="grid-3" style={{ gap: 12 }}>
|
|
441
|
+
<div className="card" style={{ padding: '18px 18px 16px' }}>
|
|
442
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--blue)', marginBottom: 8 }}>Default path</div>
|
|
443
|
+
<div style={{ fontSize: 12.5, color: 'var(--text-dim)', lineHeight: 1.65 }}>Claude Code stays the default provider. Existing CLI flows keep working without forcing a provider switch.</div>
|
|
444
|
+
</div>
|
|
445
|
+
<div className="card" style={{ padding: '18px 18px 16px' }}>
|
|
446
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--purple)', marginBottom: 8 }}>Optional providers</div>
|
|
447
|
+
<div style={{ fontSize: 12.5, color: 'var(--text-dim)', lineHeight: 1.65 }}>GPT Codex and Ollama can now be enabled for shared chat / JSON / judge-style paths when you want alternate cloud or local execution.</div>
|
|
448
|
+
</div>
|
|
449
|
+
<div className="card" style={{ padding: '18px 18px 16px' }}>
|
|
450
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--yellow)', marginBottom: 8 }}>Truthfulness rule</div>
|
|
451
|
+
<div style={{ fontSize: 12.5, color: 'var(--text-dim)', lineHeight: 1.65 }}>Fallback is explicit, not silent. If a command is Claude-scoped or a fallback path was used, status and dashboard surfaces now record that truth explicitly.</div>
|
|
452
|
+
</div>
|
|
453
|
+
</div>
|
|
454
|
+
</SectionFrame>
|
|
455
|
+
|
|
432
456
|
<SectionFrame
|
|
433
457
|
eyebrow="Workflow framing"
|
|
434
458
|
title="Typical operating sequence"
|
|
@@ -359,6 +359,7 @@ export default function GuidePage() {
|
|
|
359
359
|
<Callout type="info">
|
|
360
360
|
<strong>Prerequisites:</strong> Node.js 18+, <a href="https://bun.sh">Bun</a> (for building),
|
|
361
361
|
and <a href="https://docs.anthropic.com/en/docs/claude-code">Claude CLI</a> with a Claude Max plan.
|
|
362
|
+
Claude Code remains the default provider. Codex and Ollama are optional providers for shared prompt-in / text-out paths once enabled in <code>~/.helix/config.json</code>.
|
|
362
363
|
Prefer <code>claude auth login</code> managed credentials over exporting a hardcoded <code>CLAUDE_CODE_OAUTH_TOKEN</code>.
|
|
363
364
|
</Callout>
|
|
364
365
|
|
|
@@ -403,7 +404,7 @@ helixevo evolve --verbose
|
|
|
403
404
|
helixevo graph --optimize
|
|
404
405
|
helixevo topology --status`}</Code>
|
|
405
406
|
<p className="guide-text-sm">
|
|
406
|
-
<code>evolve</code> mutates skills directly, while <code>graph --optimize</code> and <code>topology</code> expose the higher-level structural review and execution loop.
|
|
407
|
+
<code>evolve</code> mutates skills directly, while <code>graph --optimize</code> and <code>topology</code> expose the higher-level structural review and execution loop. Optimize now refreshes the review queue first and then reports whether conflict enrichment completed fully or only partially.
|
|
407
408
|
</p>
|
|
408
409
|
</Step>
|
|
409
410
|
|
|
@@ -882,7 +883,7 @@ helixevo metrics --verbose`}</Code>
|
|
|
882
883
|
</ul>
|
|
883
884
|
|
|
884
885
|
<Callout type="warning">
|
|
885
|
-
Proof remains bounded. Recent changes should stay <strong>measuring</strong>, weak evidence should stay <strong>insufficient-evidence</strong>, and semantic-adoption proof should be treated as correlational evidence rather than strong direct causality.
|
|
886
|
+
Proof remains bounded. Recent changes should stay <strong>measuring</strong>, weak evidence should stay <strong>insufficient-evidence</strong>, and semantic-adoption proof should be treated as correlational evidence rather than strong direct causality. Treat <strong>regressed</strong> as explicit negative evidence that should trigger route/structure review before retry, and treat <strong>verified</strong> as stronger operator trust in the review state rather than magical proof of causality.
|
|
886
887
|
</Callout>
|
|
887
888
|
</Section>
|
|
888
889
|
|
|
@@ -1090,10 +1091,19 @@ generation: 3
|
|
|
1090
1091
|
|
|
1091
1092
|
{/* ─── Configuration ─── */}
|
|
1092
1093
|
<Section id="config" title="Configuration" subtitle="All configurable parameters and their defaults.">
|
|
1094
|
+
<h3 className="guide-h3">Provider control</h3>
|
|
1095
|
+
<div className="guide-params">
|
|
1096
|
+
<Param name="model" type="string" desc="Backward-compatible top-level model alias. It stays in sync with the current default provider model." def='"sonnet"' />
|
|
1097
|
+
<Param name="judgeModel" type="string" desc="Backward-compatible top-level judge model alias. It stays in sync with the current default provider judge model." def='"sonnet"' />
|
|
1098
|
+
<Param name="llm.defaultProvider" type="string" desc="Default provider for shared prompt-in / text-out operations." def='"claude-code"' />
|
|
1099
|
+
<Param name="llm.fallbackPolicy" type="string" desc="Fallback policy for shared provider-eligible operations. Keep disabled unless you want explicit on-failure fallback." def='"disabled"' />
|
|
1100
|
+
<Param name="llm.providers.claudeCode.enabled" type="boolean" desc="Keep Claude Code enabled as the default provider unless you intentionally move the default elsewhere." def="true" />
|
|
1101
|
+
<Param name="llm.providers.codex.enabled" type="boolean" desc="Enable GPT Codex for shared chat / JSON / judge-style paths." def="false" />
|
|
1102
|
+
<Param name="llm.providers.ollama.enabled" type="boolean" desc="Enable Ollama for shared local-model chat / JSON / judge-style paths." def="false" />
|
|
1103
|
+
</div>
|
|
1104
|
+
|
|
1093
1105
|
<h3 className="guide-h3">Evolution</h3>
|
|
1094
1106
|
<div className="guide-params">
|
|
1095
|
-
<Param name="model" type="string" desc="LLM model for proposals and clustering." def='"sonnet"' />
|
|
1096
|
-
<Param name="judgeModel" type="string" desc="LLM model for judge evaluations." def='"sonnet"' />
|
|
1097
1107
|
<Param name="evolution.schedule" type="cron" desc="When to run automatic evolution." def='"0 2 * * *"' />
|
|
1098
1108
|
<Param name="evolution.minFailuresForEvolution" type="number" desc="Minimum unresolved failures before evolve runs." def="5" />
|
|
1099
1109
|
<Param name="evolution.maxFailuresPerRun" type="number" desc="Max failures to process per run." def="20" />
|
|
@@ -1115,6 +1125,32 @@ generation: 3
|
|
|
1115
1125
|
<Code title="~/.helix/config.json">{`{
|
|
1116
1126
|
"model": "sonnet",
|
|
1117
1127
|
"judgeModel": "sonnet",
|
|
1128
|
+
"llm": {
|
|
1129
|
+
"defaultProvider": "claude-code",
|
|
1130
|
+
"fallbackPolicy": "disabled",
|
|
1131
|
+
"fallbackOrder": [],
|
|
1132
|
+
"providers": {
|
|
1133
|
+
"claudeCode": {
|
|
1134
|
+
"enabled": true,
|
|
1135
|
+
"command": "claude",
|
|
1136
|
+
"model": "sonnet",
|
|
1137
|
+
"judgeModel": "sonnet"
|
|
1138
|
+
},
|
|
1139
|
+
"codex": {
|
|
1140
|
+
"enabled": false,
|
|
1141
|
+
"command": "codex",
|
|
1142
|
+
"model": "gpt-5-codex",
|
|
1143
|
+
"judgeModel": "gpt-5-codex"
|
|
1144
|
+
},
|
|
1145
|
+
"ollama": {
|
|
1146
|
+
"enabled": false,
|
|
1147
|
+
"command": "ollama",
|
|
1148
|
+
"host": "http://127.0.0.1:11434",
|
|
1149
|
+
"model": "qwen3-coder:latest",
|
|
1150
|
+
"judgeModel": "qwen3-coder:latest"
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
},
|
|
1118
1154
|
"evolution": {
|
|
1119
1155
|
"schedule": "0 2 * * *",
|
|
1120
1156
|
"minFailuresForEvolution": 5,
|
|
@@ -1144,8 +1180,10 @@ generation: 3
|
|
|
1144
1180
|
├── pressure-interventions.jsonl # Routed intervention ledger across response lanes
|
|
1145
1181
|
├── transfer-events.jsonl # Promotion / transfer evidence across motifs and projects
|
|
1146
1182
|
├── governance-state.json # Operator-selected governance steering state
|
|
1183
|
+
├── llm-runtime-state.json # Default provider, per-provider health, last execution, and fallback truth
|
|
1147
1184
|
├── topology-review-candidates.json # Persisted structural review queue
|
|
1148
1185
|
├── topology-review-decisions.jsonl # Accept / reject / defer decision ledger
|
|
1186
|
+
├── topology-optimize-status.json # Last full/partial optimize refresh status + queue/enrichment summary
|
|
1149
1187
|
├── topology-overrides.json # Applied safe structural topology overrides
|
|
1150
1188
|
├── topology-snapshots.json # Snapshot refs for reviewed execution and rollback
|
|
1151
1189
|
├── topology-apply-plans.json # Prepared reviewed topology plans
|
|
@@ -1176,7 +1214,8 @@ generation: 3
|
|
|
1176
1214
|
['Observation memory', 'var(--blue)', 'failures.jsonl + activation-traces.jsonl capture what happened, where it happened, and which skills were active.'],
|
|
1177
1215
|
['Pressure & response memory', 'var(--yellow)', 'pressure-signals.jsonl + pressure-interventions.jsonl + transfer-events.jsonl describe demand, routing, and reusable promotion evidence.'],
|
|
1178
1216
|
['Ontology frontier memory', 'var(--blue)', 'ontology/kernel.json + ontology/frontier.json + ontology/extensions.json + ontology/reviews.jsonl + ontology/change-log.jsonl preserve semantic kernel state, provisional concepts, approved extensions, and review/change lineage while semantic adoption is derived from active runtime/control objects rather than a parallel ontology-usage ledger.'],
|
|
1179
|
-
['Governance &
|
|
1217
|
+
['Governance & provider memory', 'var(--purple)', 'governance-state.json + llm-runtime-state.json preserve adaptation steering plus the truthful backend ledger: default provider, per-provider health, last execution, and fallback state.'],
|
|
1218
|
+
['Structural review memory', 'var(--purple)', 'topology-review-candidates.json + topology-review-decisions.jsonl + topology-optimize-status.json preserve why structural decisions are being made and whether the last optimize pass was full or degraded.'],
|
|
1180
1219
|
['Topology execution memory', 'var(--green)', 'topology-overrides.json + topology-snapshots.json + topology-apply-plans.json + topology-executions.jsonl + topology-artifacts.jsonl preserve reviewed structural execution and rollback.'],
|
|
1181
1220
|
['Evaluation & frontier memory', 'var(--blue)', 'evolution-history.json + evolution-artifacts.jsonl + skill-tests.jsonl + canary-registry.json + frontier.json preserve proof, guardrails, and best configurations.'],
|
|
1182
1221
|
['Discovery memory', 'var(--purple)', 'knowledge-buffer.json keeps research discoveries and drafts so failed experiments can be iterated instead of lost.'],
|
package/dashboard/app/page.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Link from 'next/link'
|
|
2
|
-
import { getDashboardSummary, getOntologyDashboardSummary, loadCoEvolutionSummary, loadFailures, loadFrontier, loadGraph, loadHistory, listProjects } from '@/lib/data'
|
|
2
|
+
import { getDashboardSummary, getOntologyDashboardSummary, loadCoEvolutionSummary, loadFailures, loadFrontier, loadGraph, loadHistory, listProjects, loadTopologyDashboardSummary, loadLlmRuntimeState } from '@/lib/data'
|
|
3
3
|
import { loadProofDashboardSummary } from '@/lib/proof'
|
|
4
4
|
import { OverviewActions } from '@/components/overview-actions'
|
|
5
5
|
import { PageHero } from '@/components/page-hero'
|
|
@@ -17,10 +17,94 @@ function scoreColor(score: number) {
|
|
|
17
17
|
return 'var(--red)'
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
function providerLabel(provider: 'claude-code' | 'codex' | 'ollama') {
|
|
21
|
+
if (provider === 'claude-code') return 'Claude Code'
|
|
22
|
+
if (provider === 'codex') return 'GPT Codex'
|
|
23
|
+
return 'Ollama'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function providerTone(status: 'healthy' | 'degraded' | 'unavailable' | 'unknown') {
|
|
27
|
+
if (status === 'healthy') return 'green' as const
|
|
28
|
+
if (status === 'degraded') return 'yellow' as const
|
|
29
|
+
if (status === 'unavailable') return 'red' as const
|
|
30
|
+
return 'neutral' as const
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getPriorityActions(params: {
|
|
34
|
+
unresolved: number
|
|
35
|
+
proofOpen: number
|
|
36
|
+
topologyOpen: number
|
|
37
|
+
optimizeStatus: 'idle' | 'healthy' | 'partial' | 'failed'
|
|
38
|
+
optimizeNextStep?: string
|
|
39
|
+
providerStatus: 'healthy' | 'degraded' | 'unavailable' | 'unknown'
|
|
40
|
+
providerSummary: string
|
|
41
|
+
providerNextStep?: string
|
|
42
|
+
}) {
|
|
43
|
+
const actions: Array<{ href: string; title: string; description: string; tone: 'blue' | 'green' | 'purple' | 'yellow' }> = []
|
|
44
|
+
|
|
45
|
+
if (params.providerStatus === 'degraded' || params.providerStatus === 'unavailable') {
|
|
46
|
+
actions.push({
|
|
47
|
+
href: '/commands',
|
|
48
|
+
title: 'Stabilize provider control',
|
|
49
|
+
description: params.providerNextStep ?? params.providerSummary,
|
|
50
|
+
tone: 'yellow',
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (params.optimizeStatus === 'partial' || params.optimizeStatus === 'failed') {
|
|
55
|
+
actions.push({
|
|
56
|
+
href: '/topology',
|
|
57
|
+
title: 'Review degraded optimize state',
|
|
58
|
+
description: params.optimizeNextStep ?? 'The review queue refreshed, but structural enrichment did not complete fully. Inspect topology control before treating the queue as fully enriched.',
|
|
59
|
+
tone: 'yellow',
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (params.proofOpen > 0) {
|
|
64
|
+
actions.push({
|
|
65
|
+
href: '/proof',
|
|
66
|
+
title: 'Review open proof records',
|
|
67
|
+
description: `${params.proofOpen} proof record${params.proofOpen === 1 ? '' : 's'} currently need operator review before the prove layer becomes more trustworthy.`,
|
|
68
|
+
tone: 'blue',
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (params.topologyOpen > 0) {
|
|
73
|
+
actions.push({
|
|
74
|
+
href: '/topology',
|
|
75
|
+
title: 'Triage structural backlog',
|
|
76
|
+
description: `${params.topologyOpen} topology review item${params.topologyOpen === 1 ? '' : 's'} are waiting for accept/defer/reject decisions.`,
|
|
77
|
+
tone: 'purple',
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (params.unresolved > 0) {
|
|
82
|
+
actions.push({
|
|
83
|
+
href: '/coevolution',
|
|
84
|
+
title: 'Route live pressure',
|
|
85
|
+
description: `${params.unresolved} unresolved correction${params.unresolved === 1 ? '' : 's'} still need to be routed back into the learning loop.`,
|
|
86
|
+
tone: 'green',
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (actions.length === 0) {
|
|
91
|
+
actions.push({
|
|
92
|
+
href: '/projects',
|
|
93
|
+
title: 'Setup a project',
|
|
94
|
+
description: 'Analyze a folder or GitHub repo, match skills, and identify capability gaps to seed the next loop.',
|
|
95
|
+
tone: 'green',
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return actions.slice(0, 3)
|
|
100
|
+
}
|
|
101
|
+
|
|
20
102
|
export default function Overview() {
|
|
21
103
|
const summary = getDashboardSummary()
|
|
22
104
|
const ontology = getOntologyDashboardSummary()
|
|
23
105
|
const coevolution = loadCoEvolutionSummary()
|
|
106
|
+
const topologyControl = loadTopologyDashboardSummary()
|
|
107
|
+
const llmRuntime = loadLlmRuntimeState()
|
|
24
108
|
const proof = loadProofDashboardSummary()
|
|
25
109
|
const frontier = loadFrontier()
|
|
26
110
|
const history = loadHistory()
|
|
@@ -29,6 +113,18 @@ export default function Overview() {
|
|
|
29
113
|
const unresolved = failures.filter((failure) => !failure.resolved)
|
|
30
114
|
const recentRuns = history.iterations.slice(-4).reverse()
|
|
31
115
|
const topSkills = [...graph.nodes].sort((a, b) => b.score - a.score).slice(0, 10)
|
|
116
|
+
const defaultProvider = llmRuntime.providers[llmRuntime.defaultProvider]
|
|
117
|
+
const priorityActions = getPriorityActions({
|
|
118
|
+
unresolved: summary.failures.unresolved,
|
|
119
|
+
proofOpen: proof.summary.reviewOpen,
|
|
120
|
+
topologyOpen: topologyControl.summary.open,
|
|
121
|
+
optimizeStatus: topologyControl.optimizeStatus.status,
|
|
122
|
+
optimizeNextStep: topologyControl.optimizeStatus.nextStep,
|
|
123
|
+
providerStatus: defaultProvider.status,
|
|
124
|
+
providerSummary: defaultProvider.summary,
|
|
125
|
+
providerNextStep: defaultProvider.nextStep,
|
|
126
|
+
})
|
|
127
|
+
const primaryAction = priorityActions[0]
|
|
32
128
|
|
|
33
129
|
return (
|
|
34
130
|
<div className="overview-grid">
|
|
@@ -45,19 +141,20 @@ export default function Overview() {
|
|
|
45
141
|
{ label: `${coevolution.topologyReviews.open} topology reviews`, tone: coevolution.topologyReviews.open > 0 ? 'yellow' : 'green' },
|
|
46
142
|
{ label: `${coevolution.topologyExecution.prepared} prepared structural plans`, tone: coevolution.topologyExecution.prepared > 0 ? 'blue' : 'neutral' },
|
|
47
143
|
{ label: `${proof.summary.reviewOpen} proof reviews`, tone: proof.summary.reviewOpen > 0 ? 'yellow' : proof.summary.effective > 0 ? 'green' : 'neutral' },
|
|
144
|
+
{ label: `${providerLabel(llmRuntime.defaultProvider)} ${defaultProvider.status}`, tone: providerTone(defaultProvider.status) },
|
|
48
145
|
{ label: `mode: ${coevolution.governance.activeMode.replace(/-/g, ' ')}`, tone: coevolution.governance.activeMode === 'transfer-focused' ? 'purple' : coevolution.governance.activeMode === 'project-critical' ? 'yellow' : 'blue' },
|
|
49
146
|
]}
|
|
50
147
|
actions={
|
|
51
|
-
<Link href=
|
|
52
|
-
<div className=
|
|
148
|
+
<Link href={primaryAction.href} className="metric-card-anchor" style={{ minWidth: 260, display: 'block' }}>
|
|
149
|
+
<div className={`metric-card metric-card-${primaryAction.tone} metric-card-link`}>
|
|
53
150
|
<div className="metric-card-header">
|
|
54
151
|
<div>
|
|
55
|
-
<div className="metric-card-label">
|
|
56
|
-
<div className="metric-card-value" style={{ fontSize: 24 }}>
|
|
152
|
+
<div className="metric-card-label">Priority now</div>
|
|
153
|
+
<div className="metric-card-value" style={{ fontSize: 24 }}>{primaryAction.title}</div>
|
|
57
154
|
</div>
|
|
58
155
|
<div className="metric-card-icon">↗</div>
|
|
59
156
|
</div>
|
|
60
|
-
<div className="metric-card-sublabel">
|
|
157
|
+
<div className="metric-card-sublabel">{primaryAction.description}</div>
|
|
61
158
|
</div>
|
|
62
159
|
</Link>
|
|
63
160
|
}
|
|
@@ -112,6 +209,69 @@ export default function Overview() {
|
|
|
112
209
|
/>
|
|
113
210
|
</SectionFrame>
|
|
114
211
|
|
|
212
|
+
<SectionFrame
|
|
213
|
+
eyebrow="Provider control"
|
|
214
|
+
title="Live backend truth"
|
|
215
|
+
description="Claude Code remains the default provider, while Codex and Ollama are optional for shared prompt-in/text-out paths. Claude-only web-search and research tooling stay explicitly Claude-scoped."
|
|
216
|
+
tone="blue"
|
|
217
|
+
>
|
|
218
|
+
<div className="grid-2" style={{ gap: 16 }}>
|
|
219
|
+
<div className="summary-list">
|
|
220
|
+
{(['claude-code', 'codex', 'ollama'] as const).map((provider) => {
|
|
221
|
+
const snapshot = llmRuntime.providers[provider]
|
|
222
|
+
return (
|
|
223
|
+
<div key={provider} className="summary-row">
|
|
224
|
+
<div className="summary-row-main">
|
|
225
|
+
<div className="summary-row-title">{providerLabel(provider)}</div>
|
|
226
|
+
<div className="summary-row-meta">{snapshot.summary}</div>
|
|
227
|
+
{snapshot.nextStep ? <div className="summary-row-meta" style={{ marginTop: 6 }}>Next: {snapshot.nextStep}</div> : null}
|
|
228
|
+
</div>
|
|
229
|
+
<span className={`hero-chip hero-chip-${providerTone(snapshot.status)}`}>{snapshot.status}</span>
|
|
230
|
+
</div>
|
|
231
|
+
)
|
|
232
|
+
})}
|
|
233
|
+
</div>
|
|
234
|
+
<div style={{ display: 'grid', gap: 12 }}>
|
|
235
|
+
<MetricCard
|
|
236
|
+
label="Default provider"
|
|
237
|
+
value={providerLabel(llmRuntime.defaultProvider)}
|
|
238
|
+
sublabel={`fallback: ${llmRuntime.fallbackPolicy}${llmRuntime.fallbackOrder.length > 0 ? ` • ${llmRuntime.fallbackOrder.map((provider) => providerLabel(provider)).join(' → ')}` : ''}`}
|
|
239
|
+
tone={providerTone(defaultProvider.status)}
|
|
240
|
+
href="/commands"
|
|
241
|
+
icon="☍"
|
|
242
|
+
/>
|
|
243
|
+
<MetricCard
|
|
244
|
+
label="Last provider run"
|
|
245
|
+
value={llmRuntime.lastExecution?.usedProvider ? providerLabel(llmRuntime.lastExecution.usedProvider) : 'None'}
|
|
246
|
+
sublabel={llmRuntime.lastExecution ? llmRuntime.lastExecution.summary : 'No provider-backed execution has been recorded yet.'}
|
|
247
|
+
tone={llmRuntime.lastExecution?.success ? 'green' : llmRuntime.lastExecution ? 'yellow' : 'neutral'}
|
|
248
|
+
href="/commands"
|
|
249
|
+
icon="↺"
|
|
250
|
+
/>
|
|
251
|
+
<div className="signal-text">Commands, status, and dashboard surfaces now track whether execution stayed on the selected provider, degraded, or used an explicit fallback path.</div>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
</SectionFrame>
|
|
255
|
+
|
|
256
|
+
<SectionFrame
|
|
257
|
+
eyebrow="Priority now"
|
|
258
|
+
title="Top ranked next actions"
|
|
259
|
+
description="This layer compresses the live loop into the most important operator moves right now instead of leaving everything as flat dashboard signal."
|
|
260
|
+
tone="blue"
|
|
261
|
+
>
|
|
262
|
+
<div className="summary-list">
|
|
263
|
+
{priorityActions.map((action, index) => (
|
|
264
|
+
<Link key={`${action.href}-${index}`} href={action.href} className="summary-row">
|
|
265
|
+
<div className="summary-row-main">
|
|
266
|
+
<div className="summary-row-title">{index + 1}. {action.title}</div>
|
|
267
|
+
<div className="summary-row-meta">{action.description}</div>
|
|
268
|
+
</div>
|
|
269
|
+
<span className={`hero-chip hero-chip-${action.tone}`}>open</span>
|
|
270
|
+
</Link>
|
|
271
|
+
))}
|
|
272
|
+
</div>
|
|
273
|
+
</SectionFrame>
|
|
274
|
+
|
|
115
275
|
<SectionFrame
|
|
116
276
|
eyebrow="Brain foundation"
|
|
117
277
|
title="Semantic backbone"
|
|
@@ -51,11 +51,42 @@ function consoleTone(state: RunState): 'neutral' | 'green' | 'red' | 'yellow' {
|
|
|
51
51
|
return 'neutral'
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
function getRecommendedProofMove(dashboard: ProofDashboardSummary) {
|
|
55
|
+
const firstOpen = dashboard.reviewQueue[0]
|
|
56
|
+
if (firstOpen) {
|
|
57
|
+
return {
|
|
58
|
+
label: 'Review queue first',
|
|
59
|
+
title: firstOpen.title,
|
|
60
|
+
copy: 'Open proof records should usually be resolved before you treat the prove layer as settled. Verify, defer, or contest the most important record first.',
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (dashboard.summary.regressed > 0) {
|
|
64
|
+
return {
|
|
65
|
+
label: 'Investigate regressed evidence',
|
|
66
|
+
title: 'A regressed outcome needs explanation before retry',
|
|
67
|
+
copy: 'Regressed records mean HelixEvo has explicit negative evidence. Inspect the linked structural or intervention path before repeating the same move.',
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (dashboard.summary.measuring > 0) {
|
|
71
|
+
return {
|
|
72
|
+
label: 'Let evidence mature',
|
|
73
|
+
title: 'Measuring means live, not yet proven',
|
|
74
|
+
copy: 'A measuring record is active but still too recent or incomplete for a stronger claim. Let downstream evidence accumulate before over-interpreting it.',
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
label: 'Seed proof',
|
|
79
|
+
title: 'No proof targets yet',
|
|
80
|
+
copy: 'Proof becomes useful after live interventions, semantic adoption, transfer, or topology execution create evaluable downstream evidence.',
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
54
84
|
export default function ProofClient({ initialDashboard }: { initialDashboard: ProofDashboardSummary }) {
|
|
55
85
|
const [dashboard, setDashboard] = useState(initialDashboard)
|
|
56
86
|
const [runState, setRunState] = useState<RunState>('idle')
|
|
57
87
|
const [output, setOutput] = useState('')
|
|
58
88
|
const [pendingKey, setPendingKey] = useState<string | null>(null)
|
|
89
|
+
const recommendedMove = getRecommendedProofMove(dashboard)
|
|
59
90
|
|
|
60
91
|
const runReview = async (recordId: string, decision: ProofReviewDecisionStatus, label: string) => {
|
|
61
92
|
setPendingKey(recordId)
|
|
@@ -106,9 +137,9 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
106
137
|
actions={
|
|
107
138
|
<div style={{ display: 'grid', gap: 12 }}>
|
|
108
139
|
<div className="hero-note-card">
|
|
109
|
-
<div className="hero-note-label">
|
|
110
|
-
<div className="hero-note-title">
|
|
111
|
-
<div className="hero-note-copy">
|
|
140
|
+
<div className="hero-note-label">{recommendedMove.label}</div>
|
|
141
|
+
<div className="hero-note-title">{recommendedMove.title}</div>
|
|
142
|
+
<div className="hero-note-copy">{recommendedMove.copy}</div>
|
|
112
143
|
</div>
|
|
113
144
|
<SurfaceJumpLinks surface="proof" variant="compact" title="Proof handoffs" />
|
|
114
145
|
</div>
|
|
@@ -125,6 +156,28 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
125
156
|
<MetricCard label="Open review" value={dashboard.summary.reviewOpen} sublabel={`${dashboard.summary.deferred} deferred • ${dashboard.summary.verified} verified`} tone={dashboard.summary.reviewOpen > 0 ? 'yellow' : 'green'} icon="◇" />
|
|
126
157
|
</div>
|
|
127
158
|
|
|
159
|
+
<SectionFrame
|
|
160
|
+
eyebrow="Meaning"
|
|
161
|
+
title="What these proof states mean operationally"
|
|
162
|
+
description="Proof is only useful if the operator can tell what each state should trigger next. Measuring, regressed, and verified are not cosmetic labels — they change what HelixEvo should do next."
|
|
163
|
+
tone="blue"
|
|
164
|
+
>
|
|
165
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))', gap: 12 }}>
|
|
166
|
+
<div className="guide-dimension-card" style={{ borderLeftColor: 'var(--blue)' }}>
|
|
167
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--text)' }}>Measuring</div>
|
|
168
|
+
<div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 8, lineHeight: 1.7 }}>Live evidence exists, but HelixEvo should wait for more downstream signal before claiming success.</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div className="guide-dimension-card" style={{ borderLeftColor: 'var(--yellow)' }}>
|
|
171
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--text)' }}>Regressed</div>
|
|
172
|
+
<div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 8, lineHeight: 1.7 }}>A move created explicit negative evidence. Inspect the linked route or structural execution before retrying the same strategy.</div>
|
|
173
|
+
</div>
|
|
174
|
+
<div className="guide-dimension-card" style={{ borderLeftColor: 'var(--green)' }}>
|
|
175
|
+
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--text)' }}>Verified</div>
|
|
176
|
+
<div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 8, lineHeight: 1.7 }}>An operator has reviewed the record explicitly. Verification increases trust in the review state, not necessarily in causal certainty.</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
</SectionFrame>
|
|
180
|
+
|
|
128
181
|
<SectionFrame
|
|
129
182
|
eyebrow="Coverage"
|
|
130
183
|
title="Proof now spans the live brain loop"
|