helixevo 0.5.0 → 0.6.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,21 @@ All notable changes to HelixEvo are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.6.0] - 2026-03-24
8
+
9
+ ### Added
10
+ - Derived ontology adoption bindings for pressure signals, pressure motifs, route rationale, transfer events, and topology review candidates
11
+ - Ontology adoption summaries showing active concepts, binding coverage, semantically influenced routes, and deprecation-sensitive concepts
12
+ - Workflow-shaped dashboard navigation that now groups the product into Operate, Structure, and Reference surfaces
13
+ - New Guide semantic-control section and operator playbooks for frontier refresh, concept promotion, semantic adoption inspection, and careful deprecation
14
+ - New Commands operator recipes for project onboarding, pressure response, ontology adoption, and topology review/apply loops
15
+
16
+ ### Changed
17
+ - `helixevo ontology --status --verbose` now surfaces semantic adoption, active concept usage, unused extensions, and deprecation-risk visibility
18
+ - Overview, Co-Evolution, Ontology, and Topology now show where approved ontology concepts are actively shaping the live control loop
19
+ - The Ontology dashboard surface now reads as a semantic-control cockpit instead of only frontier control
20
+ - Strategy/master-plan docs are being refreshed so the roadmap shifts from governed ontology emergence toward governed ontology adoption and semantic control
21
+
7
22
  ## [0.5.0] - 2026-03-24
8
23
 
9
24
  ### 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, and maintains a Pareto frontier of optimal skill configurations.
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, and now lets approved ontology concepts become active semantic consumers inside the live control loop.
4
4
 
5
5
  ## How it works
6
6
 
@@ -89,7 +89,7 @@ helixevo dashboard
89
89
  | `helixevo generalize` | Promote cross-project patterns ↑ |
90
90
  | `helixevo specialize --project <name>` | Create project-specific skills ↓ |
91
91
  | `helixevo graph` | View skill network in terminal |
92
- | `helixevo ontology` | Refresh, review, and govern ontology frontier concepts |
92
+ | `helixevo ontology` | Refresh, review, adopt, and inspect ontology concepts plus semantic control coverage |
93
93
  | `helixevo topology` | Prepare, apply, roll back, and inspect reviewed topology execution |
94
94
  | `helixevo research` | Proactive web research for skill improvement |
95
95
  | `helixevo dashboard [--port <n>]` | Open web dashboard, preferring localhost:3847 and falling forward if occupied |
@@ -110,7 +110,9 @@ helixevo graph --mermaid # Open in browser as Mermaid diagram
110
110
  helixevo graph --obsidian ~/vault # Sync to Obsidian vault
111
111
  helixevo graph --rebuild # Re-infer relationships (LLM call)
112
112
  helixevo graph --optimize # Detect structural candidates + refresh topology review queue
113
- helixevo ontology --status # Show ontology kernel / frontier / extension state
113
+ helixevo ontology --status # Show ontology kernel / frontier / extension / adoption state
114
+ helixevo ontology --status --verbose
115
+ # Show top active concepts, unused extensions, and deprecation-sensitive concepts
114
116
  helixevo ontology --refresh # Derive frontier concepts from recurring evidence
115
117
  helixevo ontology --review <id> --decision promote
116
118
  # Promote a reviewed frontier concept into approved extensions
