helixevo 0.9.0 → 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,17 @@ 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
+
7
18
  ## [0.9.0] - 2026-03-25
8
19
 
9
20
  ### Added
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 turns Proof into a bounded steering input for future control instead of a descriptive layer alone.
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
 
@@ -88,6 +88,7 @@ helixevo dashboard
88
88
  | `helixevo watch` | Always-on learning: auto-capture + auto-evolve |
89
89
  | `helixevo metrics` | Correction rates, skill trends, evolution impact |
90
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
@@ -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
 
@@ -83,6 +83,8 @@ type Summary = {
83
83
  proofSummary?: string
84
84
  proofReasons?: string[]
85
85
  proofLaneKeys?: string[]
86
+ proofClosureState?: 'needs-evidence' | 'needs-review' | 'stalled' | 'settled' | 'trusted-with-debt'
87
+ proofDebtSummary?: string
86
88
  }
87
89
  semanticConceptIds?: string[]
88
90
  }[]
@@ -113,6 +115,8 @@ type Summary = {
113
115
  proofSummary?: string
114
116
  proofReasons?: string[]
115
117
  proofLaneKeys?: string[]
118
+ proofClosureState?: 'needs-evidence' | 'needs-review' | 'stalled' | 'settled' | 'trusted-with-debt'
119
+ proofDebtSummary?: string
116
120
  }
117
121
  semanticConceptIds?: string[]
118
122
  }[]
@@ -171,6 +175,15 @@ function toneForProofTier(tier: 'trusted' | 'caution' | 'bounded' | 'candidate'
171
175
  return 'gray'
172
176
  }
173
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
+
174
187
  function toneForMode(mode: Summary['governance']['activeMode']): 'blue' | 'green' | 'purple' | 'yellow' | 'neutral' {
175
188
  if (mode === 'transfer-focused') return 'purple'
176
189
  if (mode === 'project-critical') return 'yellow'
@@ -329,7 +342,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
329
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="↑" />
330
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="◎" />
331
344
  <MetricCard label="Recorded interventions" value={summary.pressureInterventions.total} sublabel={`${summary.pressureInterventions.completed} completed • ${summary.pressureInterventions.dryRun} dry-run`} tone="blue" icon="↺" />
332
- <MetricCard label="Proof steering" value={proof.steering.priorityReview} sublabel={`${proof.steering.trustedLanes} trusted • ${proof.steering.cautionLanes} caution`} tone={proof.steering.cautionLanes > 0 ? 'yellow' : proof.steering.trustedLanes > 0 ? 'green' : proof.summary.reviewOpen > 0 ? 'blue' : '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="◇" />
333
346
  <MetricCard label="Realized transfers" value={summary.recentTransfers.filter((event) => event.status === 'realized').length} sublabel={`${summary.pressureMotifs.addressed} motifs now addressed`} tone="green" icon="↑" />
334
347
  </div>
335
348
 
@@ -421,6 +434,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
421
434
  <span className="badge badge-purple">recommend {motif.suggestedRoute.route}</span>
422
435
  <span className="badge badge-gray">confidence {(motif.suggestedRoute.confidence * 100).toFixed(0)}%</span>
423
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}
424
438
  {motif.suggestedRoute.semanticInfluence && motif.suggestedRoute.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {motif.suggestedRoute.semanticInfluence}</span> : null}
425
439
  {(motif.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${motif.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
426
440
  {motif.projectIds.slice(0, 3).map((projectId) => <span key={`${motif.id}-${projectId}`} className="badge badge-gray">{projectId}</span>)}
@@ -430,6 +444,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
430
444
  <div key={`${motif.id}-reason-${index}`} className="signal-text">• {reason}</div>
431
445
  ))}
432
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}
433
448
  </div>
434
449
  </div>
435
450
  </div>
@@ -572,6 +587,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
572
587
  {signal.routeRecommendation ? <span className={`badge badge-${toneForRoute(signal.routeRecommendation.route)}`}>recommend {signal.routeRecommendation.route}</span> : null}
573
588
  {signal.routeRecommendation ? <span className="badge badge-gray">{signal.routeRecommendation.scope}</span> : null}
574
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}
575
591
  {signal.routeRecommendation?.semanticInfluence && signal.routeRecommendation.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {signal.routeRecommendation.semanticInfluence}</span> : null}
576
592
  {(signal.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${signal.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
577
593
  {signal.interventionTypes.map((type) => <span key={`${signal.id}-${type}`} className="badge badge-gray">{type}</span>)}
@@ -582,6 +598,7 @@ export default function CoEvolutionClient({ summary, ontology, proof }: Props) {
582
598
  <div key={`${signal.id}-reason-${index}`} className="signal-text">• {reason}</div>
583
599
  ))}
584
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}
585
602
  </div>
