helixevo 0.8.1 → 0.10.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 CHANGED
@@ -4,6 +4,28 @@ All notable changes to HelixEvo are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.10.0] - 2026-03-26
8
+
9
+ ### Added
10
+ - New `helixevo verify-brain` command for contract-backed brain verification across deterministic isolated scenarios plus bounded live smoke checks
11
+ - New persisted theory-conformance artifact family under `~/.helix/theory-conformance/`, including the latest structured result, human-readable reports, and per-run scenario outputs
12
+
13
+ ### Changed
14
+ - Overview and Proof now surface the latest theory-conformance verdict, scenario totals, and next-action guidance so brain verification is visible in the operator cockpit
15
+ - Commands, runtime execution allowlists, README, and package metadata now describe automatic theory-conformance verification as a first-class product capability
16
+ - Release-grade verification can now rerun bounded theory conformance through `verify-brain --release`, while still truthfully exposing live proof debt and evidence immaturity instead of overstating full theory closure
17
+
18
+ ## [0.9.0] - 2026-03-25
19
+
20
+ ### Added
21
+ - Proof steering summaries with explicit evidence tiers — `trusted`, `caution`, `bounded`, and `candidate` — so proved outcomes can be surfaced as route-level and semantic-control influence instead of remaining only a descriptive ledger
22
+ - Candidate-vs-priority proof queue separation so dry-run and insufficient-evidence records stay visible without crowding higher-leverage review
23
+
24
+ ### Changed
25
+ - Pressure route recommendations now consume bounded proof steering after semantic influence, allowing weak evidence to stay bounded, cautionary evidence to bias toward review, and verified/effective evidence to strengthen trust modestly
26
+ - Overview, Proof, and Co-Evolution now expose prove-to-steer closure directly, including trusted/caution lane visibility and proof-aware route rationale
27
+ - `status`, `proof --status --verbose`, and the public README now describe Proof as a bounded steering input into the next governed loop rather than only a post-action review surface
28
+
7
29
  ## [0.8.1] - 2026-03-25
8
30
 
9
31
  ### Changed
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # HelixEvo
2
2
 
3
- Co-evolving skill and project brain for AI agents. HelixEvo captures failures, traces activations, models pressure, routes governed responses, promotes cross-project transfer, reviews structural topology changes, safely executes accepted topology transitions with rollback, lets approved ontology concepts become active semantic consumers inside the live control loop, and now exposes a first-class proof layer for bounded outcome attribution across the brain loop.
3
+ Co-evolving skill and project brain for AI agents. HelixEvo captures failures, traces activations, models pressure, routes governed responses, promotes cross-project transfer, reviews structural topology changes, safely executes accepted topology transitions with rollback, lets approved ontology concepts become active semantic consumers inside the live control loop, turns Proof into a bounded steering input for future control, and now adds automatic theory-conformance verification through contract-backed scenarios plus bounded live smoke checks.
4
4
 
5
5
  ## How it works
6
6
 
@@ -87,7 +87,8 @@ helixevo dashboard
87
87
  |---------|-------------|
88
88
  | `helixevo watch` | Always-on learning: auto-capture + auto-evolve |
89
89
  | `helixevo metrics` | Correction rates, skill trends, evolution impact |
90
- | `helixevo proof` | Outcome attribution and proof review across interventions, transfer, topology, ontology, and evolution |
90
+ | `helixevo proof` | Outcome attribution, proof review, and steering summaries across interventions, transfer, topology, ontology, and evolution |
91
+ | `helixevo verify-brain` | Automatic theory-conformance runner across deterministic scenarios plus bounded live smoke checks |
91
92
  | `helixevo health` | Network health: cohesion, coverage, balance, transfer |
92
93
  | `helixevo init` | Import existing skills + generate skill tests |
93
94
  | `helixevo capture <session>` | Extract failures from a session file |
@@ -130,6 +131,8 @@ helixevo topology --rollback <id> # Roll back an applied topology plan
130
131
  helixevo proof --status # Review proof state across the live loop
131
132
  helixevo proof --review <id> --decision verify
