changelog
Changelog — rechaj-design (repo-wide)
Section titled “Changelog — rechaj-design (repo-wide)”Auto-aggregated from per-product
changelog.mdfiles. Do not edit by hand.
[Unreleased]
Section titled “[Unreleased]”- Facilities — companion persona cores — core prototypes for the four personas the Facilities PM depends on, each filed under the Facilities sub-category: Facility Manager (
flows/facilities-manager/) — a cluster-scoped mirror of the PM (Ogun cluster) with a cluster Overview + Facilities directory + per-site Record, no Add-facility, read-only SOPs, and requests reviewed then forwarded to the PM; Station Manager (flows/facilities-station-manager/) — a single-station Dashboard (Ijoko) with health-check, KPIs and a recent-issues table; Location Scout (flows/facilities-location-scout/) — a Locations landing with a static map of live / earmarked / surveyed areas plus an areas pipeline keyed to requirement SOPs; and Department Requester (flows/facilities-requester/) — a My Requests surface to submit and track cross-department requests to Facilities. Each ships the canon shell + split-screen login + its landing surface; the remaining sidebar surfaces stub to a “coming next” placeholder pending the full build. Registered insite/src/data/products.tsunder thefacilitiesFlowCategory. - APM, Onboarding new flow at
flows/apm-onboarding/index.html— its own distinct persona (not an alias of Onboarding PM), duplicated from that flow’s shell and currently provisioned at the PM-level permission tier while the PM seat is vacant and APM covers full scope in the interim. Same four sections as Onboarding PM (Overview, Pipeline & Riders, Revenue, Settings), independently adjustable from PM’s own access going forward. Registered insite/src/data/products.tsunder the Onboarding sub-category. Skeleton only tonight — no new business logic. - Star Trek (renamed from Expansion Intelligence) re-parented from a standalone top-level Onboarding tile into a nested sidebar section inside three personas’ workspaces:
flows/pm-onboarding/index.htmlandflows/apm-onboarding/index.html(full access) andflows/vp-onboarding/index.html(read-only, view-only styling, no edit/flagging actions). Reflects the shift to persona-first sidebar architecture — features live inside the persona workspace that needs them, not as their own top-level tile. Tonight is reachability-only: each of the three gets a nav item and a placeholder section naming the 6 real screens (Dashboard, Recruitment Map, Opportunity Ranking, Vehicle Gallery, Survey Agent Performance, Survey Areas); the actual screens still live untouched atflows/expansion-intelligence/index.html(deregistered fromproducts.ts’s top-level flow list, but not moved or altered) pending the real embed. Onboarding PM’s own topbar role label corrected from “APM · Rider Onboarding” to “PM · Rider Onboarding” to stop colliding with the newly-distinct APM persona. - Facilities — Facilities PM (Super Admin) new flow at
flows/facilities-pm/index.html, filed under the new Facilities sidebar sub-category. Eight surfaces for the physical-estate owner: Overview (Facility Health north-star KPI — share of sites with no open high-severity issue, no out-of-service equipment and a current condition report — plus a needs-attention table and recent-activity feed); Facilities directory → per-site Record (health-check breakdown + folded-in Personnel / Equipment / Contractors / Issues / SOPs); Facility Issues (Open → In Progress → Pending Approval → Resolved → Reopened in a right-side drawer with an immutable case-note log, contextual state actions, and photo/video evidence taken or uploaded at filing); Requests (equipment + cross-department approve / deny / redirect, with approved equipment flowing into a live provisioning pipeline); Equipment (facility-grouped inventory — condition pills, an Incoming tab, Category/Sub-type classification with a category filter, a condition-history drawer, and the out-of-service-while-open-issue guard); Contractors (per-site engagement roll-up + ORPHANED flag); SOPs & Standards (authoring surface across SOPs · Design System · Material Specs · Spatial Playbooks with versioning and document attachments — PDF/DOC/image); and Settings (profile · notification toggles · role permissions · audit log). Companion personas (Facility Manager, Station Manager, Location Scout, Department Requester) are planned. Spec:flows/facilities-pm/PRD.md· design notesflows/facilities-pm/design.md. Registered insite/src/data/products.tswith the newfacilitiesFlowCategory and per-surface deep-linked frames (?page=…). - Onboarding PM at
flows/pm-onboarding/index.html, filed under Atlas Onboarding beside Pipeline Conversion Analyst, Rider Acquisition Manager, and VP of Onboarding. The APM (Associate Product Manager, Rider Onboarding)’s product command surface, per the Onboarding Product Command PRD v1.1 — monitoring only, no rider-record writes, no release/submit actions (those stay owned by the PCA and PM Onboarding modules). Four sidebar surfaces, one question each: Overview (north-star KPIs against target — Lead→Active conversion, onboarding completion, cycle time, MEI pass rate — the 7-stage onboarding funnel with per-stage SLA targets and an auto-surfaced biggest-leak callout, and a “Needs your call today” exception queue reusing the PCA module’s own SLA fields, deep-link/notify only); Pipeline & Riders (the 20 APM-specified rider-level metrics across four sub-tabs — pipeline snapshot, station & geography, activity & recency, trend & operational excellence — plus a read-only Rider Record drill-down matching the Relationship Manager’sopenRider()in-shell page-swap pattern rather than a modal); Revenue (the activation-fee reconciliation triplet — Recognized / Held / Reversed — reused verbatim from the Rider Acquisition Manager module, an MTD trend chart, and a fee-disposition donut); Settings intentionally defers to the existing live Atlas settings surface rather than a redesign. Registered insite/src/data/products.tsunder the Onboarding sub-category. - Expansion Intelligence at
flows/expansion-intelligence/index.html, filed under Atlas Onboarding — the Sales Lead’s field-survey and recruitment-opportunity workspace, rebuilt from an uploaded prototype onto Polaris/Caesar canon. Canonical split-screen login/landing (peach left pane, KPI proof points, Google/email sign-in) gates the app; Dashboard (coverage/observations/unique-vehicle/new-area/active-agent KPIs, a possible-duplicates rollup on the.badge b-*vocabulary, a Top Survey Areas table, and a live Sightings trend chart — Daily/Weekly/Monthly citywide totals plus a custom date-range filter, with hover-value tooltips on every bar); a Leaflet Recruitment Map (spaced-out hex-density grid + zoom-gated cluster labels, formalized againstscreens/kaag-hermes-map.htmlprecedent, pins clustering, address search); Opportunity Ranking with a sort/search/date-range filter and a right-side Area Details drawer (KPIs, trend chart, mini-map, vehicle gallery, recent activity, coverage history — a new drawer pattern since PATTERNS.md only documented centered.dlgfor web); a Vehicle Gallery (survey-area drill-in photo grid, detected/undetected/reviewed filters, duplicate-status + date filters, and a photo-review modal on canonical.dlgwith Valid/Invalid actions); Survey Agent Performance leaderboard; and Survey Areas admin (create/edit + assign-agents modals, also rebuilt on canonical.dlg, replacing the prototype’s bespoke.gal-modal-*/.dtagcomponents). Paired with the Expansion Capture mobile flow below. Registered insite/src/data/products.ts. - Issue Management Dashboard (leadership) at
screens/issue-management-dashboard.html— the third piece of the reset-to-basics support model: a leadership read on the in-app issue data (not an officer tool). KPI tiles (30-day volume, resolution rate, median time-to-resolve, escalation rate, open-now); a stacked-area trend of weekly volume by category; top issue types ranked bars; a category-mix donut; a station × category heatmap; resolution vs escalation with the breakdown of where escalations route (Revenue Assurance / Hardware / Payment / Inventory); officer throughput; and a feed of manager-minted issue types flagged as candidates to formalise into the standard list. Charts are hand-built SVG following the data-viz method — categorical hues assigned in a fixed CVD-validated order (never cycled), one measure per axis, a sequential single-hue heatmap, reserved status colors shipped with icon+label, direct value labels (the light-surface contrast-relief mitigation), and both light & dark selected (validator-passed in each mode). Registered insite/src/data/products.tsunder the Support sub-category. - Support Tickets (bare-bones) at
prototypes/support-tickets-basic.html— the Atlas side of the reset-to-basics WhatsApp support model (pairs withrechaj-swap-app/.../swap-support-basic.html). No per-issue config templates, no auto-populated resolution forms — just an officer queue. Tickets queue (Open / Escalated / Resolved / All tabs, KPI row) lists every ticket a manager raised from the swap app: issue · reported-by (manager & station) · for (rider if it happened during a swap, else “No rider · station issue”) · raised · status. Ticket detail shows what the issue is, who reported it, who it’s for, the manager’s photos, and a two-way thread the officer can reply in; the resolution panel is “fix it in Atlas, then update the status” — a note + Mark resolved, or Escalate to a senior team (Revenue Assurance / Hardware / Payment / Inventory / Engineering; issues with a natural owner pre-select it and show a hint). Escalated tickets can be pulled back or confirmed-resolved; the thread logs every status change as a system line. Issue types is the one shared, company-wide catalogue — area, source (Standard vs “New · from <manager>”), open + total ticket counts, and escalation tags — so manager-minted types surface for everyone to reuse and the table never sprawls into duplicates. Registered insite/src/data/products.tsunder the Support sub-category. - KaaG persona flows brought to RADR design parity + real VCU/DU domain model — the three KaaG personas (
flows/product-manager-kaag/,flows/technical-specialist-kaag/,flows/vp-product-kaag/) were reworked to the RADR — Telemetry Admin visual + behavioral canon: dense full-width tables (48px#f4f5f7headers, 9-column fleet rosters, no horizontal scroll at 1440), the RADR cell kit everywhere (last-seen age chips on the GREEN<10m…BLACK≥24h bands — never a bare Online/Offline — SOC bars, colored SOH, 7-day uptime sparkbars, carrier+RSSI cells, MCU·VCU·BMS·DU fault chips), 82px KPI cards with tonal icon rings, last-seen honesty bucket strips, and live behavior (2s ticking decoded signals + sparklines; the Technical Specialist gets the full dark ticking raw MQTT console with gap/backfill markers and offline session-tail honesty). Content is grounded in the real codebases (rechaj-vehicle-controller / vcu-consumer / hermes-java-api): real topics (pub/<id>,sub/<id>, retained LWTwill/<id>), real payload keys (mwv, mwc, mpd, trq, tp1, soc, soh, batv, inv, blk, fvr), the real command set (IMMOBILIZE/MECHOFF with typed confirm token, REACTIVATE, KAAG_ON/OFF, AUTO with the 21:00–06:00 night schedule and 77.5V cut) with SENT/QUEUED semantics and theradr.commands.enabledkill-switch honesty. Because there is no networked display unit, DU surfaces are modeled truthfully as display-link health — indicator states from MCU vehicle-lights frame0x18F86590, SOC-push-to-display freshness, odometer — with no invented DU commands. Data-quality honesty items surfaced throughout (fault register parsed-but-not-published per RUNBOOK §4.4,pub/vsvcu/pub/namespace mismatch, IMEI/ICCID not captured, 90-day raw retention with 1m/1h aggregates). Persona access boundaries preserved: PM = decoded-only + inverter controls; TS = full raw + commissioning + firmware + full commands; VP = strictly read-only. - Technical Specialist · KaaG at
flows/technical-specialist-kaag/index.html, filed under Atlas Telemetry. Merges the Hermes and KaaG PRD v1.1 Technical Officer and Embedded Systems Engineer scopes into one P0 persona across six linked surfaces plus a unit detail: technical overview, commissioning, decoded and raw telemetry, diagnostics, signed firmware rollout, and command audit. The flow connects hardware identity, wiring, SIM, GPS, firmware, and first-heartbeat validation directly to raw MQTT investigation, data-quality triage, OTA guardrails, rollback state, and audit-recorded remote controls. Rider-profile edits, Product policy decisions, and commercial eligibility approvals remain outside the role. - Product Manager · KaaG Operations at
flows/product-manager-kaag/index.html, filed under Atlas Telemetry beside RADR Telemetry Admin and the VP Product KaaG programme view. Implements the Hermes and KaaG PRD v1.1 P0 Product Manager persona across six linked surfaces: operations overview, fleet and inverter control, sessions and energy, read-only inspection pipeline, alert centre with the shared action audit, and rider or VCU detail. Remote disable, re-enable, and Engineering-review actions use canonical centered dialogs, preserve offline-honest delivery states, and record actor, timestamp, reason, command, and outcome. Rider-profile edits, inspection edits, and raw MQTT access are intentionally excluded. - VP Product · KaaG Programme at
flows/vp-product-kaag/index.html, filed under Atlas Telemetry beside RADR Telemetry Admin. Implements the Hermes and KaaG PRD v1.1 P1 persona as a strictly read-only executive flow: programme overview, adoption and energy, fleet health, inspection and rollout, weekly digest, and a summarised rider or VCU telemetry drill-down. Filters, search, and CSV or PDF export are present; create, edit, assignment, approval, remote-control, and raw MQTT affordances are intentionally absent. Registered with per-surface deep links insite/src/data/products.ts. - Procurement & Requisitions Flow Improvement — PRD + four persona flows. The draft PRD lands at
docs/procurement-inventory-prd.md(original PDF indocs/attachments/): end-to-end Needed → Requested → Ordered → Shipped → Delivered → Used lifecycle across Atlas + Polaris, eliminating manual order duplication and the stock-decrement-on-receive bug. Four role surfaces built swap-style (one entry per persona under the Inventory sub-category, each seeing only their own modules): Inventory Manager (flows/inventory-manager/) — populated dashboard, low/critical alerts with in-system Request-from-Procurement trigger, labelling/UOM stewardship + ad-hoc entry review, receiving with serialized-tag scan verification, returns to stock, usage-driven reorder points; Procurement Manager (flows/procurement-manager/) — requisition queue with auto team tags + urgency notifications + cross-team conflict resolution with recorded reasoning, orders with pre-send editing and post-send amendment history, ₦0 costs, attachments, air/sea/road shipping, flexible vendor contacts + lead-time tracking, BOM Procurement Orders traced to generated vendor orders, Atlas·Polaris sync view; Production Manager (flows/production-manager/) — end-to-end request lifecycle visibility with visible partial-fulfillment reasoning (the 10-rolls-of-tape case), cross-team demand at request time, consumption logging at point of use; Retrofit Manager (flows/retrofit-manager/) — same request transparency from Retrofit’s side plus Rider Management restored per FR-22. The existingscreens/inventory-management.htmlInventory & Bundles surface is kept as-is; its ATP/days-of-cover, burn-rate, alert and receiving-session semantics are reused across the new persona dashboards. All four registered with per-view deep links insite/src/data/products.ts. - RADR — Telemetry Admin: Firmware Versions + Audit Trail — the two System sidebar stubs are now real surfaces in
flows/vcu-telemetry-kaag/index.html. Firmware Versions (#firmware): signed release list with adoption bars and per-release notes (2.4.1 current / 2.4.0 superseded / 2.3.2 retired / 2.3.0 deprecated), staged-wave rollout tracker (canary → 25% → fleet → stragglers), the OTA guardrail card (updates apply only parked + SOC ≥ 40% + RSSI ≥ −95 dBm, never during a KaaG session; delta ~380 KB chunked-resumable over GSM; A/B slots with boot-check auto-rollback; ≈0.4 MB of the 500 MB monthly SIM budget), and the pending/problem table explaining each of the 7 badge units (5 stalled in dead zones with resume-at-chunk detail, 2 failed + rolled back). Audit Trail (#audit): append-only, hash-chained action log — who did what to which unit, the operator-entered reason, and the field outcome (delivered / queued-offline / expired), filterable by Commands / Firmware / Repairs / KaaG / Access & exports with search; queued-command outcome breakdown (71% delivered on reconnect, 8% expire at 72 h so stale locks never fire), actor roster including the policy engine and read-only API tokens, and an integrity card (dual device/server timestamps, nightly chain verification). Both registered as deep-linked frames insite/src/data/products.ts. - RADR — Telemetry Admin full rebuild at
flows/vcu-telemetry-kaag/index.html(flow moved under Atlas fromproducts/hermes-web-app/, filed under the new Telemetry sidebar sub-category). Replaces the five Hermes-era screens (Fleet Overview / Hermes Live Map / Inverter Control / Adoption Metrics / Battery Health) with an admin-first IA for the RADR team: Fleet Overview (VCUs on field 318/342, reporting-now honesty buckets, fleet uptime, per-unit 7-day uptime sparkbars, carrier + RSSI, MCU·VCU·BMS·DU fault chips, command queue with queued-while-offline states), VCU Detail (click any unit → decoded signals ticking live with sparklines + a raw MQTT console streamingradr/v1/<serial>/#JSON frames with UTC timestamps, GSM-gap and store-and-forward backfill markers; 24 h connectivity timeline; audit-logged commands that declare “instant” vs “will queue”; offline units show honest last-known state), Uptime & Reliability (90-day trend with incident annotations, worst-unit league, gap-cause breakdown — GSM dead zones 46% / keke power loss 27% / SIM data 14%, uptime by carrier incl. the dual-SIM pilot note, known dead-zone corridor table), KaaG — Deployments & Energy (kits deployed 124/140, kWh + ₦ at ₦90/kWh per unit and fleet-wide, 14-day energy trend, nightly usage curve with SoC-floor saves, holder custody table, idle-kit reassignment queue), and Repairs & Exchanges (ticket-follows-the-fault / custody-follows-the-box kanban: Reported → Diagnosed → Exchange issued → In workshop → Ready to redeploy; spare pool with forward caches; exchange log tracking rider dark-time; MTTR 2.4 d). Architecture: one shared<template data-shared>stylesheet + JS data module injected by the router in front of every screen — the per-screen CSS duplication of the old file is gone (426 KB → 128 KB). Hermes Live Map removed (the live map lives in Radar — Fleet Intelligence). Registered insite/src/data/products.tswith per-surface deep-links. - Lead Queue Console at
prototypes/lead-queue-console.html— Sales & Retention pipeline console. PCA Lead Queue of WAITLISTED riders pending station check-in with SLA tiering (amber 48h+ / red 72h+), clickable tier stat chips, cluster/agent/date-range filters, masked phone with copy, lead detail slide-over, and a begin-check-in action that moves the lead straight into the MEI Inspection Queue (shared pipeline, no assignment step). Also covers Band D Escalation, MEI Summary dashboard, Onboarding Queue, KAAG Coordination with detail drawer, and the RM Post-Retrofit Onboarding flow. Registered insite/src/data/products.ts. The production Next.js implementation of the Lead Queue screen has begun inmoc-x/atlas(branchfeat/sales-retention-lead-queue). - Inventory Management reworked at
screens/inventory-management.htmlto mirror the rechaj-backoffice-v2 inventory module + new in-scope features. New IA groups Catalog (Items, Item types, Categories, Bundles), Stock (Batches, Stock health) and Movements (Transfers, Requests, Receiving) under a collapsible sidebar. Repurposed Bundles as proper CRUD — named/described saved sets of items reusable from transfers and requests, with grid + inline editor. Fleshed out the previously-placeholder views: Items (full SKU table with category/type/stock-state filters), Item types (tracking semantics + per-type ATP formula, two-pane list+detail), Categories (stock-state mix bars), Batches (lot list + drill-down batch-items panel), Stock health (ATP cover, stock-outs, days-of-cover with burn rate), Transfers (outbound, sender-initiated, bundle-linked), Requests (inbound, receiver-initiated, ATP-gated fulfilment), Quarantine (per-SN with dispute linkage), Alerts (full inbox + tabs), and Audit log (movement timeline + event-type breakdown + top actors). Reuses all existing components — KPI cards, state-strip, chips, scan-progress, breakdown bars, alert rows — with only additive styles (form-grid, picker chips, tpl-card, timeline, mini-tiles, dir badges). - New Swap Module Dashboard at
screens/swap-module-dashboard.html— the Swap business unit’s KPI view inside the Atlas backoffice. Covers session counts, revenue health, goal tracking, top stations, issues by type, the battery-conflict queue, anomaly alerts, station-to-station drift, and a paginated recent-sessions list with per-session detail drilldown. Registered as both an Atlas flow and screen insite/src/data/products.ts. - Swap PM Dashboard (v2 candidate) at
screens/swap-pm-dashboard-v2.html— candidate redesign up for review against v1 before replacing. Swap-time-led: median as the lead KPI on a dark hero card, distribution histogram + per-phase breakdown (wait, scan, VCU connect, unlock, physical, payment). Anomaly band auto-flags week-over-week scenario movements. Friction map ranks every v3 support scenario by Ops-time-per-case so the PM sees the prioritization queue, not raw counts. Money-flow integrity card splits captured / stuck / leaked + funding-source mix (Opay / Paystack / Sterling) + recovery rates. Infrastructure card shows the VCU resolution ladder (BT direct → BT retry → internet → manual unlock) and battery operational signals. Specialist scoreboard sits alongside the manager scoreboard. Registered insite/src/data/products.ts.
Changed
Section titled “Changed”- KaaG persona sidebar identity now matches the Atlas onboarding treatment across Product Manager, VP Product, and Technical Specialist: the canonical Rechaj mark and wordmark are paired with a
Team KAAGsublabel, replacing the standaloneRADRlabel. The collapsed rail retains only the Rechaj mark. - Sidebar logo on the Swap Module Dashboard now uses the canonical two-tone Rechaj brand mark from the new
components/rechaj-logo.svgasset (documented aspatterns/brand-logo.md), replacing the placeholder dark-square-with-hexagon mark that violated the DESIGN.md hard rule against redrawing the bolt. - Swap Module Dashboard — date-range filter is now a plain caption beside the period selector (no longer styled as a competing button). Performance vs Goals targets are read-only (backend-owned, edit affordances removed). Station-to-station drift restructured as one home station fanning out to many destinations, with each destination weighted by share of drifted riders. Top Swap Managers ranks by Opay wallet activation (the manager’s pull) or avg swap speed (toggle); swap volume is no longer the headline metric.
- Swap-time numbers across both v1 and v2 dashboards recalibrated to operational reality: normal swap ~2 min, issues drag to 5–10 min max (not 20+). Median 2m 14s, P90 4m 38s, P95 6m 22s, hit-goal rate 48%. Manager swap-speed range tightened to 1m 48s – 2m 50s. Friction-map “Ops time” column reframed as specialist-minutes per case (2–6 min) rather than total swap drag.
Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”- RADR — Telemetry Admin (
flows/vcu-telemetry-kaag/) — superseded by the three role-scoped KaaG personas (Product Manager, Technical Specialist, VP Product), which now carry all of its surfaces at RADR design parity: the live raw MQTT console and firmware/coverage tooling live in Technical Specialist, operational fleet control in Product Manager, and the executive reporting in VP Product. Deregistered fromsite/src/data/products.ts; its design language survives asflows/kaag-radr-foundation.cssand the persona implementations. - Battery duplicate-ID queue card on the Swap Module Dashboard — surface lives on the dedicated Battery Conflicts sub-page instead.
Security
Section titled “Security”caesar
Section titled “caesar”[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”- “Manual Journals” renamed to “Journal Entries”. Per stakeholder feedback (Osita Onyekwere) that “manual journal” is Zoho jargon and reads unclearly, the Accountant menu item, page title, breadcrumb and Bulk-Update module option are now Journal Entries, and the create/edit form is New Entry / Edit Entry (button “+ New Entry”). The
accountantActivenav-highlight keys were updated in lockstep so the sidebar active state still resolves. The underlying object,Journal#voucher numbers and the double-entry line semantics are unchanged. - All date fields are now native date pickers, defaulted to today. Every “DD Mon YYYY” text input across the app — Invoice (date/due), Estimate (date/expiry), Bill (date/due), Credit Note, Expense, Journal, Payment (received/made), Vendor Credit, all four Recurring forms (start + ends), the bulk-expense grid, and the Bulk Update From/To filters — became
<input type="date">pre-filled with today (optional “Ends On” fields stay blank). Dates round-trip cleanly: sharedisoToDisp/dispToIsohelpers convert the picker’s ISO value to the app’s “DD Mon YYYY” display on save and back when editing, so all stored/displayed dates stay consistent. - Bank accounts now span multiple currencies + company-scale amounts. Two accounts were re-denominated to show the multi-currency model on the banking page, dashboard tiles and account detail: Mercury · USD Domiciliary ($180,000) and JPMorgan · GBP Reserve (£64,000) alongside the NGN accounts (GTBank ₦148.6M, Sterling ₦38.2M, Petty Cash ₦2.4M, Corporate Card −₦3.8M); foreign tiles show the ≈ NGN equivalent and consolidate into the Naira totals. Every amount across the app was scaled to realistic company size (thousands→millions): the dashboard KPIs (Receivables ₦372.58M · Payables ₦168.42M · Cash in hand ₦591.1M · Inflow ₦892.5M), the cash-flow panel/axis, Income-&-Expense and Top-Expenses charts, the banking summary tiles, and — via a one-time runtime scaler (×1000, monetary values only, FX rate table and quantities/percentages left intact) — all invoice/bill/expense/journal/COA/contact seed data, so lists, details and reports read at company scale.
- Bulk-categorized transactions keep per-line visibility. When several uncategorized bank statement lines are bulk-categorized together, they now post as one bundled transaction whose detail (opened by clicking the categorized row, which shows a “N lines” badge) preserves every underlying line — mirroring Zoho. The detail has a Transaction Details tab (a Statement Line Information (N) table listing each line with date/description/amount + Total, plus a Display Journal showing the double-entry Dr/Cr in base currency NGN, and a receipts drop zone) and a Comments & History tab, with Edit · Print · Uncategorize actions (Uncategorize returns the lines to the feed). Feedback from Phebe Idowu.
- Dark mode. A theme toggle (moon/sun) in the topbar switches the whole app between light and dark, persisted to
localStorageand re-applied on load. Implemented by overriding the design tokens under abody.darkscope, so every component that usesvar(--*)adapts automatically — surfaces, text (1/2/3), borders, brand/semantic dims, and shadows are all re-tuned for dark with accessible contrast (light text on#181B21cards over a#0F1116page; lightened green/blue/amber/red/purple for legibility on dark).color-scheme:darkis set so native date pickers and scrollbars render dark. Following a full audit for dark-mode inconsistencies, the hardcoded colors that don’t live on tokens were tokenized or given dark overrides: form inputs/selects/textareas and the modal panel now usevar(--input-bg)/var(--surface)(so they’re white in light, dark in dark); the brand-green buttons (.btn-pri,.ds-btn-primary) use a fixed dark#111text/icon in both themes (per the brand rule — no more white-on-green in dark); the table header (.tbl th) usesvar(--grey2); all five toast variants, all tooltips (sidebar, chart, income-bar), and the matched/reconciled badge greens get dark-appropriate colors. Verified across dashboard, forms, modals, settings, and data tables — buttons, inputs, status badges and KPIs all keep good contrast; light mode is unchanged. - Multi-currency on a Naira base (Batch 1). Base currency is now NGN (₦) throughout (every KPI, card, table, register, chart and form, replacing USD). Bank accounts can be opened in any currency (the Add-Account form gained a full currency selector — NGN · USD · GBP · EUR · ZAR · GHS · KES · CAD · CNY), but all balances consolidate to Naira at live rates. Helpers added:
money(n,cur)/toNGN(n,cur)/curSym/CUR_NAMES/FX_TO_NGN. Also fixed five leftover$symbols in the banking JS (closing-balance series, save-transaction, categorize/match running balance, reconcile) that the bulk USD→₦ pass had missed. - Bank categorization + FX (Batch 2). On a bank account’s Uncategorized tab you can now multi-select lines (per-row checkboxes + select-all) and bulk Categorize (one category applied to all) or bulk Exclude. The bulk-categorize modal renders the full per-category field set that swaps with the “Categorize as” dropdown — the same fields as the single-line panel (e.g. Expense → Date · Vendor · Expense Account · Itemize · Amount · Tax · Reference# · Customer · Description · Attach Receipt; Vendor Advance → Vendor · Amount · Date · Reference# · Paid Via · Deposit To · Description) — with the Amount prefilled (read-only) to the combined total of the selected lines, mirroring Zoho’s “Categorize Manually” panel. Categorizing a single line renders that category’s own fields — the “Categorize as” dropdown now drives a live field set (
feedCatFields→txnFieldList(category)) so Expense shows Expense Account/Tax/Itemize, Vendor Payment shows Vendor/Paid Via, Transfer shows To/From Account, etc., with the line’s amount pre-filled. The Expense transaction gained an Itemize toggle (multi-line Account · Notes · Amount · Tax) on both the bank Add-Transaction modal and the standalone Purchases ▸ Expenses form. When a transaction’s currency is changed away from NGN, a live editable Exchange Rate appears (prefilled from the rate table, “1 USD = ₦1,600 · editable”) with a running “Equivalent in base currency · ₦X” readout; the account balance consolidates in NGN. Teardown:docs/bank-categorize-teardown.md. - Line-item Tax picker + inline New-Tax (all document forms). The per-line
Tax %text input on Invoice / Estimate / Bill / Credit Note / Recurring Invoice / Vendor Credit is now a tax dropdown (Non-Taxable · VAT [7.5%] · WHT [5%] · WHT [10%] · + New Tax…) cloning the demo. “+ New Tax…” opens a New-Tax modal (Tax Name · Rate % · Tax Agency · value-added/compound checkboxes) that adds the tax to every picker and selects it. The option value carries the numeric rate, so all recalc/save logic is unchanged. - + New Tax on EVERY tax dropdown. The inline “+ New Tax…” affordance now appears on all tax selects, not just line items — the add-transaction / categorize Expense Tax, the bulk-categorize Tax, the standalone Expense Tax, both Expense itemize tables, the Recurring Expense Tax, and the manual + recurring Journal line Tax. Two shared helpers back this: a rate-valued picker (
taxSelById, value = numeric rate) and a label-valued picker (taxSelLabelById/taxSelLabelHTML, value = tax name, for journals/recurring-expense that store the label). Saving a new tax updates all open dropdowns of both kinds and the Settings ▸ Taxes list, since everything reads the singleTAXESarray. - File attachments on documents (Invoice / Estimate / Expense / Vendor Credit forms + Vendor Documents), matching the demo’s “Attach File(s)” — form control → persisted on the record → rendered on the detail page.
- Bulk Add Expenses (Purchases › Expenses) — a Record Expense / Bulk Add Expenses toggle opens a grid (Date · Expense Account · Amount · Paid Through · Vendor · Customer · Projects · Billable) with Add-More + Save-all, mirroring the demo.
- Bulk expense CSV upload (Batch 5). The Bulk Add Expenses grid gained an Upload CSV control plus a Download CSV template that autopopulate the grid: the file is parsed client-side (FileReader, quoted-field aware), vendor/customer names are matched to records, Billable Yes/No maps to the checkbox, and a trailing empty row is kept so you can keep adding. Review then Save creates the expenses.
- Settings flows — Roles & permissions, Locations, Taxes, Journal Approvals (Batch 7). The Settings area gained four working flows captured from the live product:
- Users & Roles (replaces the toast-only Team tab) — a Users tab (Invite User modal with a role dropdown; Change role; Remove) and a Roles tab (New Role / Edit modal with a module-permission matrix — Banking · Sales · Purchases · Accountant · Reports · Settings · Documents, each Full Access / View Only / No Access). Roles you create immediately appear in the Invite dropdown, so you create roles separately and invite users into them (system roles Admin/Staff are view-only).
- Taxes — manage the shared
TAXESrate table (New / Edit / Delete with Name · Rate · Agency · Compound), in sync with the line-item tax picker. - Locations — branches/depots (New / Edit, Make primary, Delete; Name · Code · Address · primary).
- Journal Approvals — the Accountant ▸ Journal Approvals preference: No Approval / Simple Approval / Multi-Level Approval, with Multi-Level revealing per-level approver pickers. Captured from
/settings/preferences/accountant/manual-journal-approval.
- Recurring Journals (Accountant · Batch 6). A new Recurring Journals area under the Accountant menu (after Manual Journals), mirroring Recurring Bills/Expenses: list (Profile · Reference# · Frequency · Last/Next Journal · Status · Amount) with view filters / search / sort / bulk Stop·Resume·Delete, a detail page (journal-entry lines, generated-journals table, schedule, notes, balanced check), and a New/Edit form (Profile · Repeat Every · Start · Ends On [Never expires] · Reference# · journal entry lines · Notes) with full Stop/Resume/Clone/Delete. Wired into the sidebar, breadcrumbs, and active-state.
Changed
Section titled “Changed”- Per-row currency + Transaction Type on journal entries (Batch 6). Each manual-journal and recurring-journal line now has its own Currency selector (was a single header-level currency), so a journal can mix currencies line by line. Added the Transaction Type column (Select a Type · Sales · Purchase) between Contact and Tax, matching Zoho’s journal grid (used for tax reporting), captured on save for both forms. Column widths were given
min-widthfloors and the line table scrolls horizontally when dense, so currency codes and type labels no longer clip; the Description cell flexes to fill any slack (no empty gap). Scoped the shared journal form helpers (jrAddLine/jrFormRecalc/save) to the active screen so the manual and recurring forms — which share line markup — don’t collide. - Invoice clone + account fields on Invoice & Credit Note (Batch 4). Cloning an invoice now opens an editable pre-filled draft form (was dumping straight to the read-only detail) — the proper Zoho clone flow. Invoice creation gained an Accounts Receivable account selector (Accounts Receivable · Trade Debtors · Unbilled Receivables) plus a Subject field, matching the live form; the chosen AR account drives the invoice’s GL posting and shows on the detail. Credit Note creation gained the same Accounts Receivable + Subject header fields and a per-line Account column (income account: Sales · Other Income · Interest Income · Consulting Income), exactly as captured from the demo (Item Details · Account · Qty · Rate · Disc · Tax · Amount). Also swept the remaining
(USD)price-list / revaluation labels to(NGN)(the genuine “1 USD =” foreign-rate labels were left intact). - Reconciliation reworked to match Zoho (Batch 3). The old “tick the cleared lines” model was wrong — Zoho lists the period’s transactions (you don’t select them) and you clear the gap between the statement Closing Balance and the book Cleared Balance by adding transactions until the Difference reaches ₦0. The reconcile worksheet now shows three live tiles (Cleared · Closing · Difference), an amber hint that names the difference and the direction to clear it (“add the missing withdrawal(s)…”), a non-selectable Deposits/Withdrawals table of the period transactions, and a + Add Transaction inline form that matches Zoho’s reconcile Add-Transaction modal — Apply To (Payments/Refunds · Charges) · Date (+ “Use today’s date”) · Account · Amount · Reference#, with a tip showing the exact amount that clears it — that appends rows and recomputes. Reconcile stays disabled until the difference is ₦0, then the tile turns green. Captured from the live
/reconciliations/.../newflow. - Bill form completed — added the missing Order Number and Price List fields (the demo + Caesar’s own invoice form have them); Order# shows on the bill document.
- Vendor Credit lines gained the Tax column (was missing) — wired to the tax picker, with Sub Total / Tax / Total in the form, detail table, and save; added
vcTax/vcTotal. - Reports: custom date range + drill-down. Added a Custom period option with From/To inputs (Apply re-renders), and every report row whose label is a known account / customer / vendor is now clickable to its detail (Trial Balance/Balance Sheet/GL/P&L → COA register, Sales-by-Customer/AR-aging/balances → customer, AP/vendor reports → vendor).
- Banking overview polish — the four stat tiles now use the
--grey1card background (matching the Account Summary tab); the “All Accounts” header and “Cash flow” divider strokes are inset to the card’s 20px padding instead of running edge-to-edge. - Recurring Expenses module (Purchases) — replaces the dead “Requisitions” sidebar item. Captured the Zoho demo’s Recurring Expenses deeply (list / detail / form / menu) and built a dedicated, demo-faithful area: a single expense-account model (not a bill line-item table). List columns match the demo exactly — Profile Name · Expense Account · Vendor Name · Frequency · Last Expense · Next Expense · Status · Amount; detail shows Expense details (Amount/Repeats/Account/Paid Through/Tax/Start/Ends/Last/Next) + Other details (Vendor/Customer/Notes) + a clickable generated-expenses table; the form carries Profile · Repeat Every · Start · Ends On · Expense Account · Amount · Tax · Paid Through · Vendor · Customer · Notes. Full interactivity (row/kebab Edit·Stop·Resume·Delete, bulk actions, sort/filter/search, Clone, New). Wired into the sidebar (after Expenses, matching the demo), Quick-Create, breadcrumbs, active-state and the dashboard “View more”. Recurring Bills is now bills-only (the two expense profiles migrated to Recurring Expenses; the Bill-vs-Expense Type column / view filters / form select were removed) so the two areas are disjoint, mirroring the demo. Teardown:
docs/recurring-expenses-teardown.md.
Changed
Section titled “Changed”- Document references are now clickable and routed everywhere they appear. A generic
docLink(num)/docOpen(num)router (resolves any INV/BILL/PAY/PMT/EXP/EST/CN/VC number to its record) plus alinkifyDocs(text)helper for free-text were applied across the app so any invoice/bill/payment/etc. number opens its detail in one click: banking account Transactions Reference# column, COA account-register Details, Bulk-Update results, Documents “Associated With”, dashboard Recent-Transactions, payment-receipt/payment-made applied-doc tables, credit-note→invoice and vendor-credit→bill links (detail + list), customer/vendor Statement rows, and inline doc numbers in comments + Notes. Journal-detail account names now link to their COA register; the dashboard’s three Bank/Cash/Card tiles open their account. A general parallel cross-reference (6 module finders + adversarial verify, 14 confirmed findings, all fixed) drove this pass. Also: estimate “View Invoice” now opens the actual linked invoice (was dumping to the Invoices list); the vendor Statement period filter now actually filters by date (was a no-op); archived customer-transaction stubs toast instead of navigating to an unrelated list. Verified across all 20 screens with zero console errors. - Sidebar: expanding the collapsed rail now reveals the active section’s submenu in one click. When you’re two levels deep (e.g. a Payment receipt) the rail auto-collapses; expanding it — whether via the crumb toggle or by clicking the active section’s icon — now opens that section with its submenu shown and the current page highlighted, so you can switch to a sibling page (Invoices, Credit Notes, …) without a second click to open the menu. Fixes a bug where clicking the active section’s rail icon expanded the sidebar but immediately re-collapsed its (preserved-but-hidden) submenu. Clicking a different section while expanded still switches the accordion as before.
- Customer + Vendor detail section tabs now use the segmented (
.seg) tab style from the bank details page (Overview / Comments / Transactions / Statement) instead of the underline style. Track tinted with--hoverso the pill reads on the grey detail page (the bank’s.segonly shows its track because it sits on a white card). - Head-to-toe demo cross-reference remediation (65 findings, 63 fixed · 2 intentionally out of scope). Ran a deep parallel cross-reference of the whole app against the captured demo teardowns (17 High · 25 Medium · 23 Low), then fixed every functional gap and verified each batch in preview with zero console errors. The dominant theme was “looks right but does nothing” — bulk bars, clones, status toggles, and payment flows that only toasted instead of mutating the in-memory data.
- Topbar global search (H1) — the previously-dead search input now searches across CUSTOMERS / VENDORS / INVOICES / BILLS / ESTIMATES / BANK accounts, renders a grouped results dropdown (Contacts · Transactions · Accounts) with icons + amounts, routes each result via the real
open*()openers, supports/-to-focus and arrow/enter keyboard nav, and closes on outside-click/Esc. - Notifications (M2) — each notification routes to its record (bill → Bills, uncategorised → GTBank, period-close → Settings) and “Mark all read” clears the unread dots + bell indicator.
- Data-mutating actions (H2–H17) — banking KPIs / running balances / categorize-match recompute from
feed.lengthand write real transactions; all list bulk bars (customers, invoices, expenses, recurring bills, vendor credits, payments) mutate the arrays; clones produce valid records in the right status; mark-inactive / approve / write-off toggle real status; bill Record-Payment creates a linked Payment Made; deleting an applied payment reverses the bill balance; estimate Send advances Draft→Sent; credit-note Refund uses a modal; the three missing report bodies (General Ledger, Movement of Equity, Sales by Salesperson) render, report Export downloads real CSV, and the report date-range recomputes. - Parity gaps (M5–M22) — customer comment links open the referenced invoice; customer Statement date-range + Outstanding filters actually filter; estimate list kebab is status-gated (Convert to Invoice → View Invoice once Invoiced, hidden for Draft); invoice Make-Recurring seeds the recurring form from the invoice; payment-receipt GL splits Bank Charges; Comments & History panels added to payment-receipt, credit-note, and bill detail; vendor Transactions/Statement now derive from the live BILLS/PAYMENTSMADE/EXPENSES/VENDORCREDITS arrays with clickable rows; Bills gained a Pending Approval lifecycle (view filter + amber banner + Approve/Reject); Expenses list gained the Customer column; recurring-bill generated docs are clickable; Bulk-Update From/To date filters work.
- Polish (L1–L23) —
navToclears stale sub-item highlight; Duplicate-Customers view uses a real name/email heuristic; Client Viewed added to estimate views; Expired badge → grey (terminal); Draft/Pending invoices no longer show a Journal link; Approved invoices get Send actions; void/write-off now confirm via a reusableconfirmModal; write-off is a distinct Written Off status; recurring-invoice Terms & Conditions field; payment Advance/Retainer views de-overlapped; bill attachments (upload + list); Recurring-Expense quick-create presets Type = Expense; manual-journal line grid + detail gained a Tax column and the detail totals are a real column-aligned<tfoot>;parseDatenow orders by year; Documents Trash count badge + folder counts refresh on move-to-trash; Bulk-Update dropped the out-of-scope Purchase Orders type. Intentionally not done: the optional “Bank Statements From Inbox” email-forwarding widget (L2 — avoids re-introducing mail UI) and adding Journal/Recurring-Expense to the customer New-Transaction menu (L4 — the curated sales-only set is by design per the teardown).
- Topbar global search (H1) — the previously-dead search input now searches across CUSTOMERS / VENDORS / INVOICES / BILLS / ESTIMATES / BANK accounts, renders a grouped results dropdown (Contacts · Transactions · Accounts) with icons + amounts, routes each result via the real
- App-wide design / spacing pass (4px-grid clean-up). Ran a parallel design audit (10 module readers, every finding adversarially re-verified) against the Rechaj hard rules, then normalized the foundation CSS + inline styles so every padding / margin / gap lands on the 4px grid (snapping the banned 7 / 11 / 13 / 14 / 15 / 18 / 22 / 26 / 30-style values to the nearest multiple of 4; the consistent 6px / 10px sub-rhythm is kept). Canonicalized the
.badgeto the design-system spec (12px / 500 weight / 6px radius, was 11px / 600 / 21px) and removed a stray 10px badge override in Chart of Accounts. No card-stroke, grey-card, white-on-white, or em-dash-in-copy violations were found, confirming the structure was already sound. Two flagged “bold status word” findings were false positives (already overridden to 600 by.est-banner b/.est-meta b). Verified in preview, no console errors, no visual regressions across Dashboard, Invoice detail, Record-Payment modal, Banking, P&L, and Chart of Accounts. - Full interactivity sweep — every “coming soon” toast removed (was 87, now 0), verified in preview with no console errors. Re-cross-referenced the whole app from Banking down to Documents and wired every dead control to real behaviour:
- Banking — the Add Transaction menu now carries all 20 demo transaction types (same full menu for bank/card/cash, confirmed against the demo), and clicking each type renders its captured per-type form fields; Import Statement and Attach use real file drop-zones.
- Shared utilities (new, reused app-wide so there are no per-screen dead ends):
exportCSVAuto(downloads the visible list as CSV),emailAuto/composeEmailModal(compose-email modal prefilled with the doc’s contact + subject),printDoc,importModalAuto(CSV/XLSX import modal with drop-zone + duplicate handling),viewJournalAuto/glModal(system-posted double-entry GL view for any posting doc — invoice, bill, payment, credit note, vendor credit, expense — with a balanced/unbalanced check),newTxFromContact(New Transaction menu entries open the right prefilled form with the customer/vendor selected),cloneAuto(deep-clones the open record as a new Draft),mergeModal+portalModal(customer/vendor merge + portal config). - Sales — customer/vendor New Transaction menus open prefilled forms (dropped out-of-scope Project/Journal/Recurring-Expense/Purchase-Order); customer/vendor Delete removes the record and returns to the list; bulk Merge validates a 2-record selection; the Transactions-tab “+ Add New” rows open the matching prefilled form; estimate Convert to Invoice now creates a real linked invoice and “View Invoice” opens it; estimate Share copies a portal link; invoice Create Credit Note opens a prefilled credit note; invoice/bill Make Recurring open the recurring form.
- Purchases — billable expense Convert to Invoice creates a real linked invoice from the expense; vendor flows mirror the customer side.
- Reports/Documents — Custom Report opens a report builder modal; report Export downloads CSV; Upload, New Folder, and file Preview open real modals (upload adds to the list); journal attachment download wired.
- Genuinely out-of-scope sidebar / quick-create destinations now show a neutral “not in this prototype” note instead of a dead click.
- Reports Center + Documents COMPLETE.
- Reports (
#/reports) — a Reports Center with a left category nav (Business Overview · Sales · Receivables · Payables · Purchases & Expenses · Taxes · Banking · Accountant) and categorized report links. Rendered financial reports computed live from the COA + data: Profit and Loss (Income → COGS → Gross Profit → Operating Expenses → Net Profit, the finance headline), Balance Sheet (Assets / Liabilities / Equity, balanced via Current-Year-Earnings), Trial Balance (debits = credits), AR / AP Aging Summary, Sales by Customer, Customer/Vendor Balances, Purchases by Vendor, Expenses by Category, VAT / WHT Summary, Bank Account Summary, Cash Flow Statement. Each opens a clean report sheet with date-range + Export/Print. - Documents (
#/documents) — a single place listing every file uploaded or posted (Name · Type · Associated With · Uploaded By · Date · Size), with a left folder nav (All Documents · Files · Bank Statements · Folders · Trash), search, type-colored file icons, upload, and move-to-trash. Seeded from the attachments created across the build (journal supporting docs, bill/invoice PDFs, bank statements, VAT filing).
- Reports (
- Accountant module COMPLETE — built all four sub-menus (deep-cross-referenced against the demo, no console errors):
- Chart of Accounts (
#/accountant/chartofaccounts) — 24-account COA incl. MocX-specific accounts (VAT Payable, WHT Receivable/Payable, Rider’s Loan, Solar Panel Sales); list with type badges grouped by Asset/Liability/Equity/Income/Expense, type/active view filters, sort, search; per-account register detail (info + closing balance + transactions); New/Edit account modal with grouped type select. - Manual Journals (
#/accountant/journals) — the finance “very key” one: double-entry line editor (Account · Description · Contact · Debit · Credit) with a live balance check that blocks publishing until debits = credits; detail shows the journal entries, Notes, Attachments, and a prominent Audit Trail (who created/edited/published, when, and what changed); Save as Draft / Save and Publish. - Bulk Update (
#/accountant/bulkupdateaccounts) — accountant tool with a risk banner: filter transactions by type + current account + date, select, and re-account in bulk to a new account (actually updates the rows). - Currency Adjustments (
#/accountant/bcyadjustment/list) — FX revaluation at the CBN rate (per the finance team): list of past adjustments with gain/loss, and a New Adjustment modal that fetches the CBN rate, revalues the foreign-currency accounts, and computes the net gain/loss live as the rate changes.
- Chart of Accounts (
- Purchases module COMPLETE — built all six sub-menus (each: list + detail + form, fully dynamic, deep-cross-referenced where the demo was reachable, no console errors):
- Vendors (
#/vendors) — mirror of Customers on the payables side: list (Name · Company · Email · Work Phone · Payables · Unused Credits), detail with Overview · Comments · Transactions · Statement tabs (Spend chart, Bills/Payments-Made/Expenses/Vendor-Credits sections, vendor statement), New Transaction (Purchases) menu, and the full new/edit form. - Bills (
#/bills) — posting doc mirroring Invoices with a per-line Account column (expense account), Bill-From/Bill-To document, Record Payment → Payments Made, Journal link, Balance Due, Make Recurring. - Payments Made (
#/paymentsmade) — Payment Voucher detail (amount-in-words), apply-to-open-bills form with Pay-in-full that reduces bill balances. - Expenses (
#/expenses) — list (Date · Account · Reference# · Vendor · Paid Through · Status · Amount), expense detail with a debit/credit Posting card + Convert-to-Invoice for billable, form that sets Billable when a customer is attached. - Recurring Bills / Expenses (
#/recbills) — recurring purchase profiles with a Type (Bill/Expense) column + filter, Schedule/Vendor cards, generated-documents list, Stop/Resume, line items with Account. - Vendor Credits (
#/vendorcredits) — mirror of Credit Notes on the vendor side with an Apply to Bills modal (reduces bill balance, closes the credit when fully used), Refund, Journal link. - Note: the demo’s JS bridge was intermittently timing out during this batch; Expenses was built from Zoho’s established structure (columns confirmed earlier from the vendor Expenses section) and will be re-verified against the live demo. All other Purchases sub-menus were cross-referenced against the demo.
- Vendors (
- Sales module COMPLETE — added the remaining three sub-menus (each: captured from the live demo by clicking everything, built list+detail+form dynamically, deep cross-referenced, revalidated, no console errors):
- Payments Received (
#/paymentsreceived) — list (Date · Payment# · Type · Reference# · Customer · Invoice# · Mode · Amount · Unused; views All/Invoice/Retainer/Customer-Advance); Payment Receipt detail (amount-in-words, applied-invoices table, Journal link); form with an apply-to-open-invoices table + “Pay in full” that recalcs live and reduces invoice balances on save. - Recurring Invoices (
#/recurringinvoices) — list (Customer · Profile · Frequency · Last/Next Invoice · Status · Amount; views All/Active/Stopped/Expired); detail with Schedule + Customer cards, line-item doc, generated-invoices list, and status-dependent Stop/Resume; form (Profile · Repeat Every · Start/Ends + Never-expires · Terms · line items, live total). - Credit Notes (
#/creditnotes) — list (Date · Credit Note# · Reference# · Customer · Invoice# · Status · Amount · Balance; views All/Draft/Open/Closed/Void); CREDIT NOTE detail with Credits-Remaining, Journal link, and an Apply to Invoices modal that applies the credit to open invoices (reduces invoice balance, closes the note when fully used); form (Save as Draft / Save as Open).
- Payments Received (
- Sales · Invoices (batch 3 of Sales) — captured end-to-end from the demo (route
#/invoices) + Zoho API/Help, recorded indocs/sales-teardown.md, and built in the shell (#scr-invoices/#scr-invoice/#scr-invoice-form), wired to sidebar Sales → Invoices, breadcrumb Sales › Invoices › {num}. The first posting sales doc:- List: Date · Invoice# · Order Number · Customer Name · Status · Due Date · Amount · Balance Due; view dropdown (All · Draft · Pending Approval · Approved · Sent · Partially Paid · Overdue · Paid · Void) that filters; sortable columns incl. Due Date + Balance Due; list hamburger; bulk bar; full status colors (Draft grey · Sent blue · Partially Paid amber · Overdue red · Paid green · Void grey).
- Detail: PDF-style invoice document (org · INVOICE · Invoice/Due dates · Terms · Bill To · line items · totals incl. Payment Made + Balance Due), status-contextual banner, header actions Comments & History · Edit · Send · PDF/Print · Journal (GL link, since invoices post) · Record Payment + status-dependent primary (Draft → Send Invoice/Mark as Sent; Sent/Overdue/Partially Paid → Record Payment) + More (Clone · Create Credit Note · Write Off · Void · Delete). Comments & History timeline.
- Record Payment modal (amount, date, mode, deposit account) that actually applies — reduces Balance Due and flips status to Partially Paid / Paid. Write Off and Void update status live.
- Form: Customer* · Invoice# · Order Number · Invoice Date · Payment Terms · Due Date · Salesperson · Price List + per-line Disc/Tax line items with live totals, Notes/Terms, and Save and Send / Save as Draft / Make Recurring / Cancel (persists). Verified end-to-end in preview, no console errors.
Changed
Section titled “Changed”- Detail header spacing — added a consistent 24px gap between the detail header/toolbar and the status banner (
.est-banner, used by estimate + invoice details) and the customer detail’s summary tiles, so the banner no longer sits flush against the action row. - All card containers are now white, not grey. Flipped every card surface from
--grey1to--surface(white) across the app —.sum-card,.est-doc,.stmt-doc,.est-banner,.bk-s,.bank-card,.sum-side-tile,.rec-b,.cmt-box, and the banking-summary accordion card. To keep white cards visible (no strokes/shadows allowed), they now sit on the grey page rather than nesting in a white panel: the customer-detail tab wrapper and the dashboard “Bank and Credit Cards” section are transparent, the banking account-summary wrapper toggles flat (.txn-card.flat) for the summary view while the transactions table keeps its white card, and the customer Comments/Transactions tab content is wrapped in its own white card. Grey is retained only for non-cards (hovers, icon circles, badges, modal footers, disabled inputs). Verified across estimates/customers/banking/dashboard, no console errors.
-
Estimates — deep cross-reference against the demo + gaps closed. Drove the live demo through the whole Estimates flow and matched it field-for-field:
- Detail: added the demo’s Comments & History panel (toggle in the toolbar) — an Add-Comment composer + comment list and a status-derived audit/history timeline (created → sent → viewed → accepted/declined/invoiced/expired). Made the header’s primary actions status-dependent (Draft → Send Estimate + Mark as Sent; Sent → Mark Accepted/Declined + Convert to Invoice; Accepted → Convert to Invoice; Invoiced → View Invoice). Added Share to the More menu.
- Per-line Discount & Tax: the demo’s line-item table has Discount and Tax columns (mine only had Qty/Rate/Amount). Reworked the data model and totals to compute per-line discount + tax (rolling into Sub Total · Discount · Shipping · Adjustment · Tax · Total); the detail document now shows Disc/Tax columns.
- Form: added the missing Project Name and Price List fields, and the per-line Disc % / Tax % columns, all feeding the live-recalculating totals; Save validates the customer and persists.
- Recorded the deep capture in
docs/sales-teardown.md. Verified end-to-end in preview (status actions, Comments & History add/toggle, per-line math, form recalc), no console errors.
-
Sales · Estimates (batch 2 of Sales) — captured end-to-end from the live demo (route
#/quotes) + Zoho API/Help docs, recorded indocs/sales-teardown.md, and built in the shell (#scr-estimates/#scr-estimate/#scr-estimate-form), wired to sidebar Sales → Estimates with breadcrumb Sales › Estimates › {num}:- List: columns Date · Estimate# · Reference# · Customer Name · Status · Amount; a view dropdown (All · Draft · Sent · Accepted · Declined · Invoiced · Expired) that filters; sortable Date/Estimate#/Customer/Amount with indicators; list-options hamburger (Sort · Import · Export · Refresh); a bulk bar (Mark as sent/accepted · Email · Print · Delete); full status badge set color-coded (Draft grey · Sent/Client-Viewed blue · Accepted/Invoiced/Approved green · Pending amber · Declined red · Expired amber).
- Detail: PDF-style estimate document (MocX org block · ESTIMATE · number · Bill To with address · estimate/expiry dates · salesperson · line-item table · Sub Total/Discount/Shipping/Adjustment/Tax/Total · Notes · Terms), a status-contextual banner, and header actions Edit · Mails · PDF/Print · Convert to Invoice · More (Mark as Sent/Accepted/Declined · Clone · Create Project · Delete). Lifecycle actions update status live; Convert to Invoice flips status to Invoiced (and the button becomes “View Invoice”).
- New / Edit form: header (Customer* · Estimate# · Reference# · Estimate/Expiry dates · Salesperson) + an editable line-item table (Item · Qty · Rate · Amount, add/remove rows) with live-calculating totals (Sub Total · Discount · Shipping · Adjustment · Tax % · Tax amount · Total) + Customer Notes · Terms; Save and Send / Save as Draft / Cancel actually persist (new estimate prepends to the list; edit updates in place). Verified end-to-end in preview, no console errors.
-
Sales · Customers (batch 1 of Sales) — captured end-to-end from the demo (
docs/sales-teardown.md) and built in the shell: a Customers list (#scr-customers: Name · Company · Email · Work Phone · Receivables · Unused Credits, with search, an All Customers/Active/Inactive/Overdue/Unused-credits filter, bulk-select bar, per-row kebab, and avatars + status dots); a customer detail screen (#scr-customer); and a full New / Edit Customer form (#scr-customer-form: Customer Type, Primary Contact, Company, Display Name, Email/Phone + section tabs Other Details · Address · Contact Persons · Remarks, matching the demo’s fields). Wired to the sidebar Sales → Customers; breadcrumb Sales › Customers › {name}. All controls dynamic; verified, no console errors. -
Customers menu — full demo cross-reference + every control wired up. Drove the live demo through the whole Customers menu (list, form, detail) and closed every gap:
- List view: title is now a view dropdown matching the demo’s default filters (All Customers · Active · Inactive · Overdue · Unpaid · Client Portal Enabled · Client Portal Disabled · Duplicate · CRM Customers), each actually filtering; sortable columns (Name · Company · Receivables · Unused Credits) with live sort indicators; a list-options hamburger (Sort by · Import · Export · Refresh List); and a bulk-action bar aligned to the demo (Mark as inactive · Merge · Send email · Delete) that reads the live selection count.
- New / Edit form now matches the demo field-for-field and is fully functional: added the Mobile field (Customer Phone = Work Phone + Mobile), Source, Documents upload, and a Portal Language field that reveals when portal access is enabled; the “shipping same as billing” toggle now shows/hides a full Shipping Address block; Save validates the required Display Name and actually persists (creates a new customer — slug id, opening balance → receivables — or updates the existing one) so it appears in the list immediately; added Save and New.
- Detail: added the demo’s “Go to transactions →” link atop the Transactions tab.
- Capture recorded in
docs/sales-teardown.md(List view + form deep-capture sections). Verified end-to-end in preview (view filters, sort, hamburger, bulk bar, create/edit/persist, toggles), no console errors.
-
Customer detail — deep re-capture + rebuild to match the demo, no empty tabs. Clicked through every control on the live demo and rebuilt
#scr-customeraccurately:- Mails tab removed (per request); tabs are now Overview · Comments · Transactions · Statement.
- Overview is now two-column and data-rich: Contact details, Address (Billing + Shipping), Other details (Customer Type · Currency · Price List · Payment Terms · Portal Status · Source · Website), Remarks; and on the right a Receivables panel + an Income bar chart (last 6 months, hover tooltips, total).
- Comments — a working composer (Add Comment prepends a real comment + updates the count) over an “All comments {n}” list (avatar · author · time · body · contextual link), matching the demo.
- Transactions — the demo’s grouped, collapsible sections each with a count + Add New: Invoices (Date · Invoice# · Amount · Balance Due · Status), Payments Received (Date · Payment# · Mode · Amount · Unused), Estimates, Credit Notes, with the demo’s full status set (Draft · Pending Approval · Approved · Open · Overdue · Partially Paid · Paid · Void). Empty sections show a real empty state, never a blank tab.
- Statement — date-range + Filter (All/Outstanding) dropdowns, Send Email / Print / PDF, and a statement document (org block + “Customer Statement” + date range) with a running-balance table built from the customer’s invoices and payments.
- Header menus now match the demo: New Transaction ▾ (Sales group: Invoice · Customer Payment · Estimate · Recurring Invoice · Expense · Recurring Expense · Journal · Credit Note · Project); More ▾ (Configure Customer Portal · Enable All Reminders · Clone · Merge Customers · Mark as Inactive · Delete).
CUSTOMERSenriched with per-customer addresses, other-details, remarks, comments, invoices/payments/estimates/credit-notes, and 6-month income so every tab is populated. Verified across customers (incl. inactive/empty), no console errors.
-
Banking round-2 — captured missed detail and built it:
- Add Transaction types now vary by account type (was using the bank set for all): Bank = full set; Credit Card = Card Payment · Expense Refund / Expense · Owner Drawings; Cash = asset set minus Card Payment. Confirmed against the demo.
- Transactions list: search + sortable columns — a Search input plus sortable Date / Deposits / Withdrawals / Running Balance headers with sort icons (search also filters the uncategorized feed).
- Account Summary rebuilt to match the demo: Activity Summary (Check Summary, Latest Statement Details — Transactions/Auto-Categorized/Recognized/Duplicates/Uncategorized/Best Matches — last import, last reconciliation), Transaction Rules summary (withdrawal/deposit counts), a Bank Summary closing-balance chart, Total Uncategorized / Total Recognized tiles, and accordion sections for Recent Transactions, Recurring Expenses (→ Purchases), Recurring Journals (→ Accountant).
-
Full Zoho Books product map + feature-interlink reference —
docs/zoho-books-product-map.md: every module, the shared foundations (COA/GL, Contacts, Taxes, Currencies), and how features interlink (Banking↔Sales/Purchases/Accountant, recurring generators, posting→GL, conversions). Captured so each future batch knows its dependencies. -
Banking: account switcher on the transactions view — the account name in the header is now a dropdown listing all accounts (icon · name · currency, current one checked); picking one switches the view in place (re-renders + updates the breadcrumb) without going back to the list.
-
Banking: uncategorized counts are a single source of truth — every uncategorized count (account-row badge, transactions tile + tab, dashboard bank card + notification) now derives from the actual feed-item count, not a hardcoded number, and stays in sync as items are categorized/matched (
syncAcctBadges()). Fixes the tab showing 39 when only 4 items existed. -
Banking module built end-to-end (from
docs/banking-teardown.md) — a working account transactions screen (#scr-bank-txns, opened by clicking anywhere on an account row or “View transactions”; the ⋮ menu and its actions are excluded from the row click): account header + breadcrumb (Dashboard › Banking › Account), balance summary tiles, Account Summary ↔ Transactions toggle, status tabs (All · Uncategorized · Categorized), the demo’s transaction table (Date · Reference# · Type · Status · Deposits · Withdrawals · Running Balance) with status pills, empty state, and “bank statements from inbox”. Plus the seven flows as live web.dlgmodals / inline panels: Add Bank/Credit Card · Edit Account · Add Transaction (full Money In/Out type menu → form that prepends a real row) · Import Statement (3-step stepper: configure → map → preview) · Transaction Rules (criteria builder + action) · Match & Categorize (one-click match, categorize, exclude — decrements the uncategorized count) · Reconcile (live cleared/closing/difference, zero-to-reconcile). Overview fixes: per-row ⋮ menu now varies by account type (Bank/Card full, Cash reduced) and an Active Accounts status filter. All controls dynamic; verified no console errors. -
Topbar breadcrumb trail — replaced the single page-name crumb with a real breadcrumb (
renderCrumbs()+ per-screenCRUMB_TRAILS): e.g. “Dashboard › Banking” with the parent crumbs clickable to navigate back. Extends to sub-pages as Banking flows are built. -
Banking Cash flow chart rebased to an index (multi-currency fix) — because the six accounts span two currencies (₦/$) and very different sizes, each line is now indexed to its own period start (= 100) so trends are directly comparable on one axis, with a dashed baseline at 100. Absolute balances stay in the KPI cards, the table, and the hover tooltip (native currency). The multi-series tooltip now follows the cursor instead of floating above the chart.
-
Banking Cash flow chart now plots the actual accounts — replaced the four account-type series with one line per real account (GTBank · Operations, Sterling · Collections, Petty Cash, Mercury · Operating, JPMorgan · Reserve, Corporate Card), each color-coded with visible dots; the legend moved below the chart (demo placement) and lists those accounts. Per-date hover tooltip shows all six accounts’ balances in their native currency (₦/$). The All Accounts dropdown now drives the chart, highlighting the picked account and dimming the rest (“All Accounts” restores all). Hide chart also drops the “Account balances…” subtext (the “Cash flow” title stays).
-
Banking overview rebuilt to match the demo’s KPI set, chart and controls — replaced the placeholder summary tiles with the demo’s five cards: Bank Balance · Card Balance · Cash In Hand · Payment Clearing (the four account-type balances, each with its tinted circular icon, negative balances in red) plus an Uncategorized Transactions card (count + “Categorize now”). Added the All Accounts account-selector dropdown and moved Last 30 days to the overview header. The Cash flow chart is now the demo’s four-series line chart (Bank/Card/Cash/Payment Clearing, color-matched to the legend) with visible data-point dots on every series and a per-date multi-series hover tooltip (each series shown with its colour swatch + value). Fixed the inaccurate “Cash in / Cash out” legend.
-
Single app shell — consolidated the per-page shells into one
screens/dashboard.htmlapp with in-app screen switching (.app-screensections +navTo()): the sidebar/topbar/Quick-Create/dropdowns are defined once, and Dashboard ↔ Banking switch without a reload (active nav + breadcrumb update). Removed the standalonebanking.html(its content is now the Banking screen). Login still lands here. -
Dashboard KPI cards: equal height with the footer anchored to the card bottom (no dead space on the Cash cards); chart hover tooltips on the Cash Flow line + Income/Expense bars.
-
Banking screen — expanded to match the demo fully: a Cash Flow chart (last-30-days area chart) + the accounts table rebuilt in a canonical Atlas
.tbl-cardwith the demo’s columns (Account · Entity · Uncategorised · Pending · Amount in bank · Amount in Caesar), per-account transaction counts, amber uncategorised count badges, and the group-cash footer. -
Banking page (folded into the Banking screen) — first module page behind the nav. Zoho’s banking features in our design: summary tiles (cash in Caesar, amount in bank, uncategorised, accounts) + an accounts table (account · entity · amount in bank vs amount in Caesar · status), with Add Bank/Credit Card + Import Statement actions and an All/NGN/USD filter. Reflects the finance team’s note that it’s manual-record (not feed-integrated). Shares the app shell (collapsible sidebar + tooltips, topbar, dropdowns). Dashboard ↔ Banking navigation wired (sidebar Banking item + “Go to Banking” CTA).
-
Dashboard KPI cards: added the current-vs-overdue split bar to Total Receivables and Total Payables (matching the demo).
-
Dashboard (
screens/dashboard.html) — Zoho Books’ features & flows redesigned in the Rechaj design system (not a visual clone). Our components throughout: a collapsible + expandable sidebar (.sb-*— collapses to a 68px icon rail with tooltips; Sales/Purchases/Accountant expand to sub-items), our topbar (collapse toggle · breadcrumb · search · green New · notifications · org switcher · user-pill), line tabs, KPI stat cards (Receivables · Payables · Cash in hand · Cash inflow), charts (cash-flow area, income/expense bars, top-expenses donut), circular tinted icons, and bank-account cards. Per the finance walkthrough, dropped: Items, Time Tracking, Tax Returns, Configure Features list (sidebar) and Projects, Account Watchlist, Getting Started (dashboard). Brand green, General Sans, shadow-only cards. Login Sign In navigates here. -
Login screen (
screens/login.html) — first built surface. Caesar-distinct centered, logo-led form with floating finance objects (Acctual-style, in the Rechaj palette): a clean centered card (shadow-only) for the form, with invoice / journal / cash mini-cards, a “Posted” badge, and naira + USD coins drifting around an airy off-white canvas with soft green glow. Deliberately not the Atlas split-screen, so Caesar reads as its own product on landing. Rechaj palette throughout (General Sans, brand-green dark-on-green Sign In, canonical bolt logo, no card strokes). Previewable via thecaesar-loginlaunch config (port 8790). -
Initial product scaffold (README, DESIGN.md, architecture.md, docs/).
-
Phase 1 BRD rendered to
docs/brd.md; source.docxpreserved indocs/attachments/. -
Provisional persona/flow plan in
flows/README.md. -
Zoho Books product teardown in
docs/zoho-books-teardown.md— full IA/flows/forms/reports/COA/settings of the demo we mirror, with the Caesar mirror/drop/add mapping. -
Finance-team walkthrough scope decisions in
docs/finance-walkthrough-2026-06-18.md— keep/drop/add per module from the stakeholder call, action items, and divergences to confirm with the CFO. -
Registered Caesar across the monorepo (scaffold script, release-please manifest/config, root README, llms.txt).
Changed
Section titled “Changed”- All accounts and transactions consolidated to USD — removed every NGN account/amount (GTBank, Sterling, Petty Cash are now USD): account balances, transaction amounts, feed items, chart tooltips, KPI tiles (Cash In Hand $9.2K), the Bank/Credit-Cards dashboard cards, the group-cash footer (“$2.10M · all accounts in USD”), the Add Account currency picker (USD only), and the import preview are all $. The currency (All/NGN/USD) filter was removed since there’s a single currency now. The rebased Cash-flow chart stays (still multi-scale across accounts).
- Add Transaction forms are per-type and now captured field-by-field from the demo (all 15 types) — each type renders exactly the demo’s fields: e.g. Customer Payment = Customer · Amount Received · Bank Charges · Date · Payment# · Reference# · Received Via · Description · Attachments; Expense = Expense Account · Vendor · Date · Amount · Tax · Reference# · Customer · Description · Attach Receipt; income types (Other/Interest Income, Owner’s Contribution, Sales Without Invoices) = From/Revenue Account · Amount · Received Via · …; Owner Drawings = To Account (equity); Card Payment / Transfers = From Account + To Account; Vendor Payment/Advance = Vendor · Amount · Date · Bank Charges · Paid Via. Added the Attachments field where the demo has it. (Exchange Rate / Reporting Tags omitted — single-currency USD.)
- Add Bank/Credit Card form is now type-aware — selecting the account type re-renders the fields to match: Bank = Account Number* + Bank Name* + Bank Identifier Code; Credit Card drops Account Number + Bank Identifier (keeps Bank Name); Cash drops the bank fields (Description instead). Matches the demo’s per-type form.
- Form fields a touch taller (38px → 42px) across modal inputs/selects; native
<select>chevrons now use a custom icon with proper right-edge spacing (no more cramped arrows). Bare dialog inputs (rule criteria, import mapping) now share the same styling. - Bank Summary (Account Summary) chart now has hover tooltips — per-date closing balance; every chart in the app now has working hover tooltips. The Account Summary “Transaction Rules” card links to Manage rules (the list of set rules; New rule + Back inside).
- Toasts use the canonical
alert-toastcomponent, top-center — replaced the custom black bottom-center pill with the design system’s.toast-live/.alert-toastpill (components/index.html): a colored badge + message + dismiss, fixed top-center, animating down-in / up-out, auto-dismiss. Variant is chosen per message — success (green “Done”), info (blue, e.g. coming-soon), warning (amber “Heads up”), gray (neutral). - Fluid shell (no horizontal scroll) — removed the hard
min-width:1440pxonbodyso the app resizes to the preview/browser viewport instead of forcing a fixed 1440px canvas (which overflowed the ~1425px panel). Wide tables now scroll inside their own container (the transactions table always; the accounts table below 1000px) so the page never scrolls horizontally, while account row menus stay un-clipped at desktop widths. - Sidebar collapsed by default — the app now loads with the sidebar collapsed to the 68px icon rail (tooltips on hover, expands on click), giving wider content room for data-dense menu pages. Toggled via the topbar control.
Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”- Banking accounts: replaced em dashes in account names (e.g. “GTBank — Operations”) with the DS middot (“GTBank · Operations”), per the no-em-dash rule; account-selector dropdown labels match.
Security
Section titled “Security”hermes-web-app
Section titled “hermes-web-app”[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”- 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-itemnav, 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
.tbleverywhere (grey rounded header, airy 12/16 rows, 18px card insets,.tbl-footwith 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
.psegpill 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
.psegsub-tabs and.tblsub-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;.dlgdialog canon; outline-red destructive row buttons; 600 weights (700 reserved for KPI digits); em-dash copy cleaned to middots.
- Shell — canonical full-height sidebar (Rechaj two-tone mark + product sub-label,
- 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’sRetrofitStation+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 vsmaxRetrofitsPerDaybar, 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 itsclusterso 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: falseflips to closed (with aclosedReason). Six SVG source files canonicalised atcomponents/radar/swap/. Closed banner surfaces in both the popup and the full station profile. - Rich Swap-station detail panel — modeled on
rechaj-backend-api’sSwapStationResponse+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 insessionStorage. 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
clusterfield to every keke / station / technician (assigned by nearest cluster centre) and aCLUSTERS+ per-clusterclusterSharemodel. 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 —
FieldAppnow takes astandaloneprop (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-viewflow insite/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-visiblering system;--muted-2lifted (#5e716a → #6f8579) to clear WCAG AA on the near-black canvas. /to search — the long-shown/hint now actually focuses the search bar;Escdismisses 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-motionnow also stills the reveal, the dispatch route-dash, the SLA pulse, and the Impact counters.
- 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
- 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.
- KaaG night view (
- 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
actionslist 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.
- No-code Alert Rule Builder (
- 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*-inktext variants for AA contrast on white.- Token system —
hermes-core.css:rootwas 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.jsxnow read theme tokens. - Toggle — a sun/moon control (new
sun/moonglyphs in theHIconset) lives in the module switcher (reachable on every module) and the ops top-right cluster. Default = dark; the choice persists tolocalStorage. - 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).
- Token system —
Changed
Section titled “Changed”- 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
Modalnow portals todocument.bodyso a glass panel’sbackdrop-filtercan’t trap its fixed backdrop, with an optionalthemefor 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-drawactions 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
dispatchfrom 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). NewTechIconcomponent (theme-aware--mk-disc,currentColorglyph + wrench, plain + hard-hat takes;.hm-tech/.hm-tech-freecarry the glow + pulse, stilled underprefers-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 livecurrentJobfor 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
Stagenow 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 tologin.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.
- Account menu (
- 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
locationslayer 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 thelocationskey. - 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
RadarMarkcomponent 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 underprefers-reduced-motion. Also fixed the standalonecomponents/radar/radar-mark-animated.svgasset, which was missing its SMIL animation. Rebranded every user-visible surface — the switcher brand (Radarwordmark, 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.kaagis now a derived view ofkekes.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) inDESIGN.md.
Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”- Live / Offline connection toggle — removed from the top-right cluster (the top bar is now identity-led). The
offlinestate and its whole last-known path (cached-position routing, queued immobilize commands, the offline banner) are left wired inHermesOpsand 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 legacydirections.htmltoggles. (Also fixed a latent duplicate: the global search no longer double-counts KaaG kekes, sinceHERMES.kaagis a derived subset ofHERMES.kekes.)
Removed (from the swap-station profile)
Section titled “Removed (from the swap-station profile)”- 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 inHERMES.stationsfor any future ops-tooling surface).
- Keke markers were harsh on light mode. On the soft
#eef1f0basemap 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→.14so 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 readsClosed · Running low · 3/16; Ikeja readsOpen · 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).
Security
Section titled “Security”polaris
Section titled “polaris”[Unreleased]
Section titled “[Unreleased]”- Radio option-cards spacing. The
.adm-optscope/type radio cards (New interview template · Scope, and the Move/Assign employee modal) were computingdisplay:block— a.fld > labelrule was overriding the flexgap, so the radio sat flush against its label. Bumped selector specificity (label.adm-opt) and set a 12px gap; fixed everywhere the card is used. - Settings hub tiles now uniform height. Every tile description is a concise single line (clamped with ellipsis as a guard,
min-width:0on the text column so it clamps correctly); all tiles render at an identical height across every group. Also dropped em dashes from the tile copy.
Changed
Section titled “Changed”- Knowledge Center reworked into a Craft/Notion-style library. Landing now shows every note as a preview card in a masonry grid (title + text preview + folder · author · star), so you can spot the right doc without clicking into folders. A left rail filters the Library (All docs · My notes · Shared with me · Starred, each with a live count) and lists Folders you can drill into (with a breadcrumb, sub-folder chips, and New folder / Share in-context). Cards are searchable (title + body), star-toggleable, and open the existing doc editor. New document now asks for a destination folder (pick an existing one, shown with its full path, or create a new folder inline and choose its parent) instead of silently dropping into a default folder. Replaces the old three-section → click-into-folder table browser. Share (on a doc or folder) now opens a compact Figma-style sharing overlay instead of silently copying a link: Copy link sits in the header, an email invite row with quick-add teammate chips, and a Who has access list — a lightweight lock/globe general-access row (Only invited people ↔ Anyone at MocX with the link, with its own view/edit level) plus per-person rows using inline text+caret roles (Can view / Can edit / Remove; owner locked; pending invites badged). Verified light + dark, console clean.
Changed
Section titled “Changed”- Vacancies · assign recruiter from the roster. “Assign recruiter” now picks from the recruiters created in Settings · Recruiters (active, not-already-assigned) instead of typing one from scratch, with + Add a new recruiter as a secondary option (which also saves the new recruiter to the roster) and an optional Deadline date to set the recruiter’s target.
- Team goals · tabbed with metric-key requests. The admin Team performance page is now tabbed: Team report (default — the reports table + KPIs) and My requests (the My metric key requests table, moved here from the general My-goals page, which no longer shows it). “Request a key” returns to this tab.
- Boards · Timeline view (Jira-style epic roadmap). New Timeline tab (alongside Board · List · Backlog). Epics render as bars on a time axis with a “today” line; expand an epic to reveal its child tickets as their own bars (positioned by due date). Epics now carry start / target dates (added to the epic form), and New epic now lives on the Timeline. Epics were removed from the Backlog view. Matched to Jira Timeline: a Weeks / Months / Quarters scale toggle, a progress fill in each epic bar (child tickets done · %), status-toned child bars, a hover tooltip (name · dates · progress / type · status · assignee), and hover lift.
- Boards · column transition rules. Board create + settings now include a Transition rules matrix — per column, tick which columns a ticket may move to (all-ticked = unrestricted, untick to block). Enforced on kanban drag: a disallowed move is rejected with a toast, allowed moves proceed.
- Employee locations (admin · Spend, new sidebar page after Requisitions). Lists employees with the sites they can raise requisitions against (Employee · Work email · Locations chips), searchable by name/email/employee #. Row click opens a “Locations for {name}” editor — a multi-select of all active locations (pre-checked to the employee’s assignments): filter search, a live “N selected” count, Select all / Clear (respecting the filter), “Empty = HQ fallback”, with Reset / Save. Captured 1:1 from the live
/requisitions/employee-locations.
Changed (Settings)
Section titled “Changed (Settings)”- Locations seed expanded to the full live site list (HQ, swap/retrofit stations, clusters, depots). App permissions app-role list synced to the live 24 roles (added Battery/Kit/Production/Charge-station/Procurement/Cluster roles); the Job titles multi-select now has a filter search + live “N selected” count (matching the live form), and editing a rule preserves an app-role that’s outside the current 24.
-
Sign-in page (
screens/login.html) — a split sign-in: credential form on the left, a branded “people” panel on the right with an employee avatar wall (radial-faded) and the headline “Where MocX people do their best work”, framed by floating product cards (onboarding checklist, a Q2-goal ring, a team snippet) tilted for a light isometric feel, over a subtle diagonal line pattern (faint brand-green hairlines). Inspired by the Langdock / Heidi / Firecrawl login patterns and fitting Polaris as a people platform. Rechaj DS: General Sans, real Rechaj brand mark + “Polaris” wordmark, no card strokes (soft shadow only), dark-on-green CTA; avatars are DS initial-avatars (no external images, CSP-safe). Form content mirrors the live/login: “The company people platform” / “Sign in to your Polaris account”, Continue with Zoho + Continue with Google SSO, an “or” divider, Work email + Password (with show/hide toggle), a Sign in with password button, “Trouble signing in? Contact IT”, and a Terms/Privacy line. The right panel is hidden below 960px (form-only). Both sign-in paths land in the app (dashboard.html); the app’s user-menu Sign out now returns here, closing the loop. Verified desktop + mobile, console clean. -
Onboarding task detail page. “View task” on a workflow-run’s onboarding instance now opens a real task-detail page (was a prototype toast), mirroring the live
/app/tasks/{id}page: back to the run · task title + status pill (Active/Queued) + period, a meta row (Complexity · Activates · Period), the task description (with clickable links), a per-hire New hire info block (Name · Job title · Department · Start date · Work email · Manager), and an Assignment card (Assigner · Assignees with per-assignee status). Captured 1:1 from the live UAT (Roy Watifve’s onboarding). Built on the canonicaladm-dh/adm-card/admDldetail widgets; verified light + dark, console clean. -
Admin console built out. Flipping to Admin view now opens a working console (matching the live
/dashboardteardown), not stubs:- Overview — Dashboard (KPI cards now with tonal icons + quick actions) · My requests (request-log: Type · Summary · Submitted · State, with state filters).
- Directory — Employees (directory table + status filters + Create), Departments (name/prefix/business-unit), Levels (code · pay group · rank), Job titles (default level), Positions (position # · job title · dept · BU · level · occupant · status). New-record actions file an approval request.
- Hiring (ATS) — Vacancies (per-status actions: Prepare offer → Review offer → Review & hire; Prepare-offer wizard preview), Offers (awaiting signature), Onboarding (Mark as hired), Interviews (Upcoming/Completed, opens the scorecard/decide flow).
- Spend — Requisitions (org-wide queue with a Pending/Approved/Unpaid KPI strip, opens the existing approval-chain detail), Categories (CAPEX/OPEX), Vendors, and the DoA matrix — Delegation-of-Authority policies whose amount-banded rules (Priority · Currency · Min · Max → approval chain) drive requisition routing, with Run-simulator / New-policy / Add-rule.
- Performance — Team performance (quarter banner + KPIs + direct-reports table with attainment + a Set goal form that assigns a metric-keyed goal into the report’s My goals) and admin My goals.
-
My profile page (from the user menu). A full HR profile: Identity (read-only employee number / work email / name with HR-approval Request change / DOB / resumption date + photo), Contact + residential address, Emergency contact, Next of kin, Tax IDs, Bank details (HR-approval), a document-upload form (type · file · note to HR) and a My-documents list, with a sticky Discard / Save footer.
-
General ↔ Admin view switch in the topbar (shield pill). Admin view swaps the sidebar to the admin console — Directory (Employees, Departments, Levels, Job titles, Positions, Vacancies, Interviews, Offers, Onboarding), Spend (Requisitions, Categories, Vendors, DoA matrix), Performance (My goals, Team goals) — and lands on an admin Dashboard (KPI cards + quick actions). The Employees directory is a live table; the remaining modules are first-pass landings to be built out in follow-up batches. A “General view” switch returns to the employee app.
-
Jira parity pass — everything links together.
- Sub-tasks are now real issues (own key, type, status, assignee, detail page) under a parent, not a checklist. The parent’s Sub-tasks tab lists them (checkbox to complete · status · assignee · open); each opens its own full page. Migration runs at load (
normalizeBoards). - Breadcrumb navigation on every issue page — Board ‹ Epic ‹ Parent ‹ Sub-task — each segment clickable, so you can jump up from a sub-task to its parent, its epic, or the board.
- Multiple assignees on every issue (and sub-task) — an assignee picker (checkboxes); cards/list/backlog show an avatar stack; the assignee filter matches any.
- Share links — a Share action on the issue page and board copies a deep link to the clipboard.
- Avatar hover tooltips — instant styled name tooltip on every avatar across the app.
- Board settings modal — name · key · description · column editor · access scope · Delete board. Members can now add a whole business unit or department (not just individuals). Board Share link.
- My issues quick filter on the board (plus the existing type/assignee/epic/priority filters + search).
- Create issue picks a Parent issue when type = Sub-task (and shows the Epic link otherwise); epics are created via type = Epic. New issues support choosing the assignee.
- Sprints — Start sprint (pulls Backlog in), Complete sprint (incomplete → backlog), and a Past sprints section in the Backlog with a per-sprint summary (goal · completed/total · points).
- Sub-tasks are now real issues (own key, type, status, assignee, detail page) under a parent, not a checklist. The parent’s Sub-tasks tab lists them (checkbox to complete · status · assignee · open); each opens its own full page. Migration runs at load (
-
Boards reborn as Jira-style spaces (Batch 1 of a multi-batch build). Each board is now a space with a key (e.g.
SWAP), columns = statuses, sprints, and rich issues.- Issue model — Type (Epic · Story · Task · Bug · Sub-task, each a coloured icon), key/ref (
SWAP-9), summary, rich description, Priority (Lowest→Highest, coloured arrows), Story points, status (= column), assignee, reporter, sprint, labels, due, parent epic, sub-tasks, linked issues, comments, activity. - Space header — key chip + name + member stack + New issue, with Board · Backlog · List view tabs.
- Board (kanban) — colour-coded columns, redesigned issue cards (epic chip · summary · labels · type icon + ref + priority + sub-task/comment counts + points + assignee), drag-and-drop between columns.
- List — sortable table of all issues (type · key · summary · priority · points · status · assignee). Backlog — issues grouped by Sprint (active sprint with goal + dates + point roll-up + Complete-sprint) and a Backlog group (Start-sprint).
- Issue detail (full page) — properties rail (Type · Status transition pill · Priority · Points · Assignee · Reporter · Epic · Sprint · Due · Labels) + Description + interactive sub-tasks (toggle, strike-through) + linked issues (blocks / is blocked by / relates / duplicates) + Comments (inline add). Board cards open here.
- Create issue modal — Type · Priority · Summary · rich Description · Status · Points · Assignee · Epic · Labels; auto-assigns the next
KEY-Nref and the active sprint. New boards get an auto key + empty issues/sprints.
- Issue model — Type (Epic · Story · Task · Bug · Sub-task, each a coloured icon), key/ref (
-
Jira issue detail · full interactivity (Batch 2). Every property on the issue page is now inline-editable via dropdowns — Type, Priority, Story points, Assignee, Epic, Sprint (and the Status transition pill), plus a Due date picker and Labels (add by typing + remove ×). Sub-tasks can be added (inline field) and removed; linked issues added via a type+target picker (blocks / is blocked by / relates / duplicates) and removed; attachments uploaded (file chips) and removed; comments added inline and own comments deleted. Triggers reuse the canonical
.dddropdown system; nothing is a dead control. -
Backlog + Sprints (Batch 3). The board is Scrum-aware — when a space has an active sprint, the Board shows only that sprint’s issues. In the Backlog view, issues are drag-and-dropped between the sprint and the Backlog (with grips + drop-zone highlight), Start sprint opens a sprint form (name · goal · start/end) that pulls Backlog issues into a new active sprint, and Complete sprint closes it (incomplete issues fall back to Backlog, done issues stay with the closed sprint). Story-point roll-ups per group update live.
-
Issue page · in-shell, tabbed, threaded (Batch 5 polish). The issue detail now opens in-shell as a full page (sidebar + topbar stay) instead of a viewport overlay, with white cards on the grey page (properties · description · a tabbed card). The lower sections are tabs — Sub-tasks · Attachments · Links · Comments · Activity — and Comments are threaded (canonical avatar rows with like + Reply + Delete, nested replies). Sub-tasks add via a + in the panel header → modal (the inline field is gone); Due shows the date + an edit pencil → date modal; Labels render as canonical grey
.badgepills (with remove ×) everywhere (cards, list, backlog), and backlog/list label rows are vertically aligned. -
List filters + epic swimlanes (Batch 4). Every space view gets a filter bar — text search + Type · Assignee · Epic · Priority dropdowns (active pills highlight) + Clear — applied across Board, Backlog and List. The Board adds Group by (none / epic / assignee) rendering swimlanes, each lane with its own status columns. Filters reset when you switch spaces.
- Settings — the full admin configuration hub (captured live module-by-module, clicking everything). The sidebar Settings button now opens a hub of 16 tiles (matching
/settingson the live app), each a working module:- Workflow templates — list (type + archive filters) → template authoring page: phases with task cards (assignee resolution · “Day +N from approval/resumption”), Add phase, and the full New task form (Title, Description, Phase, Complexity 1–5, Days from start, Activates-relative-to, Assignee resolution [New employee → Specific position], Dependencies limited to strictly-preceding tasks). Archive/Restore with confirm.
- Workflow alerts (stuck-task empty state) and Workflow runs (Subject · Template · Type · Started · Tasks n/m % · Status, with working status/type filters).
- Document types — per-country catalogue with country filter, mandatory flags, and full CRUD; Onboarding requirements (doc-type picker scoped by country/job/department, most-specific-wins copy); Country bank notes; Offer templates (DOCX + merge-field note) and Offer emails ({{fieldName}} placeholders) — all with create/edit/archive-or-delete.
- Recruiters (invite → INVITED, deactivate/reactivate, status tabs), Score cards (Drafts/Active/Inactive tabs, numbered rubric-object detail — TEXTAREA/RADIO/SCALE — activate/deactivate, new-draft form), Interview templates (Draft/Active/Deactivated lifecycle).
- Locations (archive-not-delete lookup), App permissions (job-title-chip rules → app role, with “Convert to job titles” on legacy rows).
- Bulk import (two-step template/upload + bulk-update cards with the live atomic-commit copy, super-admin badge), Task broadcast (list with completion %, full-page New-broadcast form incl. the evidence-required toggle), and History (append-only audit feed with working entity/action filters + debounced search, bypass notes).
- Opening Settings from the general view switches to admin mode automatically; every module has a back-breadcrumb to the hub, real filters, and live CRUD — no dead clicks.
- The hub’s 16 modules are grouped under labeled sections (Workflows · Documents & offers · Hiring · Org & access · Operations), and the tile grid uses
align-items:startso short cards no longer stretch (removes the dead space below them). - No more stacked tab bars. Pages that had two
psegbars now use one primary tab bar + a right-aligned filter dropdown: Workflow runs (status tabs + Type dropdown), Workflow templates (type tabs + Show dropdown), and History (search + Entity + Action dropdowns, no tabs). New.filt-selectdropdown widget +stFilterSelect/stFilterRowhelpers. - Second-pass cross-reference (opened every New/Edit form + row detail on live): New-template form rebuilt to the real shape (employment-type + department checkbox scopes with “leave empty = all”, Default-for-this-type toggle with the matcher note); Add phase is inline; task cards are click-to-edit with a conditional Position picker when assignee = Specific position and contextual activates-relative-to copy; document types gained the Active toggle + slug microcopy; onboarding requirements pick from the catalog as “Label (SLUG · country)” with Label + Active; offer templates open a detail page (Metadata + Documents with title-optional DOCX upload and numbered doc list); offer emails are a full page with Country scope, Preview, and a click-to-copy Available variables panel ({{firstName}} … {{signUrl}}); score cards use the real builder (Add object; Stars/Number/Radio/Text-area types + Max-stars); interview templates gained Description + scope option cards; recruiter invite = First/Last/Email/Phone/Company + signed-contract upload → “Send invitation”; bank notes use a free Country-code input; app permissions use the real 13-role list with rule microcopy; broadcast View is a full detail page (KPIs, attachments, Recipients with All/Outstanding/Done tabs); workflow runs open the onboarding instance page (Resend email / Cancel onboarding, activated/queued task cards with “Waiting on” dependencies, engine Activity feed) — the same page the employee detail’s View onboarding now opens.
- Deep live re-capture + fidelity pass (clicked every button on the live UAT, then reconciled).
- Global input-field fix: typeless
<input>s (notypeattr) weren’t matched by the form CSS and rendered narrow — every standard field now has an explicit type, so all inputs render full-width app-wide. - Employee action flows rebuilt as faithful full-page forms matching the live routed pages: Move is an Assign Acting flow (Acting-additive vs Move-replace choice, target-seat picker limited to OPEN/HIRING seats, effective date), Unassign and Terminate (effective/termination date + reason), all labelled “Lane B · Goes to dept lead”. Edit now carries the full live field set — First/Last/Middle name, Honorific, Work + Personal email, Gender, Employment type, Location, two Phones, Country, State/Province (36 states + FCT), Date of birth, Reason — and persists them.
- Vacancy rows now open a full role-pipeline page: JD gate → Recruiters (assign/remove) → Candidates → Interview workflow (stages, each binding a scorecard, add/remove) → Interviews, plus an Offer + Documents section once an offer is sent/signed, and the FILLED lock notice.
- Position New/Edit gained the live shape — dept vs BU split, rank-in-level, Reports-to, “Actively hiring” toggle, disabled dept/level/title when FILLED, and Reason; Mark as acting and Edit position are now real forms (were stubs).
- Requisition detail gained the Category breakdown section; the approval timeline now separates the approver’s role into its own chip and shows a red-X rejected step state.
- Directory create/edit forms gained the live guiding microcopy (prefix-immutable note, “Mark as business unit”, CAPEX/OPEX, rank) and Reason where the live requires it; level pay bands are now editable.
- Verified against a 5-dimension adversarial audit of the build vs the live teardown; all high/medium findings resolved.
- Admin detail/form pages now center on wide screens. The form card (
.adm-form, 660px) was left-aligning inside the 920px wrapper; form pages now render header + card in one narrow centered column so the title aligns with the card, and detail pages balance evenly (verified at 1680px).
- Global input-field fix: typeless
- Admin records now open full detail pages (re-captured menu-by-menu against the live
/dashboard, then rebuilt — rows used to dead-end or open the wrong view).- Detail pages are centered (max-width column with auto margins), the Back action moved out of the right-hand action cluster to a top-left breadcrumb (“← Employees”), and every remaining action button carries a leading icon (View onboarding, Edit pencil, Move, Unassign user-minus, Terminate ban, plus Upload / Download / Add band / Set goal).
- Directory create/edit forms that file an approval request (Department, Level) now include the required Reason for the request field.
- Employee detail — eyebrow + name + status + action bar (Back · View onboarding · Edit · Move · Unassign · Terminate). Sections: Identity (avatar, work/personal email, two phones, country, state, gender), Role & reporting (department, level, job title, location, manager, resumption date, employment type, status + the Lane-B note), Meta (UID, created, updated), Documents (type · file · uploaded-by + Download/Delete + Upload). Edit opens the real identity form (“Goes to approval”, with a Reason for the request); Move changes dept/level/title/manager; Unassign and Terminate (red) confirm and file the matching request. The list gained the missing Hire button and a Position # column.
- Department detail — Overview · Active members table (the people in that department) · Meta.
- Level detail — Overview · Meta (with Rank, which is no longer a list column) · Pay bands by country (Country · Currency · Band range · Midpoint · Leave days, with Add band + Edit/Delete).
- Job title detail — Overview · Meta · App permissions (AppRoles bound to the title, with Attach/Detach — they grant to every position carrying the title).
- Position detail — Overview (job title, department, level, reports-to, reporting manager) · Job description (upload) · Occupant (Mark as acting) · Meta.
- Team performance rows now drill into a report detail (quarter banner + per-goal cards), and the Goals column shows at-risk
!/ off-track✗markers.
- DoA approval-chain visual redesign — each step is now a numbered chip (① ② ③) with the role and the named holder + position # stacked, joined by centered arrow connectors, aligned consistently (in both the matrix and the simulator, light + dark).
- Distinct sidebar icons for My goals vs Team goals — they shared the bullseye; Team goals now uses a team icon.
- The DoA matrix now genuinely drives requisition routing — a requisition’s number of approval steps is resolved from the active DoA policy’s band for its amount + currency (≤500k → 1, 500k–5M → 2, 5M–10M → 3, CAD → CEO), and the chain label names the policy roles. Editing a DoA band changes how requisitions route. Previously the requisition tier used hardcoded thresholds disconnected from the matrix.
- DoA approval chain now names the holder — each step shows the role and the named position-holder + position # (e.g. “Chief Operating Officer · Deborah Egbele · P-00028”), in both the matrix and the simulator. Added the Edit policy action.
Changed
Section titled “Changed”- Admin console is now fully dynamic and interactive (cross-referenced menu-by-menu against the live
/dashboard; no more visual-only controls).- Filters actually filter. The canonical
psegstatus/scope tabs on every Directory and Spend list (Employees, Departments, Levels, Job titles, Positions, Requisitions, Categories, Vendors) now narrow the rows live instead of being decorative. - Directory CRUD is real. New / Edit / Archive on Departments · Levels · Job titles · Categories · Vendors push, update and archive the underlying records and re-render; New position adds a vacant seat (auto
P-xxxx); New employee seats the person into a chosen open position (auto work-email, position flips to filled). Every create files a matchingCREATE_*request into My requests. - Hiring transitions move state. Prepare offer → Send offer advances the vacancy Hiring → Offer sent; Mark as hired (with confirm) sets the signed seat to Filled and logs a
CREATE_EMPLOYEErequest. - DoA matrix works end-to-end — Run simulator resolves an amount + currency against the active policy and shows the exact priority band + approval chain it triggers; Add / Edit / Delete rule (with a multi-approver chain picker, auto-sorted by priority), New policy (created as Draft), and Activate / Deactivate (single active policy) all mutate
DOA_POLICIESand re-render. - Team goals persist — Set goal now increments the report’s goal count (and seeds their performance row), reflected immediately in the Team performance table.
- Approving a requisition keeps you in context — the org-wide queue’s approval-chain detail now returns to the admin Requisitions queue (not the employee screen) after Approve/Reject.
- Destructive table actions read as destructive — inline Delete links (e.g. DoA rules) are now red (
.link-add.danger), matching the red-outline rule for danger buttons.
- Filters actually filter. The canonical
- Block editor · fuller block set + Media group. The slash menu now matches Notion more closely: Toggle list (collapsible), Callout, plus a Media group with Link (inline insert via a small dialog), Image (upload/embed) and File (attachment chip), alongside the existing Text / Headings / lists / To-do / Quote / Code / Divider. All round-trip to HTML and render in the read views. Backspace at the start of a block deletes the block before it — including non-text blocks like images, files and dividers — so any block can be removed with the keyboard.
- Private notes · white container, no Tag, delete with confirm. The note editor now sits in a white card (like the Knowledge Center document), the Tag control is removed, and notes can be deleted — a trash action on each note card and in the editor, behind a confirmation dialog.
- My goals · no self-created goals. Removed the “New goal” button — goals are assigned by your lead, and the area shows the existing empty state until one is set.
- Interviews · scorecard + decide-outcome flows are real. The “Open scorecard” button now opens a scoring form with stage-specific criteria (each rated 1–5), an overall recommendation (Strong yes / Yes / No / Strong no) and notes; submitting records the panellist’s score, moves the interview to Awaiting scores, and shows the recommendation + notes on the detail. The lead’s Decide outcome button opens a panel summary (each scorer’s average + recommendation, overall average, who’s still pending) and records a decision — Advance to next stage / Reject mid-funnel, or Hire / Reject at the final stage — which completes the interview, stamps the stage history, and shows the decision rationale.
- Notion-style block editor for documents and notes. Replacing the toolbar rich-text field, the Knowledge Center document editor and Private notes editor now use a from-scratch block editor (the live app uses BlockNote): each line is a block, typing
/opens a filterable slash-command menu (Text · Heading 1/2/3 · Bulleted / Numbered / To-do list · Quote · Code · Divider) to insert or transform the block, a hover drag handle reorders blocks, and a + adds one. Enter splits/continues, Backspace merges, ⌘/Ctrl-B/I/U format inline, and to-dos toggle a checkbox. Content round-trips to clean HTML so existing documents open correctly and the read views still render. Private notes keep their @mention Tag and autosave on top of the block model. - Weekly summaries · submission window + grace flow, fewer tabs. The four tabs collapse to My summaries and Team (Team holds a Summaries + Grace requests sub-segment, with To-review and Reviewed merged into one status-coloured list). The standalone “This week’s summary” button is gone; in its place a window banner at the top of My summaries: while the window is open (Fri 5pm → Mon 11:59 AM) it shows days-left + Add weekly summary; once closed it reads “window has closed” + Request grace; a submitted grace request shows pending, then (simulated lead approval) flips to granted and re-enables Add weekly summary; after submitting it shows a done state. A small “preview window state” link lets you flip open/closed in the prototype. Dashboard + notification copy aligned to the new window.
- Requisitions · full form + multi-step approval chain. The New-requisition form now matches the live app: Description, Amount + Currency (NGN/USD/KSH/GBP/EUR/CAD), Urgency (Normal/Expedited), Category, Payee / Vendor, and invoice / receipt uploads. The detail adds Amount/Paid/Remaining, Urgency, Category, Payee, a Payments table, and an approval chain that scales by amount (≤₦100k → 1 approver, ₦100k–500k → 2, >₦500k → 3, walking the requester’s management line to Finance). Approving advances to the next step; “Awaiting my approval” only surfaces requisitions where you are the current step.
- Knowledge Center is functional. New folder and New document now create real nodes; New document opens a full document editor (editable title + rich body, autosave indicator, Publish / Move-to-draft with version bump, Share link, Delete). Folder/doc Share copies a deep link; Delete confirms then removes (folders remove their contents).
- Boards · sprint management overhaul. You can add a ticket straight to the Backlog (or any sprint) via per-group “Add ticket” and a Sprint field on the create form; create a sprint while one is active (it’s created planned, started later with “Start sprint”); on sprint creation pick which backlog tickets to import (checklist, not all-or-nothing); and completing a sprint opens a dialog to choose where incomplete tickets go (Backlog or a planned sprint) and which ones move, the rest falling to Backlog. Done tickets stay with the closed sprint.
- Boards · epics + ticket wording. A dedicated New epic action and an Epics section in the Backlog (each epic shows its child-ticket and point roll-up, click to open). “New issue” is now New ticket throughout, the view tabs reorder to Board · List · Backlog, and the Labels field is removed from ticket creation.
- Boards · sub-tasks are first-class tickets. Creating a sub-task now uses the same full form as a ticket (type, priority, description, points, assignee, status), pre-set to Sub-task under the parent.
- Boards · two-column ticket detail. The issue page is now two columns: the Description leads the main column (with the Sub-tasks / Attachments / Links / Comments tabs below it), while properties move to a right-hand card tabbed with Activity (Details · Activity). Seed tickets carry realistic, long descriptions (user story, context, acceptance criteria, resources).
- Org chart profile drops the Work / Notes tabs, showing the profile directly. Create initiative gains an attachments field (shown on the initiative detail).
- Danger actions now read as deliberate (red outline), not casual. Every destructive/negative action — Delete (Knowledge Center doc trash icon), Delete board, the Delete-board confirm, and Decline on both requisition and grace-request approvals — uses a consistent red-outline treatment (red border + red text, transparent fill, red-tint hover) so they no longer look like neutral secondary buttons. Added a
.btn-danger-outbutton style and an.icon-action.dangericon-button variant; theconfirmModaldanger path now uses the same outline rather than a filled-red primary. - Knowledge Center document body is full width. The doc reading card no longer caps at 760px; it now spans the full content column to match the breadcrumb, title and meta above it.
- Issue tab actions moved onto the tab-bar row. The Add sub-task · Upload · Link issue actions now sit at the far right of the tab bar, directly opposite the tabs, instead of in a separate header row above each list, so the list itself moves up. The action swaps with the active tab (Comments/Activity show none).
- Board columns are drag-reorderable. The column editor (New board · Board settings) gives each column a drag grip; grab it to reorder the lanes, and the board renders them in the new order on save. Text fields stay selectable (drag only starts from the grip).
- Start-sprint “move Backlog issues in” is now a toggle (far right of its row, on by default) instead of a fixed hint. Off → the sprint is created empty (Backlog untouched); on → all current Backlog issues move into the new sprint and onto the board. The success toast reports how many moved.
- Goal form · Repeat every quarter. The new-goal form ends with a Repeat every quarter toggle (recreate the goal at the start of each new quarter); the goal detail shows a Cadence row and repeating goals carry a small repeat marker on the card.
- Modal width tightened to a consistent 560px. Every modal in the app shares the single
dlg-mdwidth, so the small utility dialogs (Due date, Add sub-task, Link issue, Rename, etc.) no longer feel oversized while the multi-field forms still fit (no horizontal overflow). One value, applied uniformly. - Task detail can expand to a full page (replacing the dock-to-sidebar toggle). The header icon is now an expand/collapse control: expand swaps the centered modal for a full-page view — a full-width app bar (title + collapse + close) over a narrow, centred content column (properties · Description/Activity/Comments · attachments). Collapse returns to the modal. Built as a
.dlg-fullmodal variant. Board task cards open in that same full-page view (was a small modal): properties (Type tag · Column · Assignee · Complexity · Due) + Description + linked task/initiative + comments summary, with a back-to-board control. Modelled on the live/app/boards/{id}/task/{id}page. - New board form does real setup — beyond name + description, you now define the columns (editable list, add/remove, defaults To do/Doing/Reviewed/Done → the board renders exactly those lanes) and the access scope (“Visible to”: Only me · Specific teammates [checkbox picker] · My business unit · My department · Whole organization), which resolves the board’s member list. The Members modal surfaces the Visible to scope.
- Avatars show the full name on hover everywhere — the shared
avG()helper now sets atitle, so every initials chip across the app has a name tooltip. - Avatar stacks no longer bleed — overlapping stacked avatars were translucent and muddied where they overlapped; they’re now opaque (green tint composited over the surface) with a clean ring, and the trailing negative margin was removed (which also stopped the board-header gear icon from being clipped at the edge).
- Private notes reworked into a notes app (Apple-Notes style). Dropped the “About <report>” subject model and the modal form. The list is now equal-height cards (title on one line, a 2-line truncated preview, a footer with tagged-teammate avatars or a Private marker + the updated date) that are clickable. Opening one (or New note) goes to a full-page, slim, centred editor (not a modal, since note length is unbounded): a large title field, the upgraded rich-text body, a “Saved” autosave indicator (debounced, no Save button), and a Tag control to insert an
@teammatemention chip for reference only (inserting one does not notify anyone). Empty notes are discarded on leaving. Person profiles now cross-reference notes by mention (a teammate’s Notes tab lists notes that @-tag them) and deep-link into the editor. - Weekly summaries · the other three tabs are now populated (no more empty states). To review lists reports’ submitted summaries with a From column (avatar + name); Reviewed by me lists the ones you’ve signed off; Grace requests is a table of window-extension requests (Employee · Week · Requested · Status) opening a detail with the reason and Grant / Decline actions. Seeded from Ridwan’s reports (Aisha, Chidi).
- Weekly-summary review actions (captured from the live reviewer panel). Reviewing a report’s submitted summary offers two actions: Approve (one click, no comment — far-right primary) and Flag for discussion (a red action that opens a Google Meet scheduling modal — what to discuss + date + time, auto-generating a
meet.google.com/xxx-xxxx-xxxlink shared with the teammate). Both move the summary to Reviewed by me; the detail then shows a Review section with the outcome badge (Approved / Flagged) and, for a flag, the discussion note + a meeting card for the scheduled 1:1. Added a.btn-dangerbutton style. - Rich-text editor upgraded (shared
richEditor, used by task descriptions + all three weekly-summary fields). Expanded the toolbar to the full set — undo · redo · bold · italic · underline · strikethrough · inline code · clear formatting · H1 · H2 · H3 · quote · code block · bulleted/numbered lists · align left/centre/right · link · attach file — tightened the button gaps and pinned the toolbar to one row (no wrap). Buttons now show an active (highlighted) state for whatever’s applied at the cursor (bold, lists, headings, alignment, etc.) viaqueryCommandState/queryCommandValuesynced on key/mouse/focus. Attach inserts an inline file chip (paperclip + name + size) into the body, so weekly summaries (and any rich field) support attachments. Headings toggle cleanly back to normal body text — toggling a heading off and the default paragraph separator both resolve to<p>(14px), so non-heading typing is always normal size. Added editor styles for headings,<pre>code blocks, inline<code>and file chips. Because it’s one shared component, every rich-text field on the platform inherits the change.
- My goals (My performance) · new Performance area. Recaptured
polaris-uat.rechaj.com/app/performance(general view) and added it as the first item under Performance in the sidebar (scr-performance). Mirrors the live layout: a quarter-elapsed banner (clock chip · “Apr 1 – Jun 30 · everything resets next quarter” · 95%, with an inset rounded progress track that sits inside the card with left/right + bottom padding, not a full-bleed edge line), a manager-set Goals list as equal-height, clickable cards (title · status badge On track/At risk/Achieved · single-line description · a tone-coloured progress bar with Now/Target). A card opens a goal detail modal (metric · status · now · target · quarter + full description + a Progress section with “% of target”). A My metric key requests card lists mono key · description · Pending/Approved.- New goal modal proposes a measurable goal (title · approved metric key · target · baseline · why). Picking “Request a new metric key…” (or the section’s Request a key link) opens the live-accurate Request a new metric key modal — title + super-admin review copy, fields Suggested name (lowercase snake_case, 3-64) · Description (“What should this metric measure?”) · Reason (“Why do you need this metric key?”) — preserving the goal draft with a Back action; submitting logs a Pending request.
- Metric key requests render in the standard
.tbltable (Metric key · Requested · Status · View), and each row opens a request detail modal: details (key · status · requested · reviewed-by chip) + What-it-measures + Reason + a.tl-steprequest timeline (Requested → Submitted → Approved by<super-admin>/ Awaiting review, with date + time). SharedtlStep()helper added. - Note: live has a general view and an Admin view toggle; we are building the general view now (the Admin view wires metric-key approval + the cross-links later).
Changed
Section titled “Changed”- Collaboration + Spend brought to full fidelity after a deep recapture of the live UAT flows (Private notes · Boards · Knowledge Center · My requisitions), one menu at a time:
- Boards — board cards now show an icon, name, description, a member avatar-stack and an “Updated …” line (was column/card counts). Board detail rebuilt: back-crumb, member stack, Members (roster modal with Owner/Member + add) and Rename (inline modal) actions, a settings cog, and a real kanban of linked work items — each card carries a type tag (Task blue / Initiative purple), a # ref, complexity pips, due date, comment count and assignee. Columns mirror the live To do · Doing · Reviewed · Done, are colour-coded like the Tasks kanban (a
boardColTonekeyword map → grey backlog · blue in-progress · amber review · green done, tinting column + dot), and cards are drag-and-drop between columns (functional). A card opens a detail modal that deep-links to the linked task/initiative. No “+” add buttons, no scrollbar (per earlier kanban decisions). - Knowledge Center — section cards (My Department · My Business Unit · Shared with me) now drill into a real folder browser: breadcrumb, the section Lead (person chip + role + position id), and a Name / Type / Updated / Actions table (folders show “Folder · n / n”, documents show “Document · by …”, with a hover Delete), plus New folder / New document / Share. Documents open a doc view — breadcrumb, title with a Saved / Draft status pill, Move to draft / Share / Delete, a version meta line (“Created by … · vN · Last edited
by …”) and a rich-text body. Faithful to the live IA captured at /app/knowledge-center. - My requisitions — the Awaiting my approval and Approved by me tabs are now populated and clickable (reports’ requests routed to the current user as approver). A requisition detail modal mirrors the initiative pattern: an icon-labelled details panel (Amount · Requester · Approver · Filed · Needed by · Status), a Justification section, and an Approval section built with the canonical
.tl-steptimeline (Filed → Submitted → Awaiting / Approved / Declined, with date + time). Approvers see Approve / Decline actions that move the requisition’s state live. - Private notes — cards refined with the tagged person, a Private lock chip, and an author · date footer; empty-state copy aligned to the live wording.
- Boards — board cards now show an icon, name, description, a member avatar-stack and an “Updated …” line (was column/card counts). Board detail rebuilt: back-crumb, member stack, Members (roster modal with Owner/Member + add) and Rename (inline modal) actions, a settings cog, and a real kanban of linked work items — each card carries a type tag (Task blue / Initiative purple), a # ref, complexity pips, due date, comment count and assignee. Columns mirror the live To do · Doing · Reviewed · Done, are colour-coded like the Tasks kanban (a
- Dropped the Option 3 reimagining. Removed
screens/dashboard-reimagined.htmland its directory flow;screens/dashboard.htmlis now the single Polaris build, and its flow in the directory is renamed to just Polaris. DESIGN.md “Variants” → “Build”.
- Polaris product scaffolded (Option 1 — faithful IA + improved UX). Captured the live app at
polaris.rechaj.com/appread-only (teardown indocs/polaris-teardown.md) and rebuilt it as a single-file SPAscreens/dashboard.htmlon the Rechaj design system, reusing the Caesar DS foundation (tokens, components, modal/toast/dropdown infrastructure, native date pickers, and the audited dark mode — one shared theme toggle).- Shell — grouped sidebar (Overview · Performance · Collaboration · Spend, 10 areas), topbar with a global quarter switcher (Q1–Q4 2026), dark-mode toggle, notifications and a user pill. Brand mark + green buttons follow the hard rules (dark
#111text on green). - Dashboard — a quarter-at-a-glance: Open tasks / My initiatives / Awaiting my review / This-week stat tiles, plus My tasks, My initiatives, profile and weekly-summary cards.
- Tasks — My tasks / Assigned by me, status filter, Table + Kanban parity, complexity pips, a New-task modal (Title · Description · Complexity 1–5 · Deadline · Assignee).
- Initiatives — My initiatives / To review, status filter, a table view, a detail view with an approval timeline, and a New-initiative modal (Title · Description · Impact · Complexity · Save-as-draft / Submit).
- Initiative detail redesigned to match the task detail: a grey details panel (icon-labelled Owner · Line manager · Complexity · Status · Quarter — the line manager is resolved from the owner’s manager in the org), an Impact section, and an Approval section built with the canonical DS
.tl-steptimeline (done / active / pending nodes) showing date + time per step (Created as draft → Submitted → Awaiting / Approved / Needs-revision by the named manager). Kanban view removed from Initiatives. - Weekly summaries — My summaries / To review / Reviewed by me / Grace requests, recaptured from
polaris-uat.rechaj.com/app/summaries: a table list (Week · Status · Submitted · Reviewed), a detail modal (meta panel + Submitter/Reviewer + three rich sections What went well · What didn’t go as planned · Other comments), and a this-week form whose three fields are rich-text editors (bold, lists, links) so summaries can be multi-line/formatted. Submitting moves the open week to Submitted with today’s date. - Private notes — manager notes about reports (hidden from their subjects), New-note modal.
- Org chart — a clean, readable position tree with vacant/hiring states.
- Interviews — Upcoming / Completed panels with candidate, stage, time and panel.
- Boards — board cards → kanban board detail; New-board modal.
- Knowledge Center — Department / Business Unit / Shared sections with folder + doc counts.
- Requisitions — My / Awaiting my approval / Approved by me, ₦ amounts, New-requisition modal.
- Seeded with realistic demo data (the live account was empty for the captured user). No em dashes in copy; light + dark verified, console clean.
- Shell — grouped sidebar (Overview · Performance · Collaboration · Spend, 10 areas), topbar with a global quarter switcher (Q1–Q4 2026), dark-mode toggle, notifications and a user pill. Brand mark + green buttons follow the hard rules (dark
- Polaris Option 3 (reimagining) added as a separate file
screens/dashboard-reimagined.htmlfor side-by-side comparison with Option 1. Same Rechaj DS, data and dark mode; the IA is reorganised around jobs to be done:- Home is action-first, not a counter board: a “Needs you” aggregate inbox + a performance pulse (complexity points, initiatives approved, approval rate this quarter).
- My work unifies Tasks and Initiatives in one Table/Board with a Type column and an All/Tasks/Initiatives filter (both are quarter-scoped, complexity-rated work).
- Reviews is a single approvals inbox aggregating everything awaiting your sign-off, grouped: initiatives to review, weekly summaries to review, requisitions to approve, interview scorecards. (Option 1 scatters these across sections.)
- Team merges Org chart + People + Private notes; Cycle holds the weekly-summary rhythm + a quarter overview.
- Adds a ⌘K command palette (Go to + Create) and a topbar search trigger. Sidebar regrouped to Perform · People · Workspace. Light + dark verified, console clean.
- Kanban upgrade + drag-and-drop across both variants. Adapted a richer board UI to the Rechaj DS: per-column status dot + count pill + add button, subtle status-tinted columns (blue/amber/red/green washes via the
--*-dimtokens, neutral--grey1otherwise), and cards showing a type badge + complexity + a dated footer with an assignee avatar.- Native HTML5 drag-and-drop is functional: drag a card to another column to change its status (in-memory), with a drop-target highlight and a confirmation toast. A shared engine (
kbDragStart/Over/Leave/Drop/End+kbMove) powers Option 1’s Tasks and Initiatives boards and Option 3’s unified My-work board. - In Option 3’s unified board, Tasks and Initiatives render as two labelled boards (each with its own status lane set), and cross-kind drops are rejected (a Task can’t enter an initiative-only stage like Approved). Light + dark verified, console clean.
- Native HTML5 drag-and-drop is functional: drag a card to another column to change its status (in-memory), with a drop-target highlight and a confirmation toast. A shared engine (
- Org chart redesigned + clickable profiles (both variants). Recaptured the live org chart (react-d3-tree: elbow connectors, position cards, search + “As of” date, click-to-expand) and rebuilt it properly:
- A real connector-line tree (CSS elbow connectors) derived from a manager graph, so reporting lines are visible. Node cards show avatar · name · role · position id, a +N direct-reports badge, an amber HIRING state for vacant roles, and the current user is highlighted.
- Every node is clickable, opening a deeply cross-referenced profile: Contact (email, birthday), Reporting (manager + direct reports as clickable chips that open their profiles), Work this quarter (their tasks and initiatives, pulled live with status), Interview panels they sit on, and Private notes about them. Footer actions: Assign task · Add note. The vacant variant shows a reports-to chip and a View-hiring-pipeline CTA.
- Toolbar echoing the live app: Find an employee search (highlights matches, dims the rest), an As of date, Reset, and a “N positions · 1 hiring” caption. People enriched with manager, email, business unit and position id to power the graph and the cross-references. Light + dark verified, console clean.
- Org chart polish: the whole board is drag-to-pan (grab/grabbing cursor; a movement threshold distinguishes a pan from a node click). The node cards and board frame now use a grey stroke instead of a shadow (the DS
--borderhairline; grey1/grey2 are near-white fills) — flatter, calmer in a dense tree. The person profile was redesigned: a hero, a 4-tile stat strip (Reports · Open tasks · Initiatives · Panels), and a two-column Jira-style layout (Reporting + Work this quarter on the left; Contact + Organization on the right), with manager/report chips that open in place. Light + dark verified, console clean. - Interviews rebuilt from the live UAT flow. Recaptured
polaris-uat.rechaj.com/app/interviews(a recruiter table: When · Candidate+email · Role · Stage · Status, with View/Decide). Rebuilt the list as that table (Upcoming/Completed tabs) and added a click-through interview detail modal with deep cross-referencing: candidate/email/role, scheduled time, stage X of Y + stage name, status + outcome, the interviewer panel (clickable person chips with a LEAD marker → open each person’s profile), a scorecard / submitted-scores breakdown (each panellist’s criteria + score, “N of M submitted”), and a stage history. Lead-only Decide outcome and panellist Open scorecard actions appear by status. The person profile’s “Interview panels” rows now link into this detail (person ⇄ interview ⇄ panellist round-trip). Data enriched with stages, statuses, outcomes, panels, leads, scorecards and history; grey-card sections, light + dark verified, console clean. - Org chart rooted at the Organization. The tree now starts at an Organization node (building icon, non-clickable) that branches to the C-suite on one row (CEO · CTO · COO), with each executive’s staff beneath them (Product under the CEO, Engineering under the CTO, Operations under the COO). Added the CTO, COO and an Operations Lead, and re-parented Engineering under the CTO. A C-suite member’s profile shows “Manager: Organization”. Initial fit is deferred a frame so the whole org lands legibly centered.
- Person profile redesigned + tabbed. Narrowed the modal (760 → 600px) and split the content into Profile · Work · Notes tabs (Work/Notes show a count chip). The hero and a 4-tile stat strip stay pinned above the tabs; Profile holds Reporting + Contact + Organization, Work holds tasks/initiatives/interview panels, and Notes shows full note cards (title · body · author). Switching tabs is instant (no re-render).
- Refined to pill tabs (segmented track, white active pill with green label, matching the DS), each category wrapped in its own grey card instead of line-separated sections (kv-row dividers dropped inside the cards), and the modal scrollbar hidden (
.dlg-bodyscrolls without a visible bar). The person’s role now sits as a green pill on the far right of the hero (the under-name role line was removed).
- Refined to pill tabs (segmented track, white active pill with green label, matching the DS), each category wrapped in its own grey card instead of line-separated sections (kv-row dividers dropped inside the cards), and the modal scrollbar hidden (
- Collapsed by default → drill down. On load only the first row is open (Organization + the C-suite); every branch shows a “+N” toggle and the user expands one level at a time. Reset returns to this default. Search temporarily expands the whole tree to reveal matches, then restores the exact pre-search drill state when cleared.
- Org chart → full pan/zoom/collapse canvas (Option 1 /
dashboard.htmlonly). Replaced the scrolling container with a transform-based canvas: drag to pan on all axes, scroll-wheel and ±/fit buttons to zoom, and no scrollbars anywhere. Subtrees are collapsible via a bottom-center ± toggle on each parent (shows “+N descendants” when collapsed). Employee tiles redesigned from squares to horizontal cards (avatar left; name, role and position id right). Reference source moved topolaris-uat.rechaj.com. The second variant (dashboard-reimagined.html) is parked — Option 1 is the maintained build going forward.
- Task flow made Jira-style (both variants). The task Description is now a rich-text editor (a
contenteditablewith a toolbar: bold · italic · strikethrough · bulleted/numbered lists · quote · link) and the form gained attachment uploads (click or drag-drop, with image thumbnails, file chips, size, and remove). The create modal widened to accommodate the editor.- The task detail is a slim (600px) tabbed view matching the person profile: a Details grey card (inline Status picker, Assignee(s), Reporter, Complexity, Deadline, Quarter) above pill tabs — Description (rich text + attachments) and Activity (comment thread + composer). A header dock toggle converts the modal into a right-docked, full-height sidebar (and back); the choice persists for the session. Status changes and comments update in place. The Details block is an icon-labelled list (circular icon chips + label) on a soft grey panel with row dividers, sitting above the tabs. The task-detail footer was removed (the top-right ✕ closes it) and the comment composer is sticky at the bottom in both modal and sidebar modes. Status is a color-coded pill with a chevron (grey/blue/red/green by status) that opens a dot-coded menu to change it, replacing the boxed
<select>. (Also fixed a latent name collision: the detail’s status setter was overriding the Tasks status filter — renamed totdSetStatus, so filtering by status works again.)- Split into three tabs: Description · Activity · Comments. Activity is an audit-trail log (timeline of system events: created · assigned · attachment added · status change · deadline set, newest first; status changes append automatically). Comments is the full thread: each comment supports Like (toggle + count), Reply (inline composer → nested, indented replies), and renders @mentions (highlighted) + links; the composer has a toolbar to @-mention (people dropdown), attach files (chips), and add a link. Attachments and comment files are clickable to view. In sidebar mode the footer is pinned to the viewport bottom, and on the Comments tab the composer is pinned (sticky) at the bottom while the thread scrolls.
- Descriptions are stored as HTML; list/table previews strip tags and truncate. The showcase task is seeded with a formatted description, two attachments and a comment thread. Light + dark verified, console clean.
- Assignee → searchable multi-select. Replaced the single-assignee
<select>with a token/combobox: search and pick multiple assignees, and assign people, departments or business units (grouped People · Departments · Business units menu; people show an avatar, dept/unit chips are tinted). Selections are removable chips; the task detail lists all assignees (people clickable into their profile). Tasks store anassignees[]array plus a primaryassigneefor the table/kanban. The create modal also slimmed from 760 → 600px.
- The task detail is a slim (600px) tabbed view matching the person profile: a Details grey card (inline Status picker, Assignee(s), Reporter, Complexity, Deadline, Quarter) above pill tabs — Description (rich text + attachments) and Activity (comment thread + composer). A header dock toggle converts the modal into a right-docked, full-height sidebar (and back); the choice persists for the session. Status changes and comments update in place. The Details block is an icon-labelled list (circular icon chips + label) on a soft grey panel with row dividers, sitting above the tabs. The task-detail footer was removed (the top-right ✕ closes it) and the comment composer is sticky at the bottom in both modal and sidebar modes. Status is a color-coded pill with a chevron (grey/blue/red/green by status) that opens a dot-coded menu to change it, replacing the boxed
rechaj-agent-app
Section titled “rechaj-agent-app”[Unreleased]
Section titled “[Unreleased]”- Expansion Capture at
flows/expansion-capture/index.html— the field survey agent’s tricycle-capture flow, feeding the Atlas Expansion Intelligence dashboard, rebuilt from an uploaded prototype onto thersm-*scaffold under this product’s registeredagent-*class prefix. Field Agent Dashboard on the canonical.rsm-hero/.rsm-statspattern (earnings/riders KPIs, rider-inactivity empty state, “Capture Keke” FAB) with a persona switch into the Survey Agent My Stats landing (area filter, Daily/Weekly/All-time/Custom.km-tabs, capture chart, recent captures, empty state when nothing’s been captured yet). Capture: area context, a single.rt-capture-addtile opening a real fullscreen.ka-camera-shellviewfinder (reused from Battery Onboarding Operator) instead of an instant-flip placeholder, captured.rt-capture-thumbwith retake, auto-filled GPS/time, notes, and an inline error sheet (DESIGN.md’s recoverable-failure pattern) for a low-confidence plate read — Save anyway vs. Retake — before a full-screenactivated-sheetsuccess confirmation (replacing the prototype’s bespoke success screen). Custom date-range keeps the canonical.rsm-sheetbottom sheet. Registered insite/src/data/products.ts.
Changed
Section titled “Changed”Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”Security
Section titled “Security”rechaj-field-support
Section titled “rechaj-field-support”[Unreleased]
Section titled “[Unreleased]”- Field Technician flow (
flows/field-technician/) — the offline-first mobile companion for a dispatch technician (Radar Field): incoming dispatch → accept → navigate to the rider pin → diagnostic checklist → mandatory before/after photos + case type + parts → resolve & trigger the rider NPS SMS. This is the data-capture end of the hardware feedback loop and pairs with the Radar (God-View) dispatch console. It is the same app the Radar web flow overlays, rendered here standalone (viaFieldApp standalone) as the Field Support Technician persona; module deps are referenced from the Radar flow so they never drift. Registered insite/src/data/products.ts.
[3.0.0] — 2026-06-10
Section titled “[3.0.0] — 2026-06-10”Rebuilt both surfaces against PRD v3.0 (8-state machine, 50m geofence, QR-scan-only serials, financial gateway, offline-first). UX-first: the field agent app is deliberately lean and metrics-free — all analytics live on the CFSM dashboard. No QA approval gate on either surface — a submitted resolution is resolved; the CFSM monitors but doesn’t gate.
Changed — Field Tech app rebuilt to v3 (flows/field-agent/index.html)
Section titled “Changed — Field Tech app rebuilt to v3 (flows/field-agent/index.html)”Fresh build (~24 screens) reusing the prior token block + nav engine.
v3 workflow
- Agent-facing lifecycle: Open → Accepted (en route) → Arrived → Resolving → Submitted → Closed (Cancelled handled too). The agent submits and moves on — the CFSM’s QA review/approval is not surfaced in this app.
- En-route screen with sticky GPS-tracking notice + 50m / 60s geofence auto-arrival (+ manual “Mark arrived” override)
- Arrived → diagnosis category cards (Battery / Electrical / Other) gate which form opens
- Battery form: QR-scan-only serials (no manual entry; 3 fails → request CFSM-authorised manual entry), old+new voltage capture, source swap station, financial gateway: when a rescue is the rider’s first swap of the day, the standard ₦12,000 first-swap fee is collected during the swap (same as a station) — scan old battery → wallet charge → confirmed before submit; failure → retry · escalate to CFSM override · cancel. Flagged up front on the rescue case detail.
- Electrical form: controlled component multi-select + on-site / swap-station parts capture
- Category C “Other”: 30-char-min issue + resolution descriptions gate submit
- Submit → clean “Resolution submitted · synced” confirmation (work record only: serials, payment, photos — no metrics)
- Offline-first: sync-queue inspector, offline submit (queued), and a non-dismissable conflict sheet (case cancelled by CFSM while offline)
Lean by design (removed — these are the CFSM’s, not the agent’s)
- Home performance card (resolved/target, median TTR, first-pass QA %, streak), oil-maintenance prompts, submit-time cycle breakdown / MTTR, “My performance” page
- The QA gate — Pending-QA status, “Submit for QA” / awaiting-approval language, and the QA-reject → reopened rework loop. The CFSM dashboard owns review/approval; the agent just resolves and moves on. Cases tab is Open / Active / Done.
- Home is now just: in-progress card · assigned queue · sync status
Changed — CFSM dashboard aligned to v3 (products/atlas/flows/field-support-cfsm/index.html)
Section titled “Changed — CFSM dashboard aligned to v3 (products/atlas/flows/field-support-cfsm/index.html)”- No QA gate. Removed the Pending-QA kanban column, the “Pending QA” cases tab, the QA review/approve modal, and the structured reject→reopen flow. Cases flow straight to Resolved when the agent submits — the CFSM monitors and can drill in, but doesn’t gate/approve. Kanban: Assigned → En route → Arrived → Resolving → Resolved.
- Keeps the operational escalations (not QA): payment-override (₦12,000 first-swap) and manual-serial authorisation modals + alerts (the CFSM side of the field escalations)
- Metrics stay here (CFSM’s domain): live-ops hero, KPI strip, agent productivity, component failure, SLA heatmap, lifecycle funnel
- Geofence reference corrected 150m → 50m; alerts panel adds Category-C overuse flag
Technical
Section titled “Technical”- Both surfaces verified in-browser — happy path, the ₦12,000 first-swap-of-day rescue billing (pending → collected), electrical swap-station, offline conflict, and the QA-free CFSM all resolve with zero console errors
[1.2.0] — 2026-06-08
Section titled “[1.2.0] — 2026-06-08”Changed — CFSM web dashboard full rework (products/atlas/flows/field-support-cfsm/index.html)
Section titled “Changed — CFSM web dashboard full rework (products/atlas/flows/field-support-cfsm/index.html)”Comprehensive, Rechaj-branded rebuild of the Cluster Field Support Manager dashboard (1440px Atlas shell) aligned to PRD §9, matched to the reworked FSA app’s visual language (“one product”). 6 pages, 3 drawers, 8 modals, 6 popovers — every interactive element wired, no dead ends.
Added / reworked
- Atlas split-screen login gate (peach left / white form-card right) revealing the app shell on sign-in
- Sidebar IA fixed to PRD §9.2 — Overview · Cases · Agents · Riders · Oil maintenance · Reports (grouped Operations / Team & riders / Insights); Review queue folded into a Cases tab; Reports page added (was absent)
- Overview: brand-dark “Now active” live-ops hero, 5-tile cross-filtering KPI strip, live kanban board (Assigned/En route/Arrived/In progress/Resolved) with SLA-risk cards, agents panel with status dots + one-tap assign, recent-activity feed with filter chips
- Cases: status tabs (Active/Resolved/Escalated/Review queue/All) + search/filter toolbar +
.ds-table; rows open the case-detail drawer - Agents (§9.7): per-FSA performance table with CSS resolution-mix split-bars, no-show, avg distance
- Riders (§16): lookup + recurrence/repeat-≤7d flags + oil status
- Oil maintenance (§11): reminder funnel, KPI tiles, full compliance ledger with Send SMS / Call / Mark-done row actions
- Reports (§10): period switcher, CSV export, CSS-only stacked bar chart, SLA heatmap, lifecycle funnel, component-failure bars, agent sparklines
- Right-side drawers replacing full-page detail: case detail (live brand-dark hero + timeline + photo evidence + Reassign/Add-note/Escalate/Cancel actions), FSA detail, rider detail
- 8 modals: create-case (rider lookup auto-populate, map-pin picker, duplicate soft-warning, workload-sorted FSA select), reassign, cancel, add-note, escalate-resolve, review approve/reject branch, reject-reassign, oil follow-up (SMS/Call/Mark-done modes)
- Popovers: cluster switcher, global search, notifications, board filter/sort, user menu
Design / Rechaj color fixes
- Adopted the FSA token block verbatim (canonical
--sh-card/--sh-lg,--red9 #B91C1C); brand green#01E46Freserved for interaction only (CTAs, active nav, focus rings, KPI filter ring), state carried by amber/blue/green-status/red ramps .ds-btn-primary(#01E46F bg + #111 text, weight 500) replaces 700-weight/brand-dark-text CTAs- SLA-risk kanban card fixed to hard rules: white card + circular red icon + red outline (no border, no full-card tint)
- Canonical
.ds-badgeeverywhere; all icon containers circular; brand mark = exact two-tone SVG (was a redrawn bolt) showPageactive-state bug fixed (re-applies.is-active); breadcrumb topbar
Technical
Section titled “Technical”- All nav verified in-browser: 6 pages / 8 modals / 3 drawers resolve, zero dangling targets, single-active-page invariant, zero console errors
- Create/reassign/cancel/note/escalate/review→reject/oil flows + KPI cross-filter + tab switching + table search all exercised and passing
[1.1.0] — 2026-06-08
Section titled “[1.1.0] — 2026-06-08”Changed — FSA mobile app (390px) full rebuild
Section titled “Changed — FSA mobile app (390px) full rebuild”Reworked flows/field-agent/index.html into a single fully-wired, click-through prototype (27 screens, no placeholders) aligned to PRD §8 and the §6.3 state machine. Every interactive element routes to a real screen.
Screens added / reworked
- Auth: splash (auto-advance) → biometric unlock → SSO login → first-run permissions (reused as a Profile settings sub-page)
- Home command center: dark gradient hero with canonical two-tone brand mark, live connection chip, 3 shift-stat tiles (Open/In progress/Resolved colour-coded), tappable SLA banner, prominent dark active-case card, status-grouped “Assigned to me” list
- Case list with 6 status sub-tabs (All / SLA risk / En route / Arrived / In progress / Sync issues) + empty states
- Map tab: schematic cluster map, status-coloured pins, FSA location pin, nearest-case peek card with Navigate/Open
- Case detail in all 4 live states (Assigned→Accept, En route + geofence prompt, Arrived, In progress) with state-specific dynamic CTA + timeline
- Resolution forms — electrical (9 types) and battery (in/out serials) variants — locked issue category, spring radio, live photo count, real submit gating (type + ≥1 photo)
- In-app low-light camera → photo review (GPS/timestamp stamp) → returns to originating form
- Three submit outcomes: auto-closed, sent-for-review, resolved-offline (queued)
- Escalation reason sheet → confirmation; case-actions sheet; sign-out confirm sheet
- Alerts feed with deep-links, notification detail, profile + sub-pages (personal info, notification settings, sync queue, my performance, case history)
Design upgrades
- State colour system enforced (amber = assigned/en-route, blue = accepted/arrived/in-progress, green = resolved, red = escalated/SLA) — brand green reserved for interaction only
- Canonical
--sh-card/--sh-lgshadows,.ds-badgespec, 32px phone radius; headings dropped to 600 (700 reserved for display numerals) - Connectivity language: tappable online/offline chip, offline sync banner, reconnect toast, live sync-queue count
- Microinteractions: directional screen transitions, button press-scale, spring sheet, animated radio/outcome icons; 44px tap targets throughout
Technical
Section titled “Technical”- Robust nav engine (history stack, tab roots, sheet overlays, toast) — all 27 nav targets resolve, exactly one active screen invariant verified
- Full happy-path + escalation + battery + offline + sign-out + back-nav verified in-browser; zero console errors
[1.0.0] — 2026-06-05
Section titled “[1.0.0] — 2026-06-05”Field Agent (mobile, 390px)
- Splash screen and login/welcome flow
- Case list (home) with open, accepted, arrived, and resolved cases
- Case detail with 6 states:
open,open2,accepted,arrived,reopened,reassigned - GPS auto-arrival overlay (100m / 60s continuous → auto-flip to ARRIVED after 3s timer; manual override)
- Resolution type selector (Battery swap / Electrical repair / Oil maintenance)
- Battery swap resolution form: new/old serial inputs, station selector, notes
- Electrical repair resolution form: 9-component chip selector, on-site/retrofit toggle, parts checklist
- Oil maintenance resolution form: oil type select, quantity, odometer, before/after photo tiles, 30-day auto-scheduling banner
- Resolution submitted confirmation screen with pending-approval status card
REOPENEDstate: rejection callout with CFSM feedback, Resubmit resolution CTAREASSIGNEDstate: amber callout with new agent name + CFSM reason, action bar hidden
CFSM Console (web, 1440px Atlas shell)
- Login screen with Google SSO (Bisi Olawale persona)
- Case Board: 5-tile KPI strip, 4-column kanban (Open / Accepted / Arrived / Resolved)
- Recurrence panel below board: issue type bars, top components, top riders by case volume
- Analytics dashboard: 4-tile KPI row (143 total, 88.8% resolve rate, 38m median TTR, 6.3% reopen), issue type breakdown, electrical component failure frequency table, rider volume table, agent performance table
- Oil Reminders page: overdue/due-soon/SMS-sent summary strip, full rider table with colour-coded due-date badges, per-row Send SMS + Create case actions, bulk “Send all reminders”
- Create case modal with walk-in toggle (auto-shown for Oil Maintenance — skips Accept/Arrived, opens case in ARRIVED state)
- Case review panel (right-side drawer): timeline metrics, case details, resolution data, evidence photos; Approve & close / Reject for resolved cases; Reassign / Cancel case for active cases
- Reassign modal: agent picker with online status + active case count, reason free-text
- Cancel modal: 4-option reason enum (Rider no-show, Duplicate case, Rider resolved independently, Other) with validation
Technical
Section titled “Technical”- 113/113 automated interaction tests passing (100% success rate)
- Zero JS console errors or warnings across both prototypes
- All flows verified against PRD §6, §7, §7.1, §7.3.3 including walk-in oil case and REASSIGNED agent state
rechaj-ops-app
Section titled “rechaj-ops-app”[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”Security
Section titled “Security”rechaj-retrofit-app
Section titled “rechaj-retrofit-app”[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”Security
Section titled “Security”rechaj-selene-app
Section titled “rechaj-selene-app”[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”Deprecated
Section titled “Deprecated”Removed
Section titled “Removed”Security
Section titled “Security”rechaj-swap-app
Section titled “rechaj-swap-app”[Unreleased]
Section titled “[Unreleased]”- Bare-bones in-app support at
prototypes/swap-support-basic.html— a deliberate reset from the sophisticatedsupport-cases-v3direction, taking the current WhatsApp support model straight to the app on top of the unchanged production UI (swap-prod-v1). Two moves managers make today: Get help and Park swap.Get help(on the dashboard for out-of-swap issues; in a bar on Swap Payment / Complete Swap for in-swap issues) opens a uniform flow — pick the exact issue from the shared, grouped list → attach a screenshot + photos → describe → submit. One flow for every issue; no per-issue-type capture screens, no auto-population (that comes later). Submitting creates one support ticket + a two-way thread (manager ↔ Rechaj support, with photo attachments). An in-swap ticket auto-parks the swap so the rider queue moves on; Park swap parks manually. Parked swaps and support tickets live on the home screen (parked = oldest-first with a count badge; resume-in-place when resolved). Report a new issue lets a manager name an issue that isn’t listed, pick its area, and add it to the company-wide shared taxonomy so support and other managers reuse the same type — keeping one clean issues table. Escalation targets are named (Revenue Assurance for special cases, Hardware for keke breakdowns) as tags on the relevant issues; their downstream is intentionally a stub for now. Registered insite/src/data/products.tswith side-panel scenarios (home · get-help · in-swap · report · new-issue · thread).
Changed
Section titled “Changed”- Reconcile sheet pruned — removed the “Capture every transfer claimed” subtitle, the context recap card, and the “If it’s still slow…” overdraft note. Sheet now goes straight from the title to the payment-count chooser and the payment rows.
- Rider authentication form (perm-station-change lookup) — QR scan returns plate and phone number. Manual entry replaced with two inputs (plate + phone) instead of a single licence-number input.
- Old-battery reassignment scenario rebuilt and shipped (WIP tag removed). After unlocking a keke with no record of the current battery, the manager scans or types the serial. Three outcomes interactively branchable on-screen: (a) logged → continue to new-battery, (b) serial in use on another battery in the field → opens “Report to support” sheet, parks swap, (c) serial unknown → opens “Request new serial from backoffice” sheet, parks swap. Parked-swap copy + notification banners added for both new wait states.
- Terminology — “battery cycle” replaced with “swap” everywhere user-visible. Battery profile rows now read “Last swapped” / “612 swaps” (was “Last cycled” / “612 cycles”). Applies across swap-app prototypes v1/v2/v3, Atlas v1 & v2 dashboards, and the swap-support-resolution prototype.
- Battery serial format — adopted production pattern
BP-YYMMDD-NNNNNNNN(e.g.BP-251022-23910847) everywhere a battery serial is shown. Replaces the legacyBAT-####mock format in all prototypes + Atlas references. Ticket IDs (#BAT-####) intentionally left untouched — those are audit case numbers, not battery serials. - v3 final-step (Set next milestone) — adds a manual Voltage input (the manager reads off the new battery’s display before handing it over) and pre-fills “Current mileage” with the value from the rider’s last swap. A hint below the mileage input notes “From last swap (07:14 today). Edit if the dashboard reads differently.” — manual override stays available. Voltage flows through to the swap-complete receipt.
- Voltage everywhere — the metric Rechaj actually records is voltage, not state-of-charge. Every percentage-based charge reading across the app was renamed and recalibrated:
98%→67.2V,12%→50.4V. Labels updated: “Charge” / “Charge level” / “State of charge” → “Voltage”; “Charge given” → “Voltage given”; “Return charge” → “Return voltage”. Hits v2 + v3 swap-app prototypes, Atlas v1 + v2 dashboards, and the swap-support-resolution prototype. - v3 rider-profile wallet hero — adds a circular refresh affordance at the top-right (idempotent re-pull of balance from backend, with a 900ms spin animation) and a View history link in the footer that opens a new
sheet-wallet-historybottom sheet. Sheet groups top-ups and daily-fee debits by day, with credit (green) / debit (red) iconography.
- Production swap-flow replica + battery-compartment unlock:
prototypes/swap-prod-v1.html. Faithful rebuild of the currently-live swap app (the role-split update has not shipped) across five screens — dashboard, Initiate-swap sheet (plate + phone), Swap Payment (session timer, rider wallet + refresh, swap fee, rider/keke details, Sango Reward, VCU status card, station balance), Transaction-history sheet, and Complete Swap with the “Keke compartment control” green lock button. The compartment unlock wires the full Bluetooth → internet → OTP cascade onto the production UI (logic ported fromsupport-cases-v3.html): the VCU card’sBluetooth enabled/Recently streameddiagnostic drives the path. Deep-linkable scenarios: default (BT/internet reachable → direct unlock) and?scenario=bt-fail(No/No → 5s BT timeout → Try internet fails at 3s → OTP fallback: 6-digit, 15s window, blurs on expiry, regenerable). Also supports?screen=<id>direct deep-links. - New v3 of the support-cases prototype:
prototypes/support-cases-v3.html. Captures the full set of swap-app support scenarios — a 3-step happy path (drops the obligatory old-battery scan because the depleted battery is held in-memory), wallet not loading, battery not yet transferred to the station, temporary vs permanent station change, insufficient balance with three funding accounts (Opay / Paystack / Sterling, Opay highlighted), manager→rider transfer failure, funding-not-reflecting reconciliation, funds held with another station manager, battery serial conflict (kept + polished), old-battery reassignment, and a three-rung VCU fallback ladder (Bluetooth → internet → manual unlock). v3 lives alongside v2 until approved. - Six new patterns surfaced inside v3 —
reassign-banner,va-tabs(virtual-account picker),action-strip(subtle inline action),psc-station-list(radio-select),vcu-ladder(progress strip),manual-unlock(numeric code entry). - Five new scenario groups in the
/flowssidebar —station,wallet,battery,vcu(in addition to the existingflows/scenarios/end-states). Six new sidebar icons (map-pin,shuffle,key,wifi,clock) added tosite/src/pages/flows.astro. - New v2 of the support-cases prototype:
prototypes/support-cases-v2.html. Covers the full station-manager support flow — station mismatch, first-swap-unpaid (Opay funding), battery conflict (duplicate serial), the parked-swap queue with live update banner, and a redesigned support log. Lives alongside the v1prototypes/support-cases.htmluntil v2 is approved, at which point v1 will be removed. - Seven new entries in
patterns/:prototype-scenarios,parked-queue,notification-banner,inline-alert,status-card,captured-context,timer-band— extracted from the new prototype for cross-product reuse. - New
Scenariodata shape insite/src/data/products.tslets a flow declare captured scenarios. The/flowspage renders them as a 3-column grid panel beside the iframe; clicks update?scenario=<slug>on the iframe, which the prototype reads at init to set up the captured state. - v2 swap-flow now models the full happy path leadership called out: rider-details card surfaces wallet balance + active subscription + station match alongside the existing identification fields, and a new Connect & unlock step (
#screen-vcu-unlock) sits between rider details and battery return. The step has four captured states (vcu-connected,battery-locked,battery-unlocked,vcu-failed) driven bydata-stateon the screen, with auto-progression on entry and on tapping Unlock battery lock. - Four standalone keke illustrations at
prototypes/assets/keke-{connected,locked,unlocked,issue}.svg— used as hero artwork on the four VCU states. - Progress bar across the swap rebalanced to 4 steps: Identify · Connect · Return · Out.
- Scenario list grew to 16 + Reset, with five new captured states:
rider-details-ok,vcu-connected,battery-locked,battery-unlocked,vcu-failed. Three new scenario icons (bluetooth,lock,lock-open) added tosite/src/pages/flows.astro.
Removed
Section titled “Removed”- “Rider wallet not loading” scenario removed — the new wallet-hero refresh button on the rider profile handles this inline. Dropped the
alert-wallet-failinline alert,sheet-wallet-failbottom sheet,retryWalletLoad/submitWalletFailJS, thewallet-failscenario mode, and the scenario entries insite/src/data/products.ts(both swap-app and Atlas swap-support-resolution). Also removed the corresponding Atlas resolution screen + queue row.