helixevo 0.8.0 → 0.9.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 +19 -0
- package/README.md +5 -5
- package/dashboard/app/coevolution/client.tsx +23 -1
- package/dashboard/app/page.tsx +179 -181
- package/dashboard/app/proof/client.tsx +84 -15
- package/dashboard/lib/data.ts +130 -12
- package/dashboard/lib/proof.ts +267 -10
- package/dist/cli.js +1645 -1332
- package/package.json +2 -2
|
@@ -39,6 +39,17 @@ function labelForOutcome(outcome: ProofOutcomeState) {
|
|
|
39
39
|
return outcome.replace(/-/g, ' ')
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
function toneForSteeringTier(tier: 'trusted' | 'caution' | 'bounded' | 'candidate') {
|
|
43
|
+
if (tier === 'trusted') return 'green'
|
|
44
|
+
if (tier === 'caution') return 'yellow'
|
|
45
|
+
if (tier === 'bounded') return 'blue'
|
|
46
|
+
return 'neutral'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function labelForSteeringLane(lane: ProofDashboardSummary['steering']['routeLanes'][number] | ProofDashboardSummary['steering']['semanticLanes'][number]) {
|
|
50
|
+
return lane.route ? lane.route.replace(/-/g, ' ') : lane.conceptId ?? lane.laneKey
|
|
51
|
+
}
|
|
52
|
+
|
|
42
53
|
function formatDate(value: string | undefined) {
|
|
43
54
|
if (!value) return '—'
|
|
44
55
|
return new Date(value).toLocaleString()
|
|
@@ -52,19 +63,20 @@ function consoleTone(state: RunState): 'neutral' | 'green' | 'red' | 'yellow' {
|
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
function getRecommendedProofMove(dashboard: ProofDashboardSummary) {
|
|
66
|
+
const cautionLane = dashboard.steering.routeLanes.find((lane) => lane.evidenceTier === 'caution')
|
|
67
|
+
if (cautionLane) {
|
|
68
|
+
return {
|
|
69
|
+
label: 'Caution first',
|
|
70
|
+
title: labelForSteeringLane(cautionLane),
|
|
71
|
+
copy: 'A cautionary proof lane should usually be reviewed before you trust that route again. Regressed or contested evidence now biases the next loop toward more care.',
|
|
72
|
+
}
|
|
73
|
+
}
|
|
55
74
|
const firstOpen = dashboard.reviewQueue[0]
|
|
56
75
|
if (firstOpen) {
|
|
57
76
|
return {
|
|
58
77
|
label: 'Review queue first',
|
|
59
78
|
title: firstOpen.title,
|
|
60
|
-
copy: '
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (dashboard.summary.regressed > 0) {
|
|
64
|
-
return {
|
|
65
|
-
label: 'Investigate regressed evidence',
|
|
66
|
-
title: 'A regressed outcome needs explanation before retry',
|
|
67
|
-
copy: 'Regressed records mean HelixEvo has explicit negative evidence. Inspect the linked structural or intervention path before repeating the same move.',
|
|
79
|
+
copy: 'High-leverage proof records should usually be resolved before you treat the prove layer as settled. Verify, defer, or contest the most important record first.',
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
82
|
if (dashboard.summary.measuring > 0) {
|
|
@@ -74,6 +86,13 @@ function getRecommendedProofMove(dashboard: ProofDashboardSummary) {
|
|
|
74
86
|
copy: 'A measuring record is active but still too recent or incomplete for a stronger claim. Let downstream evidence accumulate before over-interpreting it.',
|
|
75
87
|
}
|
|
76
88
|
}
|
|
89
|
+
if (dashboard.candidateQueue.length > 0) {
|
|
90
|
+
return {
|
|
91
|
+
label: 'Candidate evidence only',
|
|
92
|
+
title: 'Dry-run and insufficient evidence stay bounded',
|
|
93
|
+
copy: 'Candidate proof records should remain visible, but they should not steer the system strongly until stronger downstream evidence appears.',
|
|
94
|
+
}
|
|
95
|
+
}
|
|
77
96
|
return {
|
|
78
97
|
label: 'Seed proof',
|
|
79
98
|
title: 'No proof targets yet',
|
|
@@ -128,10 +147,10 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
128
147
|
description="Review whether interventions, transfers, topology changes, semantic adoption, and evolution effects actually appear to be working. Proof stays bounded and operator-governed rather than pretending to know more than the evidence supports."
|
|
129
148
|
chips={[
|
|
130
149
|
{ label: `${dashboard.summary.total} proof records`, tone: 'blue' },
|
|
131
|
-
{ label: `${dashboard.
|
|
132
|
-
{ label: `${dashboard.
|
|
133
|
-
{ label: `${dashboard.summary.regressed} regressed`, tone: dashboard.summary.regressed > 0 ? 'yellow' : 'neutral' },
|
|
150
|
+
{ label: `${dashboard.steering.trustedLanes} trusted lanes`, tone: dashboard.steering.trustedLanes > 0 ? 'green' : 'neutral' },
|
|
151
|
+
{ label: `${dashboard.steering.cautionLanes} caution lanes`, tone: dashboard.steering.cautionLanes > 0 ? 'yellow' : 'neutral' },
|
|
134
152
|
{ label: `${dashboard.summary.reviewOpen} open review`, tone: dashboard.summary.reviewOpen > 0 ? 'yellow' : 'green' },
|
|
153
|
+
{ label: `${dashboard.steering.candidateLanes} candidate lanes`, tone: dashboard.steering.candidateLanes > 0 ? 'neutral' : 'green' },
|
|
135
154
|
{ label: `${dashboard.summary.verified} verified`, tone: dashboard.summary.verified > 0 ? 'green' : 'neutral' },
|
|
136
155
|
]}
|
|
137
156
|
actions={
|
|
@@ -149,11 +168,11 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
149
168
|
<OperatorLoopTrail surface="proof" />
|
|
150
169
|
|
|
151
170
|
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 16 }}>
|
|
152
|
-
<MetricCard label="
|
|
153
|
-
<MetricCard label="
|
|
154
|
-
<MetricCard label="Regressed" value={dashboard.summary.regressed} sublabel={`${dashboard.summary.contested} contested • explicit failed or rolled-back cases`} tone={dashboard.summary.regressed > 0 ? 'yellow' : 'neutral'} icon="!" />
|
|
171
|
+
<MetricCard label="Trusted lanes" value={dashboard.steering.trustedLanes} sublabel={`${dashboard.summary.verified} verified records backing future trust`} tone={dashboard.steering.trustedLanes > 0 ? 'green' : 'neutral'} icon="✓" />
|
|
172
|
+
<MetricCard label="Caution lanes" value={dashboard.steering.cautionLanes} sublabel={`${dashboard.summary.regressed} regressed • ${dashboard.summary.contested} contested`} tone={dashboard.steering.cautionLanes > 0 ? 'yellow' : 'neutral'} icon="!" />
|
|
155
173
|
<MetricCard label="Measuring" value={dashboard.summary.measuring} sublabel={`${dashboard.summary.insufficientEvidence} insufficient-evidence`} tone={dashboard.summary.measuring > 0 ? 'blue' : 'neutral'} icon="◎" />
|
|
156
|
-
<MetricCard label="
|
|
174
|
+
<MetricCard label="Candidate evidence" value={dashboard.steering.candidateLanes} sublabel={`${dashboard.candidateQueue.length} open low-closure records`} tone={dashboard.steering.candidateLanes > 0 ? 'neutral' : 'green'} icon="◌" />
|
|
175
|
+
<MetricCard label="Open review" value={dashboard.summary.reviewOpen} sublabel={`${dashboard.steering.priorityReview} high-leverage • ${dashboard.summary.verified} verified`} tone={dashboard.summary.reviewOpen > 0 ? 'yellow' : 'green'} icon="◇" />
|
|
157
176
|
</div>
|
|
158
177
|
|
|
159
178
|
<SectionFrame
|
|
@@ -178,6 +197,34 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
178
197
|
</div>
|
|
179
198
|
</SectionFrame>
|
|
180
199
|
|
|
200
|
+
<SectionFrame
|
|
201
|
+
eyebrow="Steering"
|
|
202
|
+
title="What proof is changing about future control"
|
|
203
|
+
description="Proof now separates trusted, cautionary, bounded, and candidate evidence so the next governed loop can steer more honestly. Trusted lanes can strengthen confidence modestly, caution lanes bias toward more review, and candidate evidence stays bounded."
|
|
204
|
+
tone="blue"
|
|
205
|
+
>
|
|
206
|
+
<div className="grid-2" style={{ gap: 16 }}>
|
|
207
|
+
<div className="summary-list">
|
|
208
|
+
{dashboard.steering.routeLanes.slice(0, 4).map((lane) => (
|
|
209
|
+
<div key={lane.laneKey} className="summary-row">
|
|
210
|
+
<div className="summary-row-main">
|
|
211
|
+
<div className="summary-row-title">{labelForSteeringLane(lane)}</div>
|
|
212
|
+
<div className="summary-row-meta">{lane.summary}</div>
|
|
213
|
+
<div className="summary-row-meta" style={{ marginTop: 6 }}>{lane.reasons[0] ?? 'Proof steering keeps this lane bounded.'}</div>
|
|
214
|
+
</div>
|
|
215
|
+
<span className={`hero-chip hero-chip-${toneForSteeringTier(lane.evidenceTier)}`}>{lane.evidenceTier}</span>
|
|
216
|
+
</div>
|
|
217
|
+
))}
|
|
218
|
+
{dashboard.steering.routeLanes.length === 0 ? <div className="signal-text">No route-level steering evidence yet.</div> : null}
|
|
219
|
+
</div>
|
|
220
|
+
<div style={{ display: 'grid', gap: 12 }}>
|
|
221
|
+
<MetricCard label="Priority review" value={dashboard.steering.priorityReview} sublabel={`${dashboard.reviewQueue.length} high-leverage queue items`} tone={dashboard.steering.priorityReview > 0 ? 'yellow' : 'green'} icon="◇" />
|
|
222
|
+
<MetricCard label="Semantic steering" value={dashboard.steering.semanticLanes.length} sublabel={`${dashboard.steering.semanticLanes.filter((lane) => lane.evidenceTier === 'trusted').length} trusted • ${dashboard.steering.semanticLanes.filter((lane) => lane.evidenceTier === 'caution').length} caution`} tone={dashboard.steering.semanticLanes.length > 0 ? 'purple' : 'neutral'} icon="◎" />
|
|
223
|
+
<div className="signal-text">Candidate evidence remains visible below, but it no longer dominates the highest-value proof review surface.</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</SectionFrame>
|
|
227
|
+
|
|
181
228
|
<SectionFrame
|
|
182
229
|
eyebrow="Coverage"
|
|
183
230
|
title="Proof now spans the live brain loop"
|
|
@@ -255,6 +302,28 @@ export default function ProofClient({ initialDashboard }: { initialDashboard: Pr
|
|
|
255
302
|
</div>
|
|
256
303
|
</SectionFrame>
|
|
257
304
|
|
|
305
|
+
<SectionFrame
|
|
306
|
+
eyebrow="Candidate evidence"
|
|
307
|
+
title="Dry-run and low-closure proof"
|
|
308
|
+
description="These records remain visible, but they should not steer the system strongly until stronger downstream evidence or explicit operator review exists."
|
|
309
|
+
>
|
|
310
|
+
<div style={{ display: 'grid', gap: 10 }}>
|
|
311
|
+
{dashboard.candidateQueue.length > 0 ? dashboard.candidateQueue.map((record) => (
|
|
312
|
+
<div key={record.id} style={{ padding: '14px 16px', borderRadius: 18, border: '1px solid var(--border)', background: 'rgba(255,255,255,0.72)' }}>
|
|
313
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', gap: 12, flexWrap: 'wrap' }}>
|
|
314
|
+
<div style={{ fontSize: 12.5, fontWeight: 700, color: 'var(--text)' }}>{record.title}</div>
|
|
315
|
+
<span className="badge badge-gray">candidate</span>
|
|
316
|
+
</div>
|
|
317
|
+
<div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 6, lineHeight: 1.6 }}>{record.summary}</div>
|
|
318
|
+
<div style={{ display: 'grid', gap: 6, marginTop: 10 }}>
|
|
319
|
+
{record.reasons.slice(0, 2).map((reason, idx) => <div key={`${record.id}-candidate-${idx}`} className="signal-text">• {reason}</div>)}
|
|
320
|
+
{record.recommendedAction ? <div className="signal-text">→ {record.recommendedAction}</div> : null}
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
)) : <div className="signal-text">No candidate-only proof records right now.</div>}
|
|
324
|
+
</div>
|
|
325
|
+
</SectionFrame>
|
|
326
|
+
|
|
258
327
|
<div className="grid-2">
|
|
259
328
|
<SectionFrame
|
|
260
329
|
eyebrow="Verified"
|
package/dashboard/lib/data.ts
CHANGED
|
@@ -30,6 +30,8 @@ function readOntologyJsonl<T>(filename: string): T[] {
|
|
|
30
30
|
return raw.split('\n').filter(Boolean).map((l) => JSON.parse(l))
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
import { loadProofSteeringSummary } from './proof'
|
|
34
|
+
|
|
33
35
|
// ─── Types ──────────────────────────────────────────────────────
|
|
34
36
|
|
|
35
37
|
export type CognitiveRole = 'generalist' | 'specialist' | 'hybrid'
|
|
@@ -180,6 +182,8 @@ export type PressureInterventionImpact = 'exploratory' | 'structural' | 'resolvi
|
|
|
180
182
|
export type PressureLifecycleState = 'open' | 'in-progress' | 'addressed' | 'stale'
|
|
181
183
|
export type PressureRouteScope = 'local' | 'project' | 'network'
|
|
182
184
|
export type PressureRouteTrigger = 'high-priority-local-gap' | 'project-bounded-recurrence' | 'recurring-cross-project-gap' | 'overlapping-skills' | 'accepted-iteration-pattern' | 'insufficient-evidence' | 'mixed-signal'
|
|
185
|
+
export type ProofSteeringTier = 'trusted' | 'caution' | 'bounded' | 'candidate'
|
|
186
|
+
export type ProofSteeringInfluence = 'none' | 'explanatory' | 'weighted'
|
|
183
187
|
|
|
184
188
|
export interface PressureRouteRecommendation {
|
|
185
189
|
route: PressureInterventionType
|
|
@@ -190,6 +194,11 @@ export interface PressureRouteRecommendation {
|
|
|
190
194
|
reasons: string[]
|
|
191
195
|
semanticInfluence?: OntologySemanticInfluence
|
|
192
196
|
semanticConceptIds?: string[]
|
|
197
|
+
proofInfluence?: ProofSteeringInfluence
|
|
198
|
+
proofTier?: ProofSteeringTier
|
|
199
|
+
proofSummary?: string
|
|
200
|
+
proofReasons?: string[]
|
|
201
|
+
proofLaneKeys?: string[]
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
export interface PressureIntervention {
|
|
@@ -2036,6 +2045,105 @@ function matchTopologyOntologyBindings(candidate: ResolvedTopologyReviewCandidat
|
|
|
2036
2045
|
return dedupeOntologyBindings(bindings)
|
|
2037
2046
|
}
|
|
2038
2047
|
|
|
2048
|
+
function proofTierWeight(tier: ProofSteeringTier): number {
|
|
2049
|
+
return tier === 'caution' ? 4 : tier === 'trusted' ? 3 : tier === 'bounded' ? 2 : 1
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2052
|
+
function strongerProofTier(current: ProofSteeringTier | undefined, next: ProofSteeringTier): ProofSteeringTier {
|
|
2053
|
+
if (!current) return next
|
|
2054
|
+
return proofTierWeight(next) > proofTierWeight(current) ? next : current
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
function applyProofInfluenceToRoute(params: {
|
|
2058
|
+
recommendation: PressureRouteRecommendation
|
|
2059
|
+
signal: PressureSignal
|
|
2060
|
+
semanticBindings: ResolvedOntologyBinding[]
|
|
2061
|
+
proofSteering: import('./proof').ProofSteeringSummary | null
|
|
2062
|
+
}): PressureRouteRecommendation {
|
|
2063
|
+
const { recommendation, semanticBindings, proofSteering } = params
|
|
2064
|
+
if (!proofSteering) return recommendation
|
|
2065
|
+
|
|
2066
|
+
let route = recommendation.route
|
|
2067
|
+
let confidence = recommendation.confidence
|
|
2068
|
+
let triggeredBy = recommendation.triggeredBy
|
|
2069
|
+
const reasons = [...recommendation.reasons]
|
|
2070
|
+
const proofReasons: string[] = []
|
|
2071
|
+
const proofLaneKeys: string[] = []
|
|
2072
|
+
let proofSummary: string | undefined
|
|
2073
|
+
let proofTier: ProofSteeringTier | undefined
|
|
2074
|
+
let proofInfluence: 'none' | 'explanatory' | 'weighted' = 'none'
|
|
2075
|
+
|
|
2076
|
+
const routeLane = proofSteering.byRoute[recommendation.route]
|
|
2077
|
+
if (routeLane) {
|
|
2078
|
+
proofLaneKeys.push(routeLane.laneKey)
|
|
2079
|
+
proofReasons.push(...routeLane.reasons.slice(0, 2))
|
|
2080
|
+
proofSummary = proofSummary ?? routeLane.summary
|
|
2081
|
+
proofTier = strongerProofTier(proofTier, routeLane.evidenceTier)
|
|
2082
|
+
|
|
2083
|
+
if (routeLane.evidenceTier === 'trusted') {
|
|
2084
|
+
confidence = Math.min(0.95, confidence + (routeLane.score >= 4 ? 0.06 : 0.04))
|
|
2085
|
+
proofInfluence = 'weighted'
|
|
2086
|
+
reasons.push(`Proof steering: ${routeLane.summary}`)
|
|
2087
|
+
} else if (routeLane.evidenceTier === 'caution') {
|
|
2088
|
+
if (recommendation.route !== 'manual-review' && routeLane.score <= -3 && (recommendation.route === 'generalize' || recommendation.route === 'evolve')) {
|
|
2089
|
+
route = 'manual-review'
|
|
2090
|
+
triggeredBy = 'mixed-signal'
|
|
2091
|
+
confidence = Math.max(0.66, confidence - 0.02)
|
|
2092
|
+
proofInfluence = 'weighted'
|
|
2093
|
+
reasons.push(`Proof steering: ${routeLane.summary} Governance now prefers explicit operator review before retrying ${recommendation.route}.`)
|
|
2094
|
+
} else {
|
|
2095
|
+
confidence = Math.max(0.4, confidence - 0.08)
|
|
2096
|
+
proofInfluence = 'weighted'
|
|
2097
|
+
reasons.push(`Proof steering: ${routeLane.summary}`)
|
|
2098
|
+
}
|
|
2099
|
+
} else {
|
|
2100
|
+
if (proofInfluence === 'none') proofInfluence = 'explanatory'
|
|
2101
|
+
reasons.push(`Proof steering: ${routeLane.summary}`)
|
|
2102
|
+
}
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
const conceptIds = uniqueStrings([...(recommendation.semanticConceptIds ?? []), ...semanticBindings.map((binding) => binding.conceptId)])
|
|
2106
|
+
const conceptLanes = conceptIds.map((conceptId) => proofSteering.byConceptId[conceptId]).filter(Boolean)
|
|
2107
|
+
if (conceptLanes.length > 0) {
|
|
2108
|
+
const strongestConceptLane = [...conceptLanes].sort((a, b) => proofTierWeight(b.evidenceTier) - proofTierWeight(a.evidenceTier) || Math.abs(b.score) - Math.abs(a.score))[0]
|
|
2109
|
+
if (strongestConceptLane) {
|
|
2110
|
+
proofLaneKeys.push(strongestConceptLane.laneKey)
|
|
2111
|
+
proofReasons.push(...strongestConceptLane.reasons.slice(0, 2))
|
|
2112
|
+
proofSummary = proofSummary ?? strongestConceptLane.summary
|
|
2113
|
+
proofTier = strongerProofTier(proofTier, strongestConceptLane.evidenceTier)
|
|
2114
|
+
if (strongestConceptLane.evidenceTier === 'trusted') {
|
|
2115
|
+
confidence = Math.min(0.95, confidence + 0.02)
|
|
2116
|
+
proofInfluence = 'weighted'
|
|
2117
|
+
reasons.push(`Proof steering: ${strongestConceptLane.summary}`)
|
|
2118
|
+
} else if (strongestConceptLane.evidenceTier === 'caution') {
|
|
2119
|
+
confidence = Math.max(0.4, confidence - 0.03)
|
|
2120
|
+
if (proofInfluence === 'none') proofInfluence = 'weighted'
|
|
2121
|
+
reasons.push(`Proof steering: ${strongestConceptLane.summary}`)
|
|
2122
|
+
} else {
|
|
2123
|
+
if (proofInfluence === 'none') proofInfluence = 'explanatory'
|
|
2124
|
+
reasons.push(`Proof steering: ${strongestConceptLane.summary}`)
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
return {
|
|
2130
|
+
...recommendation,
|
|
2131
|
+
route,
|
|
2132
|
+
confidence,
|
|
2133
|
+
triggeredBy,
|
|
2134
|
+
reasons: [...new Set(reasons)].slice(0, 8),
|
|
2135
|
+
proofInfluence,
|
|
2136
|
+
proofTier,
|
|
2137
|
+
proofSummary,
|
|
2138
|
+
proofReasons: [...new Set(proofReasons)].slice(0, 4),
|
|
2139
|
+
proofLaneKeys: [...new Set(proofLaneKeys)],
|
|
2140
|
+
}
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2143
|
+
type ProofSteeringLoadOptions = {
|
|
2144
|
+
includeProofSteering?: boolean
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2039
2147
|
function applyOntologyInfluenceToRoute(params: {
|
|
2040
2148
|
recommendation: PressureRouteRecommendation
|
|
2041
2149
|
signal: PressureSignal
|
|
@@ -2088,8 +2196,9 @@ function buildRouteRecommendation(params: {
|
|
|
2088
2196
|
governanceMode: GovernanceModeName
|
|
2089
2197
|
governanceProfile: GovernanceProfile
|
|
2090
2198
|
semanticBindings: ResolvedOntologyBinding[]
|
|
2199
|
+
proofSteering: import('./proof').ProofSteeringSummary | null
|
|
2091
2200
|
}): PressureRouteRecommendation {
|
|
2092
|
-
const { signal, relatedSignals, linkedInterventions, governanceMode, governanceProfile, semanticBindings } = params
|
|
2201
|
+
const { signal, relatedSignals, linkedInterventions, governanceMode, governanceProfile, semanticBindings, proofSteering } = params
|
|
2093
2202
|
const projectSpread = new Set(relatedSignals.map((entry) => entry.projectId ?? entry.projectPath).filter(Boolean)).size
|
|
2094
2203
|
const recurrenceCount = relatedSignals.length
|
|
2095
2204
|
const activeTypes = [...new Set(linkedInterventions.map((intervention) => intervention.interventionType))]
|
|
@@ -2175,12 +2284,19 @@ function buildRouteRecommendation(params: {
|
|
|
2175
2284
|
}
|
|
2176
2285
|
}
|
|
2177
2286
|
|
|
2178
|
-
|
|
2287
|
+
const ontologyAware = applyOntologyInfluenceToRoute({
|
|
2179
2288
|
recommendation,
|
|
2180
2289
|
signal,
|
|
2181
2290
|
semanticBindings,
|
|
2182
2291
|
governanceProfile,
|
|
2183
2292
|
})
|
|
2293
|
+
|
|
2294
|
+
return applyProofInfluenceToRoute({
|
|
2295
|
+
recommendation: ontologyAware,
|
|
2296
|
+
signal,
|
|
2297
|
+
semanticBindings,
|
|
2298
|
+
proofSteering,
|
|
2299
|
+
})
|
|
2184
2300
|
}
|
|
2185
2301
|
|
|
2186
2302
|
function interventionEvidenceAccepted(
|
|
@@ -2206,7 +2322,7 @@ function interventionKeepsPressureActive(impact: PressureInterventionImpact, sta
|
|
|
2206
2322
|
return impact === 'exploratory' || impact === 'structural' || impact === 'resolving'
|
|
2207
2323
|
}
|
|
2208
2324
|
|
|
2209
|
-
export function loadResolvedPressureSignals(): ResolvedPressureSignal[] {
|
|
2325
|
+
export function loadResolvedPressureSignals(options: ProofSteeringLoadOptions = {}): ResolvedPressureSignal[] {
|
|
2210
2326
|
const pressureSignals = loadPressureSignals()
|
|
2211
2327
|
const interventions = loadPressureInterventions()
|
|
2212
2328
|
const transferEvents = loadTransferEvents()
|
|
@@ -2214,6 +2330,7 @@ export function loadResolvedPressureSignals(): ResolvedPressureSignal[] {
|
|
|
2214
2330
|
const artifacts = loadEvolutionArtifacts()
|
|
2215
2331
|
const governance = deriveGovernanceSummary(pressureSignals, interventions)
|
|
2216
2332
|
const concepts = activeOntologyExtensions()
|
|
2333
|
+
const proofSteering = options.includeProofSteering === false ? null : loadProofSteeringSummary()
|
|
2217
2334
|
const acceptedProposalIds = new Set(
|
|
2218
2335
|
history.iterations.flatMap((iteration) => iteration.proposals)
|
|
2219
2336
|
.filter((proposal) => proposal.outcome === 'accepted')
|
|
@@ -2259,6 +2376,7 @@ export function loadResolvedPressureSignals(): ResolvedPressureSignal[] {
|
|
|
2259
2376
|
governanceMode: governance.activeMode,
|
|
2260
2377
|
governanceProfile: governance.profile,
|
|
2261
2378
|
semanticBindings,
|
|
2379
|
+
proofSteering,
|
|
2262
2380
|
})
|
|
2263
2381
|
|
|
2264
2382
|
const lifecycle: PressureLifecycleState = addressingInterventions.length > 0 || signal.status === 'addressed'
|
|
@@ -2304,8 +2422,8 @@ function projectRoleForSkill(skillId: string, graph: SkillGraph): CognitiveRole
|
|
|
2304
2422
|
return inferCognitiveRole(node)
|
|
2305
2423
|
}
|
|
2306
2424
|
|
|
2307
|
-
export function loadPressureMotifs(): ResolvedPressureMotif[] {
|
|
2308
|
-
const resolvedSignals = loadResolvedPressureSignals()
|
|
2425
|
+
export function loadPressureMotifs(options: ProofSteeringLoadOptions = {}): ResolvedPressureMotif[] {
|
|
2426
|
+
const resolvedSignals = loadResolvedPressureSignals(options)
|
|
2309
2427
|
const interventions = loadPressureInterventions()
|
|
2310
2428
|
const transferEvents = loadTransferEvents()
|
|
2311
2429
|
const governance = deriveGovernanceSummary()
|
|
@@ -2419,7 +2537,7 @@ export function loadPressureMotifs(): ResolvedPressureMotif[] {
|
|
|
2419
2537
|
})
|
|
2420
2538
|
}
|
|
2421
2539
|
|
|
2422
|
-
function collectOntologyAdoptionState(): { summary: OntologyAdoptionSummary, consumerMap: Map<string, OntologyConsumerSummary> } {
|
|
2540
|
+
function collectOntologyAdoptionState(options: ProofSteeringLoadOptions = {}): { summary: OntologyAdoptionSummary, consumerMap: Map<string, OntologyConsumerSummary> } {
|
|
2423
2541
|
const extensions = loadOntologyExtensions()
|
|
2424
2542
|
const activeExtensions = extensions.filter((concept) => concept.status === 'active')
|
|
2425
2543
|
const byConceptKind = ontologyKindCounts()
|
|
@@ -2458,7 +2576,7 @@ function collectOntologyAdoptionState(): { summary: OntologyAdoptionSummary, con
|
|
|
2458
2576
|
byConceptKind[concept.conceptKind] = (byConceptKind[concept.conceptKind] ?? 0) + 1
|
|
2459
2577
|
}
|
|
2460
2578
|
|
|
2461
|
-
const signals = loadResolvedPressureSignals()
|
|
2579
|
+
const signals = loadResolvedPressureSignals(options)
|
|
2462
2580
|
for (const signal of signals) {
|
|
2463
2581
|
for (const binding of signal.semanticBindings ?? []) registerBinding(binding)
|
|
2464
2582
|
if (signal.routeRecommendation?.semanticConceptIds?.length) {
|
|
@@ -2478,7 +2596,7 @@ function collectOntologyAdoptionState(): { summary: OntologyAdoptionSummary, con
|
|
|
2478
2596
|
}
|
|
2479
2597
|
}
|
|
2480
2598
|
|
|
2481
|
-
for (const motif of loadPressureMotifs()) {
|
|
2599
|
+
for (const motif of loadPressureMotifs(options)) {
|
|
2482
2600
|
for (const binding of motif.semanticBindings ?? []) registerBinding(binding)
|
|
2483
2601
|
}
|
|
2484
2602
|
|
|
@@ -2517,13 +2635,13 @@ function collectOntologyAdoptionState(): { summary: OntologyAdoptionSummary, con
|
|
|
2517
2635
|
}
|
|
2518
2636
|
}
|
|
2519
2637
|
|
|
2520
|
-
export function getOntologyAdoptionSummary(): OntologyAdoptionSummary {
|
|
2521
|
-
return collectOntologyAdoptionState().summary
|
|
2638
|
+
export function getOntologyAdoptionSummary(options: ProofSteeringLoadOptions = {}): OntologyAdoptionSummary {
|
|
2639
|
+
return collectOntologyAdoptionState(options).summary
|
|
2522
2640
|
}
|
|
2523
2641
|
|
|
2524
|
-
export function loadResolvedOntologyExtensions(): ResolvedOntologyExtension[] {
|
|
2642
|
+
export function loadResolvedOntologyExtensions(options: ProofSteeringLoadOptions = {}): ResolvedOntologyExtension[] {
|
|
2525
2643
|
const extensions = loadOntologyExtensions()
|
|
2526
|
-
const { consumerMap } = collectOntologyAdoptionState()
|
|
2644
|
+
const { consumerMap } = collectOntologyAdoptionState(options)
|
|
2527
2645
|
return extensions
|
|
2528
2646
|
.map((concept) => {
|
|
2529
2647
|
const consumer = consumerMap.get(concept.id)
|