586
603
  ) : null}
587
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,10 +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
34
72
  proofCaution: number
73
+ proofNeedsEvidence: number
74
+ proofStalled: number
75
+ proofTrustedWithDebt: number
35
76
  topologyOpen: number
36
77
  optimizeStatus: 'idle' | 'healthy' | 'partial' | 'failed'
37
78
  optimizeNextStep?: string
@@ -59,6 +100,15 @@ function getPriorityActions(params: {
59
100
  })
60
101
  }
61
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
+
62
112
  if (params.proofCaution > 0) {
63
113
  actions.push({
64
114
  href: '/proof',
@@ -68,6 +118,15 @@ function getPriorityActions(params: {
68
118
  })
69
119
  }
70
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
+
71
130
  if (params.proofOpen > 0) {
72
131
  actions.push({
73
132
  href: '/proof',
@@ -77,6 +136,15 @@ function getPriorityActions(params: {
77
136
  })
78
137
  }
79
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
+
80
148
  if (params.topologyOpen > 0) {
81
149
  actions.push({
82
150
  href: '/topology',
@@ -114,6 +182,7 @@ export default function Overview() {
114
182
  const topologyControl = loadTopologyDashboardSummary()
115
183
  const llmRuntime = loadLlmRuntimeState()
116
184
  const proof = loadProofDashboardSummary()
185
+ const conformance = loadLatestTheoryConformanceResult()
117
186
  const frontier = loadFrontier()
118
187
  const history = loadHistory()
119
188
  const graph = loadGraph()
@@ -145,6 +214,9 @@ export default function Overview() {
145
214
  unresolved: summary.failures.unresolved,
146
215
  proofOpen: proof.summary.reviewOpen,
147
216
  proofCaution: proof.steering.cautionLanes,
217
+ proofNeedsEvidence: proof.summary.needsEvidence,
218
+ proofStalled: proof.summary.stalled,
219
+ proofTrustedWithDebt: proof.steering.trustedWithDebtLanes,
148
220
  topologyOpen: topologyControl.summary.open,
149
221
  optimizeStatus: topologyControl.optimizeStatus.status,
150
222
  optimizeNextStep: topologyControl.optimizeStatus.nextStep,
@@ -187,7 +259,7 @@ export default function Overview() {
187
259
 
188
260
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
189
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="!" />
190
- <MetricCard label="Proof review" value={proof.summary.reviewOpen} sublabel={`${proof.steering.trustedLanes} trusted lanes • ${proof.steering.cautionLanes} caution`} tone={proof.summary.reviewOpen > 0 ? 'yellow' : proof.steering.trustedLanes > 0 ? 'green' : proof.steering.cautionLanes > 0 ? 'yellow' : '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="◇" />
191
263
  <MetricCard
192
264
  label="Open pressure"
193
265
  value={ontology.pressureLifecycle.open}
@@ -241,6 +313,37 @@ export default function Overview() {
241
313
  </div>
242
314
  </SectionFrame>
243
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
+
244
347
  {unresolved.length > 0 ? (
245
348
  <SectionFrame
246
349
  eyebrow="Attention"
@@ -353,6 +456,7 @@ export default function Overview() {
353
456
  <div className="summary-row-main">
354
457
  <div className="summary-row-title">{lane.route ? lane.route.replace(/-/g, ' ') : lane.conceptId ?? lane.laneKey}</div>
355
458
  <div className="summary-row-meta">{lane.summary}</div>
459
+ {lane.debtSummary ? <div className="summary-row-meta" style={{ marginTop: 6 }}>{lane.debtSummary}</div> : null}
356
460
  </div>
357
461
  <span className={`hero-chip hero-chip-${lane.evidenceTier === 'trusted' ? 'green' : lane.evidenceTier === 'caution' ? 'yellow' : lane.evidenceTier === 'bounded' ? 'blue' : 'neutral'}`}>{lane.evidenceTier}</span>
358
462
  </div>
@@ -361,8 +465,8 @@ export default function Overview() {
361
465
  </div>
362
466
  <div style={{ display: 'grid', gap: 12 }}>
363
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="✓" />
364
- <MetricCard label="Caution lanes" value={proof.steering.cautionLanes} sublabel={`${proof.summary.regressed} regressed • ${proof.summary.contested} contested`} tone={proof.steering.cautionLanes > 0 ? 'yellow' : 'neutral'} href="/proof" icon="!" />
365
- <div className="signal-text">Candidate evidence stays visible in Proof, but no longer dominates the highest-value steering surface.</div>
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>
366
470
  </div>
367
471
  </div>
368
472
  </SectionFrame>