Orchestrata Ultimate › Plans › plan_vizint_implementation › implementation-plan
VizInt Command Center — Detailed Implementation Plan
Source: plans/plan_vizint_implementation/implementation-plan.md at 8a2cb42ad · last changed 2026-07-27 · first committed 2026-05-26 · 1041 lines.
Prose pending.
Plan text
VizInt Command Center — Detailed Implementation Plan
Spec: 016-vizint-command-center
Status: Gap Analysis Complete → Implementation Planned
Plan Version: 1.0.0
Created: 2026-05-26
Estimated Duration: 8–10 weeks (1 engineer full-time)
Parallelizable: Phases 0–1 can overlap; Phases 2–4 have internal parallel tracks
Table of Contents
- Executive Summary
- Current State Snapshot
- Phase 0: Foundation & Backend Hardening
- Phase 1: Portal Framework Core
- Phase 2: P1 Production Gadgets (Batch A)
- Phase 3: P1 Production Gadgets (Batch B) + Gateway Integration
- Phase 4: P2 Gadgets & Personal Productivity
- Phase 5: Testing, Compliance & Performance
- Appendix A: Dependency Graph
- Appendix B: Risk Register
- Appendix C: Definition of Done
- Appendix D: Traceability Matrix
1. Executive Summary
Problem
The VizInt Command Center (Spec 016) is the unified dashboard for Orchestrata. The backend gateway handlers exist but the entire JavaScript frontend is missing from the repository. Additionally:
- A conflicting older spec (051) describes a different architecture (FastAPI + HTMX)
- Gateway
SessionHandler.handle_active()returns hardcoded mock data - 117 of 294 requirements are incomplete (40% gap)
- 0% constitutional compliance verified
- No contract tests between frontend expectations and backend RPC schemas
Solution
Implement the frontend in 5 phases over 8–10 weeks:
| Phase | Focus | Duration | Deliverable |
|---|---|---|---|
| 0 | Spec consolidation, backend hardening, contract tests | Week 1 | Clean spec, real backend data, verified RPC schemas |
| 1 | Portal framework (bridge, bus, registry, chrome, sync) | Weeks 1–3 | vizint-ui/ with core framework + 59 unit tests passing |
| 2 | P1 Gadgets Batch A (ProjectExplorer, SessionManager, CXPFeed, VolkStatus) | Weeks 3–5 | 4 core gadgets with real data |
| 3 | P1 Gadgets Batch B (ClaudeChat, TaskBoard, QADashboard, AuditTrail) + Gateway hardening | Weeks 5–7 | 4 more gadgets + real Neo4j queries |
| 4 | P2 Gadgets (KGExplorer, NotificationCenter, Personal gadgets) | Weeks 7–8 | Remaining gadgets |
| 5 | E2E tests, constitutional compliance, performance | Weeks 8–10 | Full test suite, compliance audit, perf budget |
Success Criteria
- All 294 requirements in
specs/016-vizint-command-center/checklists/requirements.mdmarked[x] - Constitutional compliance ≥ 90% (128/142 items)
- Test coverage: 59 unit tests + 8 contract + 8 integration + 5 perf + 11 E2E = 91 tests minimum
- Performance: initial render < 100ms, WebSocket reconnect < 3s, memory < 100MB (10 gadgets)
- Frontend code committed to
vizint-ui/with its ownpackage.json, Vitest, Playwright
2. Current State Snapshot
What Exists ✅
src/orchestrata_ultimate/gateway/
├── handlers/session.py # SessionHandler — 7 RPC methods (stubbed active)
├── handlers/projects.py # ProjectsHandler — 4 RPC methods (real Neo4j)
├── handlers/volk.py # VolkHandler — list, lifecycle
├── handlers/cxp.py # CXPFeed handler
├── handlers/knowledge.py # Knowledge graph queries
├── handlers/governance.py # Governance decisions
├── rpc.py # RPC router wiring all handlers
├── server.py # WebSocket server (SPEC-014)
└── pubsub.py # Pub/sub subscription manager
What Is Missing ❌
vizint-ui/ # ENTIRE DIRECTORY MISSING
├── index.html # Entry point with import maps
├── app.js # CommandCenterApp
├── lib/
│ ├── portal.js # Gadget lifecycle
│ ├── bus.js # EventBus (CustomEvents)
│ ├── registry.js # Dynamic ES module loading
│ ├── chrome.js # Gadget window chrome
│ ├── shared.js # Utilities (debounce, formatTimestamp)
│ ├── atlas.js # Geolocation
│ └── chronus.js # Time engine
├── bridge/
│ ├── websocket-bridge.js # JSON-RPC 2.0 over WS
│ ├── gadget-bridge.js # bus <-> RPC translation
│ ├── state-sync.js # localStorage + remote sync
│ └── notification-manager.js # Desktop + in-app notifications
├── gadgets/ # 31 gadgets (ALL MISSING)
├── styles/
│ ├── common.css # CSS variables, themes
│ └── command-center.css # Layout, chrome, badges
├── providers/ # Chronus providers
├── configs/
│ └── command-center.json # Runtime config
└── tests/
├── vitest.config.js
├── unit/ # 48 unit tests
├── e2e/ # 11 Playwright tests
└── helpers/ws-test-server.js # Mock JSON-RPC server
Phase 0: Foundation & Backend Hardening
Duration: Week 1
Goal: Eliminate blockers before frontend development starts
Parallelizable: Yes — backend tasks can run alongside Phase 1 scaffolding
0.1 Deprecate SPEC-051
Task: Consolidate the two VizInt specs into one canonical source of truth.
| # | Task | Time | Owner | Verification |
|---|---|---|---|---|
| 0.1.1 | Add deprecation notice to specs/051-vizint-ui/spec.md header |
15 min | Any | File committed |
| 0.1.2 | Move any unique FRs from SPEC-051 into SPEC-016 as "Historical Notes" appendix | 1 hr | Any | SPEC-016 updated |
| 0.1.3 | Update RTM to point all vizint requirements to SPEC-016 only | 30 min | Any | grep -c 051 rtm/ returns 0 |
| 0.1.4 | Delete or archive specs/051-vizint-ui/compliance-audit.md |
15 min | Any | File moved to archive/ |
Deliverable: Single canonical spec (016). No references to 051 in active docs.
0.2 Harden Gateway SessionHandler
Task: Remove hardcoded mock data from gateway/handlers/session.py.
| # | Task | Time | Owner | Verification |
|---|---|---|---|---|
| 0.2.1 | Audit SessionHandler.handle_active() — replace hardcoded session with Neo4j query |
2 hr | Backend | Returns real active session or null |
| 0.2.2 | Audit SessionHandler.handle_list() — verify Neo4j pagination |
1 hr | Backend | Returns paginated session list |
| 0.2.3 | Audit SessionHandler.handle_get() — verify session lookup by ID |
1 hr | Backend | Returns session with context/facts |
| 0.2.4 | Audit SessionHandler.handle_open() — wire to SessionController.begin() |
2 hr | Backend | Creates real session, returns session_id |
| 0.2.5 | Audit SessionHandler.handle_close() — wire to SessionController.end() |
2 hr | Backend | Closes session, persists summary |
| 0.2.6 | Add @traces(spec="016", ...) to all handler methods missing traceability |
30 min | Backend | code-review.py --min-severity ERROR passes |
Deliverable: All 7 session RPC methods return real data from Neo4j/SessionController.
0.3 Write Contract Tests
Task: Create schema-validated contract tests that pin frontend expectations to backend behavior.
| # | Task | Time | Owner | Verification |
|---|---|---|---|---|
| 0.3.1 | Define JSON schemas for all 11 gateway RPC methods (session.* + projects.*) | 2 hr | Backend | Schemas in vizint-ui/tests/contracts/ |
| 0.3.2 | Write contract tests: session.list request/response round-trip |
1 hr | Backend | Test passes against real gateway |
| 0.3.3 | Write contract tests: session.get, session.open, session.close |
1 hr | Backend | All pass |
| 0.3.4 | Write contract tests: projects.list, projects.get, projects.tasks, projects.taskCreate |
1 hr | Backend | All pass |
| 0.3.5 | Write contract tests: volk.list, cxp.traffic, knowledge.query |
1 hr | Backend | All pass |
| 0.3.6 | Add contract test CI step to GitHub Actions | 30 min | Backend | Runs on every PR |
Deliverable: 8 contract tests passing. Schemas are the API contract between frontend and backend.
0.4 Create vizint-ui/ Scaffold
Task: Set up the frontend directory structure and toolchain.
| # | Task | Time | Owner | Verification |
|---|---|---|---|---|
| 0.4.1 | Create vizint-ui/package.json with Vitest + Playwright + ESLint |
30 min | Frontend | npm install succeeds |
| 0.4.2 | Create vizint-ui/vitest.config.js (jsdom, ES modules, coverage) |
30 min | Frontend | npm test runs |
| 0.4.3 | Create vizint-ui/playwright.config.js (Firefox, baseURL from env) |
30 min | Frontend | npx playwright test runs |
| 0.4.4 | Create vizint-ui/.eslintrc.json (strict rules per CONST-VI) |
30 min | Frontend | npm run lint runs |
| 0.4.5 | Create directory skeleton (lib/, bridge/, gadgets/, styles/, tests/) | 15 min | Frontend | find vizint-ui -type d matches spec |
| 0.4.6 | Add vizint-ui/ to root .gitignore for node_modules/, coverage/ |
5 min | Frontend | Ignored correctly |
Deliverable: vizint-ui/ is a runnable Node.js project with test tooling.
Phase 0 Exit Criteria
- [ ] SPEC-051 deprecation notice committed
- [ ]
SessionHandler.handle_active()returns real Neo4j data (no hardcoded values) - [ ] 8 contract tests pass against real gateway
- [ ]
vizint-ui/directory scaffolded withnpm install,npm test,npm run e2eall working - [ ] Gateway handlers have
@traceson all public methods
Phase 1: Portal Framework Core
Duration: Weeks 1–3
Goal: Implement the core infrastructure that all gadgets depend on
Risk: Low — these are well-specified utility modules with clear interfaces
1.1 Shared Utilities (lib/shared.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.1.1 | generateId() — UUID v4 |
15 min | Frontend | TEST-UNIT-045, 046 | REQ-016-265 |
| 1.1.2 | debounce(fn, ms) — cancelable |
15 min | Frontend | TEST-UNIT-047 | REQ-016-275 |
| 1.1.3 | formatTimestamp(iso) — human-readable |
15 min | Frontend | TEST-UNIT-048 | REQ-016-265 |
| 1.1.4 | throttle(fn, ms) — for scroll/resize |
30 min | Frontend | New | NFR-001 |
| 1.1.5 | clamp(val, min, max) — utility |
10 min | Frontend | New | — |
| 1.1.6 | escapeHtml(str) — XSS prevention |
30 min | Frontend | New | FR-016 |
Deliverable: lib/shared.js with 100% unit test coverage.
1.2 EventBus (lib/bus.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.2.1 | emit(type, detail) — dispatch CustomEvent with vizint: prefix |
30 min | Frontend | TEST-UNIT-001 | REQ-016-265 |
| 1.2.2 | on(type, handler) — subscribe |
30 min | Frontend | TEST-UNIT-002 | REQ-016-265 |
| 1.2.3 | off(type, handler) — unsubscribe |
30 min | Frontend | TEST-UNIT-003 | REQ-016-265 |
| 1.2.4 | once(type, handler) — auto-remove after first fire |
30 min | Frontend | TEST-UNIT-004 | REQ-016-265 |
| 1.2.5 | addEventListener/removeEventListener DOM API compatibility |
30 min | Frontend | TEST-UNIT-005, 006 | REQ-016-266 |
| 1.2.6 | destroy() — remove all listeners |
30 min | Frontend | TEST-UNIT-007 | REQ-016-271 |
| 1.2.7 | Wildcard subscriptions (vizint:session.*) |
1 hr | Frontend | New | REQ-016-267 |
Deliverable: lib/bus.js — 8 unit tests passing.
1.3 WebSocketBridge (bridge/websocket-bridge.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.3.1 | connect(url, auth) — open WS, send auth |
1 hr | Frontend | TEST-UNIT-009 | REQ-016-258, 261 |
| 1.3.2 | call(method, params) — JSON-RPC 2.0 request/response |
1 hr | Frontend | TEST-UNIT-010, 011 | REQ-016-258 |
| 1.3.3 | subscribe(topic, filters, callback) — subscription RPC |
1 hr | Frontend | TEST-UNIT-016 | REQ-016-262 |
| 1.3.4 | unsubscribe(subId) — remove subscription |
30 min | Frontend | TEST-UNIT-017 | REQ-016-262 |
| 1.3.5 | Auto-reconnect with exponential backoff (1s, 2s, 4s, max 30s) | 2 hr | Frontend | TEST-UNIT-012, 013 | REQ-016-259 |
| 1.3.6 | Connection state tracking (connected/reconnecting/disconnected) |
1 hr | Frontend | TEST-UNIT-014, 015 | FR-001 |
| 1.3.7 | Request queue during disconnect (max 100, oldest discarded) | 1 hr | Frontend | TEST-UNIT-018, 019 | FR-001 |
| 1.3.8 | RPC timeout handling (reject after 10s) | 1 hr | Frontend | TEST-UNIT-020 | FR-001 |
| 1.3.9 | onStateChange(listener) — multiple listeners |
30 min | Frontend | New | FR-001 |
| 1.3.10 | Correlation IDs (cc-req-{counter}) on all RPC calls |
30 min | Frontend | New | CONST-VIII-013 |
Deliverable: bridge/websocket-bridge.js — 12 unit tests passing.
1.4 StateSync (bridge/state-sync.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.4.1 | get(key) — read from localStorage |
30 min | Frontend | TEST-UNIT-021 | FR-002 |
| 1.4.2 | set(key, value) — write to localStorage + debounced gateway sync |
1 hr | Frontend | TEST-UNIT-022, 024 | FR-002 |
| 1.4.3 | delete(key) — remove from both |
30 min | Frontend | TEST-UNIT-023 | FR-002 |
| 1.4.4 | pullRemote() — fetch from gateway |
1 hr | Frontend | TEST-UNIT-025 | FR-002 |
| 1.4.5 | pushLocal() — send to gateway |
1 hr | Frontend | TEST-UNIT-026 | FR-002 |
| 1.4.6 | Last-write-wins conflict resolution | 1 hr | Frontend | TEST-UNIT-027 | FR-002 |
| 1.4.7 | Key namespacing (commandcenter.state.*) |
30 min | Frontend | TEST-UNIT-028 | CONST-X-006 |
| 1.4.8 | Fallback to localStorage-only when gateway disconnected | 30 min | Frontend | New | FR-002 |
Deliverable: bridge/state-sync.js — 8 unit tests passing.
1.5 GadgetRegistry (lib/registry.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.5.1 | register(manifest) — validate manifest schema |
1 hr | Frontend | TEST-UNIT-036, 040 | FR-004 |
| 1.5.2 | load(id, basePath) — dynamic import() of ES module |
1 hr | Frontend | TEST-UNIT-037 | FR-004 |
| 1.5.3 | resolveDependencies(id) — ensure deps loaded before mount |
1 hr | Frontend | New | FR-004 |
| 1.5.4 | unload(id) — remove from DOM and memory |
30 min | Frontend | New | FR-004 |
| 1.5.5 | Error handling for invalid manifests | 30 min | Frontend | TEST-UNIT-039 | FR-004 |
| 1.5.6 | basePath resolution for gadget entry points |
30 min | Frontend | TEST-UNIT-038 | FR-004 |
Deliverable: lib/registry.js — 5+ unit tests passing.
1.6 Gadget Chrome (lib/chrome.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.6.1 | create(gadgetId, title) — build titlebar + body container |
1 hr | Frontend | TEST-UNIT-041 | FR-007 |
| 1.6.2 | Minimize button — toggle body visibility | 30 min | Frontend | TEST-UNIT-042 | FR-007 |
| 1.6.3 | Close button — trigger unmount | 30 min | Frontend | TEST-UNIT-043 | FR-007 |
| 1.6.4 | Status bar — render connection info | 30 min | Frontend | TEST-UNIT-044 | FR-007 |
| 1.6.5 | Resize handles — mouse drag to resize | 1 hr | Frontend | New | US-012 |
| 1.6.6 | Extension slot — custom buttons in titlebar | 1 hr | Frontend | New | CONST-IV-009 |
Deliverable: lib/chrome.js — 4+ unit tests passing.
1.7 GadgetBridge (bridge/gadget-bridge.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.7.1 | mapEventToRPC(busEvent, rpcMethod, paramsMapper) |
1 hr | Frontend | New | FR-003 |
| 1.7.2 | mapSubscriptionToEvent(topic, busEvent, payloadMapper) |
1 hr | Frontend | New | FR-003 |
| 1.7.3 | call(method, params) — proxy to WebSocketBridge |
30 min | Frontend | New | FR-003 |
| 1.7.4 | subscribe(topic, filters, callback) — proxy to WebSocketBridge |
30 min | Frontend | New | FR-003 |
| 1.7.5 | Namespace mapping: session.*, cxp.*, volk.*, knowledge.*, governance.* |
1 hr | Frontend | New | FR-003 |
| 1.7.6 | Bidirectional event translation | 1 hr | Frontend | New | FR-003 |
Deliverable: bridge/gadget-bridge.js — tested via integration.
1.8 NotificationManager (bridge/notification-manager.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.8.1 | Subscribe to governance.decisions |
30 min | Frontend | TEST-UNIT-029 | FR-005 |
| 1.8.2 | Subscribe to kernel.events (severity ≥ warning) |
30 min | Frontend | TEST-UNIT-030 | FR-005 |
| 1.8.3 | Subscribe to session.events (type = decision_needed) |
30 min | Frontend | TEST-UNIT-031 | FR-005 |
| 1.8.4 | Priority ordering: info < warning < error < critical | 30 min | Frontend | TEST-UNIT-032 | FR-005 |
| 1.8.5 | Desktop notification via Notification API | 1 hr | Frontend | TEST-UNIT-033 | FR-005 |
| 1.8.6 | Max 200 notifications stored (oldest discarded) | 30 min | Frontend | TEST-UNIT-034 | FR-005 |
| 1.8.7 | Unread count tracking | 30 min | Frontend | TEST-UNIT-035 | FR-005 |
| 1.8.8 | Click-to-navigate to relevant gadget | 1 hr | Frontend | New | US-010 |
| 1.8.9 | "Mark all read" and per-notification dismiss | 30 min | Frontend | New | US-010 |
Deliverable: bridge/notification-manager.js — 7+ unit tests passing.
1.9 CommandCenterApp (app.js)
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.9.1 | initialize(config) — bootstrap 5 subsystems |
1 hr | Frontend | E2E | FR-001–007 |
| 1.9.2 | mountDefaultLayout() — load default profile gadgets |
1 hr | Frontend | E2E | US-012 |
| 1.9.3 | Theme system — light/dark toggle, system pref detection | 2 hr | Frontend | E2E | FR-006 |
| 1.9.4 | Layout profiles — Development (5 gadgets), Monitoring (4 gadgets) | 2 hr | Frontend | E2E | US-012 |
| 1.9.5 | Connection status indicator in header | 1 hr | Frontend | E2E | FR-001 |
| 1.9.6 | shutdown() — disconnect, persist, unmount |
1 hr | Frontend | New | FR-001 |
Deliverable: app.js — E2E tests for page load, header, theme, layout, connection status.
1.10 HTML Entry Point & Styles
| # | Task | Time | Owner | Tests | Req IDs |
|---|---|---|---|---|---|
| 1.10.1 | index.html — import maps, zero-build ES modules, no bundler |
1 hr | Frontend | E2E | FR-001 |
| 1.10.2 | styles/common.css — CSS custom properties, light/dark themes |
2 hr | Frontend | Visual | FR-006 |
| 1.10.3 | styles/command-center.css — grid layout, header, gadget chrome |
2 hr | Frontend | Visual | US-012 |
| 1.10.4 | System preference detection (prefers-color-scheme) |
30 min | Frontend | E2E | FR-006 |
| 1.10.5 | No flash of unstyled content (theme applied before first paint) | 30 min | Frontend | E2E | FR-006 |
Deliverable: index.html loads in browser with correct theme, grid, and header.
Phase 1 Exit Criteria
- [ ] All 59 unit tests from
testing.mdpassing - [ ] 11 E2E tests passing (page load, header, theme, layout, WebSocket, gadget loading)
- [ ]
vizint-ui/runs withnpm run dev(static file server) - [ ]
code-review.pypasses on all new JS files (ES2024, no var, no eval, etc.) - [ ] Performance: initial render < 100ms, theme switch < 50ms
Phase 2: P1 Production Gadgets (Batch A)
Duration: Weeks 3–5
Goal: Implement the 4 most critical observability gadgets
Parallelizable: Yes — 4 gadgets can be developed in parallel by different engineers
2.1 ProjectExplorer Gadget (gadgets/project-explorer/)
Requirements: US-001, FR-008, REQ-016-001 to 020
Estimated LOC: 173
Priority: Critical
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 2.1.1 | Query knowledge.nodes for Project node on mount |
1 hr | E2E | REQ-016-001, 002, 003 |
| 2.1.2 | Display project metadata: name, version, file count, LOC | 1 hr | E2E | REQ-016-003, 004 |
| 2.1.3 | KG node summary: counts by type (File, Class, Function, Session, Iteration, Spec) | 1 hr | E2E | REQ-016-011 |
| 2.1.4 | File tree browser via knowledge.nodes (node_type=File) |
2 hr | E2E | REQ-016-006, 007, 008 |
| 2.1.5 | File tree search with debounced filtering (300ms) | 1 hr | E2E | REQ-016-008 |
| 2.1.6 | Recent sessions list (last 10) with status badges | 1 hr | E2E | REQ-016-015, 016 |
| 2.1.7 | Auto-refresh every 60 seconds | 30 min | E2E | REQ-016-013 |
| 2.1.8 | Click-through from file tree to KGExplorer (context passing) | 1 hr | E2E | REQ-016-010 |
Deferred to Phase 5: Sparkline trends (REQ-016-012), iteration summary (REQ-016-005, 017), click-through to SessionManager/IterationBrowser (REQ-016-018, 019).
2.2 SessionManager Gadget (gadgets/session-manager/)
Requirements: US-002, FR-009, REQ-016-021 to 052
Estimated LOC: 198
Priority: Critical
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 2.2.1 | Call session.active on mount, display session_id prominently |
1 hr | E2E | REQ-016-021, 022 |
| 2.2.2 | Display active session: goals, portfolio, duration (live timer), status | 1 hr | E2E | REQ-016-022 |
| 2.2.3 | "No active session" placeholder | 30 min | E2E | REQ-016-025 |
| 2.2.4 | "Start Session" button + dialog (goals, portfolio, purpose) | 2 hr | E2E | REQ-016-026, 027, 028 |
| 2.2.5 | "Close Session" button + dialog (summary, carryover checklist) | 2 hr | E2E | REQ-016-029, 030, 031 |
| 2.2.6 | Subscribe to session.events for real-time updates |
1 hr | E2E | REQ-016-043, 044, 045 |
| 2.2.7 | Session history table with pagination | 1 hr | E2E | REQ-016-046, 047 |
| 2.2.8 | Toast notifications for open/close results | 30 min | E2E | REQ-016-032 |
Deferred to Phase 5: Deferred work management (REQ-016-033 to 039), work logging (REQ-016-040 to 042), history search/filter (REQ-016-048 to 050).
2.3 CXPFeed Gadget (gadgets/cxp-feed/)
Requirements: US-003, FR-012, REQ-016-051 to 074
Estimated LOC: 161
Priority: Critical
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 2.3.1 | Subscribe to cxp.traffic on mount |
30 min | E2E | REQ-016-051, 052, 053 |
| 2.3.2 | Render packets as scrolling rows: timestamp, from, to, subject, status, thread_id | 1 hr | E2E | REQ-016-054, 055 |
| 2.3.3 | Color-coded delivery status (green/yellow/red/grey) | 30 min | E2E | REQ-016-056 |
| 2.3.4 | Click to expand full CXP payload (11 fields) | 1 hr | E2E | REQ-016-057 |
| 2.3.5 | Volk filter dropdown (from volk.list) |
1 hr | E2E | REQ-016-060 |
| 2.3.6 | Thread filter (debounced 300ms) | 30 min | E2E | REQ-016-061 |
| 2.3.7 | Delivery status filter dropdown | 30 min | E2E | REQ-016-063 |
| 2.3.8 | Multiple filters with AND semantics + "Clear Filters" | 1 hr | E2E | REQ-016-064, 066, 067 |
| 2.3.9 | Auto-scroll pause on scroll-up, resume on scroll-to-bottom | 1 hr | E2E | REQ-016-068, 069 |
| 2.3.10 | Packet count badge in titlebar | 30 min | E2E | REQ-016-072 |
| 2.3.11 | Max 5000 packets retained (oldest discarded) | 30 min | E2E | REQ-016-059 |
Deferred to Phase 5: JSON syntax highlighting (REQ-016-058), subject glob filter (REQ-016-062), active filter count (REQ-016-065), jump-to-bottom button (REQ-016-070, 071), throughput indicator (REQ-016-073, 074).
2.4 VolkStatus Gadget (gadgets/volk-status/)
Requirements: US-004, FR-013, REQ-016-075 to 093
Estimated LOC: 192
Priority: Critical
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 2.4.1 | Call volk.list on mount, render as cards |
1 hr | E2E | REQ-016-075, 076 |
| 2.4.2 | Card content: alias, role, health indicator, current task | 1 hr | E2E | REQ-016-076, 077, 078, 079 |
| 2.4.3 | Subscribe to volk.lifecycle for real-time updates |
1 hr | E2E | REQ-016-080 |
| 2.4.4 | CSS transition on health changes (300ms) | 30 min | E2E | REQ-016-081 |
| 2.4.5 | Task start/complete event updates | 30 min | E2E | REQ-016-084 |
| 2.4.6 | Responsive grid layout (auto columns based on width) | 1 hr | E2E | REQ-016-090 |
Deferred to Phase 5: Detail panel (REQ-016-085 to 089), compact mode (REQ-016-091 to 093), slide-in animations (REQ-016-082, 083).
Phase 2 Exit Criteria
- [ ] All 4 gadgets render real data from gateway
- [ ] E2E tests for each gadget: mount, data display, real-time updates
- [ ] Integration tests: gateway → WebSocketBridge → GadgetBridge → gadget render
- [ ] No console errors, no unhandled rejections
- [ ] Gadgets functional when gateway disconnected (cached data, read-only mode)
Phase 3: P1 Production Gadgets (Batch B) + Gateway Hardening
Duration: Weeks 5–7
Goal: Complete remaining P1 gadgets + ensure backend feeds real data
Parallelizable: Gadget development parallel; gateway hardening can be separate track
3.1 ClaudeChat Gadget (gadgets/claude-chat/)
Requirements: US-005, FR-016, REQ-016-094 to 118
Estimated LOC: 226
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 3.1.1 | Scrollable message history (user right, Claude left) | 1 hr | E2E | REQ-016-094, 095 |
| 3.1.2 | Message input (Shift+Enter newline, Enter send) | 1 hr | E2E | REQ-016-096 |
| 3.1.3 | Send via cxp.send with dedicated thread_id |
1 hr | E2E | REQ-016-099, 100 |
| 3.1.4 | Receive responses via cxp.traffic filtered to thread_id |
1 hr | E2E | REQ-016-101 |
| 3.1.5 | Work status tracking: sent → processing → delivered | 1 hr | E2E | REQ-016-102 |
| 3.1.6 | Markdown rendering: code blocks, lists, bold, italic, links | 2 hr | E2E | REQ-016-104 to 107 |
| 3.1.7 | HTML sanitization (no script tags, no event handlers) | 1 hr | Unit | REQ-016-108 |
| 3.1.8 | "New Thread" button — fresh thread_id, clear display | 30 min | E2E | REQ-016-109 |
| 3.1.9 | Chat history persisted in localStorage (last 100 messages) | 1 hr | E2E | REQ-016-112 |
| 3.1.10 | Typing indicator (animated dots) while processing | 1 hr | E2E | REQ-016-114, 115 |
| 3.1.11 | Connection status in chat header | 30 min | E2E | REQ-016-116, 117 |
| 3.1.12 | Error responses with red styling | 30 min | E2E | REQ-016-103 |
Deferred: Thread selector (REQ-016-110, 111), cross-device sync (REQ-016-113), message search (REQ-016-118), timestamps on hover (REQ-016-098).
3.2 TaskBoard Gadget (gadgets/task-board/)
Requirements: US-006, FR-010, FR-017, REQ-016-119 to 144
Estimated LOC: 224
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 3.2.1 | Kanban columns: Not Started, In Progress, Completed | 1 hr | E2E | REQ-016-119 |
| 3.2.2 | Task cards: title, priority badge, assigned volk, description | 1 hr | E2E | REQ-016-121 |
| 3.2.3 | Column headers with task count | 30 min | E2E | REQ-016-122 |
| 3.2.4 | HTML5 Drag and Drop between columns | 2 hr | E2E | REQ-016-124, 125, 126 |
| 3.2.5 | Drop zone highlighting | 30 min | E2E | REQ-016-125 |
| 3.2.6 | Status change sends RPC update | 1 hr | E2E | REQ-016-126 |
| 3.2.7 | "New Task" modal: title, description, assigned volk, priority | 2 hr | E2E | REQ-016-129 to 136 |
| 3.2.8 | Query tasks via projects.tasks with status filtering |
1 hr | E2E | REQ-016-134 |
| 3.2.9 | New task appears in correct column immediately | 30 min | E2E | REQ-016-132, 136 |
Deferred: Deferred column (REQ-016-123), touch drag-drop (REQ-016-127), undo (REQ-016-128), task detail panel (REQ-016-137 to 141), bidirectional sync (REQ-016-142 to 144).
3.3 QADashboard Gadget (gadgets/qa-dashboard/)
Requirements: US-007, FR-014, REQ-016-145 to 168
Estimated LOC: 179
Priority: Currently only 21% complete — biggest gap
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 3.3.1 | Display test count, pass rate, coverage percentage | 1 hr | E2E | REQ-016-145, 146, 147 |
| 3.3.2 | Pass rate color: green ≥99%, yellow ≥95%, red <95% | 30 min | E2E | REQ-016-146 |
| 3.3.3 | Coverage trend sparkline (Canvas 2D, last 20 iterations) | 3 hr | E2E | REQ-016-150, 151, 152 |
| 3.3.4 | Hover tooltip on sparkline (value + date) | 1 hr | E2E | REQ-016-152 |
| 3.3.5 | Gate status: pass (green ✓), fail (red ✗), partial (yellow ▲) | 1 hr | E2E | REQ-016-154, 155 |
| 3.3.6 | Failed tests expandable section | 1 hr | E2E | REQ-016-158, 159, 160 |
| 3.3.7 | RTM progress bar: verified/total requirements | 1 hr | E2E | REQ-016-162, 163 |
| 3.3.8 | Click RTM bar → RTM Viewer gadget | 30 min | E2E | REQ-016-164 |
| 3.3.9 | "Run Tests" button sending RPC command | 1 hr | E2E | REQ-016-167 |
| 3.3.10 | Test run progress bar | 1 hr | E2E | REQ-016-168 |
| 3.3.11 | Real-time updates via kernel.events subscription |
1 hr | E2E | REQ-016-165, 166 |
Deferred: Metric cards with delta (REQ-016-149), slowest tests highlight (REQ-016-161), duration trend sparkline (REQ-016-150 related).
3.4 AuditTrail Gadget (gadgets/audit-trail/)
Requirements: US-008, FR-015, REQ-016-169 to 188
Estimated LOC: 202
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 3.4.1 | Query governance.query on mount with default time range |
1 hr | E2E | REQ-016-169 |
| 3.4.2 | Sortable table: timestamp, actor, action, resource, result, latency | 1 hr | E2E | REQ-016-170, 171, 172 |
| 3.4.3 | Pagination: 50 items/page | 1 hr | E2E | REQ-016-173 |
| 3.4.4 | Full-text search (debounced 300ms) | 1 hr | E2E | REQ-016-174 |
| 3.4.5 | Actor filter dropdown | 1 hr | E2E | REQ-016-176 |
| 3.4.6 | Action type filter dropdown | 1 hr | E2E | REQ-016-177 |
| 3.4.7 | Result filter dropdown | 1 hr | E2E | REQ-016-178 |
| 3.4.8 | Active filter summary bar with remove buttons | 1 hr | E2E | REQ-016-180 |
| 3.4.9 | Click row → expand full JSON event detail | 1 hr | E2E | REQ-016-184 |
| 3.4.10 | Constitutional article violations highlighted | 1 hr | E2E | REQ-016-181 |
Deferred: Date range picker (REQ-016-175), article filter (REQ-016-179), escalation chains (REQ-016-182, 183), CSV/JSON export (REQ-016-185 to 188).
3.5 Gateway Hardening (Backend Track)
| # | Task | Time | Owner | Verification |
|---|---|---|---|---|
| 3.5.1 | VolkHandler.handle_list() — return real volk instances from runtime |
2 hr | Backend | Contract test passes |
| 3.5.2 | VolkHandler.handle_lifecycle() — publish real lifecycle events |
2 hr | Backend | E2E test sees events |
| 3.5.3 | CXPFeedHandler — stream real CXP packets via pub/sub |
2 hr | Backend | CXPFeed gadget receives packets |
| 3.5.4 | KnowledgeHandler.handle_query() — validate read-only Cypher |
2 hr | Backend | KGExplorer can query |
| 3.5.5 | GovernanceHandler.handle_query() — return real Prolog decisions |
2 hr | Backend | AuditTrail shows real data |
| 3.5.6 | Add RPC method: tests.run — trigger pytest execution |
2 hr | Backend | QADashboard "Run Tests" works |
| 3.5.7 | Add RPC method: tests.status — return current test run progress |
1 hr | Backend | Progress bar updates |
| 3.5.8 | Add RPC method: metrics.current — return test count, coverage, pass rate |
1 hr | Backend | QADashboard metrics load |
Deliverable: All gateway handlers return real data. No stubs or hardcoded values remain.
Phase 3 Exit Criteria
- [ ] All 8 P1 gadgets render real data
- [ ] QADashboard completion ≥ 80% (was 21%)
- [ ] Gateway has zero hardcoded responses
- [ ] Contract tests expanded to cover new RPC methods (
tests.run,metrics.current) - [ ] Integration tests: full stack (backend → WS → frontend → render)
Phase 4: P2 Gadgets & Personal Productivity
Duration: Weeks 7–8
Goal: Complete remaining gadgets + personal productivity features
Parallelizable: Yes — personal gadgets are independent
4.1 KGExplorer Gadget (gadgets/kg-explorer/)
Requirements: US-009, FR-019, REQ-016-189 to 208
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 4.1.1 | Force-directed graph rendering (Canvas 2D API) | 4 hr | E2E | REQ-016-189 |
| 4.1.2 | Node coloring by type (blue File, green Class, etc.) | 1 hr | E2E | REQ-016-190 |
| 4.1.3 | Node size proportional to relationship count | 1 hr | E2E | REQ-016-191 |
| 4.1.4 | Labeled directed edges with arrowheads | 1 hr | E2E | REQ-016-192 |
| 4.1.5 | Zoom (scroll wheel, 0.1x–5x) | 1 hr | E2E | REQ-016-194 |
| 4.1.6 | Pan (mouse drag on background) | 1 hr | E2E | REQ-016-195 |
| 4.1.7 | Node drag repositioning | 1 hr | E2E | REQ-016-196 |
| 4.1.8 | Click node → property panel | 1 hr | E2E | REQ-016-197, 199–201 |
| 4.1.9 | Double-click → expand relationships | 1 hr | E2E | REQ-016-198 |
| 4.1.10 | Cypher input with "Run Query" button | 1 hr | E2E | REQ-016-203, 205 |
| 4.1.11 | Query results as tabular data | 1 hr | E2E | REQ-016-206 |
| 4.1.12 | Query error messages inline | 30 min | E2E | REQ-016-208 |
Deferred: Auto-complete (REQ-016-204), query history (REQ-016-207), full-text search (FR-019 related).
4.2 NotificationCenter Gadget (gadgets/notification-center/)
Requirements: US-010, FR-005, REQ-016-209 to 230
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 4.2.1 | Subscribe to governance/kernel/session events | 30 min | E2E | REQ-016-209–213 |
| 4.2.2 | Desktop notification permission + display | 1 hr | E2E | REQ-016-214–216 |
| 4.2.3 | Click desktop notification → focus tab + open gadget | 1 hr | E2E | REQ-016-217 |
| 4.2.4 | Notification bell with unread count badge | 30 min | E2E | REQ-016-219 |
| 4.2.5 | Dropdown: last 50 notifications | 1 hr | E2E | REQ-016-220, 221 |
| 4.2.6 | Click notification → navigate to relevant gadget | 1 hr | E2E | REQ-016-222 |
| 4.2.7 | "Mark All Read" + per-notification dismiss | 30 min | E2E | REQ-016-223, 224 |
| 4.2.8 | Priority styling: info/blue, warning/yellow, error/red, critical/pulsing red | 30 min | E2E | REQ-016-225 |
| 4.2.9 | Notification settings panel | 1 hr | E2E | REQ-016-226–230 |
4.3 Personal Productivity Gadgets
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 4.3.1 | PrayerTimes gadget (wraps existing portal gadget) | 2 hr | E2E | REQ-016-231–234 |
| 4.3.2 | Flashcards gadget (Italian/Arabic, CSV data) | 2 hr | E2E | REQ-016-289 |
| 4.3.3 | Iqama Countdown gadget | 1 hr | E2E | REQ-016-290 |
| 4.3.4 | Time-to-POI gadget | 2 hr | E2E | REQ-016-291 |
| 4.3.5 | Chronus Sequencer gadget | 2 hr | E2E | REQ-016-292 |
| 4.3.6 | Settings gadget (1125 LOC) | 3 hr | E2E | REQ-016-293 |
| 4.3.7 | Embed gadgets (iframe) | 1 hr | E2E | REQ-016-294 |
| 4.3.8 | Todoist integration (API token, today's tasks, completion toggle) | 3 hr | E2E | REQ-016-235–238 |
| 4.3.9 | All personal gadgets function independently when gateway disconnected | 1 hr | E2E | CONST-IX-004 |
4.4 Theme & Layout Polish
| # | Task | Time | Tests | Req IDs |
|---|---|---|---|---|
| 4.4.1 | Named layout profiles: save, switch, reset to default | 2 hr | E2E | US-012 |
| 4.4.2 | Gadget minimize/maximize/wide modes | 1 hr | E2E | US-012 |
| 4.4.3 | Reset to default layout button | 30 min | E2E | US-012 (deferred AC) |
| 4.4.4 | Layout persistence via StateSync | 1 hr | E2E | US-012 |
Phase 4 Exit Criteria
- [ ] All 31 gadgets implemented and mountable
- [ ] All personal gadgets work offline (gateway disconnected)
- [ ] Theme/layout customization fully functional
- [ ] E2E tests for each new gadget
Phase 5: Testing, Compliance & Performance
Duration: Weeks 8–10
Goal: Validate the entire system against spec, constitution, and performance budget
Parallelizable: Test categories can run in parallel
5.1 Contract & Integration Tests
| # | Task | Time | Tests |
|---|---|---|---|
| 5.1.1 | Contract: session.list request/response schema |
1 hr | TEST-CONTRACT-001, 002 |
| 5.1.2 | Contract: session.get valid session_id param |
1 hr | TEST-CONTRACT-003 |
| 5.1.3 | Contract: projects.list request/response schema |
1 hr | TEST-CONTRACT-004 |
| 5.1.4 | Contract: subscribe valid channel name enum |
1 hr | TEST-CONTRACT-005 |
| 5.1.5 | Contract: unsubscribe valid subscription_id |
1 hr | TEST-CONTRACT-006 |
| 5.1.6 | Contract: RPC error codes match gateway catalog | 1 hr | TEST-CONTRACT-007 |
| 5.1.7 | Contract: push notification envelope schema | 1 hr | TEST-CONTRACT-008 |
| 5.1.8 | Integration: SessionHandler returns live data | 1 hr | TEST-INTEG-001 |
| 5.1.9 | Integration: ProjectsHandler returns live data | 1 hr | TEST-INTEG-002 |
| 5.1.10 | Integration: Gadget receives real push notification | 1 hr | TEST-INTEG-003 |
| 5.1.11 | Integration: State round-trips localStorage ↔ remote | 1 hr | TEST-INTEG-004 |
| 5.1.12 | Integration: Each P1 gadget loads, renders, responds to events | 2 hr | TEST-INTEG-005 |
| 5.1.13 | Integration: Cross-browser (Chrome, Safari) | 2 hr | TEST-INTEG-006 |
| 5.1.14 | Integration: Accessibility ARIA landmarks | 1 hr | TEST-INTEG-007 |
| 5.1.15 | Integration: Keyboard navigation | 1 hr | TEST-INTEG-008 |
5.2 Performance Tests
| # | Task | Time | Tests | Target |
|---|---|---|---|---|
| 5.2.1 | 60fps during gadget panel scrolling | 2 hr | TEST-PERF-001 | 60fps |
| 5.2.2 | Initial render < 100ms | 1 hr | TEST-PERF-002 | < 100ms |
| 5.2.3 | Event dispatch latency < 16ms | 1 hr | TEST-PERF-003 | < 16ms |
| 5.2.4 | Gadget mount/unmount < 50ms | 1 hr | TEST-PERF-004 | < 50ms |
| 5.2.5 | WebSocket reconnect < 2s on network restore | 2 hr | TEST-PERF-005 | < 2s |
| 5.2.6 | Memory usage < 100MB with 10 gadgets | 1 hr | New | < 100MB |
| 5.2.7 | Bundle size < 2MB initial load | 1 hr | New | < 2MB |
5.3 Accessibility Tests
| # | Task | Time |
|---|---|---|
| 5.3.1 | Keyboard navigation: Tab/Enter/Escape on all controls | 2 hr |
| 5.3.2 | ARIA labels on all interactive elements | 2 hr |
| 5.3.3 | Color contrast ratio ≥ 4.5:1 | 1 hr |
| 5.3.4 | Focus indicators visible | 1 hr |
| 5.3.5 | Screen reader compatibility | 2 hr |
| 5.3.6 | No information conveyed by color alone | 1 hr |
5.4 Security Tests
| # | Task | Time |
|---|---|---|
| 5.4.1 | XSS prevention: all user input sanitized | 2 hr |
| 5.4.2 | CSP headers validated | 1 hr |
| 5.4.3 | Token storage: encrypted in localStorage (Web Crypto API) | 1 hr |
| 5.4.4 | No eval(), new Function(), setTimeout(string) |
30 min |
| 5.4.5 | Markdown sanitization blocks script tags | 1 hr |
5.5 Failure Scenario Tests
| # | Task | Time |
|---|---|---|
| 5.5.1 | Gateway disconnect → read-only mode | 1 hr |
| 5.5.2 | Gateway disconnect → RPC queue (max 100) | 1 hr |
| 5.5.3 | Gateway reconnect → flush queue, re-subscribe | 1 hr |
| 5.5.4 | Gadget error → error boundary catches, other gadgets unaffected | 1 hr |
| 5.5.5 | Subscription lost → auto re-subscription | 1 hr |
| 5.5.6 | RPC timeout → structured error + retry option | 1 hr |
| 5.5.7 | localStorage quota exceeded → eviction + warning | 1 hr |
| 5.5.8 | Rapid reconnects (race condition) | 1 hr |
5.6 Constitutional Compliance Review
| # | Task | Time | Target |
|---|---|---|---|
| 5.6.1 | Article I: Agent Autonomy — verify dashboard observes but never overrides | 2 hr | 8/10 |
| 5.6.2 | Article II: Prolog SSOT — verify all auth through gateway, no hardcoded rules | 2 hr | 10/10 |
| 5.6.3 | Article III: Session Isolation — verify no cross-session data leak | 2 hr | 10/12 |
| 5.6.4 | Article IV: Hooks — verify plugin gadget loading, custom themes | 1 hr | 8/10 |
| 5.6.5 | Article V: Minimal Core — verify core < 5000 lines, gadgets dynamic | 1 hr | 8/10 |
| 5.6.6 | Article VI: JS ES2024 — ESLint + Prettier CI, no var, no eval | 1 hr | 18/20 |
| 5.6.7 | Article VII: No Mocks — verify real WS, real DOM, real events in tests | 2 hr | 8/10 |
| 5.6.8 | Article VIII: Observability — metrics tracking, structured logging | 2 hr | 16/20 |
| 5.6.9 | Article IX: Graceful Degradation — failure injection tests | 2 hr | 16/20 |
| 5.6.10 | Article X: Versioning — API_VERSION checked, namespacing | 1 hr | 8/10 |
| 5.6.11 | Article XI: Documentation — all APIs documented | 1 hr | 8/10 |
Target: 128/142 (90%) constitutional items verified.
5.7 Performance Budget Validation
| Metric | Target | Validation Method |
|---|---|---|
| Gadget initial render | < 100ms | Playwright performance trace |
| WebSocket reconnect | < 3s | Network throttling + timer |
| RPC round-trip p95 | < 200ms | Latency histogram in tests |
| CXP feed scroll | 60fps | requestAnimationFrame timing |
| Theme switch | < 50ms | Visual regression test |
| Initial page load | < 2MB | Lighthouse bundle analysis |
| Memory (10 gadgets) | < 100MB | performance.memory sampling |
| Event delivery | < 200ms | End-to-end latency test |
Phase 5 Exit Criteria
- [ ] All 294 requirements checked
[x]in requirements.md - [ ] Constitutional compliance ≥ 90% (128/142)
- [ ] 91+ tests passing: 59 unit + 8 contract + 8 integration + 5 perf + 11 E2E
- [ ] All performance metrics within budget
- [ ] Accessibility audit passes WCAG 2.1 AA
- [ ] Security audit: 0 XSS vectors, CSP enforced
- [ ]
vizint-ui/committed with workingnpm test,npm run e2e
Appendix A: Dependency Graph
Phase 0 ──────────────────────────────────────────────────────────────►
│
├──► Spec consolidation (0.1) ──┐
│ │
├──► Gateway hardening (0.2) ────┼──► Phase 1 ──► Phase 2 ──► Phase 3 ──► Phase 4 ──► Phase 5
│ │ ▲ ▲ ▲ ▲ ▲
├──► Contract tests (0.3) ───────┘ │ │ │ │ │
│ │ │ │ │ │
└──► Scaffold (0.4) ──────────────────┘ │ │ │ │
│ │ │ │
Phase 1: Portal Framework ──────────────────────────┘ │ │ │
├── lib/shared.js │ │ │
├── lib/bus.js │ │ │
├── bridge/websocket-bridge.js │ │ │
├── bridge/state-sync.js │ │ │
├── lib/registry.js │ │ │
├── lib/chrome.js │ │ │
├── bridge/gadget-bridge.js │ │ │
├── bridge/notification-manager.js │ │ │
├── app.js │ │ │
└── index.html + styles │ │ │
│ │ │
Phase 2: P1 Batch A ────────────────────────────────────────────┘ │ │
├── gadgets/project-explorer/ │ │
├── gadgets/session-manager/ │ │
├── gadgets/cxp-feed/ │ │
└── gadgets/volk-status/ │ │
│ │
Phase 3: P1 Batch B + Gateway ──────────────────────────────────────────────┘ │
├── gadgets/claude-chat/ │
├── gadgets/task-board/ │
├── gadgets/qa-dashboard/ │
├── gadgets/audit-trail/ │
└── backend: volk.list, cxp.traffic, tests.run, metrics.current │
│
Phase 4: P2 Gadgets ────────────────────────────────────────────────────────────────────┘
├── gadgets/kg-explorer/
├── gadgets/notification-center/
├── gadgets/prayer-times/
├── gadgets/flashcards/
├── gadgets/iqama-countdown/
├── gadgets/time-to-poi/
├── gadgets/chronus-sequencer/
├── gadgets/settings/
├── gadgets/embed/
└── theme/layout polish
Phase 5: Validation
├── contract tests
├── integration tests
├── performance tests
├── accessibility tests
├── security tests
├── failure scenarios
└── constitutional compliance
Appendix B: Risk Register
| ID | Risk | Probability | Impact | Mitigation |
|---|---|---|---|---|
| R1 | Gateway schema changes during frontend development break contract tests | Medium | High | Lock RPC schemas in Phase 0. Version gateway protocol. |
| R2 | Neo4j query performance > 10s timeout on large KG (558K nodes) | Medium | High | Add query timeouts, pagination, indexes. Fallback to cached data. |
| R3 | Canvas 2D performance inadequate for large KG graphs | Low | Medium | Implement WebGL fallback for KGExplorer. Limit initial node count. |
| R4 | WebSocket reconnect race conditions with rapid disconnect/reconnect | Medium | Medium | Implement connection state machine. Deduplicate subscriptions. |
| R5 | localStorage quota exceeded on long-running sessions | Low | Medium | Implement LRU eviction. Compress stored data. |
| R6 | Browser compatibility — Safari Notification API, ES2024 features | Low | Medium | Test on target browsers (Chrome 90+, Firefox 88+, Safari 14+). Polyfill if needed. |
| R7 | Scope creep — personal gadgets (Todoist, Gmail) require OAuth flows | Medium | Medium | Defer to post-MVP. Implement prayer times + flashcards first (no OAuth). |
| R8 | Team bandwidth — 8–10 weeks assumes 1 FTE; may stretch with parallel work | Medium | Medium | Prioritize P1 gadgets. P2 gadgets can ship in follow-up release. |
| R9 | Spec drift — requirements change during implementation | Low | High | Freeze spec at Phase 0. Changes require approval and traceability update. |
| R10 | Test infrastructure — Playwright/Vitest setup issues | Low | Low | Use standard configs. Mock WS server already specified in testing.md. |
Appendix C: Definition of Done
Per-Task Definition of Done
- Code complete: Implementation matches spec requirement IDs
- Tests pass: Unit + E2E tests for the feature pass in CI
- Lint clean: ESLint + Prettier pass with zero warnings
- Traceability:
@tracesdecorator on all new Python classes/methods - No stubs: All data from real backend (Neo4j, gateway, runtime)
- Documented: JSDoc on all public JS classes/methods
- Reviewed: Code review approval (pre-commit hook passes)
Per-Phase Definition of Done
- All phase exit criteria met (see each phase)
- Contract tests pass for all RPC methods touched in the phase
- Integration tests pass for end-to-end flows
- No console errors in browser during E2E test run
- Performance budget not exceeded for new features
- Commit to git with session tracking (
session work ...)
Per-Project Definition of Done
- All 294 requirements in
requirements.mdmarked[x] - Constitutional compliance ≥ 90% (128/142)
- 91+ tests passing across all categories
- Performance budget validated
- Accessibility audit passes WCAG 2.1 AA
- Security audit: 0 critical vulnerabilities
- SPEC-051 deprecated and archived
vizint-ui/committed with README, package.json, and CI config
Appendix D: Traceability Matrix
| Requirement | Phase | Task | Test | Status |
|---|---|---|---|---|
| REQ-016-258 | 1 | 1.3.1 | TEST-UNIT-009 | Planned |
| REQ-016-259 | 1 | 1.3.5 | TEST-UNIT-012, 013 | Planned |
| REQ-016-260 | 1 | 1.3.7 | TEST-UNIT-018, 019 | Planned |
| REQ-016-261 | 1 | 1.3.1 | TEST-UNIT-009 | Planned |
| REQ-016-262 | 1 | 1.7.1–1.7.4 | Integration | Planned |
| REQ-016-265 | 1 | 1.2.1 | TEST-UNIT-001 | Planned |
| REQ-016-266 | 1 | 1.2.5 | TEST-UNIT-005, 006 | Planned |
| REQ-016-267 | 1 | 1.2.7 | New | Planned |
| REQ-016-268 | 1 | 1.5.1 | TEST-UNIT-036 | Planned |
| REQ-016-269 | 1 | 1.5.1 | TEST-UNIT-040 | Planned |
| REQ-016-270 | 1 | 1.5.6 | TEST-UNIT-038 | Planned |
| REQ-016-271 | 1 | 1.2.6, 1.6.3 | TEST-UNIT-007, 043 | Planned |
| REQ-016-272 | 1 | 1.6.1 | TEST-UNIT-041 | Planned |
| REQ-016-273 | 1 | 1.4.1 | TEST-UNIT-021 | Planned |
| REQ-016-274 | 1 | 1.4.4, 1.4.5 | TEST-UNIT-025, 026 | Planned |
| REQ-016-275 | 1 | 1.4.2 | TEST-UNIT-024 | Planned |
| REQ-016-276 | 1 | 1.4.6 | TEST-UNIT-027 | Planned |
| REQ-016-277 | 1 | 1.8.5 | TEST-UNIT-033 | Planned |
| REQ-016-278 | 1 | 1.8.6 | TEST-UNIT-034 | Planned |
| REQ-016-279 | 1 | 1.8.1–1.8.3 | TEST-UNIT-029–031 | Planned |
| REQ-016-280 | 1 | 1.10.2 | E2E | Planned |
| REQ-016-281 | 1 | 1.10.4 | E2E | Planned |
| REQ-016-282 | 1 | 1.10.2 | E2E | Planned |
| REQ-016-283 | 1 | 1.9.4 | E2E | Planned |
| REQ-016-284 | 1 | 1.9.4 | E2E | Planned |
| REQ-016-285 | 1 | 1.9.1 | E2E | Planned |
| REQ-016-286 | 5 | 5.1.12 | TEST-INTEG-005 | Planned |
| REQ-016-287 | 1 | All unit tests | 59 tests | Planned |
| REQ-016-288 | 1 | 1.3.5 | TEST-UNIT-012 | Planned |
| REQ-016-289 | 4 | 4.3.2 | E2E | Planned |
| REQ-016-290 | 4 | 4.3.3 | E2E | Planned |
| REQ-016-291 | 4 | 4.3.4 | E2E | Planned |
| REQ-016-292 | 4 | 4.3.5 | E2E | Planned |
| REQ-016-293 | 4 | 4.3.6 | E2E | Planned |
| REQ-016-294 | 4 | 4.3.7 | E2E | Planned |
Appendix E: File Inventory
New Files to Create
vizint-ui/
├── package.json
├── package-lock.json
├── vitest.config.js
├── playwright.config.js
├── .eslintrc.json
├── .prettierrc
├── index.html
├── app.js
├── lib/
│ ├── portal.js
│ ├── bus.js
│ ├── registry.js
│ ├── chrome.js
│ ├── shared.js
│ ├── atlas.js
│ └── chronus.js
├── bridge/
│ ├── websocket-bridge.js
│ ├── gadget-bridge.js
│ ├── state-sync.js
│ └── notification-manager.js
├── gadgets/
│ ├── project-explorer/
│ │ └── gadget.js
│ ├── session-manager/
│ │ └── gadget.js
│ ├── cxp-feed/
│ │ └── gadget.js
│ ├── volk-status/
│ │ └── gadget.js
│ ├── claude-chat/
│ │ └── gadget.js
│ ├── task-board/
│ │ └── gadget.js
│ ├── qa-dashboard/
│ │ └── gadget.js
│ ├── audit-trail/
│ │ └── gadget.js
│ ├── kg-explorer/
│ │ └── gadget.js
│ ├── notification-center/
│ │ └── gadget.js
│ ├── flashcards/
│ │ ├── gadget.js
│ │ └── data.csv
│ ├── iqama-countdown/
│ │ └── gadget.js
│ ├── prayer-times/
│ │ └── gadget.js
│ ├── time-to-poi/
│ │ └── gadget.js
│ ├── chronus-sequencer/
│ │ └── gadget.js
│ ├── settings/
│ │ └── gadget.js
│ ├── embed/
│ │ └── gadget.js
│ ├── embed-web/
│ │ └── gadget.js
│ ├── runway-viewport/
│ │ └── gadget.js
│ ├── chronus-dev/
│ │ └── gadget.js
│ ├── atlas-debug/
│ │ └── gadget.js
│ ├── helloworld/
│ │ └── gadget.js
│ ├── helloworld2/
│ │ └── gadget.js
│ ├── helloworld-settings/
│ │ └── gadget.js
│ ├── daily/
│ │ └── gadget.js
│ ├── worldtz/
│ │ └── gadget.js
│ ├── eom/
│ │ └── gadget.js
│ └── prayertimes-chronus/
│ └── gadget.js
├── styles/
│ ├── common.css
│ └── command-center.css
├── providers/
│ ├── chronus_civil_provider.js
│ └── chronus_prayerTimes_provider.js
├── configs/
│ └── command-center.json
└── tests/
├── unit/
│ ├── shared.test.js
│ ├── bus.test.js
│ ├── websocket-bridge.test.js
│ ├── state-sync.test.js
│ ├── registry.test.js
│ ├── chrome.test.js
│ └── notification-manager.test.js
├── e2e/
│ └── dashboard.spec.js
├── contracts/
│ ├── session.schema.json
│ ├── projects.schema.json
│ └── rpc.contract.test.js
└── helpers/
└── ws-test-server.js
Existing Files to Modify
specs/051-vizint-ui/spec.md # Add deprecation notice
specs/016-vizint-command-center/checklists/
├── requirements.md # Mark items [x] as completed
├── constitutional.md # Mark items [x] as completed
└── testing.md # Mark items [x] as completed
src/orchestrata_ultimate/gateway/handlers/session.py # Remove hardcoded data
src/orchestrata_ultimate/gateway/handlers/volk.py # Add lifecycle pub/sub
src/orchestrata_ultimate/gateway/handlers/cxp.py # Add traffic streaming
src/orchestrata_ultimate/gateway/rpc.py # Add new RPC methods
.github/workflows/
└── ci.yml # Add vizint-ui test steps
Appendix F: Effort Summary
| Phase | Tasks | Estimated Hours | Engineer |
|---|---|---|---|
| 0 | 19 | ~24 hrs | Backend + Frontend |
| 1 | 47 | ~56 hrs | Frontend |
| 2 | 26 | ~32 hrs | Frontend |
| 3 | 35 | ~44 hrs | Frontend + Backend |
| 4 | 24 | ~32 hrs | Frontend |
| 5 | 40 | ~48 hrs | QA + Frontend |
| TOTAL | 191 | ~236 hrs | ~8–10 weeks @ 60% utilization |
End of Implementation Plan