132
133
  # Verify a proof record after operator review
134
+ helixevo verify-brain --verbose # Run the contract-backed brain verification workflow
135
+ helixevo verify-brain --release # Run stricter release-grade conformance handling
133
136
  ```
134
137
 
135
138
  ### Research options
@@ -165,6 +168,10 @@ All data is stored in `~/.helix/`:
165
168
  ├── topology-artifacts.jsonl # Evidence artifacts for reviewed structural execution
166
169
  ├── proof-reviews.jsonl # Operator verify/defer/contest ledger for derived proof records
167
170
  ├── evolution-artifacts.jsonl # Evolution + ontology-review evidence artifacts
171
+ ├── theory-conformance/
172
+ │ ├── latest.json # Latest contract-backed brain verification result
173
+ │ ├── reports/ # Human-readable theory-conformance reports
174
+ │ └── runs/ # Per-run scenario artifacts and structured outputs
168
175
  ├── ontology/
169
176
  │ ├── kernel.json # Materialized ontology kernel snapshot
170
177
  │ ├── extensions.json # Approved ontology extensions
@@ -199,10 +206,10 @@ helixevo dashboard --port 3900
199
206
  **Tabs:**
200
207
  - **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
201
208
  - **Skill Network** — Interactive graph, premium inspector, co-evolution routing signals, and topology review/execution handoff links
202
- - **Co-Evolution** — Operator cockpit for routed pressure response, governance mode visibility, promotion queues, transfer evidence, semantic route influence, and topology handoff
209
+ - **Co-Evolution** — Operator cockpit for routed pressure response, governance mode visibility, promotion queues, transfer evidence, semantic route influence, proof-aware route rationale, and topology handoff
203
210
  - **Ontology** — Semantic control surface for kernel visibility, frontier concept review, approved ontology extensions, adoption coverage, deprecation risk, and native ontology change events
204
211
  - **Topology** — Governance steering plus a persistent operator pipeline for review → prepare → apply → rollback across merge / split / promote / rewire / consolidate candidates
205
- - **Proof** — Outcome-attribution and proof-review cockpit for bounded effectiveness review across interventions, transfer, topology execution, semantic adoption, and evolution impact
212
+ - **Proof** — Outcome-attribution, review, and proof-steering cockpit for bounded effectiveness across interventions, transfer, topology execution, semantic adoption, and evolution impact
206
213
  - **Projects** — Project intake studio, live project analysis, gap routing, per-project pressure hotspots, and promotion feeders
207
214
  - **Evolution** — Timeline of evolution runs with judge scores, artifact provenance, and activation-aware context
208
215
  - **Research** — Knowledge buffer plus a live “why research now” handoff from current pressure, governed routing, and recurring gaps
@@ -249,7 +256,7 @@ Failures → Cluster → Propose → Replay → Multi-Judge → Regression → C
249
256
  - **Governance steering** lets the operator pin or release the active adaptation mode rather than relying only on derived routing.
250
257
  - **Topology review** persists merge / split / promote / rewire / consolidate candidates so manual review is a real workflow.
251
258
  - **Reviewed topology execution** turns accepted safe candidates into prepared plans, snapshot-backed applies, and rollbackable structural transitions.
252
- - **Proof control** turns bounded outcome attribution into an explicit operator layer where interventions, transfer, topology execution, semantic adoption, and evolution impact can be verified, deferred, or contested.
259
+ - **Proof control** turns bounded outcome attribution into an explicit operator layer where interventions, transfer, topology execution, semantic adoption, and evolution impact can be verified, deferred, or contested, then fed back into future control through bounded proof steering.
253
260
  - **Evolution artifacts** preserve proposal-level evidence so the dashboard can show what changed, why, and with what provenance.
254
261
 
255
262
  **Three-layer hierarchy:**
@@ -18,6 +18,7 @@ const ALLOWED_COMMANDS: Record<string, { cmd: string; args: string[]; timeout: n
18
18
  'graph-optimize': { cmd: 'helixevo', args: ['graph', '--optimize', '--verbose'], timeout: 300000 },
19
19
  'research': { cmd: 'helixevo', args: ['research', '--verbose'], timeout: 300000 },
20
20
  'research-dry': { cmd: 'helixevo', args: ['research', '--dry-run', '--verbose'], timeout: 300000 },
21
+ 'verify-brain': { cmd: 'helixevo', args: ['verify-brain', '--verbose'], timeout: 600000 },
21
22
  'report': { cmd: 'helixevo', args: ['report', '--days', '7'], timeout: 30000 },
22
23
  }
23
24
 
@@ -78,6 +78,13 @@ type Summary = {
78
78
  reasons: string[]
79
79
  semanticInfluence?: 'none' | 'explanatory' | 'weighted'
80
80
  semanticConceptIds?: string[]
81
+ proofInfluence?: 'none' | 'explanatory' | 'weighted'
82
+ proofTier?: 'trusted' | 'caution' | 'bounded' | 'candidate'
83
+ proofSummary?: string
84
+ proofReasons?: string[]
85
+ proofLaneKeys?: string[]
86
+ proofClosureState?: 'needs-evidence' | 'needs-review' | 'stalled' | 'settled' | 'trusted-with-debt'
87
+ proofDebtSummary?: string
81
88
  }
82
89
  semanticConceptIds?: string[]
83
90
  }[]
@@ -103,6 +110,13 @@ type Summary = {
103
110
  reasons: string[]
104
111
  semanticInfluence?: 'none' | 'explanatory' | 'weighted'
105
112
  semanticConceptIds?: string[]
113
+ proofInfluence?: 'none' | 'explanatory' | 'weighted'
114
+ proofTier?: 'trusted' | 'caution' | 'bounded' | 'candidate'
115
+ proofSummary?: string
116
+ proofReasons?: string[]
117
+ proofLaneKeys?: string[]
118
+ proofClosureState?: 'needs-evidence' | 'needs-review' | 'stalled' | 'settled' | 'trusted-with-debt'
119
+ proofDebtSummary?: string
106
120
  }
107
121
  semanticConceptIds?: string[]
108
122
  }[]
@@ -153,6 +167,23 @@ function toneForRoute(route: PressureInterventionType) {
153
167
  return 'gray'
154
168
  }
155
169
 
170
+ function toneForProofTier(tier: 'trusted' | 'caution' | 'bounded' | 'candidate' | undefined) {
171
+ if (tier === 'trusted') return 'green'
172
+ if (tier === 'caution') return 'yellow'
173
+ if (tier === 'bounded') return 'blue'
174
+ if (tier === 'candidate') return 'gray'
175
+ return 'gray'
176
+ }
177
+
178
+ function toneForProofClosureState(state: 'needs-evidence' | 'needs-review' | 'stalled' | 'settled' | 'trusted-with-debt' | undefined) {
179
+ if (state === 'trusted-with-debt') return 'yellow'
180
+ if (state === 'stalled') return 'yellow'
181
+ if (state === 'needs-review') return 'blue'
182
+ if (state === 'needs-evidence') return 'gray'
183
+ if (state === 'settled') return 'green'
184
+ return 'gray'
185
+ }
186
+
156
187
  function toneForMode(mode: Summary['governance']['activeMode']): 'blue' | 'green' | 'purple' | 'yellow' | 'neutral' {
157
188
  if (mode === 'transfer-focused') return 'purple'
158
189
  if (mode === 'project-critical') return 'yellow'
@@ -311,7 +342,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
311
342
  <MetricCard label="Prepared topology" value={summary.topologyExecution.prepared} sublabel={`${summary.topologyExecution.applied} applied • ${summary.topologyExecution.rolledBack} rolled back`} tone={summary.topologyExecution.prepared > 0 ? 'blue' : summary.topologyExecution.applied > 0 ? 'green' : 'neutral'} icon="↑" />
312
343
  <MetricCard label="Active semantics" value={ontology.ontologyLoop.adoption.activeConcepts} sublabel={`${ontology.ontologyLoop.adoption.totalBindings} bindings • ${ontology.ontologyLoop.adoption.routesInfluenced} influenced routes`} tone={ontology.ontologyLoop.adoption.activeConcepts > 0 ? 'green' : 'neutral'} icon="◎" />
313
344
  <MetricCard label="Recorded interventions" value={summary.pressureInterventions.total} sublabel={`${summary.pressureInterventions.completed} completed • ${summary.pressureInterventions.dryRun} dry-run`} tone="blue" icon="↺" />
314
- <MetricCard label="Proof review" value={proof.summary.reviewOpen} sublabel={`${proof.summary.effective} effective • ${proof.summary.regressed} regressed`} tone={proof.summary.reviewOpen > 0 ? 'yellow' : proof.summary.effective > 0 ? 'green' : 'neutral'} icon="◇" />
345
+ <MetricCard label="Proof steering" value={proof.steering.priorityReview} sublabel={`${proof.summary.needsEvidence} need evidence • ${proof.steering.trustedWithDebtLanes} trusted with debt`} tone={proof.summary.stalled > 0 || proof.steering.trustedWithDebtLanes > 0 ? 'yellow' : proof.steering.cautionLanes > 0 ? 'yellow' : proof.steering.trustedLanes > 0 ? 'green' : proof.summary.reviewOpen > 0 ? 'blue' : 'neutral'} icon="◇" />
315
346
  <MetricCard label="Realized transfers" value={summary.recentTransfers.filter((event) => event.status === 'realized').length} sublabel={`${summary.pressureMotifs.addressed} motifs now addressed`} tone="green" icon="↑" />
316
347
  </div>
317
348
 
@@ -402,6 +433,8 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
402
433
  <span className={`badge badge-${toneForLifecycle(motif.lifecycle)}`}>{motif.lifecycle}</span>
403
434
  <span className="badge badge-purple">recommend {motif.suggestedRoute.route}</span>
404
435
  <span className="badge badge-gray">confidence {(motif.suggestedRoute.confidence * 100).toFixed(0)}%</span>
436
+ {motif.suggestedRoute.proofTier ? <span className={`badge badge-${toneForProofTier(motif.suggestedRoute.proofTier)}`}>proof {motif.suggestedRoute.proofTier}</span> : null}
437
+ {motif.suggestedRoute.proofClosureState ? <span className={`badge badge-${toneForProofClosureState(motif.suggestedRoute.proofClosureState)}`}>{motif.suggestedRoute.proofClosureState}</span> : null}
405
438
  {motif.suggestedRoute.semanticInfluence && motif.suggestedRoute.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {motif.suggestedRoute.semanticInfluence}</span> : null}
406
439
  {(motif.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${motif.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
407
440
  {motif.projectIds.slice(0, 3).map((projectId) => <span key={`${motif.id}-${projectId}`} className="badge badge-gray">{projectId}</span>)}
@@ -410,6 +443,8 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
410
443
  {motif.suggestedRoute.reasons.slice(0, 2).map((reason, index) => (
411
444
  <div key={`${motif.id}-reason-${index}`} className="signal-text">• {reason}</div>
412
445
  ))}
446
+ {motif.suggestedRoute.proofSummary ? <div className="signal-text">→ {motif.suggestedRoute.proofSummary}</div> : null}
447
+ {motif.suggestedRoute.proofDebtSummary ? <div className="signal-text">⇢ {motif.suggestedRoute.proofDebtSummary}</div> : null}
413
448
  </div>
414
449
  </div>
415
450
  </div>
@@ -551,6 +586,8 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
551
586
  {signal.projectId ? <span className="badge badge-gray">{signal.projectId}</span> : null}
552
587
  {signal.routeRecommendation ? <span className={`badge badge-${toneForRoute(signal.routeRecommendation.route)}`}>recommend {signal.routeRecommendation.route}</span> : null}
553
588
  {signal.routeRecommendation ? <span className="badge badge-gray">{signal.routeRecommendation.scope}</span> : null}
589
+ {signal.routeRecommendation?.proofTier ? <span className={`badge badge-${toneForProofTier(signal.routeRecommendation.proofTier)}`}>proof {signal.routeRecommendation.proofTier}</span> : null}
590
+ {signal.routeRecommendation?.proofClosureState ? <span className={`badge badge-${toneForProofClosureState(signal.routeRecommendation.proofClosureState)}`}>{signal.routeRecommendation.proofClosureState}</span> : null}
554
591
  {signal.routeRecommendation?.semanticInfluence && signal.routeRecommendation.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {signal.routeRecommendation.semanticInfluence}</span> : null}
555
592
  {(signal.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${signal.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
556
593
  {signal.interventionTypes.map((type) => <span key={`${signal.id}-${type}`} className="badge badge-gray">{type}</span>)}
@@ -560,6 +597,8 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
560
597
  {signal.routeRecommendation.reasons.slice(0, 2).map((reason, index) => (
561
598
  <div key={`${signal.id}-reason-${index}`} className="signal-text">• {reason}</div>
562
599
  ))}
600
+ {signal.routeRecommendation.proofSummary ? <div className="signal-text">→ {signal.routeRecommendation.proofSummary}</div> : null}
601
+ {signal.routeRecommendation.proofDebtSummary ? <div className="signal-text">⇢ {signal.routeRecommendation.proofDebtSummary}</div> : null}
563
602
  </div>
564
603
  ) : null}
565
604
  </div>
@@ -247,6 +247,28 @@ const COMMANDS: CommandInfo[] = [
247
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)' },
248
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.',
249
249
  },
250
+ {
251
+ name: 'verify-brain',
252
+ description: 'Run the contract-backed theory-conformance workflow. This command executes deterministic isolated scenarios plus bounded live smoke checks, emits a structured verdict, saves the latest report, and turns the brain-theory question into an operational product capability instead of a manual milestone-only argument.',
253
+ usage: 'helixevo verify-brain [options]',
254
+ examples: [
255
+ { cmd: 'helixevo verify-brain', desc: 'Run the default isolated + live theory-conformance suite' },
256
+ { cmd: 'helixevo verify-brain --isolated-only --verbose', desc: 'Run only deterministic isolated scenarios with detailed output' },
257
+ { cmd: 'helixevo verify-brain --live-only', desc: 'Run only the bounded live smoke checks' },
258
+ { cmd: 'helixevo verify-brain --release --json', desc: 'Run release-grade verification and emit structured JSON' },
259
+ ],
260
+ options: [
261
+ { flag: '--release', desc: 'Use stricter release-grade failure handling' },
262
+ { flag: '--live-only', desc: 'Run only the bounded live smoke suite' },
263
+ { flag: '--isolated-only', desc: 'Run only the deterministic isolated suite' },
264
+ { flag: '--json', desc: 'Print the structured result as JSON' },
265
+ { flag: '--verbose', desc: 'Show scenario-by-scenario and claim-by-claim details' },
266
+ ],
267
+ category: 'analysis',
268
+ needsLLM: true,
269
+ runnable: { command: 'verify-brain', label: 'Verify Brain', icon: 'M12 3l7 4v5c0 5-3.5 9-7 10-3.5-1-7-5-7-10V7l7-4zm0 5v5m0 4h.01', color: 'var(--purple)' },
270
+ note: 'This is the new bridge between theory and product. Use it when you need a contract-backed answer to whether the current HelixEvo brain still behaves according to the bounded theory.' ,
271
+ },
250
272
  {
251
273
  name: 'status',
252
274
  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.',
@@ -6,6 +6,7 @@ import { PageHero } from '@/components/page-hero'
6
6
  import { MetricCard } from '@/components/metric-card'
7
7
  import { SectionFrame } from '@/components/section-frame'
8
8
  import { OperatorLoopTrail } from '@/components/operator-loop-trail'
9
+ import { loadLatestTheoryConformanceResult } from '@/lib/theory'
9
10
 
10
11
  export const dynamic = 'force-dynamic'
11
12
 
@@ -28,9 +29,50 @@ function providerTone(status: 'healthy' | 'degraded' | 'unavailable' | 'unknown'
28
29
  return 'neutral' as const
29
30
  }
30
31
 
32
+ function conformanceTone(verdict: 'pass' | 'bounded-pass' | 'fail' | 'inconclusive') {
33
+ if (verdict === 'pass') return 'green' as const
34
+ if (verdict === 'bounded-pass') return 'yellow' as const
35
+ if (verdict === 'fail') return 'red' as const
36
+ return 'neutral' as const
37
+ }
38
+
39
+ function conformanceHeadline(result: ReturnType<typeof loadLatestTheoryConformanceResult>) {
40
+ if (!result) {
41
+ return {
42
+ title: 'Run the first automated verification pass',
43
+ description: 'No theory-conformance run has been recorded yet. Run helixevo verify-brain to generate the first contract-backed verdict.',
44
+ }
45
+ }
46
+
47
+ const failing = result.scenarios.find((scenario) => scenario.verdict === 'fail')
48
+ if (failing) {
49
+ return {
50
+ title: `${failing.scenarioId} needs attention`,
51
+ description: failing.summary,
52
+ }
53
+ }
54
+
55
+ const bounded = result.scenarios.find((scenario) => scenario.verdict === 'bounded-pass' || scenario.verdict === 'inconclusive')
56
+ if (bounded) {
57
+ return {
58
+ title: `${bounded.scenarioId} stayed bounded`,
59
+ description: bounded.summary,
60
+ }
61
+ }
62
+
63
+ return {
64
+ title: 'The latest executed theory checks passed',
65
+ description: result.summary,
66
+ }
67
+ }
68
+
31
69
  function getPriorityActions(params: {
32
70
  unresolved: number
33
71
  proofOpen: number
72
+ proofCaution: number
73
+ proofNeedsEvidence: number
74
+ proofStalled: number
75
+ proofTrustedWithDebt: number
34
76
  topologyOpen: number
35
77
  optimizeStatus: 'idle' | 'healthy' | 'partial' | 'failed'
36
78
  optimizeNextStep?: string
@@ -58,6 +100,33 @@ function getPriorityActions(params: {
58
100
  })
59
101
  }
60
102
 
103
+ if (params.proofStalled > 0) {
104
+ actions.push({
105
+ href: '/proof',
106
+ title: 'Resolve stalled proof debt',
107
+ description: `${params.proofStalled} proof record${params.proofStalled === 1 ? '' : 's'} have aged without stronger evidence or review and now need explicit revisit.`,
108
+ tone: 'yellow',
109
+ })
110
+ }
111
+
112
+ if (params.proofCaution > 0) {
113
+ actions.push({
114
+ href: '/proof',
115
+ title: 'Inspect cautionary proof steering',
116
+ description: `${params.proofCaution} proof lane${params.proofCaution === 1 ? '' : 's'} currently reduce trust or increase review bias for the next control step.`,
117
+ tone: 'yellow',
118
+ })
119
+ }
120
+
121
+ if (params.proofTrustedWithDebt > 0) {
122
+ actions.push({
123
+ href: '/proof',
124
+ title: 'Review trusted lanes with debt',
125
+ description: `${params.proofTrustedWithDebt} lane${params.proofTrustedWithDebt === 1 ? '' : 's'} look trusted but still carry unresolved closure debt behind the summary.`,
126
+ tone: 'yellow',
127
+ })
128
+ }
129
+
61
130
  if (params.proofOpen > 0) {
62
131
  actions.push({
63
132
  href: '/proof',
@@ -67,6 +136,15 @@ function getPriorityActions(params: {
67
136
  })
68
137
  }
69
138
 
139
+ if (params.proofNeedsEvidence > 0) {
140
+ actions.push({
141
+ href: '/proof',
142
+ title: 'Harvest missing proof evidence',
143
+ description: `${params.proofNeedsEvidence} proof record${params.proofNeedsEvidence === 1 ? '' : 's'} still need stronger downstream evidence before they should steer more strongly.`,
144
+ tone: 'blue',
145
+ })
146
+ }
147
+
70
148
  if (params.topologyOpen > 0) {
71
149
  actions.push({
72
150
  href: '/topology',
@@ -104,6 +182,7 @@ export default function Overview() {
104
182
  const topologyControl = loadTopologyDashboardSummary()
105
183
  const llmRuntime = loadLlmRuntimeState()
106
184
  const proof = loadProofDashboardSummary()
185
+ const conformance = loadLatestTheoryConformanceResult()
107
186
  const frontier = loadFrontier()
108
187
  const history = loadHistory()
109
188
  const graph = loadGraph()
@@ -134,6 +213,10 @@ export default function Overview() {
134
213
  const priorityActions = getPriorityActions({
135
214
  unresolved: summary.failures.unresolved,
136
215
  proofOpen: proof.summary.reviewOpen,
216
+ proofCaution: proof.steering.cautionLanes,
217
+ proofNeedsEvidence: proof.summary.needsEvidence,
218
+ proofStalled: proof.summary.stalled,
219
+ proofTrustedWithDebt: proof.steering.trustedWithDebtLanes,
137
220
  topologyOpen: topologyControl.summary.open,
138
221
  optimizeStatus: topologyControl.optimizeStatus.status,
139
222
  optimizeNextStep: topologyControl.optimizeStatus.nextStep,
@@ -176,7 +259,7 @@ export default function Overview() {
176
259
 
177
260
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
178
261
  <MetricCard label="Unresolved corrections" value={summary.failures.unresolved} sublabel={`out of ${summary.failures.total} captured failures`} tone={summary.failures.unresolved > 0 ? 'yellow' : 'green'} href={summary.failures.unresolved > 0 ? '#attention' : '/evolution'} icon="!" />
179
- <MetricCard label="Proof review" value={proof.summary.reviewOpen} sublabel={`${proof.summary.effective} effective • ${proof.summary.regressed} regressed`} tone={proof.summary.reviewOpen > 0 ? 'yellow' : proof.summary.effective > 0 ? 'green' : 'neutral'} href="/proof" icon="◇" />
262
+ <MetricCard label="Proof review" value={proof.summary.reviewOpen} sublabel={`${proof.summary.needsEvidence} need evidence • ${proof.steering.trustedWithDebtLanes} trusted with debt`} tone={proof.summary.stalled > 0 || proof.steering.trustedWithDebtLanes > 0 ? 'yellow' : proof.summary.reviewOpen > 0 ? 'blue' : proof.steering.trustedLanes > 0 ? 'green' : proof.steering.cautionLanes > 0 ? 'yellow' : 'neutral'} href="/proof" icon="◇" />
180
263
  <MetricCard
181
264
  label="Open pressure"
182
265
  value={ontology.pressureLifecycle.open}
@@ -230,6 +313,37 @@ export default function Overview() {
230
313
  </div>
231
314
  </SectionFrame>
232
315
 
316
+ <SectionFrame
317
+ eyebrow="Automated brain verification"
318
+ title="Latest theory-conformance result"
319
+ description="HelixEvo can now record a contract-backed brain-verification run in parallel with the live operator cockpit. This is the latest stored verdict."
320
+ tone="blue"
321
+ >
322
+ {conformance ? (
323
+ <div className="grid-2" style={{ gap: 16 }}>
324
+ <div className="hero-note-card">
325
+ <div className="hero-note-label">{conformance.verdict}</div>
326
+ <div className="hero-note-title">{conformanceHeadline(conformance).title}</div>
327
+ <div className="hero-note-copy">{conformanceHeadline(conformance).description}</div>
328
+ {conformance.reportPath ? (
329
+ <div className="signal-text" style={{ marginTop: 10 }}>report · {conformance.reportPath}</div>
330
+ ) : null}
331
+ </div>
332
+ <div style={{ display: 'grid', gap: 12 }}>
333
+ <MetricCard label="Verdict" value={conformance.verdict} sublabel={`${conformance.totals.passed} pass • ${conformance.totals.boundedPass} bounded • ${conformance.totals.failed} fail • ${conformance.totals.inconclusive} inconclusive`} tone={conformanceTone(conformance.verdict)} href="/proof" icon="◎" />
334
+ <MetricCard label="Scenarios" value={conformance.totals.scenarios} sublabel={`${conformance.totals.assertions} assertions in the latest run`} tone="blue" href="/proof" icon="◇" />
335
+ <MetricCard label="Run mode" value={conformance.mode} sublabel={conformance.releaseMode ? 'release-grade handling enabled' : 'standard operator run'} tone="purple" href="/commands" icon="⇄" />
336
+ <div className="signal-text">{conformance.nextActions[0] ?? 'Open Proof or run helixevo verify-brain --verbose for the full latest report.'}</div>
337
+ </div>
338
+ </div>
339
+ ) : (
340
+ <div className="empty-state" style={{ padding: 24 }}>
341
+ <div className="empty-state-title">No theory-conformance run yet</div>
342
+ <div className="empty-state-desc">Run <code>helixevo verify-brain --verbose</code> to generate the first contract-backed brain-verification report.</div>
343
+ </div>
344
+ )}
345
+ </SectionFrame>
346
+
233
347
  {unresolved.length > 0 ? (
234
348
  <SectionFrame
235
349
  eyebrow="Attention"
@@ -328,6 +442,35 @@ export default function Overview() {
328
442
  </SectionFrame>
329
443
  ) : null}
330
444
 
445
+ <SectionFrame
446
+ eyebrow="Proof steering"
447
+ title="What proved outcomes are changing now"
448
+ description="Proof now separates trusted, cautionary, bounded, and candidate evidence so the next governed loop can steer more honestly instead of treating every proof record as equally strong."
449
+ tone="blue"
450
+ actions={<Link href="/proof" className="badge badge-gray">Open proof control</Link>}
451
+ >
452
+ <div className="grid-2" style={{ gap: 16 }}>
453
+ <div className="summary-list">
454
+ {proof.steering.routeLanes.slice(0, 3).map((lane) => (
455
+ <div key={lane.laneKey} className="summary-row">
456
+ <div className="summary-row-main">
457
+ <div className="summary-row-title">{lane.route ? lane.route.replace(/-/g, ' ') : lane.conceptId ?? lane.laneKey}</div>
458
+ <div className="summary-row-meta">{lane.summary}</div>
459
+ {lane.debtSummary ? <div className="summary-row-meta" style={{ marginTop: 6 }}>{lane.debtSummary}</div> : null}
460
+ </div>
461
+ <span className={`hero-chip hero-chip-${lane.evidenceTier === 'trusted' ? 'green' : lane.evidenceTier === 'caution' ? 'yellow' : lane.evidenceTier === 'bounded' ? 'blue' : 'neutral'}`}>{lane.evidenceTier}</span>
462
+ </div>
463
+ ))}
464
+ {proof.steering.routeLanes.length === 0 ? <div className="signal-text">No route-level proof steering yet.</div> : null}
465
+ </div>
466
+ <div style={{ display: 'grid', gap: 12 }}>
467
+ <MetricCard label="Trusted lanes" value={proof.steering.trustedLanes} sublabel={`${proof.summary.verified} verified records reinforce future trust`} tone={proof.steering.trustedLanes > 0 ? 'green' : 'neutral'} href="/proof" icon="✓" />
468
+ <MetricCard label="Trusted with debt" value={proof.steering.trustedWithDebtLanes} sublabel={`${proof.summary.needsEvidence} need evidence • ${proof.summary.stalled} stalled`} tone={proof.steering.trustedWithDebtLanes > 0 || proof.summary.stalled > 0 ? 'yellow' : 'neutral'} href="/proof" icon="!" />
469
+ <div className="signal-text">Proof can now look strong at the lane level while still carrying unresolved closure debt underneath. Overview keeps that debt visible instead of hiding it behind a single trusted badge.</div>
470
+ </div>
471
+ </div>
472
+ </SectionFrame>
473
+
331
474
  <SectionFrame
332
475
  eyebrow="Brain summary"
333
476
  title="Semantic backbone"