@@ -182,10 +184,10 @@ helixevo dashboard --port 3900
182
184
  ```
183
185
 
184
186
  **Tabs:**
185
- - **Overview** — Premium control cockpit with frontier signals, brain foundation, semantic backbone, pressure counts, ontology frontier visibility, topology review visibility, and prepared/applied structural state
187
+ - **Overview** — Premium control cockpit with frontier signals, brain foundation, semantic backbone, ontology adoption visibility, pressure counts, topology review visibility, and prepared/applied structural state
186
188
  - **Skill Network** — Interactive graph, premium inspector, co-evolution routing signals, and topology review/execution handoff links
187
- - **Co-Evolution** — Operator cockpit for routed pressure response, governance mode visibility, promotion queues, transfer evidence, and topology handoff
188
- - **Ontology** — Semantic control surface for kernel visibility, frontier concept review, approved ontology extensions, and native ontology change events
189
+ - **Co-Evolution** — Operator cockpit for routed pressure response, governance mode visibility, promotion queues, transfer evidence, semantic route influence, and topology handoff
190
+ - **Ontology** — Semantic control surface for kernel visibility, frontier concept review, approved ontology extensions, adoption coverage, deprecation risk, and native ontology change events
189
191
  - **Topology** — Governance steering plus a persistent operator pipeline for review → prepare → apply → rollback across merge / split / promote / rewire / consolidate candidates
190
192
  - **Projects** — Project intake studio, live project analysis, gap routing, per-project pressure hotspots, and promotion feeders
191
193
  - **Evolution** — Timeline of evolution runs with judge scores, artifact provenance, and activation-aware context
@@ -224,7 +226,8 @@ Failures → Cluster → Propose → Replay → Multi-Judge → Regression → C
224
226
 
225
227
  **Brain foundation:**
226
228
  - **Ontology** defines the stable semantic kernel for skills, projects, tasks, capabilities, artifacts, and mutations.
227
- - **Ontology frontier and extensions** let new semantic concepts emerge as provisional hypotheses, pass explicit review, and become approved extensions without free-form drift.
229
+ - **Ontology frontier and extensions** let new semantic concepts emerge as provisional hypotheses, pass explicit review, become approved extensions, and then appear as active semantic consumers in pressure, routing, transfer, and structural interpretation without free-form drift.
230
+ - **Semantic adoption visibility** shows which approved concepts are unused, active, deprecation-sensitive, or currently influencing live route rationale.
228
231
  - **Activation traces** record which skills and gaps were active during capture and project analysis.
229
232
  - **Pressure signals** turn failures and project gaps into explicit adaptation demand.
230
233
  - **Pressure interventions** record how HelixEvo responded across research, specialize, evolve, generalize, and manual-review lanes.
@@ -72,7 +72,10 @@ type Summary = {
72
72
  governanceMode: Summary['governance']['activeMode']
73
73
  triggeredBy: string
74
74
  reasons: string[]
75
+ semanticInfluence?: 'none' | 'explanatory' | 'weighted'
76
+ semanticConceptIds?: string[]
75
77
  }
78
+ semanticConceptIds?: string[]
76
79
  }[]
77
80
  promoteQueue: {
78
81
  id: string
@@ -94,11 +97,14 @@ type Summary = {
94
97
  governanceMode: Summary['governance']['activeMode']
95
98
  triggeredBy: string
96
99
  reasons: string[]
100
+ semanticInfluence?: 'none' | 'explanatory' | 'weighted'
101
+ semanticConceptIds?: string[]
97
102
  }
103
+ semanticConceptIds?: string[]
98
104
  }[]
99
105
  recentAddressed: { id: string; kind: string; projectId?: string; capability?: string; description?: string; addressedAt?: string; responseSummary: string; interventionTypes: PressureInterventionType[] }[]
100
106
  recentInterventions: { id: string; interventionType: PressureInterventionType; status: 'started' | 'completed' | 'failed' | 'dry-run'; impact: 'exploratory' | 'structural' | 'resolving' | 'none'; projectId?: string; capabilities?: string[]; reasonSummary: string; completedAt?: string; createdAt: string }[]
101
- recentTransfers: { id: string; timestamp: string; transferType: 'specialist-to-generalist' | 'generalist-to-project' | 'cross-project' | 'domain-transfer'; targetSkillIds?: string[]; capabilityIds?: string[]; motifIds?: string[]; status?: 'candidate' | 'realized' | 'rejected'; summary?: string }[]
107
+ recentTransfers: { id: string; timestamp: string; transferType: 'specialist-to-generalist' | 'generalist-to-project' | 'cross-project' | 'domain-transfer'; targetSkillIds?: string[]; capabilityIds?: string[]; motifIds?: string[]; status?: 'candidate' | 'realized' | 'rejected'; summary?: string; semanticConceptIds?: string[] }[]
102
108
  }
103
109
 
104
110
  interface Props {
@@ -109,6 +115,13 @@ interface Props {
109
115
  reviewOpen: number
110
116
  extensions: number
111
117
  changeEvents: number
118
+ adoption: {
119
+ activeConcepts: number
120
+ unusedExtensions: number
121
+ totalBindings: number
122
+ routesInfluenced: number
123
+ conceptsAtDeprecationRisk: number
124
+ }
112
125
  }
113
126
  }
114
127
  }
@@ -255,6 +268,7 @@ export default function CoEvolutionClient({ summary, ontology }: Props) {
255
268
  { label: `${summary.pressureMotifs.promotionReady} promotion-ready motifs`, tone: summary.pressureMotifs.promotionReady > 0 ? 'purple' : 'neutral' },
256
269
  { label: `${summary.topologyReviews.open} topology reviews`, tone: summary.topologyReviews.open > 0 ? 'yellow' : 'green' },
257
270
  { label: `${ontology.ontologyLoop.frontier} ontology frontier`, tone: ontology.ontologyLoop.reviewOpen > 0 ? 'blue' : 'neutral' },
271
+ { label: `${ontology.ontologyLoop.adoption.activeConcepts} active concepts`, tone: ontology.ontologyLoop.adoption.activeConcepts > 0 ? 'green' : 'neutral' },
258
272
  { label: `${summary.recentTransfers.length} recent transfers`, tone: summary.recentTransfers.length > 0 ? 'green' : 'neutral' },
259
273
  { label: formatMode(summary.governance.activeMode), tone: toneForMode(summary.governance.activeMode) },
260
274
  ]}
@@ -285,6 +299,7 @@ export default function CoEvolutionClient({ summary, ontology }: Props) {
285
299
  <MetricCard label="Promotion-ready motifs" value={summary.pressureMotifs.promotionReady} sublabel={`${summary.pressureMotifs.total} recurring motifs tracked`} tone="purple" icon="⇄" />
286
300
  <MetricCard label="Topology reviews" value={summary.topologyReviews.open} sublabel={`${summary.topologyReviews.accepted} accepted • ${summary.topologyReviews.deferred} deferred`} tone={summary.topologyReviews.open > 0 ? 'yellow' : 'green'} icon="◇" />
287
301
  <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="↑" />
302
+ <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="◎" />
288
303
  <MetricCard label="Recorded interventions" value={summary.pressureInterventions.total} sublabel={`${summary.pressureInterventions.completed} completed • ${summary.pressureInterventions.dryRun} dry-run`} tone="blue" icon="↺" />
289
304
  <MetricCard label="Realized transfers" value={summary.recentTransfers.filter((event) => event.status === 'realized').length} sublabel={`${summary.pressureMotifs.addressed} motifs now addressed`} tone="green" icon="↑" />
290
305
  </div>
@@ -376,6 +391,8 @@ export default function CoEvolutionClient({ summary, ontology }: Props) {
376
391
  <span className={`badge badge-${toneForLifecycle(motif.lifecycle)}`}>{motif.lifecycle}</span>
377
392
  <span className="badge badge-purple">recommend {motif.suggestedRoute.route}</span>
378
393
  <span className="badge badge-gray">confidence {(motif.suggestedRoute.confidence * 100).toFixed(0)}%</span>
394
+ {motif.suggestedRoute.semanticInfluence && motif.suggestedRoute.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {motif.suggestedRoute.semanticInfluence}</span> : null}
395
+ {(motif.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${motif.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
379
396
  {motif.projectIds.slice(0, 3).map((projectId) => <span key={`${motif.id}-${projectId}`} className="badge badge-gray">{projectId}</span>)}
380
397
  </div>
381
398
  <div style={{ display: 'grid', gap: 4, marginTop: 10 }}>
@@ -477,6 +494,7 @@ export default function CoEvolutionClient({ summary, ontology }: Props) {
477
494
  <div className="summary-row-meta">{event.transferType} • {formatDate(event.timestamp)}</div>
478
495
  <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap', marginTop: 8 }}>
479
496
  <span className={`badge badge-${event.status === 'realized' ? 'green' : event.status === 'candidate' ? 'purple' : 'gray'}`}>{event.status ?? 'candidate'}</span>
497
+ {(event.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${event.id}-${conceptId}`} className="badge badge-green">{conceptId}</span>)}
480
498
  {(event.targetSkillIds ?? []).slice(0, 2).map((skill) => <span key={`${event.id}-${skill}`} className="badge badge-gray">{skill}</span>)}
