helixevo 0.8.0 → 0.8.1

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,14 @@ All notable changes to HelixEvo are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.8.1] - 2026-03-25
8
+
9
+ ### Changed
10
+ - Overview now behaves more like an essential operator cockpit and gives higher priority to live operator state over release/reference framing
11
+ - Unresolved corrections now surface earlier in the landing flow when active, ahead of quick actions and semantic summary content
12
+ - Healthy provider state remains compact on Overview while fallback/deviation cases are explained more explicitly and truthfully
13
+ - Semantic backbone now reads as a compact brain summary instead of a dense secondary dashboard, with direct control links into co-evolution, ontology, topology, and proof
14
+
7
15
  ## [0.8.0] - 2026-03-25
8
16
 
9
17
  ### Added
@@ -6,8 +6,6 @@ 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 { SurfaceJumpLinks } from '@/components/surface-jump-links'
10
- import { CURRENT_RELEASE_SPOTLIGHT } from '@/lib/release-spotlight'
11
9
 
12
10
  export const dynamic = 'force-dynamic'
13
11
 
@@ -114,6 +112,25 @@ export default function Overview() {
114
112
  const recentRuns = history.iterations.slice(-4).reverse()
115
113
  const topSkills = [...graph.nodes].sort((a, b) => b.score - a.score).slice(0, 10)
116
114
  const defaultProvider = llmRuntime.providers[llmRuntime.defaultProvider]
115
+ const lastExecutionUsedFallback = Boolean(llmRuntime.lastExecution?.fallbackUsed)
116
+ const isProviderDegraded =
117
+ defaultProvider.status === 'degraded' ||
118
+ defaultProvider.status === 'unavailable'
119
+ const showProviderAttention = isProviderDegraded || lastExecutionUsedFallback
120
+ const providerAttentionTone = defaultProvider.status === 'unavailable' ? 'red' : 'yellow'
121
+ const providerAttentionEyebrow = isProviderDegraded ? 'Provider attention' : 'Recent provider deviation'
122
+ const providerAttentionTitle = defaultProvider.status === 'unavailable'
123
+ ? 'Backend recovery needed'
124
+ : isProviderDegraded
125
+ ? 'Live backend truth'
126
+ : 'Fallback used recently'
127
+ const providerAttentionDescription = isProviderDegraded
128
+ ? lastExecutionUsedFallback
129
+ ? 'The default provider currently needs attention and a recent provider-backed run used explicit fallback. Review runtime health before treating execution as fully healthy or default-aligned.'
130
+ : 'The default provider currently needs attention. Review runtime health before treating provider-backed execution as fully healthy.'
131
+ : llmRuntime.lastExecution?.usedProvider
132
+ ? `A recent provider-backed run did not stay on the selected default provider. The default remained ${providerLabel(llmRuntime.defaultProvider)}, but the last successful execution used ${providerLabel(llmRuntime.lastExecution.usedProvider)}. Review provider health and fallback policy before assuming default-provider execution.`
133
+ : 'A recent provider-backed run used explicit fallback instead of staying on the selected default provider. Review provider health and fallback policy before assuming default-provider execution.'
117
134
  const priorityActions = getPriorityActions({
118
135
  unresolved: summary.failures.unresolved,
119
136
  proofOpen: proof.summary.reviewOpen,
@@ -133,14 +150,9 @@ export default function Overview() {
133
150
  title="Dashboard"
134
151
  description="Monitor the live state of your self-evolving skill ecosystem, launch high-value actions, and trace how failures turn into frontier-worthy improvements."
135
152
  chips={[
136
- { label: `${summary.skills.total} skills`, tone: 'purple' },
137
153
  { label: `${summary.failures.unresolved} unresolved corrections`, tone: summary.failures.unresolved > 0 ? 'yellow' : 'green' },
138
- { label: `${summary.evolution.runs} evolution runs`, tone: 'blue' },
139
- { label: `${frontier.programs.length}/${frontier.capacity} frontier slots`, tone: 'green' },
140
- { label: `${coevolution.pressureMotifs.promotionReady} promotion-ready motifs`, tone: coevolution.pressureMotifs.promotionReady > 0 ? 'purple' : 'neutral' },
141
- { label: `${coevolution.topologyReviews.open} topology reviews`, tone: coevolution.topologyReviews.open > 0 ? 'yellow' : 'green' },
142
- { label: `${coevolution.topologyExecution.prepared} prepared structural plans`, tone: coevolution.topologyExecution.prepared > 0 ? 'blue' : 'neutral' },
143
154
  { label: `${proof.summary.reviewOpen} proof reviews`, tone: proof.summary.reviewOpen > 0 ? 'yellow' : proof.summary.effective > 0 ? 'green' : 'neutral' },
155
+ { label: `${coevolution.topologyReviews.open} topology reviews`, tone: coevolution.topologyReviews.open > 0 ? 'yellow' : 'green' },
144
156
  { label: `${providerLabel(llmRuntime.defaultProvider)} ${defaultProvider.status}`, tone: providerTone(defaultProvider.status) },
145
157
  { label: `mode: ${coevolution.governance.activeMode.replace(/-/g, ' ')}`, tone: coevolution.governance.activeMode === 'transfer-focused' ? 'purple' : coevolution.governance.activeMode === 'project-critical' ? 'yellow' : 'blue' },
146
158
  ]}
@@ -162,38 +174,98 @@ export default function Overview() {
162
174
 
163
175
  <OperatorLoopTrail surface="overview" />
164
176
 
165
- <div className="grid-5">
166
- <MetricCard label="Total skills" value={summary.skills.total} sublabel={`${summary.skills.evolved} evolved • ${summary.skillTests} skill tests`} tone="purple" href="/network" icon="◆" />
167
- <MetricCard label="Accepted proposals" value={summary.evolution.accepted} sublabel={`${summary.evolution.rejected} rejected`} tone="green" href="/evolution" icon="✓" />
177
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
168
178
  <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="!" />
169
- <MetricCard label="Discoveries" value={summary.buffer.discoveries} sublabel={`${summary.buffer.drafts} drafts in progress`} tone="blue" href="/research" icon="◎" />
170
- <MetricCard label="Frontier candidates" value={frontier.programs.length} sublabel={`${summary.canaries} active canaries`} tone="neutral" href="/frontier" icon="▲" />
171
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="◇" />
180
+ <MetricCard
181
+ label="Open pressure"
182
+ value={ontology.pressureLifecycle.open}
183
+ sublabel={`${ontology.pressureLifecycle.inProgress} in progress • ${ontology.pressureLifecycle.addressed} addressed`}
184
+ tone={ontology.pressureLifecycle.open > 0 ? 'yellow' : 'green'}
185
+ href="/coevolution"
186
+ icon="!"
187
+ />
188
+ <MetricCard
189
+ label="Topology review"
190
+ value={ontology.topologyReviews.open}
191
+ sublabel={`${ontology.topologyExecution.prepared} prepared • ${ontology.topologyExecution.applied} applied`}
192
+ tone={ontology.topologyReviews.open > 0 ? 'yellow' : ontology.topologyExecution.applied > 0 ? 'green' : 'blue'}
193
+ href="/topology"
194
+ icon="⇄"
195
+ />
196
+ <MetricCard
197
+ label="Ontology frontier"
198
+ value={ontology.ontologyLoop.frontier}
199
+ sublabel={`${ontology.ontologyLoop.reviewOpen} open • ${ontology.ontologyLoop.extensions} approved extensions`}
200
+ tone={ontology.ontologyLoop.reviewOpen > 0 ? 'yellow' : ontology.ontologyLoop.extensions > 0 ? 'blue' : 'neutral'}
201
+ href="/ontology"
202
+ icon="◎"
203
+ />
204
+ <MetricCard
205
+ label="Active semantic concepts"
206
+ value={ontology.ontologyLoop.adoption.activeConcepts}
207
+ sublabel={`${ontology.ontologyLoop.adoption.totalBindings} bindings • ${ontology.ontologyLoop.adoption.routesInfluenced} influenced routes`}
208
+ tone={ontology.ontologyLoop.adoption.activeConcepts > 0 ? 'green' : 'neutral'}
209
+ href="/ontology"
210
+ icon="⇄"
211
+ />
172
212
  </div>
173
213
 
174
214
  <SectionFrame
175
- eyebrow={`Release spotlight · v${CURRENT_RELEASE_SPOTLIGHT.version}`}
176
- title={CURRENT_RELEASE_SPOTLIGHT.title}
177
- description={CURRENT_RELEASE_SPOTLIGHT.summary}
215
+ eyebrow="Priority now"
216
+ title="Top ranked next actions"
217
+ description="This layer compresses the live loop into the most important operator moves right now instead of leaving everything as flat dashboard signal."
178
218
  tone="blue"
179
219
  >
180
- <div className="grid-2" style={{ gap: 16 }}>
181
- <div style={{ display: 'grid', gap: 10 }}>
182
- {CURRENT_RELEASE_SPOTLIGHT.bullets.map((item) => (
183
- <div key={item} className="signal-text">• {item}</div>
184
- ))}
185
- <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 4 }}>
186
- {CURRENT_RELEASE_SPOTLIGHT.nextActions.map((action) => (
187
- <Link key={action.href} href={action.href} className={`hero-chip hero-chip-${action.tone}`} style={{ textDecoration: 'none' }}>
188
- {action.label}
189
- </Link>
190
- ))}
191
- </div>
192
- </div>
193
- <SurfaceJumpLinks surface="overview" variant="panel" title="Jump into the updated loop" />
220
+ <div className="summary-list">
221
+ {priorityActions.map((action, index) => (
222
+ <Link key={`${action.href}-${index}`} href={action.href} className="summary-row">
223
+ <div className="summary-row-main">
224
+ <div className="summary-row-title">{index + 1}. {action.title}</div>
225
+ <div className="summary-row-meta">{action.description}</div>
226
+ </div>
227
+ <span className={`hero-chip hero-chip-${action.tone}`}>open</span>
228
+ </Link>
229
+ ))}
194
230
  </div>
195
231
  </SectionFrame>
196
232
 
233
+ {unresolved.length > 0 ? (
234
+ <SectionFrame
235
+ eyebrow="Attention"
236
+ title="Unresolved corrections"
237
+ description="These user corrections have been captured but not yet folded back into the skill network."
238
+ tone="yellow"
239
+ className="anchor-target"
240
+ >
241
+ <div id="attention" className="signal-list">
242
+ {unresolved.slice(0, 5).map((failure, index) => (
243
+ <div key={`${failure.id}-${index}`} className="signal-row signal-row-attention">
244
+ <div className="signal-dot" />
245
+ <div style={{ flex: 1 }}>
246
+ <div className="signal-title">
247
+ {failure.userRequest.slice(0, 120)}
248
+ {failure.userRequest.length > 120 ? '…' : ''}
249
+ </div>
250
+ <div className="signal-text">
251
+ Correction: {failure.correction.slice(0, 180)}
252
+ {failure.correction.length > 180 ? '…' : ''}
253
+ </div>
254
+ <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 10 }}>
255
+ <span className="badge badge-yellow">{failure.correctionType}</span>
256
+ {failure.project ? <span className="badge badge-gray">{failure.project}</span> : null}
257
+ <span className="badge badge-gray">{new Date(failure.timestamp).toLocaleDateString()}</span>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ ))}
262
+ {unresolved.length > 5 ? (
263
+ <div className="signal-text" style={{ textAlign: 'center' }}>+{unresolved.length - 5} more unresolved corrections</div>
264
+ ) : null}
265
+ </div>
266
+ </SectionFrame>
267
+ ) : null}
268
+
197
269
  <SectionFrame
198
270
  eyebrow="Execution layer"
199
271
  title="Quick actions"
@@ -209,100 +281,60 @@ export default function Overview() {
209
281
  />
210
282
  </SectionFrame>
211
283
 
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}
284
+ {showProviderAttention ? (
285
+ <SectionFrame
286
+ eyebrow={providerAttentionEyebrow}
287
+ title={providerAttentionTitle}
288
+ description={providerAttentionDescription}
289
+ tone={providerAttentionTone}
290
+ actions={<Link href="/commands" className="badge badge-gray">Open commands</Link>}
291
+ >
292
+ <div className="grid-2" style={{ gap: 16 }}>
293
+ <div className="summary-list">
294
+ {(['claude-code', 'codex', 'ollama'] as const).map((provider) => {
295
+ const snapshot = llmRuntime.providers[provider]
296
+ return (
297
+ <div key={provider} className="summary-row">
298
+ <div className="summary-row-main">
299
+ <div className="summary-row-title">{providerLabel(provider)}</div>
300
+ <div className="summary-row-meta">{snapshot.summary}</div>
301
+ {snapshot.nextStep ? <div className="summary-row-meta" style={{ marginTop: 6 }}>Next: {snapshot.nextStep}</div> : null}
302
+ </div>
303
+ <span className={`hero-chip hero-chip-${providerTone(snapshot.status)}`}>{snapshot.status}</span>
228
304
  </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>
305
+ )
306
+ })}
307
+ </div>
308
+ <div style={{ display: 'grid', gap: 12 }}>
309
+ <MetricCard
310
+ label="Default provider"
311
+ value={providerLabel(llmRuntime.defaultProvider)}
312
+ sublabel={`fallback: ${llmRuntime.fallbackPolicy}${llmRuntime.fallbackOrder.length > 0 ? ` • ${llmRuntime.fallbackOrder.map((provider) => providerLabel(provider)).join(' → ')}` : ''}`}
313
+ tone={providerTone(defaultProvider.status)}
314
+ href="/commands"
315
+ icon="☍"
316
+ />
317
+ <MetricCard
318
+ label="Last provider run"
319
+ value={llmRuntime.lastExecution?.usedProvider ? providerLabel(llmRuntime.lastExecution.usedProvider) : 'None'}
320
+ sublabel={llmRuntime.lastExecution ? llmRuntime.lastExecution.summary : 'No provider-backed execution has been recorded yet.'}
321
+ tone={llmRuntime.lastExecution?.success ? 'green' : llmRuntime.lastExecution ? 'yellow' : 'neutral'}
322
+ href="/commands"
323
+ icon="↺"
324
+ />
325
+ <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>
326
+ </div>
252
327
  </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>
328
+ </SectionFrame>
329
+ ) : null}
274
330
 
275
331
  <SectionFrame
276
- eyebrow="Brain foundation"
332
+ eyebrow="Brain summary"
277
333
  title="Semantic backbone"
278
- description="A hybrid ontology view of the living brain, combining derived skill-graph semantics with native ontology frontier, extension, and semantic review activity."
334
+ description="Compact summary of pressure, response, structural review, ontology growth, and semantic adoption across the living brain."
279
335
  actions={<span className="badge badge-gray">{ontology.source === 'hybrid-native-derived' ? `Ontology ${ontology.specVersion} · hybrid native + derived` : ontology.source === 'graph' ? `Ontology ${ontology.specVersion}` : 'Compatibility-derived'}</span>}
280
336
  >
281
337
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
282
- <MetricCard
283
- label="Generalist skills"
284
- value={ontology.skillRoles.generalist}
285
- sublabel={`${ontology.stabilityStates.stable} stable abstractions`}
286
- tone="purple"
287
- href="/network"
288
- icon="◎"
289
- />
290
- <MetricCard
291
- label="Project specialists"
292
- value={ontology.skillRoles.specialist}
293
- sublabel={`${ontology.plasticityStates.candidate} candidate rewires`}
294
- tone="blue"
295
- href="/projects"
296
- icon="◉"
297
- />
298
- <MetricCard
299
- label="Hybrid bridges"
300
- value={ontology.skillRoles.hybrid}
301
- sublabel={`${ontology.plasticityStates.volatile} volatile transitions`}
302
- tone="green"
303
- href="/network"
304
- icon="⇄"
305
- />
306
338
  <MetricCard
307
339
  label="Open pressure"
308
340
  value={ontology.pressureLifecycle.open}
@@ -319,14 +351,6 @@ export default function Overview() {
319
351
  href="/coevolution"
320
352
  icon="↺"
321
353
  />
322
- <MetricCard
323
- label="Pressure motifs"
324
- value={ontology.pressureMotifs.total}
325
- sublabel={`${ontology.pressureMotifs.promotionReady} promotion-ready • ${ontology.transferEvents.realized} realized transfers`}
326
- tone="purple"
327
- href="/coevolution"
328
- icon="⇄"
329
- />
330
354
  <MetricCard
331
355
  label="Topology review"
332
356
  value={ontology.topologyReviews.open}
@@ -351,81 +375,16 @@ export default function Overview() {
351
375
  href="/ontology"
352
376
  icon="⇄"
353
377
  />
354
- <MetricCard
355
- label="Observed mutation verbs"
356
- value={ontology.mutationOperationsObserved}
357
- sublabel={ontology.observedMutationActions.length > 0 ? ontology.observedMutationActions.join(' • ') : 'Waiting for evolution history'}
358
- tone="yellow"
359
- href="/evolution"
360
- icon="◇"
361
- />
362
378
  </div>
363
379
 
364
380
  <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 16 }}>
365
- <span className="badge badge-gray">{ontology.relationFamiliesObserved} relation families live in the graph</span>
366
- <span className="badge badge-gray">{ontology.evidenceBackedProposals} proposals already carry judge + regression evidence</span>
367
- <span className="badge badge-gray">{ontology.artifacts.total} evolution artifacts ({ontology.artifacts.native} native • {ontology.artifacts.derived} derived)</span>
368
- <span className="badge badge-gray">{ontology.activationTraces.total} activation traces ({ontology.activationTraces.native} native • {ontology.activationTraces.derived} derived)</span>
369
- <span className="badge badge-gray">{ontology.pressureSignals.total} pressure signals ({ontology.pressureSignals.native} native • {ontology.pressureSignals.derived} derived)</span>
370
- <span className="badge badge-gray">{ontology.pressureInterventions.total} response interventions logged</span>
371
- <span className="badge badge-gray">{ontology.pressureLifecycle.open} open • {ontology.pressureLifecycle.inProgress} in progress • {ontology.pressureLifecycle.addressed} addressed</span>
372
381
  <Link href="/coevolution" className="badge badge-blue" style={{ textDecoration: 'none' }}>Open co-evolution control</Link>
373
- <span className="badge badge-gray">{coevolution.topProjects.length} pressured project hotspots</span>
374
- <span className="badge badge-gray">{coevolution.crossProjectGapAreas.length} cross-project gap motifs</span>
375
- <span className="badge badge-gray">{ontology.pressureMotifs.promotionReady} motifs currently recommend generalize</span>
376
- <span className="badge badge-gray">{ontology.transferEvents.total} transfer events logged ({ontology.transferEvents.realized} realized)</span>
377
- <span className="badge badge-gray">ontology → {ontology.ontologyLoop.frontier} frontier • {ontology.ontologyLoop.extensions} extensions • {ontology.ontologyLoop.changeEvents} changes</span>
378
- <span className="badge badge-gray">semantic adoption → {ontology.ontologyLoop.adoption.activeConcepts} active concepts • {ontology.ontologyLoop.adoption.totalBindings} bindings • {ontology.ontologyLoop.adoption.routesInfluenced} influenced routes</span>
379
- <span className="badge badge-gray">deprecation risk → {ontology.ontologyLoop.adoption.conceptsAtDeprecationRisk} concepts • {ontology.ontologyLoop.adoption.unusedExtensions} unused extensions</span>
380
- <span className="badge badge-gray">topology → {ontology.topologyReviews.open} open • {ontology.topologyReviews.accepted} accepted • {ontology.topologyReviews.generatedFromManualReview} manual-route</span>
381
- <span className="badge badge-gray">execution → {ontology.topologyExecution.prepared} prepared • {ontology.topologyExecution.applied} applied • {ontology.topologyExecution.rolledBack} rolled back</span>
382
- <span className="badge badge-gray">proof → {proof.summary.total} total • {proof.summary.effective} effective • {proof.summary.reviewOpen} open review</span>
383
382
  <Link href="/ontology" className="badge badge-blue" style={{ textDecoration: 'none' }}>Open ontology control</Link>
384
383
  <Link href="/topology" className="badge badge-blue" style={{ textDecoration: 'none' }}>Open topology control</Link>
385
384
  <Link href="/proof" className="badge badge-blue" style={{ textDecoration: 'none' }}>Open proof control</Link>
386
- <span className="badge badge-gray">governance: {ontology.governance.activeMode.replace(/-/g, ' ')} ({ontology.governance.source})</span>
387
- <span className="badge badge-gray">routes → research {ontology.governedRoutes.research} • specialize {ontology.governedRoutes.specialize} • evolve {ontology.governedRoutes.evolve} • generalize {ontology.governedRoutes.generalize} • manual-review {ontology.governedRoutes['manual-review']}</span>
388
- <span className="badge badge-gray">{ontology.enrichedSkillNodes} skills carry explicit brain metadata</span>
389
- <span className="badge badge-gray">{ontology.annotatedFailures.pressureSignals} failures annotated with pressure signals</span>
390
385
  </div>
391
386
  </SectionFrame>
392
387
 
393
- {unresolved.length > 0 ? (
394
- <SectionFrame
395
- eyebrow="Attention"
396
- title="Unresolved corrections"
397
- description="These user corrections have been captured but not yet folded back into the skill network."
398
- tone="yellow"
399
- className="anchor-target"
400
- >
401
- <div id="attention" className="signal-list">
402
- {unresolved.slice(0, 5).map((failure, index) => (
403
- <div key={`${failure.id}-${index}`} className="signal-row signal-row-attention">
404
- <div className="signal-dot" />
405
- <div style={{ flex: 1 }}>
406
- <div className="signal-title">
407
- {failure.userRequest.slice(0, 120)}
408
- {failure.userRequest.length > 120 ? '…' : ''}
409
- </div>
410
- <div className="signal-text">
411
- Correction: {failure.correction.slice(0, 180)}
412
- {failure.correction.length > 180 ? '…' : ''}
413
- </div>
414
- <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 10 }}>
415
- <span className="badge badge-yellow">{failure.correctionType}</span>
416
- {failure.project ? <span className="badge badge-gray">{failure.project}</span> : null}
417
- <span className="badge badge-gray">{new Date(failure.timestamp).toLocaleDateString()}</span>
418
- </div>
419
- </div>
420
- </div>
421
- ))}
422
- {unresolved.length > 5 ? (
423
- <div className="signal-text" style={{ textAlign: 'center' }}>+{unresolved.length - 5} more unresolved corrections</div>
424
- ) : null}
425
- </div>
426
- </SectionFrame>
427
- ) : null}
428
-
429
388
  <div className="grid-2">
430
389
  <SectionFrame
431
390
  eyebrow="Frontier"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helixevo",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Co-evolving skill and project brain for AI agents, with reliable provider-aware actuation, ontology-aware learning, governed response, rollbackable topology control, bounded proof control, and a premium dashboard.",
5
5
  "type": "module",
6
6
  "bin": {