- StepReview: add cloud provider logos to Infrastructure and Credentials rows,
replace boring "X selected" with M/R/O color-coded tier breakdown chips,
rename button to "Launch OpenOva ecosystem", update step title/description
- componentGroups.ts: extract shared GROUPS data (Tier/ComponentDef/GroupDef)
so StepComponents and StepReview both import from a single source of truth
- StepComponents: import GROUPS from componentGroups.ts, fix Zustand stale
state bug (use getState() after toggleGroupComponent to read live state,
eliminating Livekit→Stunner mis-selection and similar Fabric group issues)
- StepTopology: fix selected item text turning white on light background
(isSelected color: '#fff' → 'var(--wiz-text-hi)' which is #0f172a in light)
- WizardLayout: remove A/B/C light mode picker, lock in Option B (Midnight
Split dark sidebar) permanently as LIGHT_SIDEBAR_BG constant
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All `rgba(var(--wiz-ch),X)` patterns replaced with named semantic tokens
across all 7 wizard step components + WizardLayout:
- --wiz-text-hi / md / lo / sub / hint — text tiers with WCAG AA light values
- --wiz-border / --wiz-border-sub — border tiers
- --wiz-bg-card / input / sub / xs — background tiers
- --wiz-card-shadow — eliminates the 0 32px 80px rgba(0,0,0,0.5) blotch in light mode
Light mode values: #0f172a (21:1) → #64748b (4.7:1 AA). Dark mode behaviour
unchanged — tokens resolve to same rgba(255,255,255,X) values as before.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Floating A·B·C toggle appears top-right in light mode only.
A = Slate Pro (cool gradient), B = Midnight Split (dark sidebar),
C = Cloud Paper (white sidebar + slate bg). Persisted in localStorage.
Option B properly restores dark sidebar with white channel text.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduce --wiz-ch CSS channel variable (255,255,255 dark / 0,0,0 light) and
matching --wiz-page-bg, --wiz-panel-bg, --wiz-deep-bg overrides in
[data-theme="light"]. Replace every hardcoded rgba(255,255,255,X) inline style
across WizardLayout, all 7 step components, and _shared with
rgba(var(--wiz-ch),X) so text, borders, and surface tints automatically invert
when the theme toggles. Fix SVG diagram helpers (BOX/REGION) to use style={{}}
attributes instead of presentation attributes so CSS custom properties resolve
correctly. Replace hardcoded dark panel backgrounds (#131320, #0f1117) with
var(--wiz-panel-bg) / var(--wiz-deep-bg).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each component now shows its official brand color + recognisable inline SVG
mark (18×18) in the component selection list. Logos dim when deselected and
reach full opacity when selected, giving clear visual feedback.
Covers all 9 blocks: PILOT, SPINE, SURGE, SILO, GUARDIAN, INSIGHTS,
FABRIC, CORTEX, RELAY — all 52 components.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Custom dropdown component with provider logos, chevron animation, dark
panel with check indicator. Region auto-selected on provider change
(HQ-suggested or first available). Fallback to first provider+region
when no HQ hint matches.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- All region cards always fully expanded side-by-side (no accordion)
- Grid layout: 1/2/3 columns matching topology region count
- Radio button semantics: dot indicator for provider + cloud region selection
- HQ-based pre-selection: parses orgHeadquarters to suggest nearest provider
and stagger cloud regions across topology regions for built-in redundancy
(e.g. Frankfurt → Hetzner FSN1/NBG1/HEL1 across 3 regions)
- '★ nearest' badge on recommended provider when not yet configured
- HQ hint banner at top shows which location drove the suggestions
- Credentials summary shown once all regions are fully configured
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Recommended items now pre-selected by default in all blocks; optional items off
- Profile-based defaults: industry/compliance/size adjusts which optional blocks
(FABRIC, CORTEX) are pre-enabled and which recommended components are selected
e.g. Financial Services → FABRIC(cnpg/valkey/strimzi/debezium) + openmeter + strongSwan
e.g. Tech/Large orgs → CORTEX(kserve/knative/axon) enabled
- Re-applies automatically when org profile fields change
- Card header: PRODUCT NAME — Subtitle on line 1, 1-line description on line 2
- Added componentsAppliedForProfile to store to avoid overwriting user customizations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove Required/Optional tag badge from card header
- Subtitle now occupies that space (conceptual name, truncated 1 line = equal heights)
- Tier chips (Xm/Yr/Zo) replace selection count text, color-coded:
M = always grey/muted (user cannot change mandatory), R = blue, O = indigo
Chips light up only when items are actually selected
- Locked mandatory items: grey checked checkbox (opacity 0.6) instead of green
so user clearly understands these cannot be toggled
- Lock icon changed from green to muted white
- Remove SelectionDot (replaced by tier chips as selection indicator)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When a user enables a component, all transitive hard dependencies are
automatically selected across blocks. Example: selecting KServe also
selects Knative; selecting LibreChat enables FerretDB + CNPG in FABRIC;
selecting OpenMeter pulls in Strimzi + ClickHouse.
Dependency map covers 14 components with cross-block and intra-block
deps. Transitive resolution via BFS ensures chains like
librechat→ferretdb→cnpg are fully satisfied.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Equal card heights: GroupCard outer div is flex-column with height:100%
- Color semantics: mandatory locked = green (#4ADE80), recommended = blue (#38BDF8), optional = indigo (#818CF8)
- Sort components by tier: mandatory → recommended → optional within each block
- SelectionDot uses green for required blocks, blue for optional blocks
- Locked mandatory rows get green background tint (rgba(74,222,128,0.06))
- TierBadge colors updated to match new semantic scheme
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Product names now match pitch deck page 5:
security/identity/data → GUARDIAN
networking → SURGE
gitops → SPINE
observability → INSIGHTS
resilience → SILO
ai → CORTEX
events → FABRIC
comms → RELAY
Expand layout: move CardGrid to module level (not inside render fn)
so React never remounts the grid on state change. Split into
before/expanded/after segments guarantees all cards after the
expanded one sit below it — left and right neighbours included.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Strip 'OpenOva' prefix + rename 'Platform X' → short portfolio names
(Security, Identity, Network, Catalyst, Specter, Fabric, Resilience, Cortex, Relay)
- Default 3-col grid (desktop), 2-col tablet, 1-col mobile
- Split rendering into before/expanded/after slices so all cards after
the expanded one always appear below it, never beside it
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Persisted localStorage topology='delta' (removed topology) caused
runtime crash: TOPOLOGY_REGION_LABELS['delta'] → undefined → undefined.length.
- store.ts merge(): reset topology+regionProviders+regionCloudRegions
when persisted topology is not in the valid set
- StepProvider.tsx / StepReview.tsx: defensive ?? fallbacks in case
an unknown topology value slips through
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove 'delta' from TOPOLOGY_NAMES, add 'zoned' with correct counts
- Show provider + cloud region label/location per topology slot
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Topology (StepTopology + model):
- 5 topologies: TRIANGLE (3-region, CP at top / 2 DP at bottom = real triangle),
DUAL (2×3 clusters), ZONED (2×2: DMZ isolated + MGMT·RTZ merged), COMPACT
(2×1: geo-redundant solo), SOLO (unchanged)
- Removed DELTA; TRIANGLE is now the Tier-1 Bank topology
- SVG diagrams redrawn — TRIANGLE uses triangle layout (CP apex, DP base corners)
Provider (StepProvider):
- Added cloud region selection per topology region (5 regions per provider)
- Provider list is now vertical (1 per line, full width) — no card grid
- allConfigured requires both provider AND cloud region per slot
- Auto-advance after cloud region selected
Org (StepOrg):
- HQ moved to row 2 alongside Email (was in row 1 with Name/Domain)
Components (StepComponents):
- Expanded group spans full width (gridColumn: 1 / -1)
- Product portfolio names as primary: OpenOva Cortex, Specter, Fabric, Relay,
Catalyst, Platform Security/Identity/Network/Resilience
- Concept name shown as secondary subtitle
Store + model:
- Added regionCloudRegions to WizardState
- Added setRegionCloudRegion action
- setTopology also resets regionCloudRegions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
WizardLayout: 3-state sidebar
- Mobile (<768px): 56px top bar — logo + step name + progress dots
- Tablet (768–1080px): 52px icon-only sidebar — numbered circles + vertical bar
- Desktop (≥1080px): full 260px sidebar — labels, descriptions, progress
StepOrg: desktop=3col, tablet=2col, mobile=1col grids
StepTopology: 2-pane on desktop, stacked on tablet/mobile
StepProvider: responsive region grid + provider picker grid
These files were written but never committed in the previous session.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Missing file that was created locally but never committed.
Provides mobile/tablet/desktop breakpoint detection used across all wizard steps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All three remaining wizard steps now use useBreakpoint() to adapt layout:
- StepComponents: 2-col group grid collapses to 1-col on mobile
- StepCredentials: multi-provider 2-col grid collapses to 1-col on mobile
- StepReview: 2-col left/right layout stacks to 1-col on mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
WizardLayout: Atlas 2-pane — 260px glass left rail (logo + vertical step
list + progress bar) + flex right content area (max 960px)
StepOrg: 3-col grid (Name/Domain/HQ), full-width Email, 2-col dropdowns
StepTopology: 2-pane — compact radio list left (40%), diagram+bullets
detail panel right (60%); selected card expands inline in right panel
StepProvider: all 5 cloud providers enabled (was Hetzner-only); provider
picker uses 3-col card grid; region rows go 2-col when 3+ regions
StepCredentials: 2-col grid when 2+ providers, full-width for single
StepComponents: group cards in 2-col grid; hamburger expand preserved
StepReview: 2-col layout — left: Org+Infrastructure, right: Credentials+Components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- WizardLayout: step rail now marks done = step.id < currentStep (not
completedSteps) — fixes all steps appearing complete from localStorage
- _shared.tsx: remove sticky/floating footer nav — nav sits inline below
content, no negative margin, no gradient overlay
- DesignShowcase: add D11 Atlas (Cosmos palette, vertical left step rail,
2-col wide form) and D12 Helm (3-pane: context left, form centre, live
summary right) — both use horizontal space effectively with grid cards
side by side; DESIGNS array and Prev/Next nav updated to handle 12 designs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Scroll & layout:
- Scroll to top on every step transition (wizard-body id + useEffect) [#19]
- Sticky nav footer in StepShell — always visible even on tall steps [#20]
Defaults & pre-selection:
- Pre-select TRIANGLE topology so Continue is immediately available [#21]
- Org size default changed to 2,000–10,000 (realistic financial demo) [#30]
- Compliance frameworks start empty — selection must be explicit [#25]
Provider accordion:
- Auto-collapse after selecting a provider; auto-open next unassigned region [#22]
- Lift open/onToggle state to StepProvider for coordinated control
Credentials:
- Hide Hetzner how-to card once all providers are validated [#23]
- Fix → arrow rendered as ellipsis: use Unicode escapes \u2192 \u2014 [#24]
- Shorten region subtitle to "Regions 1, 2, 3" — no verbose labels [#28]
Components:
- SelectionDot enlarged to 18px, glow on full, amber on partial [#27]
Review:
- Replace 🚀 emoji with Lucide Zap icon on Provision button [#29]
Step 1 labels:
- Fix "Domainoptional" / "Headquartersoptional" run-together text [#26]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rename TITAN → DELTA (Δ symbol — triangle in Greek) in model, store, and all step components
- Per-region cloud provider selection: regionProviders: Record<number, CloudProvider>
stores one provider per region index; setTopology resets regionProviders to avoid stale data
- Accordion RegionRow in StepProvider: collapsed shows label + selected provider,
expanded shows inline provider radio buttons; Apply-to-all shortcut when first region set
- Credentials per unique provider: one TokenSection per deduplicated provider set;
providerTokens + providerValidated state per provider; RHF removed from StepCredentials
(replaced with clean useState + manual validation to fix RHF disconnect bug)
- StepTopology hamburger collapse: unselected cards = compact 48px row only;
selected = expands with large SVG diagram (viewBox 0 0 280 130) + bullet points
- SmartField.onFocus calls e.target.select() for instant replacement UX
- StepReview GROUP_NAMES lookup + per-region provider display + per-provider cred status
- Fix unused TOPOLOGY_REGION_COUNT import in store.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move OOLogo outside glass card so it stays fixed across all steps
- Replace thin progress bars with Journey-style numbered circles
- Completed steps show checkmark, current glows with sky-blue ring
- Connector lines fill with gradient as steps complete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix OOLogo viewBox to 0 0 700 400 with strokeWidth 100 (correct aspect ratio)
- Render logo at width = height × 1.75 to prevent cropping
- Add all 6 wizard steps with real content to every design alternative
- Shared StepBody component with design-specific theming
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Redesign tokens: Catalyst sky-blue brand (#38BDF8), near-black surfaces
matching openova.io (#09090B/#111113/#18181B), zinc text palette
- Add semantic CSS vars (--color-text-primary/secondary/muted/disabled)
replacing hardcoded oklch() values across all components — required
for proper light/dark mode support
- Add light mode with [data-theme="light"] CSS variable overrides
- Add useTheme hook with localStorage persistence (key: oo-theme)
- Add inline theme init script in index.html to prevent flash on load
- Replace OctagonAlert placeholder with OpenOva double-loop SVG logo
- Rebrand sidebar: "OpenOva" label + "Catalyst" in sky-blue
- Add Sun/Moon theme toggle in the top bar header
- Promote credentials skip link to brand-colored underlined text
(was invisible muted grey — "Skip — explore in demo mode")
- Update button/input/StepShell/StepIndicator to use CSS vars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix currentStep initial value (0→1) so wizard advances correctly on first Continue
- Add `code` + `countryCode` to HETZNER_REGIONS; drop deprecated `role: primary|dr` from Region model
- Use region code in cluster context names: hz-fsn-rtz-prod (not hz-fsn1-rtz-prod)
- Derive success page URLs and kubeconfig from wizard store (orgDomain, region)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add thinking, effort, profile fields to ChatCompletionRequest
- Add chatV1() and chatV1Stream() using query() with persistSession=false
- Route to V1 when thinking/effort params present or profile='deep'
- V2 session pool unchanged; V1 runs stateless with native systemPrompt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add docs/NAMING-CONVENTION.md — canonical naming standard for all
cloud resources, K8s objects, DNS, and tags across all providers.
Covers dimension taxonomy (provider/region/building-block/environment),
the Don't-Repeat-the-Parent principle, 4-char DNS location codes with
full lookup table, multi-tenant scoping via namespace, and migration rules.
- Fix SRE.md: remove primary/DR region labels; clusters are named by
building block (rtz/dmz/mgt), not failover role. Both regions run
symmetric rtz clusters; k8gb owns traffic distribution.
- Fix PLATFORM-TECH-STACK.md: update both Mermaid diagrams and region
table to use Region A / Region B (rtz cluster) language.
- Fix core/README.md: Platform CRD example now references cluster context
names (hz-fsn-rtz-prod / hz-hel-rtz-prod) instead of primary/standby roles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previous retryStrategy(times > 5) returned null, permanently destroying the
ioredis client after 5 failed reconnects. After idle, the TCP connection drops,
all 5 retries fail, and every subsequent command throws 'Connection is closed'.
Changes:
- retryStrategy now retries indefinitely (max 30s interval) — connection
is always restored when Valkey comes back
- 'end' event handler restarts the client if ioredis somehow stops retrying
- getValkey() returns null when client.status is 'end'/'close' so callers
skip persistence gracefully instead of throwing
- maxRetriesPerRequest: 3 kept — commands fail fast, background reconnect
handles recovery
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sessions whose Claude CLI subprocess has exited (idle > MAX_IDLE_MS) are
recycled in acquire() rather than returned. This prevents all-stale-pool
scenarios that caused WriteRecsActivity/ExtractIntentActivity to fail with
'Connection is closed' after Axon sits idle overnight.
- Added lastUsed: number to PoolEntry, set on warmup and release
- acquire() skips idle entries older than 5 min, recycles each one
- release() stamps lastUsed so the TTL resets on every successful use
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Re-add 2-3 word chunk splitting with 25-60ms delays that was lost during
the includePartialMessages refactor. Fixes the "10s wait then dump" UX.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>