From 0e6016ecacd3f1fd831b886a7ee6a1164953387e Mon Sep 17 00:00:00 2001 From: "@chitcommit" <208086304+chitcommit@users.noreply.github.com> Date: Wed, 14 Oct 2026 01:37:31 -0500 Subject: [PATCH 1/3] feat(ui): add read-only AETHER governance observation page --- ui/src/pages/AetherGovernance.tsx | 119 ++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 ui/src/pages/AetherGovernance.tsx diff --git a/ui/src/pages/AetherGovernance.tsx b/ui/src/pages/AetherGovernance.tsx new file mode 100644 index 0000000..6e9df9d --- /dev/null +++ b/ui/src/pages/AetherGovernance.tsx @@ -0,0 +1,119 @@ +import { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; +import { api, type ServiceStatus, type Task } from '../lib/api'; +import { ShieldCheck, ShieldAlert, Database, Activity, BookOpen } from 'lucide-react'; + +/** + * AETHER is an OBSERVATION-ONLY projection. It does not attest Canon state, + * authorize a tool call, issue capabilities, or bypass an executor. + * ADR-0024 acceptance tests and external telemetry are not yet wired here. + */ +export function AetherGovernance() { + const [services, setServices] = useState(null); + const [tasks, setTasks] = useState(null); + const [errors, setErrors] = useState([]); + const [loading, setLoading] = useState(true); + const [observedAt, setObservedAt] = useState(null); + + useEffect(() => { + let active = true; + const load = async () => { + const [serviceResult, taskResult] = await Promise.allSettled([ + api.getBridgeStatus(), api.getTasks({ limit: 100 }), + ]); + if (!active) return; + const failures: string[] = []; + if (serviceResult.status === 'fulfilled') setServices(serviceResult.value.services); + else failures.push('Service connections unavailable'); + if (taskResult.status === 'fulfilled') setTasks(taskResult.value.tasks); + else failures.push('Task feed unavailable'); + setErrors(failures); + setObservedAt(new Date().toISOString()); + setLoading(false); + }; + void load(); + return () => { active = false; }; + }, []); + + const connected = services?.filter((item) => item.status === 'ok').length ?? 0; + const outstanding = tasks?.filter((task) => !['done', 'verified'].includes(task.backend_status)).length ?? 0; + const panels = [ + { + label: 'ChittyOS service connections', + value: services === null ? 'Unavailable' : `${connected} / ${services.length} reporting OK`, + detail: 'Existing bridge-status API. A healthy connection does not establish authorization.', + icon: Activity, + }, + { + label: 'Tasks in returned page', + value: tasks === null ? 'Unavailable' : String(tasks.length), + detail: 'Read-only view of the first 100 tasks; not a complete event ledger.', + icon: BookOpen, + }, + { + label: 'Non-terminal tasks in page', + value: tasks === null ? 'Unavailable' : String(outstanding), + detail: 'Status only. Completion or verification requires independently linked evidence.', + icon: Database, + }, + ]; + + return ( +
+
+

AETHER / ADR-0024

+

Governance Observation

+

+ Read-only projection of existing ChittyCommand services and tasks. No execution, + approvals, cryptographic validation, epistemic promotion, or retrieval federation. +

+
+ +
+
+ Safety assurance NOT VERIFIED +
+

+ ADR-0024 is an approved architectural design, not proof that Ed25519 capability checks, + Canon revision pinning, per-person AI Search isolation, Ralph Loop stop hooks, + fail-closed enforcement, or durable outbox execution have passed production tests. + Control-plane write actions are intentionally absent. +

+
+ +
+ {panels.map(({ label, value, detail, icon: Icon }) => ( +
+
{label}
+

{loading ? 'Loading' : value}

+

{detail}

+
+ ))} +
+ + {errors.length > 0 && ( +
+ {errors.join('; ')}. Missing data is never treated as a passing check. +
+ )} + +
+

Control contract

+
+

TY โ€” identity: resolve a Canon P before a protected operation.

+

VY โ€” connectivity: service health is observational, not permission.

+

RY โ€” authority: real PEP verifies scoped capability before any side effect.

+

Memory: per-P AI Search is an isolation target, not established by this page.

+

Epistemics: retrieved material remains untrusted until independently verified.

+

Ralph: bounded retry and stop hooks require executable proof, not UI simulation.

+
+
+ +

+ Observation timestamp: {observedAt ?? 'Not available'} ยท Data originates from existing authenticated read APIs. + For task details use the Task Board. + This page does not claim an audit-grade or real-time telemetry stream. +

+
+ ); +} From 7b75df258898d60a88367e4b654780cc1c8dd7f2 Mon Sep 17 00:00:00 2001 From: "@chitcommit" <208086304+chitcommit@users.noreply.github.com> Date: Wed, 14 Oct 2026 01:37:43 -0500 Subject: [PATCH 2/3] feat(ui): route AETHER read-only governance view --- ui/src/main.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/src/main.tsx b/ui/src/main.tsx index e2e477e..1f5c080 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -12,6 +12,7 @@ import { Upload } from './pages/Upload'; import { CashFlow } from './pages/CashFlow'; import { Recommendations } from './pages/Recommendations'; import { Settings } from './pages/Settings'; +import { AetherGovernance } from './pages/AetherGovernance'; import { ActionQueue } from './pages/ActionQueue'; import { Evidence } from './pages/Evidence'; import { Tasks } from './pages/Tasks'; @@ -47,6 +48,7 @@ ReactDOM.createRoot(document.getElementById('root')!).render( } /> } /> } /> + } /> From 1dcfccfdffe545af324c95a0b570c7bf2fb8a6a6 Mon Sep 17 00:00:00 2001 From: "@chitcommit" <208086304+chitcommit@users.noreply.github.com> Date: Wed, 14 Oct 2026 01:37:45 -0500 Subject: [PATCH 3/3] feat(ui): route AETHER read-only governance view --- ui/src/components/Sidebar.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/components/Sidebar.tsx b/ui/src/components/Sidebar.tsx index ba57c0f..70e64d5 100644 --- a/ui/src/components/Sidebar.tsx +++ b/ui/src/components/Sidebar.tsx @@ -2,7 +2,7 @@ import { NavLink } from 'react-router-dom'; import { cn } from '../lib/utils'; import { LayoutDashboard, Zap, Receipt, ShieldAlert, Wallet, Scale, Gavel, - Lightbulb, TrendingUp, Upload, Settings, LogOut, BookOpen, ListChecks, + Lightbulb, TrendingUp, Upload, Settings, LogOut, BookOpen, ListChecks, ShieldCheck, } from 'lucide-react'; import { logout, getUser } from '../lib/auth'; @@ -46,6 +46,7 @@ const navGroups: NavGroup[] = [ label: 'System', items: [ { path: '/upload', label: 'Documents', icon: Upload }, + { path: '/aether', label: 'AETHER Governance', icon: ShieldCheck }, { path: '/settings', label: 'Settings', icon: Settings }, ], },