481
499
  {(event.capabilityIds ?? []).slice(0, 2).map((capability) => <span key={`${event.id}-${capability}`} className="badge badge-gray">{capability}</span>)}
482
500
  </div>
@@ -510,6 +528,8 @@ export default function CoEvolutionClient({ summary, ontology }: Props) {
510
528
  {signal.projectId ? <span className="badge badge-gray">{signal.projectId}</span> : null}
511
529
  {signal.routeRecommendation ? <span className={`badge badge-${toneForRoute(signal.routeRecommendation.route)}`}>recommend {signal.routeRecommendation.route}</span> : null}
512
530
  {signal.routeRecommendation ? <span className="badge badge-gray">{signal.routeRecommendation.scope}</span> : null}
531
+ {signal.routeRecommendation?.semanticInfluence && signal.routeRecommendation.semanticInfluence !== 'none' ? <span className="badge badge-green">semantic {signal.routeRecommendation.semanticInfluence}</span> : null}
532
+ {(signal.semanticConceptIds ?? []).slice(0, 2).map((conceptId) => <span key={`${signal.id}-${conceptId}`} className="badge badge-gray">{conceptId}</span>)}
513
533
  {signal.interventionTypes.map((type) => <span key={`${signal.id}-${type}`} className="badge badge-gray">{type}</span>)}
514
534
  </div>
515
535
  {signal.routeRecommendation?.reasons?.length ? (
@@ -133,26 +133,27 @@ const COMMANDS: CommandInfo[] = [
133
133
  },
134
134
  {
135
135
  name: 'ontology',
136
- description: 'Govern the ontology frontier explicitly. Refresh provisional concepts from recurring evidence, review them with promote/reject/defer decisions, and deprecate approved extensions without allowing free-form semantic drift.',
136
+ description: 'Govern the ontology frontier explicitly and inspect semantic adoption. Refresh provisional concepts from recurring evidence, review them with promote/reject/defer decisions, and see which approved concepts are actively shaping pressure, routing, transfer, and topology interpretation.',
137
137
  usage: 'helixevo ontology [options]',
138
138
  examples: [
139
- { cmd: 'helixevo ontology --status', desc: 'Show kernel, frontier, extension, and change-log counts' },
139
+ { cmd: 'helixevo ontology --status', desc: 'Show kernel, frontier, extension, adoption, and change-log counts' },
140
+ { cmd: 'helixevo ontology --status --verbose', desc: 'Show top active concepts, unused extensions, and deprecation-sensitive concepts' },
140
141
  { cmd: 'helixevo ontology --refresh', desc: 'Derive frontier concepts from recurring capability, pressure, and topology evidence' },
141
142
  { cmd: 'helixevo ontology --review ontology_capability_ui --decision promote', desc: 'Promote a frontier concept into approved ontology extensions' },
142
- { cmd: 'helixevo ontology --deprecate ontology_capability_ui', desc: 'Deprecate an approved ontology extension' },
143
+ { cmd: 'helixevo ontology --deprecate ontology_capability_ui', desc: 'Deprecate an approved ontology extension with consumer-risk visibility' },
143
144
  ],
144
145
  options: [
145
- { flag: '--status', desc: 'Show ontology kernel, frontier, extension, and review state' },
146
+ { flag: '--status', desc: 'Show ontology kernel, frontier, extension, adoption, and review state' },
146
147
  { flag: '--refresh', desc: 'Refresh frontier concepts from recurring evidence' },
147
148
  { flag: '--review <conceptId>', desc: 'Review a frontier concept' },
148
149
  { flag: '--decision <promote|reject|defer>', desc: 'Decision for --review' },
149
150
  { flag: '--rationale <text>', desc: 'Optional review or deprecate rationale' },
150
151
  { flag: '--deprecate <conceptId>', desc: 'Deprecate an approved ontology extension' },
151
- { flag: '--verbose', desc: 'Show detailed frontier concepts, extensions, and change events' },
152
+ { flag: '--verbose', desc: 'Show detailed frontier concepts, active semantic consumers, and ontology changes' },
152
153
  ],
153
154
  category: 'network',
154
155
  needsLLM: false,
155
- note: 'Milestone 8 keeps ontology growth governed: concepts begin in the frontier, require explicit review, and only then become approved extensions.',
156
+ note: 'Milestone 9 keeps ontology growth governed while also showing semantic adoption: concepts begin in the frontier, become approved extensions through review, and then become visible as live consumers inside the control loop.',
156
157
  },
157
158
  {
158
159
  name: 'topology',
@@ -315,6 +316,33 @@ const WORKFLOW = [
315
316
  { label: 'health', desc: 'Assess quality', tone: 'blue' as const },
316
317
  ]
317
318
 
319
+ const WORKFLOW_RECIPES = [
320
+ {
321
+ title: 'New project onboarding',
322
+ tone: 'blue' as const,
323
+ summary: 'Stand up project context, detect capability gaps, and create the first routed pressure picture.',
324
+ steps: ['helixevo project-setup <path>', 'helixevo research --project <path>', 'helixevo specialize --project <name>'],
325
+ },
326
+ {
327
+ title: 'Pressure-response loop',
328
+ tone: 'purple' as const,
329
+ summary: 'Capture real demand, let governance route the response, then apply the right lane.',
330
+ steps: ['helixevo watch --project <name>', 'helixevo evolve', 'helixevo generalize'],
331
+ },
332
+ {
333
+ title: 'Ontology adoption loop',
334
+ tone: 'green' as const,
335
+ summary: 'Move from recurring evidence to approved concepts and inspect live semantic adoption.',
336
+ steps: ['helixevo ontology --refresh', 'helixevo ontology --review <conceptId> --decision promote', 'helixevo ontology --status --verbose'],
337
+ },
338
+ {
339
+ title: 'Topology review / apply loop',
340
+ tone: 'yellow' as const,
341
+ summary: 'Refresh structural review candidates, prepare accepted safe plans, apply them, and keep rollback available.',
342
+ steps: ['helixevo graph --optimize', 'helixevo topology --prepare <candidateId>', 'helixevo topology --apply <planId>'],
343
+ },
344
+ ]
345
+
318
346
  const CATEGORIES: Array<{
319
347
  id: CommandInfo['category']
320
348
  label: string
@@ -323,7 +351,7 @@ const CATEGORIES: Array<{
323
351
  }> = [
324
352
  { id: 'core', label: 'Core workflow', tone: 'purple', description: 'The commands that initialize HelixEvo and keep it learning continuously.' },
325
353
  { id: 'evolution', label: 'Evolution', tone: 'green', description: 'Mutation, promotion, and specialization controls for active skill improvement.' },
326
- { id: 'network', label: 'Network & research', tone: 'blue', description: 'Graph maintenance, discovery, and relationship mapping across the skill ecosystem.' },
354
+ { id: 'network', label: 'Structure, ontology & research', tone: 'blue', description: 'Graph maintenance, semantic control, structural review, and discovery across the skill ecosystem.' },
327
355
  { id: 'analysis', label: 'Analysis & reports', tone: 'yellow', description: 'Operational reads on system quality, trends, reports, and health.' },
328
356
  { id: 'system', label: 'System', tone: 'neutral', description: 'Supporting commands for capture, dashboard access, and environment-level actions.' },
329
357
  ]
@@ -361,8 +389,8 @@ export default function CommandsPage() {
361
389
  actions={
362
390
  <div className="hero-note-card">
363
391
  <div className="hero-note-label">Recommended operating loop</div>
364
- <div className="hero-note-title">Init → Watch → EvolveGeneralizeGraph → Health</div>
365
- <div className="hero-note-copy">Use the Commands page as the practical bridge between HelixEvo’s CLI and the premium dashboard cockpit.</div>
392
+ <div className="hero-note-title">Project Setup → Watch → Co-EvolutionOntologyTopology</div>
393
+ <div className="hero-note-copy">Use the Commands page as the practical bridge between HelixEvo’s CLI, semantic control loop, and the premium dashboard cockpit.</div>
366
394
  </div>
367
395
  }
368
396
  />
@@ -402,6 +430,32 @@ export default function CommandsPage() {
402
430
  </div>
403
431
  </SectionFrame>
404
432
 
433
+ <SectionFrame
434
+ eyebrow="Operator recipes"
435
+ title="Fast command loops for the live product"
436
+ description="These compact sequences make the M9 dashboard and CLI feel like one coordinated operating surface instead of separate references."
437
+ tone="blue"
438
+ >
439
+ <div className="grid-2" style={{ gap: 14 }}>
440
+ {WORKFLOW_RECIPES.map((recipe) => (
441
+ <div key={recipe.title} className="card" style={{ padding: '18px 18px 16px' }}>
442
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 8 }}>
443
+ <span className={`hero-chip hero-chip-${recipe.tone}`}>{recipe.title}</span>
444
+ </div>
445
+ <div style={{ fontSize: 12.5, color: 'var(--text-dim)', lineHeight: 1.65, marginBottom: 12 }}>{recipe.summary}</div>
446
+ <div style={{ display: 'grid', gap: 8 }}>
447
+ {recipe.steps.map((step, index) => (
448
+ <div key={step} style={{ padding: '10px 12px', borderRadius: 14, background: 'rgba(255,255,255,0.72)', border: '1px solid var(--border)' }}>
449
+ <div style={{ fontSize: 10.5, fontWeight: 700, color: 'var(--text-muted)', textTransform: 'uppercase', letterSpacing: 0.9, marginBottom: 4 }}>Step {index + 1}</div>
450
+ <code style={{ fontFamily: 'var(--font-mono)', fontSize: 11.5, color: 'var(--text)' }}>$ {step}</code>
451
+ </div>
452
+ ))}
453
+ </div>
454
+ </div>
455
+ ))}
456
+ </div>
457
+ </SectionFrame>
458
+
405
459
  {CATEGORIES.map(category => {
406
460
  const commands = COMMANDS.filter(command => command.category === category.id)
407
461
  if (commands.length === 0) return null
@@ -11,6 +11,7 @@ const TOC = [
11
11
  { id: 'architecture', label: 'Architecture', icon: '◎' },
12
12
  { id: 'brainstack', label: 'Brain Stack', icon: '◈' },
13
13
  { id: 'loop', label: 'Adaptation Loop', icon: '↺' },
14
+ { id: 'semanticcontrol', label: 'Semantic Control', icon: '◉' },
14
15
  { id: 'surfaces', label: 'Surface Map', icon: '▦' },
15
16
  { id: 'watch', label: 'Always-On Learning', icon: '⚡' },
16
17
  { id: 'evolution', label: 'Evolution Pipeline', icon: '⟳' },
@@ -246,6 +247,7 @@ export default function GuidePage() {
246
247
  <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
247
248
  <a href="#quickstart" className="hero-chip hero-chip-blue" style={{ textDecoration: 'none' }}>Quick Start</a>
248
249
  <a href="#brainstack" className="hero-chip hero-chip-green" style={{ textDecoration: 'none' }}>Brain Stack</a>
250
+ <a href="#semanticcontrol" className="hero-chip hero-chip-blue" style={{ textDecoration: 'none' }}>Semantic Control</a>
249
251
  <a href="#surfaces" className="hero-chip hero-chip-purple" style={{ textDecoration: 'none' }}>Surface Map</a>
250
252
  </div>
251
253
  </div>
@@ -277,6 +279,7 @@ export default function GuidePage() {
277
279
  <span className="hero-chip hero-chip-blue">v{VERSION}</span>
278
280
  <span className="hero-chip hero-chip-purple">{TOC.length} sections</span>
279
281
  <span className="hero-chip hero-chip-green">operator path + theory path</span>
282
+ <span className="hero-chip hero-chip-blue">semantic control reference</span>
280
283
  <span className="hero-chip hero-chip-yellow">governed plasticity reference</span>
281
284
  </div>
282
285
 
@@ -296,6 +299,7 @@ export default function GuidePage() {
296
299
  <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
297
300
  <a href="#quickstart" className="hero-chip hero-chip-blue" style={{ textDecoration: 'none' }}>Quick Start</a>
298
301
  <a href="#brainstack" className="hero-chip hero-chip-purple" style={{ textDecoration: 'none' }}>Brain Stack</a>
302
+ <a href="#semanticcontrol" className="hero-chip hero-chip-blue" style={{ textDecoration: 'none' }}>Semantic Control</a>
299
303
  <a href="#surfaces" className="hero-chip hero-chip-green" style={{ textDecoration: 'none' }}>Surface Map</a>
300
304
  <a href="#maturity" className="hero-chip hero-chip-yellow" style={{ textDecoration: 'none' }}>Safety</a>
301
305
  </div>
@@ -469,7 +473,7 @@ helixevo topology --status`}</Code>
469
473
  },
470
474
  {
471
475
  cmd: 'helixevo ontology',
472
- desc: 'Govern the ontology frontier explicitly. Refresh concept hypotheses from recurring evidence, review them with promote/reject/defer decisions, and deprecate approved extensions without allowing free-form semantic drift.',
476
+ desc: 'Govern the ontology frontier explicitly and inspect semantic adoption. Refresh concept hypotheses from recurring evidence, review them with promote/reject/defer decisions, and see which approved concepts are actively shaping pressure, routing, transfer, and topology interpretation.',
473
477
  flags: ['--status', '--refresh', '--review <conceptId>', '--decision <promote|reject|defer>', '--rationale <text>', '--deprecate <conceptId>', '--verbose'],
474
478
  },
475
479
  {
@@ -536,7 +540,7 @@ helixevo topology --status`}</Code>
536
540
  <h3 className="guide-h3">Brain foundation</h3>
537
541
  <div className="grid-2" style={{ gap: 12, marginBottom: 20 }}>
538
542
  {[
539
- ['Ontology', 'var(--blue)', 'Stable semantic kernel for skills, projects, tasks, capabilities, artifacts, and mutations.'],
543
+ ['Ontology', 'var(--blue)', 'Stable semantic kernel plus approved extensions that can now become active semantic consumers in pressure, routing, transfer, and topology interpretation.'],
540
544
  ['Activation traces', 'var(--green)', 'Observation memory showing which skills and gaps were active when capture or project analysis occurred.'],
541
545
  ['Pressure signals', 'var(--yellow)', 'Explicit adaptation demand derived from failures and project gaps.'],
542
546
  ['Interventions', 'var(--purple)', 'The response ledger across research, specialize, evolve, generalize, and manual-review lanes.'],
@@ -570,8 +574,8 @@ helixevo topology --status`}</Code>
570
574
  {
571
575
  title: '1. Semantic layer',
572
576
  color: 'var(--blue)',
573
- desc: 'Ontology and invariants define what kinds of things HelixEvo can talk about and persist truthfully.',
574
- where: 'Visible in: ontology-aware graph summaries, skill metadata, and brain foundation summaries.'
577
+ desc: 'Ontology and invariants define what kinds of things HelixEvo can talk about and persist truthfully, and approved extensions can now feed back into live interpretation rather than remaining passive review outcomes.',
578
+ where: 'Visible in: ontology-aware graph summaries, semantic adoption counts, route rationale, and brain foundation summaries.'
575
579
  },
576
580
  {
577
581
  title: '2. Observation layer',
@@ -666,14 +670,69 @@ helixevo topology --status`}</Code>
666
670
  </Callout>
667
671
  </Section>
668
672
 
673
+
674
+ {/* ─── Semantic Control ─── */}
675
+ <Section id="semanticcontrol" title="Ontology Adoption + Semantic Control" subtitle="Milestone 8 made ontology reviewable; Milestone 9 made approved concepts behaviorally meaningful inside the live control loop.">
676
+ <p className="guide-text">
677
+ The key post-M9 change is that approved ontology extensions are no longer just semantic ledger entries. They can now bind into
678
+ recurring pressure, motifs, route rationale, transfer interpretation, and topology review context while still remaining subordinate
679
+ to governance and evidence.
680
+ </p>
681
+ <p className="guide-text">
682
+ A concise way to think about the ontology lifecycle now is: <strong>frontier hypothesis → review decision → approved extension → active semantic consumer → optional deprecation</strong>.
683
+ Promotion is what turns reviewed semantics into live semantic control. Deprecation is what safely withdraws that influence when the concept is no longer trustworthy or useful.
684
+ </p>
685
+ <div className="grid-2" style={{ gap: 12, marginBottom: 18 }}>
686
+ {[
687
+ ['Emergence', 'var(--blue)', 'Recurring evidence creates frontier concepts, but frontier creation alone does not yet imply live semantic adoption.'],
688
+ ['Adoption', 'var(--green)', 'Promoted concepts begin appearing as active semantic consumers across signals, motifs, and route rationale.'],
689
+ ['Bounded influence', 'var(--yellow)', 'Ontology can sharpen explanation and confidence inside the existing governance envelope; it does not bypass safety or invent arbitrary routes.'],
690
+ ['Withdrawal', 'var(--purple)', 'Deprecation remains explicit and operator-visible, with consumer warnings before semantic influence is retired.'],
691
+ ].map(([title, color, desc]) => (
692
+ <div key={String(title)} className="guide-dimension-card" style={{ borderLeftColor: String(color) }}>
693
+ <div style={{ fontSize: 12, fontWeight: 700, color: String(color), letterSpacing: 0.2 }}>{title}</div>
694
+ <div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 6, lineHeight: 1.6 }}>{desc}</div>
695
+ </div>
696
+ ))}
697
+ </div>
698
+ <h3 className="guide-h3">Operator playbooks</h3>
699
+ <div className="grid-3" style={{ gap: 12, marginBottom: 18 }}>
700
+ <div className="card" style={{ padding: '16px 16px 14px' }}>
701
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--blue)', marginBottom: 8 }}>Recurring pressure → adoption</div>
702
+ <Code title="Terminal">{`helixevo ontology --refresh
703
+ helixevo ontology --review <conceptId> --decision promote
704
+ helixevo ontology --status --verbose`}</Code>
705
+ <div style={{ fontSize: 12, color: 'var(--text-dim)', lineHeight: 1.6 }}>Use this when recurring pressure or motif evidence looks stable enough to deserve an approved semantic family.</div>
706
+ </div>
707
+ <div className="card" style={{ padding: '16px 16px 14px' }}>
708
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--green)', marginBottom: 8 }}>Check live semantic consumers</div>
709
+ <div style={{ fontSize: 12, color: 'var(--text-dim)', lineHeight: 1.6, marginBottom: 10 }}>Compare these surfaces together:</div>
710
+ <ul className="guide-list" style={{ marginBottom: 0 }}>
711
+ <li><strong>/ontology</strong> for adoption counts, unused extensions, and deprecation-sensitive concepts</li>
712
+ <li><strong>/coevolution</strong> for semantically influenced routes and backlog rationale</li>
713
+ <li><strong>/topology</strong> when structural review candidates start clustering around the same semantic family</li>
714
+ </ul>
715
+ </div>
716
+ <div className="card" style={{ padding: '16px 16px 14px' }}>
717
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--yellow)', marginBottom: 8 }}>Deprecate carefully</div>
718
+ <Code title="Terminal">{`helixevo ontology --status --verbose
719
+ helixevo ontology --deprecate <conceptId>`}</Code>
720
+ <div style={{ fontSize: 12, color: 'var(--text-dim)', lineHeight: 1.6 }}>Always inspect active semantic consumers first. A deprecation warning means the concept is still shaping the live control loop and should be retired intentionally.</div>
721
+ </div>
722
+ </div>
723
+ <Callout type="info">
724
+ The safest mental model is: <strong>M8 governs semantic emergence, M9 governs semantic adoption</strong>. Together they create a semantic loop where concepts can emerge, be reviewed, influence live cognition, and then be retired without silent drift.
725
+ </Callout>
726
+ </Section>
727
+
669
728
  {/* ─── Surface Map ─── */}
670
729
  <Section id="surfaces" title="Dashboard Surface Map" subtitle="Each tab is a different control or observability surface for the same brain.">
671
730
  <div className="grid-2" style={{ gap: 12 }}>
672
731
  {[
673
732
  ['Overview', 'var(--blue)', 'Top-level cockpit for frontier state, brain foundation, pressure totals, topology review counts, and prepared/applied structural state.'],
674
- ['Co-Evolution', 'var(--purple)', 'The response cockpit. Use it to inspect routed pressure, governance mode, promotion queue, interventions, and transfer evidence.'],
733
+ ['Co-Evolution', 'var(--purple)', 'The response cockpit. Use it to inspect routed pressure, governance mode, promotion queue, transfer evidence, and where approved ontology concepts are influencing live route rationale.'],
675
734
  ['Skill Network', 'var(--green)', 'Graph-level understanding: relationships, co-evolution signals, inspector context, and structural handoff links.'],
676
- ['Ontology', 'var(--blue)', 'Semantic control surface for kernel visibility, frontier review, approved extensions, and ontology change events.'],
735
+ ['Ontology', 'var(--blue)', 'Semantic control surface for kernel visibility, frontier review, approved extensions, semantic adoption coverage, consumer summaries, and ontology change events.'],
677
736
  ['Topology', 'var(--yellow)', 'Governed plasticity surface for review decisions, accepted-ready queue, prepared plans, apply, rollback, and execution history.'],
678
737
  ['Projects', 'var(--blue)', 'Project intake and project-aware pressure surface. Best for capability gaps, activation traces, and promotion feeders.'],
679
738
  ['Research', 'var(--purple)', 'Discovery-oriented view grounded in current pressure and routed recommendations rather than disconnected idea generation.'],
@@ -687,8 +746,8 @@ helixevo topology --status`}</Code>
687
746
  ))}
688
747
  </div>
689
748
  <Callout type="tip">
690
- If you are debugging current state, the best sequence is usually: <strong>Overview → Co-Evolution → Topology → Skill Network → Projects / Research</strong>.
691
- That path mirrors the stack from summary → routed demand → structural review/execution → graph context → project or discovery detail.
749
+ If you are debugging current state, the best sequence is usually: <strong>Overview → Co-Evolution → Ontology → Topology → Skill Network → Projects / Research</strong>.
750
+ That path mirrors the stack from summary → routed demand → semantic interpretation → structural review/execution → graph context → project or discovery detail.
692
751
  </Callout>
693
752
  </Section>
694
753
 
@@ -1103,7 +1162,7 @@ generation: 3
1103
1162
  {[
1104
1163
  ['Observation memory', 'var(--blue)', 'failures.jsonl + activation-traces.jsonl capture what happened, where it happened, and which skills were active.'],
1105
1164
  ['Pressure & response memory', 'var(--yellow)', 'pressure-signals.jsonl + pressure-interventions.jsonl + transfer-events.jsonl describe demand, routing, and reusable promotion evidence.'],
1106
- ['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.'],
1165
+ ['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.'],
1107
1166
  ['Governance & review memory', 'var(--purple)', 'governance-state.json + topology-review-candidates.json + topology-review-decisions.jsonl preserve why structural decisions are being made.'],
1108
1167
  ['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.'],
1109
1168
  ['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.'],
@@ -68,22 +68,23 @@ export default function OntologyClient({ initialDashboard }: { initialDashboard:
68
68
  return (
69
69
  <div style={{ display: 'grid', gap: 22 }}>
70
70
  <PageHero
71
- eyebrow="Semantic plasticity"
72
- title="Ontology Frontier Control"
73
- description="Inspect the stable kernel, review frontier concept hypotheses derived from recurring evidence, promote durable concepts into approved extensions, and keep semantic plasticity governed rather than free-form."
71
+ eyebrow="Semantic control"
72
+ title="Ontology Semantic Control"
73
+ description="Inspect the stable kernel, review frontier concept hypotheses, promote approved extensions, track active semantic consumers, and keep ontology adoption governed rather than free-form."
74
74
  chips={[
75
75
  { label: `${dashboard.summary.frontier} frontier`, tone: dashboard.summary.frontier > 0 ? 'yellow' : 'neutral' },
76
76
  { label: `${dashboard.summary.reviewOpen} open review`, tone: dashboard.summary.reviewOpen > 0 ? 'yellow' : 'green' },
77
77
  { label: `${dashboard.summary.extensions} approved extensions`, tone: dashboard.summary.extensions > 0 ? 'blue' : 'neutral' },
78
- { label: `${dashboard.summary.changeEvents} change events`, tone: dashboard.summary.changeEvents > 0 ? 'purple' : 'neutral' },
78
+ { label: `${dashboard.adoption.activeConcepts} active concepts`, tone: dashboard.adoption.activeConcepts > 0 ? 'green' : 'neutral' },
79
+ { label: `${dashboard.adoption.routesInfluenced} semantically influenced routes`, tone: dashboard.adoption.routesInfluenced > 0 ? 'purple' : 'neutral' },
79
80
  { label: formatMode(dashboard.governance.activeMode), tone: dashboard.governance.activeMode === 'transfer-focused' ? 'purple' : dashboard.governance.activeMode === 'project-critical' ? 'yellow' : 'blue' },
80
81
  ]}
81
82
  actions={
82
83
  <div style={{ display: 'grid', gap: 12 }}>
83
84
  <div className="hero-note-card">
84
85
  <div className="hero-note-label">Native ontology state</div>
85
- <div className="hero-note-title">Kernel + frontier + extensions</div>
86
- <div className="hero-note-copy">Milestone 8 keeps the semantic kernel stable while letting new concepts emerge into a reviewable frontier before promotion.</div>
86
+ <div className="hero-note-title">Kernel + review + semantic adoption</div>
87
+ <div className="hero-note-copy">Use this surface to move from frontier hypotheses into approved extensions, inspect active semantic consumers, and manage deprecation with operator-visible risk rather than hidden drift.</div>
87
88
  </div>
88
89
  <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap', justifyContent: 'flex-end' }}>
89
90
  <button onClick={() => runAction('refresh', {}, 'ontology refresh')} disabled={runState === 'running'} className="badge badge-blue" style={{ border: 'none', cursor: 'pointer' }}>Refresh ontology frontier</button>
@@ -97,14 +98,16 @@ export default function OntologyClient({ initialDashboard }: { initialDashboard:
97
98
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
98
99
  <MetricCard label="Kernel concepts" value={dashboard.summary.kernelConcepts} sublabel={`${dashboard.kernel.relationFamilies.length} relation families`} tone="purple" icon="◎" />
99
100
  <MetricCard label="Frontier hypotheses" value={dashboard.summary.frontier} sublabel={`${dashboard.summary.reviewOpen} open • ${dashboard.summary.deferred} deferred`} tone={dashboard.summary.reviewOpen > 0 ? 'yellow' : 'neutral'} icon="◇" />
100
- <MetricCard label="Approved extensions" value={dashboard.summary.extensions} sublabel={`${dashboard.summary.deprecated} deprecated`} tone={dashboard.summary.extensions > 0 ? 'blue' : 'neutral'} icon="↑" />
101
+ <MetricCard label="Approved extensions" value={dashboard.summary.extensions} sublabel={`${dashboard.summary.deprecated} deprecated • ${dashboard.adoption.unusedExtensions} unused`} tone={dashboard.summary.extensions > 0 ? 'blue' : 'neutral'} icon="↑" />
102
+ <MetricCard label="Active semantic concepts" value={dashboard.adoption.activeConcepts} sublabel={`${dashboard.adoption.totalBindings} bindings • ${dashboard.adoption.routesInfluenced} routed influences`} tone={dashboard.adoption.activeConcepts > 0 ? 'green' : 'neutral'} icon="⇄" />
103
+ <MetricCard label="Deprecation-sensitive" value={dashboard.adoption.conceptsAtDeprecationRisk} sublabel="approved concepts with live consumers" tone={dashboard.adoption.conceptsAtDeprecationRisk > 0 ? 'yellow' : 'neutral'} icon="!" />
101
104
  <MetricCard label="Concept changes" value={dashboard.summary.changeEvents} sublabel={`${dashboard.summary.promoted} promoted • ${dashboard.summary.rejected} rejected`} tone={dashboard.summary.changeEvents > 0 ? 'green' : 'neutral'} icon="⇄" />
102
105
  </div>
103
106
 
104
107
  <SectionFrame
105
108
  eyebrow="Kernel"
106
109
  title="Stable semantic anchor"
107
- description="The kernel remains the constitutional layer. Milestone 8 does not mutate it directly; it materializes and exposes it while adding governed extension growth around it."
110
+ description="The kernel remains the constitutional layer. HelixEvo still keeps it stable while governed frontier review, approved extensions, and semantic adoption grow around it."
108
111
  >
109
112
  <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
110
113
  <span className="badge badge-gray">version {dashboard.kernel.version}</span>
@@ -124,6 +127,45 @@ export default function OntologyClient({ initialDashboard }: { initialDashboard:
124
127
  </div>
125
128
  </SectionFrame>
126
129
 
130
+ <SectionFrame
131
+ eyebrow="Adoption"
132
+ title="Semantic consumer coverage"
133
+ description="Approved concepts now become visible as live semantic consumers across pressure, route rationale, transfer, and topology interpretation rather than remaining passive approved vocabulary."
134
+ >
135
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))', gap: 16 }}>
136
+ <div className="guide-dimension-card" style={{ borderLeftColor: 'var(--green)' }}>
137
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--green)' }}>Top active concepts</div>
138
+ <div style={{ display: 'grid', gap: 8, marginTop: 10 }}>
139
+ {dashboard.adoption.topActiveConcepts.length > 0 ? dashboard.adoption.topActiveConcepts.map((concept) => (
140
+ <div key={concept.conceptId} style={{ fontSize: 12, color: 'var(--text-dim)', lineHeight: 1.6 }}>
141
+ <strong style={{ color: 'var(--text)' }}>{concept.conceptName}</strong>
142
+ <div>{concept.totalBindings} bindings • {Object.entries(concept.bindingsByTargetType).map(([target, count]) => `${target}:${count}`).join(' • ')}</div>
143
+ </div>
144
+ )) : <div style={{ fontSize: 12, color: 'var(--text-dim)' }}>No active semantic consumers yet.</div>}
145
+ </div>
146
+ </div>
147
+ <div className="guide-dimension-card" style={{ borderLeftColor: 'var(--yellow)' }}>
148
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--yellow)' }}>Deprecation risk</div>
149
+ <div style={{ display: 'grid', gap: 8, marginTop: 10 }}>
150
+ {dashboard.adoption.atRiskConcepts.length > 0 ? dashboard.adoption.atRiskConcepts.map((concept) => (
151
+ <div key={concept.conceptId} style={{ fontSize: 12, color: 'var(--text-dim)', lineHeight: 1.6 }}>
152
+ <strong style={{ color: 'var(--text)' }}>{concept.conceptName}</strong>
153
+ <div>{concept.warning}</div>
154
+ </div>
155
+ )) : <div style={{ fontSize: 12, color: 'var(--text-dim)' }}>No deprecation-sensitive concepts right now.</div>}
156
+ </div>
157
+ </div>
158
+ </div>
159
+ <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 16 }}>
160
+ <span className="badge badge-gray">bindings → signals {dashboard.adoption.bindingsByTargetType['pressure-signal'] ?? 0}</span>
161
+ <span className="badge badge-gray">motifs {dashboard.adoption.bindingsByTargetType['pressure-motif'] ?? 0}</span>
162
+ <span className="badge badge-gray">routes {dashboard.adoption.bindingsByTargetType['route-recommendation'] ?? 0}</span>
163
+ <span className="badge badge-gray">transfers {dashboard.adoption.bindingsByTargetType['transfer-event'] ?? 0}</span>
164
+ <span className="badge badge-gray">topology {dashboard.adoption.bindingsByTargetType['topology-review'] ?? 0}</span>
165
+ <span className="badge badge-gray">unused extensions {dashboard.adoption.unusedExtensions}</span>
166
+ </div>
167
+ </SectionFrame>
168
+
127
169
  <SectionFrame
128
170
  eyebrow="Frontier"
129
171
  title="Reviewable concept hypotheses"
@@ -167,7 +209,7 @@ export default function OntologyClient({ initialDashboard }: { initialDashboard:
167
209
  <SectionFrame
168
210
  eyebrow="Extensions"
169
211
  title="Approved ontology extensions"
170
- description="Promoted concepts live here as approved semantic vocabulary. Deprecation is bounded and explicit there is no hidden semantic drift."
212
+ description="Promoted concepts live here as approved semantic vocabulary. Once active, they can shape pressure, route rationale, transfer interpretation, and topology review while deprecation remains bounded and explicit."
171
213
  >
172
214
  <div style={{ display: 'grid', gap: 12 }}>
173
215
  {dashboard.extensions.length > 0 ? dashboard.extensions.map((concept) => (
@@ -180,16 +222,22 @@ export default function OntologyClient({ initialDashboard }: { initialDashboard:
180
222
  <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
181
223
  <span className={`badge badge-${toneForConcept(concept.conceptKind)}`}>{concept.conceptKind}</span>
182
224
  <span className="badge badge-gray">{concept.status}</span>
225
+ <span className="badge badge-gray">{concept.adoptionCount} bindings</span>
183
226
  <span className="badge badge-gray">{(concept.evidenceIds?.length ?? 0)} evidence ids</span>
227
+ {concept.warning ? <span className="badge badge-yellow">deprecation risk</span> : null}
184
228
  </div>
185
229
  </div>
186
230
  <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 12 }}>
187
231
  <span className="badge badge-gray">{(concept.projectIds?.length ?? 0)} projects</span>
232
+ <span className="badge badge-gray">signals {concept.bindingsByTargetType['pressure-signal'] ?? 0}</span>
233
+ <span className="badge badge-gray">routes {concept.bindingsByTargetType['route-recommendation'] ?? 0}</span>
234
+ <span className="badge badge-gray">transfers {concept.bindingsByTargetType['transfer-event'] ?? 0}</span>
188
235
  <span className="badge badge-gray">created {formatDate(concept.createdAt)}</span>
189
236
  {concept.status !== 'deprecated' ? (
190
237
  <button onClick={() => runAction('deprecate', { conceptId: concept.id, rationale: `Deprecate ontology extension ${concept.name} after operator review.` }, `deprecate ${concept.name}`)} disabled={pendingKey === concept.id} className="badge badge-gray" style={{ border: 'none', cursor: 'pointer' }}>Deprecate</button>
191
238
  ) : null}
192
239
  </div>
240
+ {concept.warning ? <div className="signal-text" style={{ marginTop: 10 }}>• {concept.warning}</div> : null}
193
241
  </div>
194
242
  )) : (
195
243
  <div className="empty-state" style={{ padding: 24 }}>
@@ -151,6 +151,14 @@ export default function Overview() {
151
151
  href="/ontology"
152
152
  icon="◎"
153
153
  />
154
+ <MetricCard
155
+ label="Active semantic concepts"
156
+ value={ontology.ontologyLoop.adoption.activeConcepts}
157
+ sublabel={`${ontology.ontologyLoop.adoption.totalBindings} bindings • ${ontology.ontologyLoop.adoption.routesInfluenced} influenced routes`}
158
+ tone={ontology.ontologyLoop.adoption.activeConcepts > 0 ? 'green' : 'neutral'}
159
+ href="/ontology"
160
+ icon="⇄"
161
+ />
154
162
  <MetricCard
155
163
  label="Observed mutation verbs"
156
164
  value={ontology.mutationOperationsObserved}
@@ -175,6 +183,8 @@ export default function Overview() {
175
183
  <span className="badge badge-gray">{ontology.pressureMotifs.promotionReady} motifs currently recommend generalize</span>
176
184
  <span className="badge badge-gray">{ontology.transferEvents.total} transfer events logged ({ontology.transferEvents.realized} realized)</span>
177
185
  <span className="badge badge-gray">ontology → {ontology.ontologyLoop.frontier} frontier • {ontology.ontologyLoop.extensions} extensions • {ontology.ontologyLoop.changeEvents} changes</span>
186
+ <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>
187
+ <span className="badge badge-gray">deprecation risk → {ontology.ontologyLoop.adoption.conceptsAtDeprecationRisk} concepts • {ontology.ontologyLoop.adoption.unusedExtensions} unused extensions</span>
178
188
  <span className="badge badge-gray">topology → {ontology.topologyReviews.open} open • {ontology.topologyReviews.accepted} accepted • {ontology.topologyReviews.generatedFromManualReview} manual-route</span>
179
189
  <span className="badge badge-gray">execution → {ontology.topologyExecution.prepared} prepared • {ontology.topologyExecution.applied} applied • {ontology.topologyExecution.rolledBack} rolled back</span>
180
190
  <Link href="/ontology" className="badge badge-blue" style={{ textDecoration: 'none' }}>Open ontology control</Link>