Skip to content

changelog

All notable changes to this product are documented here. The format is based on Keep a Changelog, and this product adheres to Semantic Versioning.

  • VCU / KaaG Dashboard — full design-system audit + redesign (flows/vcu-telemetry-kaag/). All five screens (Fleet Overview · Hermes Live Map · Inverter Control · Adoption Metrics · Battery Health) rebuilt to the canonical Atlas/Caesar/Polaris web patterns:
    • Shell — canonical full-height sidebar (Rechaj two-tone mark + product sub-label, .sb-item nav, tinted pill badges, working collapse) with the breadcrumb topbar inside the main column (crumb-toggle · breadcrumb · topbar search · bordered .icon-actions · green-tinted user-pill). Map screen’s persona drift fixed (Jamiu Ozigi / Super Admin → Yusuf Olanrewaju / Product Manager).
    • Tables — Caesar/Polaris .tbl everywhere (grey rounded header, airy 12/16 rows, 18px card insets, .tbl-foot with pagination); busy filter-chip toolbars replaced by the Caesar card-head (title + inline list search + filter gear + Export).
    • Tabs — every tab group is the Polaris .pseg pill segmented control (white active pill + green label + count chips).
    • Detail-on-click — rider tables no longer pin a default rider; each row opens a 760px right-side drawer: 2-column DETAILS label→value card, plain-language health flag, FULL PROFILE (SOC trend / battery swaps / telemetry) with .pseg sub-tabs and .tbl sub-tables, sticky footer actions chaining into the confirm dialog. Map drawer opens on marker click only (no auto-open).
    • Plain-language health — hex fault bitmasks (0x02, MCU/BMS fault columns, MQTT bitmask grids) collapsed into a single Health badge/flag (Speed interlock · Low-SOC protection · Comms lost · Thermal · SOH low · Firmware outdated · Nominal).
    • Declutter — duplicate alert banner removed; KPI rows trimmed and made page-scrolling; supporting cards equal-height in a .dash-row; QA Registry chip-matrix reduced to a 7-column outcome table; tonal circular icons replace solid fills (incl. the map’s red alert ticker → white tonal); rider modal + full-profile modal consolidated into the drawer; .dlg dialog canon; outline-red destructive row buttons; 600 weights (700 reserved for KPI digits); em-dash copy cleaned to middots.
  • Ops intelligence (Phase C). The swap-station profile gains a charged-stock burn-down — an hourly mini-chart of charged batteries declining across the day with a runs-dry-in-~Xh / healthy cover projection — plus station traffic (arrivals today · unique riders · avg dwell, grounded in the VCU visit ledger). The Risk & money board gains a Fleet pulse card: streaming %, moving / idle / dark counts, and weak-signal / not-reporting tallies (live connectivity + movement). The board’s at-risk-rider list doubles as the PIP-style at-risk worklist (low-swap / overdraft / delinquent riders, click-to-locate). All seeded deterministically.
  • Predictive health & safety (Phase B). Telemetry the VCU pipeline already carries is now surfaced for triage. The keke Battery tab gains State-of-Health, range-to-empty, pack temperature (amber/red over-temp), and a battery-health bar; the VCU tab gains a Motor & drive block (RPM, torque, gear, MCU temp) and a diagnostic-codes (DTC) list. The Alerts panel becomes Alerts & faults with a live, telemetry-driven fault feed at the top — VCU/MCU fault codes, thermal over-temp, and security events — sorted critical-first, each click-to-locate. Theft / unauthorized-movement detection (lock engaged while the keke is moving) raises a critical security entry in the feed and a red banner on the rider’s profile, with one-click Immobilize. Seeded from the firmware fault register + BMS/MCU signals.
  • Money & risk layer (Phase A of the API-grounded feature set). Radar gains a financial dimension drawn from rechaj-backend-api (rider wallets/overdrafts, battery-as-collateral loans, SRRR revenue, payouts). Each rider/keke now carries a wallet balance + overdraft state, a battery-as-collateral loan (retrofit cost, % paid off, balance, on-track/due-soon/delinquent), and a computed stranding-risk score (0–100) that fuses overdraft + loan delinquency + low SoC + offline + no-swap-today, with human-readable reasons. Surfaces: (1) the keke popup shows risk + overdraft chips; (2) the keke profile leads with a Money & risk card (risk gauge + reason chips, wallet, kit-paid-off bar, loan status); (3) a new Risk & money board (shield button, top-right) lists the top at-risk riders fleet-wide (click → fly to rider), with summary tiles (high-risk / overdraft / delinquent / loan exposure), payout health (cleared % · OK/failed/reversed/pending · next run), and SRRR revenue run-rate per cluster. Reframes Radar from “where are my kekes” to “which assets & riders are at risk now.” Seeded deterministically (no RNG perturbation).
  • Retrofit centers — a new operational asset type (one per cluster — where petrol kekes are converted to electric), modeled on rechaj-backend-api’s RetrofitStation + RetrofitStationResponse/RetrofitStationTodayStatistic. Rendered with the purple charge-pin (block-and-spanner; Open = solid + glow, Closed = dashed + dim, same open/closed language as the swap pins), behind a new Retrofit layer toggle in the rail. Clicking one opens a detail card: On the floor now (in-progress / in-queue / workstations active / avg retrofit time), Today’s capacity (done vs maxRetrofitsPerDay bar, pending today, lifetime conversions), and the center manager (name + phone + tenure + rating + Call/Message). Six centers (5 open, 1 closed for a power upgrade); each carries its cluster so the cluster filter scopes them. Pins: components/radar/retrofit/.
  • Swap-station pin (charge-pin v2) — replaces the disc-glyph station marker with a real teardrop pin that encodes two signals in one glyph: stock (3-bay battery cabinet — Lots / Low / Out shown by how many bays are lit) × operation (Open = solid vivid frame with a soft halo, Closed = dashed grey frame, dimmed, pulses if also Out). Pin tip is the location anchor. Stock derives from charged/total (out = 0 · low < 35% · lots); open: false flips to closed (with a closedReason). Six SVG source files canonicalised at components/radar/swap/. Closed banner surfaces in both the popup and the full station profile.
  • Rich Swap-station detail panel — modeled on rechaj-backend-api’s SwapStationResponse + StationTrackerItemResponse. The thin “X / Y charged + Queue 3 riders” card is replaced with a dense, scrollable ops surface: address + opening hours + cluster · last-swap timestamp · Riders on-site / Approaching (queue) / Avg wait / Utilization (riders-on-site and queue are derived live from each keke’s GPS distance to the station — geofence-style) · 3-segment battery inventory bar (charged · depleted · faulty) with legend · Throughput (Swaps today / Daily avg / Avg swap time / Riders assigned / Lifetime) · Station manager with photo well, name, phone, tenure, NPS ★, plus inline Call / Message and a Relationship Manager row · Cabinets (per-cabinet id + serial + locker count) · On-site now and Approaching sample lists (real rider names + SoC / metres + ETA) · Recent swaps (rider + plate + depleted→charged serials + payment mode chip + timestamp). Same data shape is reused in the asset-popup quick view.
  • Sign-in page (flows/god-view/login.html) — the Radar entry screen on the dark command-center brand: a split layout with an animated radar-scope brand panel (live pitch + stat chips) and an auth card offering Continue with Google (official 4-colour mark) and Continue with Zoho (4-colour tile) SSO, plus email + password with show/hide and “keep me signed in”. Any sign-in routes into the God View command center (index.html); the chosen method is stashed in sessionStorage. Registered as the first frame of the God-View screen set.
  • Cluster-aware filtering — everything in Rechaj is cluster-aware, so the whole surface now filters by cluster. Added a cluster field to every keke / station / technician (assigned by nearest cluster centre) and a CLUSTERS + per-cluster clusterShare model. The God View / Dispatch gets a cluster dropdown by the search bar that scopes the map markers, density bubbles, technicians, and the dispatch queue; the Impact dashboard filters every metric, the trend chart and the per-rider callout by cluster. (KaaG view filter is the one remaining surface.)
  • Impact dashboard 2.0 — rebuilt into a board-grade, filterable analytics surface: time-period filters (Day / Week / Month / Quarter) that re-bucket from a real ~18-month daily time-series, the cluster filter, a trend monitor (click any metric to chart it, with a hover read-out), and a new financial story — Rider fuel savings is now the hero metric (₦, with a “₦/day per rider” callout) alongside the climate numbers. Cumulative figures stay at true board scale via a documented pre-window baseline, while per-period deltas stay window-consistent.
  • Field app standalone mode — FieldApp now takes a standalone prop (drops the overlay backdrop + close button) so the Field Technician app can render as its own flow. See the Field Support → Field Technician flow.
  • KaaG node detail popup — clicking a KaaG-active keke on the night map (or its row in “Lit now · by draw”) now opens a per-unit card: live draw (kW), energy delivered tonight (kWh), pack SoC, the rider (name + phone), the host being powered, lit-since, payment status, and a Cap-draw / Remind action. The morning-stranding-risk unit shows a red badge + “Protect AM”. Position is clamped to the map area so it never slides under the right sidebar; click the map background to dismiss.
  • God View command center (flows/god-view/) — the canonical interactive Hermes build, arranged from the initial Claude Design work into the design-system flows convention. Self-contained no-build React app (React 18 UMD + in-browser Babel) covering the brief’s P0 surface: full-bleed dark map with glowing status-coded assets + density clusters, layer rail, global search, KPI strip, alert feed; tabbed asset profiles (keke / battery-as-collateral / VCU / station); the Field Support dispatch hero flow with live technician→rider convergence; high-friction immobilize/reactivate command; offline last-known mode (age chips + queued-command badges); the board-facing Impact dashboard (live CO₂/diesel/kWh counters, 12-mo trend, auditable methodology, embeddable widget); and the 390px offline-first Field Technician mobile companion.
  • Design-directions exploration board (flows/god-view/directions.html).
  • Flow design notes (flows/god-view/design.md) — six principles, the brief→build map for all nine screens, the divergence ledger, and the states-still-to-design backlog.
  • Registered the product + god-view flow in site/src/data/products.ts.
  • Polish pass (post-arrange):
    • Accessibility — keyboard focus is now operable across the whole command center: map markers, layer rail, module switcher (tablist/tab), top-right controls (switch/button), and dispatch queue rows are all focusable with Enter/Space activation and ARIA labels/state; one visible :focus-visible ring system; --muted-2 lifted (#5e716a → #6f8579) to clear WCAG AA on the near-black canvas.
    • / to search — the long-shown / hint now actually focuses the search bar; Esc dismisses popups/search.
    • Progressive reveal — God View “acquiring telemetry” first-paint: assets + clusters animate in with a capped stagger.
    • SLA-breach escalation — open tickets with ≤5 min remaining now escalate the whole row (red wash + pulsing dot + “SLA breach”), not just the number.
    • Wired zoom — the + / − controls now actually scale the basemap and asset layer together (1×–2×), registered about the same centre.
    • Technicians layer toggle added to the layer rail.
    • Reduced-motion — prefers-reduced-motion now also stills the reveal, the dispatch route-dash, the SLA pulse, and the Impact counters.
  • P1 surfaces + remaining P0 states (second build round):
    • KaaG night view (hermes-kaag.jsx, module 4) — night-themed map where KaaG units glow by real-time power draw; sidebar with power/revenue/collection roll-up, a payment-defaulters list (Remind / Disconnect), and the morning-stranding SoC-floor safety card made impossible to miss.
    • Route replay (hermes-replay.jsx) — opened from a keke profile. Polyline + animated keke, event markers (swap/long-stop/speed), a scrubber with 1×–10× speed + click/drag seek, a 90-day date window, day-stat header + report export, and the offline stretch rendered honestly (dashed route, dashed marker, “telemetry gap” banner).
    • Role-based view config (hermes-roles.jsx, screen 08) — one kit, configured per role. A top-right role selector reconfigures the God View’s default map layers and headline KPI tiles; three worked roles ship (Field Support, Swap Ops, Board / Exec).
    • Empty-in-view state (God View with all layers off) and the dispatch can’t-locate → last-known fallback state (offline: routes the technician to the last-known position with a re-snap promise).
    • Verified tablet (834) renders via scale-to-fit; native portrait reflow noted as backlog.
  • Rule builder + RBAC (third build round):
    • No-code Alert Rule Builder (hermes-rules.jsx, screen 07) — opened from the alerts feed. Visual IF/THEN editor with compound AND/OR conditions, a time window, action blocks, severity + multi-channel routing (SMS/Push/WhatsApp/Email), quiet-hours suppression, draft/active/paused states, a live-preview sentence, and create/edit/save. Ships the 14 starter rules from the playbook.
    • RBAC action-gating — the per-role actions list now gates the asset popup + profile commands: Field Support gets dispatch + replay + immobilize, Swap Ops gets dispatch + replay (no immobilize), Board / Exec gets replay only with a “read-only for this role” note.
  • Light theme + user-facing theme toggle (fourth build round): Hermes now ships a polished light theme alongside the default dark command-center theme, anchored to the canonical Rechaj light system (DESIGN.md / tokens.json: bg #fbfbfd, surface #ffffff, border #e4e4e4/#ebebeb, text #111/#555/#888). The status taxonomy (active #01E46F · warning #F5C451 · offline #FF7A6B · immob #B08CFF · known #7E948C · kaag #34D8E6) and brand green stay locked; only surface / line / fill / map / marker / overlay tokens re-point, plus the status colours gain darkened *-ink text variants for AA contrast on white.
    • Token system — hermes-core.css :root was refactored so every theme-switchable surface flows through tokens (added helper tokens --fill*, --mk-disc/-glow/-bw/-ring/-shadow, --map-canvas/-road/-road-exp/-water/-water-stroke/-vig, --glass-bg/-bd, --*-ink, toast/popup/backdrop tints). A :root[data-theme="light"] block re-points them to light values; a nested [data-theme="dark"] block re-pins the dark values so dark-only surfaces stay dark inside a light root.
    • The map — on light the basemap becomes a cool off-white surface with darker roads/water (the network reads on white), and markers flip to a bright disc with a stronger status-colour ring (1.5px) and a much tighter glow so the taxonomy still pops where a halo can’t carry it. The road/water SVG colours in hermes-map.jsx now read theme tokens.
    • Toggle — a sun/moon control (new sun/moon glyphs in the HIcon set) lives in the module switcher (reachable on every module) and the ops top-right cluster. Default = dark; the choice persists to localStorage.
    • Deliberately dark in both themes — the KaaG night view (“night ops”) and the Field Technician phone (“one-handed, big targets”) are scoped data-theme="dark" so they render dark even under the light root; the Impact embeddable-widget preview also stays its dark branded self (it’s an external pitch-deck artifact).
  • KaaG night view — right panel is now a master–detail surface with a per-unit session profile. Selecting a unit (map or list) opens its KaaG session profile in the panel instead of a cramped floating popup: Current session (live draw · this-session kWh · pack SoC) with an energy-draw graph since lit, Lifetime (sessions run · lifetime energy · CO₂ avoided vs a petrol generator), and a Past sessions table (when · duration · energy · CO₂). The overview no longer duplicates the top KPI strip — the redundant Power/Collection/Energy/Revenue tiles are replaced by Tonight’s impact (CO₂ avoided · petrol displaced · energy-vs-target) above the live Lit now · by draw list. Removed the unit popup’s payment / remind / cap-draw actions (collections live in the core app; the cut-off is automatic). Session draw + lifetime + history are seeded deterministically per unit. Each past-session row opens a scrutinize-the-session modal — a large draw-profile chart (kW over the session window, avg reference, hover-readout of the draw at any time) with the session’s duration · energy · CO₂ avoided · avg/peak draw · window. (Shared Modal now portals to document.body so a glass panel’s backdrop-filter can’t trap its fixed backdrop, with an optional theme for dark-scoped dialogs.)
  • KaaG night view — removed the morning-stranding card and the payment-defaulters section. The VCUs now auto-cut KaaG supply at the 20% SoC floor, so a “morning-stranding risk” alert is obsolete (the pack protects itself); and collections are handled in the core app, not the command center. The KaaG ops sidebar is now Night power & collection → Tonight (power/collection/energy/revenue) → Lit now · by draw — leaner and focused on live draw. (remind/cap-draw actions remain on the per-unit popup; the auto-cut unit stays excluded from “lit now” since it’s already off.)
  • Rider (keke) popup + profile — deeper, role-aware detail. The popup now leads with the rider’s day: VCU uptime, cluster, primary swap station, swaps today (alongside SoC + speed). The full profile’s Overview gained a KaaG status card (powering {host} · kW · since — or an explicit “No KaaG · not enrolled”), a Today block (distance · CO₂ displaced · swaps · cluster · primary station · route), a today’s swap log (time · station · depleted→charged · pay mode), and the rider’s relationship manager (call / message). Data model enriched per keke: vcuUptime, homeStation, kmToday, co2Today, rm, swapLog, plus plate/cycles/fw/route (derived deterministically so seeded downstream data is unchanged).
  • Dispatch is now a Field Support action only. Removed dispatch from the Swap Ops role — only Field Support sees the Dispatch button on a rider’s popup + profile (Board stays read-only). Other roles see the read-only note.
  • Route replay → Activity replay (telemetry, not just a route). Renamed and rebuilt: alongside the map route + moving keke, a telemetry panel charts the rider’s whole day — battery SoC, motor draw (A), speed, and pack voltage — each a sparkline with a cursor + value dot synced to the scrubber, plus a live readout of every channel at the current time. Swap, KaaG-start, long-stop, speed and offline-gap events overlay both the map and the SoC chart (and the scrubber). The day’s telemetry is a seeded multi-channel series anchored to the swap/KaaG events (SoC drains then jumps at each swap; KaaG draws it down in the evening). Day summary adds KaaG kWh + CO₂. The on-map markers now match the main God View: the moving rider is the tricycle KekeIcon (status dot + KaaG zap badge + playhead glow), swap events use the charged-battery cabinet glyph, and the KaaG event uses the cyan zap — no more generic bolt/home pucks.
  • Field-technician marker — new person + spanner disc, with a one-signal colour language. Replaced the cyan wrench glyph with the canonical technician mark (a person carrying a spanner badge, on a moving-asset disc like the keke). The single signal is colour: blue #4DA3FF = free for a new case (the disc glows and pulses softly to flag availability), amber #F5C451 = busy on a case (steady). New TechIcon component (theme-aware --mk-disc, currentColor glyph + wrench, plain + hard-hat takes; .hm-tech / .hm-tech-free carry the glow + pulse, stilled under prefers-reduced-motion). The same blue/amber language now flows through the popup and profile (header uses the actual marker, status badges, status card, and eyebrows all read free-blue / busy-amber instead of the old green/cyan). Canonical assets: components/radar/tech/ (6 SVGs — plain/hat × free/busy/currentColor). (The active-dispatch convergence marker stays cyan — that’s the dispatch/route accent, a separate transient state.)
  • Field-technician card & profile — fixed the wrong “Keke profile” header and gave techs real data. Technicians had no kind, so opening one fell through to the keke branch: it was labelled “Keke profile” and rendered an almost-empty body. Technicians are now first-class (kind: "tech", wrench glyph, KaaG-cyan tone) with a proper “Field technician” profile. The data model gained specialty, shift, tenure, vehicle, lifetime jobs, avg-resolve time, SLA-met %, and a live currentJob for busy techs (added deterministically so seeded downstream data is unchanged). The popup now shows availability + cluster, a Jobs-today / Rating / SLA vital row, the specialty, and a click-to-call; the profile shows a status / current-assignment card (Available-for-dispatch, or On site / En route with the rider + issue + ETA), Today (jobs done · avg resolve · SLA met), Performance (rating · all-time jobs · tenure), Coverage (specialty · cluster · shift · vehicle), and a Call / Message footer. Technician status reads as availability (Available / En route / On site), not the keke active/warning/offline taxonomy.
  • Command center is now fluid / fit-to-width — dropped the fixed-artboard letterbox. The app used to render a fixed 1440×900 artboard scaled to fit, which left dead side-bars on any non-16:10 screen (≈96px each side at 1920×1080) and never used a large monitor’s real estate. The Stage now fills the viewport edge-to-edge and the surfaces — all edge-anchored / centered / percent-based HUD — reflow into it: the God View / KaaG maps take the full canvas with panels pinned to the real viewport edges; the Impact dashboard fills the width with its content column centered (max-width lifted 1240 → 1440). A 1440 min-width floor preserves the HUD’s tuned panel placements (below it the overflow clips rather than letting fixed-width panels collide). Matches the Atlas full-width app treatment; verified across God View, Dispatch, Impact, KaaG and the field-tech overlay with no overlap and no console errors.
  • Top bar reworked around the signed-in user (identity, not a role dropdown). The “Viewing as …” role switcher and the Live/Offline connection toggle are both gone from the top-right. In their place:
    • Account menu (UserMenu) — an avatar + name + role chip at the far right. Tapping it opens a menu with the identity header (avatar · name · email · role badge), account options (Your profile · Preferences · Notifications), a Switch profile section, and Log out (routes back to login.html). For this design there are three demo users — Amara Eze · Field Support, Tunde Bakare · Swap Ops, Ngozi Okafor · Board / Exec — one per role; switching profile re-configures the whole God View (layers + KPIs) since the signed-in user is the role (user ↔ role 1:1). Avatars are initials tinted by role (brand-green for ops roles, KaaG-cyan for Board).
    • Role-metrics button (RoleMetrics, a gauge glyph just before the alerts bell) — reveals this role’s KPI card on demand (e.g. Swap Ops → Charged/circulation, Stations online, Low on charged stock, Swaps today +8% vs yest). This replaces the role-lens that used to live inside the role dropdown.
    • Theme toggle moved to the top-right cluster on the map surfaces (sits between the dispatch button and the account chip); the module-switcher rail keeps a copy only for KaaG / Impact, which don’t render the ops cluster — so the toggle is present exactly once on every surface.
  • Top KPI strip is CORE metrics for every role. The top strip used to be role-configured (Swap Ops saw stations/charged/etc.); it’s now a fixed “how are we doing today” set shown to everyone — Fleet visibility · Riders active · Km today · CO₂ today · Support cases today, each with a vs-yesterday delta. Role-specific KPIs now live behind the role-metrics button above.
  • Dropped the redundant “Dispatch” module tab. The dispatch console was reachable two ways (a switcher module and a top-right panel button) — now just one. The module switcher is God View · KaaG · Impact; the dispatch queue is summoned on the God View via the top-right button, which is now a technician (wrench) icon with a “Dispatch field support” tooltip. The hero dispatch flow (select keke → Dispatch support → live convergence) is unaffected — it always ran on the God View map.
  • Merged the Stations + Retrofit layer toggles into one “Locations” pin. A single map-pin toggle in the rail now reveals all Rechaj operational sites at once — swap stations (battery-cabinet pins) and retrofit centers (purple spanner pins) — under one locations layer flag. Each still opens its own kind-specific detail card; the cluster filter scopes both. Role layer-configs, the KaaG night view and the field-app map were updated to the locations key.
  • We displace petrol, not diesel. Rechaj kekes replace petrol tricycles — the Impact metric is now “Petrol displaced”, the CO₂ factor is petrol’s (2.31 kg/L), and the financial model values displaced petrol at the ₦920/L pump price net of energy paid. Methodology updated.
  • Renamed Hermes → Radar (brand rename, 2026-06-06). The product mark is now the Radar “Scope Sweep” (radar scope: range rings + crosshair + a −28° sweep + a blip), rendered in-app by a new theme-aware, animated RadarMark component driven by --radar-* tokens (green on dark, dark-green on light, blip stays #01E46F) — the sweep rotates live (4s loop, the blip flashing as it passes), pausing under prefers-reduced-motion. Also fixed the standalone components/radar/radar-mark-animated.svg asset, which was missing its SMIL animation. Rebranded every user-visible surface — the switcher brand (Radar wordmark, General Sans Bold −0.04em), the Field Technician header (Radar Field), the page <title> + favicon, and “synced to Radar”. The brand assets + spec live in the design-system components section (see Added). The slug/folder (hermes-web-app) and internal code identifiers (window.HERMES, HermesApp/Ops/Map) are intentionally unchanged for path/code stability — only the brand changed.
  • Map markers: dots → per-type icon glyphs. Each asset type now reads as a distinct icon marker instead of a bare dot: keke = the canonical colour tricycle icon (KekeIcon, gold body + brand-green rear wheel, per-instance gradient ids), swap station = charged-battery cabinet, technician = wrench. Because the keke icon is a fixed-colour illustration, status reads from a small colour-coded dot pinned to the keke (top-right: green active / amber warning / red offline / purple immobilized / grey known) instead of a coloured ring around it; problem-state dots blink. The KaaG-active badge (a cyan zap — the keke is outputting power) sits bottom-right so it never collides with the status dot. The layer rail uses a tricycle glyph for Kekes and a zap for KaaG. Selected-ring, progressive-reveal and keyboard focus preserved.
  • KaaG reframed as a keke state, not a separate asset. A KaaG unit is an inverter inside a keke powering a home, so KaaG-active kekes now keep their status colour and morph — gaining a cyan home badge on the day map (and going full-cyan, lit by live power draw, in the KaaG night-focus view). window.HERMES.kaag is now a derived view of kekes.filter(k => k.kaagActive) (KaaG units carry real keke IDs); the keke popup shows a “KaaG active · powering {host} · {kW}” strip. The night view + KPIs read the same kekes unchanged.
  • Product framing corrected from “driver-facing companion” to Fleet Intelligence / God view command center; documented the dark-surface overrides (canonical brand green #01E46F, hairline borders for surface separation, Rechaj type stack retained) in DESIGN.md.
  • Live / Offline connection toggle — removed from the top-right cluster (the top bar is now identity-led). The offline state and its whole last-known path (cached-position routing, queued immobilize commands, the offline banner) are left wired in HermesOps and the dispatch panel, just no longer reachable from a top-bar control — easy to re-expose (e.g. inside the account menu) if we want the demo path back.
  • Trucks — Rechaj no longer runs battery trucks, so the truck asset type is gone everywhere: the map glyph + marker handling, the layer-rail “Trucks” toggle, the role-config layers, the demo data (HERMES.trucks), the popup icon branch, and the legacy directions.html toggles. (Also fixed a latent duplicate: the global search no longer double-counts KaaG kekes, since HERMES.kaag is a derived subset of HERMES.kekes.)
  • Relationship Manager row — swap-station managers don’t roll up to a Relationship Manager; the row was wrong in the domain. Removed from the station-manager card.
  • Cabinets section — physical cabinet ids/serials/locker counts moved out of the operator view; this is bench/inventory data, not on-the-day ops signal. Removed from the station profile (the cabinets[] data shape is preserved in HERMES.stations for any future ops-tooling surface).
  • Keke markers were harsh on light mode. On the soft #eef1f0 basemap the marker disc was a near-opaque bright-white coin (rgba(255,255,255,.96)) with no edge and a hard .28-alpha shadow — 71 of them read as glaring cut-outs. Softened the light-theme keke chip: gentle off-white surface (#fbfcfd), a hairline edge (rgba(30,45,40,.12)), and a diffuse low-alpha shadow; also dialled the global light marker shadow from .28 → .14 so every marker (techs included) sits calmly on the map. Dark mode unchanged.
  • Station card status badges aligned with the pin semantic. The popup + profile headers were rendering the keke-status taxonomy on stations (“Warning · live”), which carries no real swap-station meaning. Stations now show the same two-signal state the v2 pin encodes: an operation badge (Open / Closed) and a stock badge (Plenty · X/Y / Running low · X/Y / Out of stock · 0/Y). Apapa Yard reads Closed · Running low · 3/16; Ikeja reads Open · Plenty · 21/26. The keke-status + age-chip path is preserved for kekes / KaaG / techs.
  • Top-bar overlap — the module switcher (now also carrying the theme toggle) and the KPI stat strip overlapped at 1440. Removed the redundant second theme toggle from the ops cluster (the switcher one is universal — reachable on Impact/KaaG too), compacted the KPI pills, and re-centred the strip in the freed middle zone so the bar reads as three clean zones: [switcher + theme] · [KPIs] · [role / Live / alerts]. Applied the same offset/compaction to the KaaG night-view KPI strip (its own component), which had the same overlap.
  • Status legend — moved from the bottom-centre horizontal bar to a vertical list docked under the left layer rail (Active → Warning → Offline → Immobilized → Known). Theme-aware (glass + status tokens).