From 53b18e30dffdcc7b1d716798ad965ded66aff65c Mon Sep 17 00:00:00 2001 From: Cyber Preacher <72062250+Cyber-preacher@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:35:28 +0400 Subject: [PATCH 1/4] Render Invision system state details --- src/pages/invision/Invision.tsx | 50 +++++++++++++++++++++++++++------ src/types/api.ts | 3 ++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/pages/invision/Invision.tsx b/src/pages/invision/Invision.tsx index 349b059..cf7193f 100644 --- a/src/pages/invision/Invision.tsx +++ b/src/pages/invision/Invision.tsx @@ -47,6 +47,15 @@ function toneForRiskStatus(status: string) { return "primary"; } +function toneForSystemState( + tone?: GetInvisionResponse["governanceState"]["tone"], +) { + if (tone === "critical") return "danger"; + if (tone === "strong" || tone === "stable") return "ok"; + if (tone === "watch") return "warn"; + return "neutral"; +} + function EngineSection({ engine, title, @@ -59,7 +68,7 @@ function EngineSection({ {engine.confidence}% · {engine.confidenceBand} @@ -184,13 +193,38 @@ const Invision: React.FC = () => { ) : null} - -

- Governance model -

-

- {invision?.governanceState.label ?? "—"} -

+ +
+
+

+ Governance model +

+

+ {invision?.governanceState.label ?? "—"} +

+ {invision?.governanceState.summary ? ( +

+ {invision.governanceState.summary} +

+ ) : null} +
+ + {invision?.governanceState.tone ?? "unknown"} + +
+ {(invision?.governanceState.drivers ?? []).length > 0 ? ( + + {(invision?.governanceState.drivers ?? []).map((driver) => ( + + ))} + + ) : null}
{primaryGovernanceMetrics.map((metric) => ( diff --git a/src/types/api.ts b/src/types/api.ts index 5811815..529d38c 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -362,6 +362,9 @@ export type GetFormationResponse = { export type InvisionGovernanceMetricDto = { label: string; value: string }; export type InvisionGovernanceStateDto = { label: string; + tone?: "critical" | "watch" | "stable" | "strong" | "unknown"; + summary?: string; + drivers?: string[]; metrics: InvisionGovernanceMetricDto[]; }; export type InvisionStabilityComponentDto = { From 4f931dbabf895c437e47228ce9aa012507ea66e0 Mon Sep 17 00:00:00 2001 From: Cyber Preacher <72062250+Cyber-preacher@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:06:16 +0400 Subject: [PATCH 2/4] Clarify Invision score and evidence coverage --- src/pages/invision/Invision.tsx | 43 +++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/pages/invision/Invision.tsx b/src/pages/invision/Invision.tsx index cf7193f..1818bb9 100644 --- a/src/pages/invision/Invision.tsx +++ b/src/pages/invision/Invision.tsx @@ -32,14 +32,18 @@ function toneForScore(tone: InvisionStabilityComponentDto["tone"]) { return "ok"; } -function toneForConfidence(engine: EngineDto): StatusTone { - if (engine.confidenceBand === "High" || engine.confidence >= 75) return "ok"; - if (engine.confidenceBand === "Medium" || engine.confidence >= 50) { - return "warn"; - } +function toneForHealthScore(score: number): StatusTone { + if (score >= 67) return "ok"; + if (score >= 34) return "warn"; return "danger"; } +function toneForMetricValue(value: string): StatusTone { + const percentValue = Number(value.replace("%", "").trim()); + if (!Number.isFinite(percentValue)) return "neutral"; + return toneForHealthScore(percentValue); +} + function toneForRiskStatus(status: string) { const normalized = status.trim().toLowerCase(); if (normalized === "critical") return "danger"; @@ -65,12 +69,27 @@ function EngineSection({ }) { return ( - - + + + {engine.score}% + + } + /> + + {engine.band} + + } + /> + {engine.confidence}% · {engine.confidenceBand} } @@ -231,7 +250,11 @@ const Invision: React.FC = () => { + {metric.value} + + } /> ))} From 44ba0b0bdbb0a8f8875123e2775e4a163fa566c9 Mon Sep 17 00:00:00 2001 From: Cyber Preacher <72062250+Cyber-preacher@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:31:02 +0400 Subject: [PATCH 3/4] Restore Invision system state header --- src/pages/invision/Invision.tsx | 48 +++++---------------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/src/pages/invision/Invision.tsx b/src/pages/invision/Invision.tsx index 1818bb9..f96c9f3 100644 --- a/src/pages/invision/Invision.tsx +++ b/src/pages/invision/Invision.tsx @@ -51,15 +51,6 @@ function toneForRiskStatus(status: string) { return "primary"; } -function toneForSystemState( - tone?: GetInvisionResponse["governanceState"]["tone"], -) { - if (tone === "critical") return "danger"; - if (tone === "strong" || tone === "stable") return "ok"; - if (tone === "watch") return "warn"; - return "neutral"; -} - function EngineSection({ engine, title, @@ -212,38 +203,13 @@ const Invision: React.FC = () => { ) : null} - -
-
-

- Governance model -

-

- {invision?.governanceState.label ?? "—"} -

- {invision?.governanceState.summary ? ( -

- {invision.governanceState.summary} -

- ) : null} -
- - {invision?.governanceState.tone ?? "unknown"} - -
- {(invision?.governanceState.drivers ?? []).length > 0 ? ( - - {(invision?.governanceState.drivers ?? []).map((driver) => ( - - ))} - - ) : null} + +

+ Governance model +

+

+ {invision?.governanceState.label ?? "—"} +

{primaryGovernanceMetrics.map((metric) => ( From 3ad17d4de3b0f8b1e32ba87eb95e8521e120e0eb Mon Sep 17 00:00:00 2001 From: Cyber Preacher <72062250+Cyber-preacher@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:42:02 +0400 Subject: [PATCH 4/4] Explain Invision band --- src/data/vortexopedia.ts | 31 ++++++++++++++++++++++ src/pages/invision/Invision.tsx | 2 +- tests/unit/phase89-visual-contract.test.ts | 3 ++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/data/vortexopedia.ts b/src/data/vortexopedia.ts index c0f236c..7884650 100644 --- a/src/data/vortexopedia.ts +++ b/src/data/vortexopedia.ts @@ -1209,6 +1209,37 @@ export const vortexopediaTerms: VortexopediaTerm[] = [ source: "Discussion", updated: "2025-12-04", }, + { + ref: 43.1, + id: "invision_band", + name: "Invision band", + category: "governance", + short: + "A readable health label for an Invision score, grouping the raw percentage into a low, medium, or high condition.", + long: [ + "Invision engines calculate raw scores for system dimensions such as decentralization and stability.", + "The band translates that percentage into a quick status label so a user can scan the system without interpreting every component immediately.", + "The band does not replace the score. The score is the numerical result; the band is the human-readable bucket for that result.", + ], + tags: ["invision", "system_health", "score", "status", "band"], + related: [ + "gradual_decentralization", + "constant_deterrence", + "legitimacy_referendum", + ], + examples: [ + "A stability score of 28% can sit in a low band, while a score near 80% can sit in a high band.", + ], + stages: ["global"], + links: [ + { + label: "Invision", + url: "/app/invision", + }, + ], + source: "App UX: Invision system health", + updated: "2026-06-19", + }, { ref: 44, id: "voter_apathy", diff --git a/src/pages/invision/Invision.tsx b/src/pages/invision/Invision.tsx index f96c9f3..b9c307c 100644 --- a/src/pages/invision/Invision.tsx +++ b/src/pages/invision/Invision.tsx @@ -70,7 +70,7 @@ function EngineSection({ } /> Band} value={ {engine.band} diff --git a/tests/unit/phase89-visual-contract.test.ts b/tests/unit/phase89-visual-contract.test.ts index 5c1b67d..e7a1442 100644 --- a/tests/unit/phase89-visual-contract.test.ts +++ b/tests/unit/phase89-visual-contract.test.ts @@ -46,7 +46,8 @@ test("Phase 89 static visual contract covers public entry routes", () => { assert.match(guide, /The two UX primitives: hints and stages/); assert.match(vortexopedia, /Search terms/); - assert.match(vortexopedia, /Showing 56 \/ 56 entries/); + assert.match(vortexopedia, /Showing 57 \/ 57 entries/); + assert.match(vortexopedia, /Invision band/); assert.match(vortexopedia, /Vortex/); });