SparkReconIQ · Kigali · platform delivery

Delivery Board — what's live, what's queued, what's next

A single live view of the reconciliation platform's work. Prod is held at v1.38.3 while a correctness stream lands on staging — every open issue, open PR, shipped release, and backlog item, from git + GitHub as of 2026-11-09.

QA / parity remediation detail →

ProductionHeld
v1.38.3 · since 2026-07-20 · v1.3.1

v1.3.1 LIVE — edit-save 500 fix (BigInt serialize; every save was silently failing) + MoMo import ~25s→~1s; Delete&replace + Wipe-ALL-source statement re-import; split-screen sign-in + boot splash

sparkreconiq.app · same-origin · Worker + Pages · health 200

Migrations 0001–0014 · per-user access control (page deny + DB-backed custom roles) · deploys on v* tag

None of the current stream is on prod yet.

Staging+1 ahead
main · auto-deploys on push

Even with prod (v1.3.1) — nothing pending

Durable edit-save: localStorage outbox + Save button + reviewable unsaved-edits list; edits survive logout

Per-user access control: hide specific pages from a user (deny) + DB-backed custom roles (Access Levels screen)

MoMo phone-first reconcile (payer 'From' → CRM phone) + import mapping corrected (From→narration, To→bank account)

Statement re-import: Delete&replace a period (keeps edits) + Wipe-ALL-source (clean slate)

Parity list FULLY CLOSED · client == server · money totals conservation-clean

Promote staging → production→tag — to ship the queued stream (1 commits) to prod

Open issues

0

0 bugs · 0 other

Open PRs

0

Backlog open

41

across 11 areas

Commit velocity

550 total

per week · last 8

Queued for —

1 commits · staging → prod
#440

feat(web): staging wears an amber mark, so nobody mistakes it for prod

Merged
To ship: v1.3.1 SHIPPED to prod 2026-07-20 (edit-save BigInt 500 fix + fast MoMo import; Delete&replace + Wipe-ALL import; split-screen sign-in). Code-only tag — no migration/reseed. Staging even with prod, nothing pending. Backlog: reconiq.spark.taxi same-origin Safari login; rotate prod DB password.

Needs a decision / blocked

product & data calls before code
—

Narration bank double-booking — dedup or keep?

Legacy app deduped same-narration / different-txid bank rows; current app + #168 keep them. ~169 riders differ in the old-snapshot diff. Product call + data quantification before porting.

Decision · product
#162

Deposit override — 3-state model

T1 bundles need deposit_override = deposit | daily | null instead of today's boolean. Schema shape decision blocks the clean fix.

Decision · schema
—

Duplicate roster rows — fix at source vs in compute

Remove pure-duplicate rows from the upstream CRM master (data action), or keep absorbing them in compute (#169). Owner + upstream access needed.

Decision · data
#145

Polished-v2 design refresh — go / no-go

Parked reskin; finished state on design/polish-v2-parked. Revive by reverting #145, or leave prod on the current look.

Parked

Open issues

0 open

No open issues.

Legacy-app parity burn-down

full detail →15 rules · 15 done · 0 partial · 0 open
Done / match 15Partial 0Open 0
T1#162
Deposit bundles split 50k + daily
T2rider ✓ · month ✓
Two working-day fns (half-open / inclusive)
T3rider ✓ · month ✓
Two compliance formulas (floored / raw)
T4#165·#167
Cutoff advances daily
T5✓
Bike status caps clock
T6rider ✓ · batch ✓
Deposits excluded from collected
T7#181
Pace per-cutoff active + Sunday interleave
T8#168
Duplicate payments once
§2#164·#181
Matching + reassigned-plate excl.
§3#168 · narration=deviation
Dedup in totals (narration kept, by decision)
§5frontend ✓
Batch daily (activeR×6k · last-day)
§6frontend ✓
Monthly Board report (wdInclusive · raw comp)
§7#181
Daily pace
§8✓
Aging bands
§9frontend ✓
Category-PIT · exec extras (slipped/top-10/forecast)

Open pull requests

0 open

No open PRs.

Recent releases

shipped to production
v1.38.32026-11-08 · current
v1.38.22026-11-08
v1.38.12026-11-08
v1.38.02026-11-07
v1.37.22026-11-07
v1.37.12026-11-07

Backlog

41 open · 11 areas
Security & auth 8›
  • `withOrgTx` provides no atomicity — ~40 `auditLog` call sites assume it does
  • Per-call API-key usage metering
  • Third copy of the forbidden-scope list
  • In-app 2FA — email OTP on login
  • Email delivery groundwork — pick a provider (Cloudflare Email Service
  • Security audit leftovers — M4 / M5 / LOW items
Domain & browsers 1›
  • Cross-browser login fix — same-origin architectureDone — (#133)
  • `reconiq.spark.taxi` same-origin so Safari can log in there
Monitoring 4›
  • Prod secrets to light up parked panelsOn hold — `NEON_API_KEY` + `NEON_ORG_ID`
  • Sanity-check Neon cost math vs the Neon console — once the API key is set
  • Trend-based alert rules — compare against a 7-day baseline instead of
  • First-class email notifier for alerts — depends on the email-delivery
API & integrations 1›
  • spark.taxi CRM integration — make the API integration-ready
Odoo connector 11›
  • Collections push sent `ref`, which Odoo 18's `account.payment` rejectsDone
  • Bikes are COUNT-ONLY, not "proposals only" as the design doc says
  • Different-`localKind` sync loop is not caught by the registry validator
  • `runPush` updates are one Odoo `write` plus one batch per updated rider-day — , unlike creates, which batch at 200. Fine at today's volume; a mass correction of past days would spend the subrequest budget.
  • `GET /api/integrations/odoo` awaits the live Odoo probe — after loading the entities, so a remote round-trip sits on the connection card's load path. Read the last stored probe result inst
  • Per-key `rate_limit_hr` is stored and displayed but NOT enforced. — Only the global 300/min per-IP limiter exists. See also the usage-metering item under Security & auth.
UI / design 1›
  • Polished-v2 design refresh — ON HOLDOn hold
Performance 3›
  • Part B — server snapshot endpoint for cold starts
  • Recompute-chain freezes — dirty-flags + debounce
  • Client OOM — durable structural fix
Admin & operations 2›
  • In-app bulk rider actions via maker-checker
  • Admin data explorer — saved parameterized queries
  • Snapshot-reload hardeningDone
Validation & housekeeping 3›
  • The month report prices a deposit bundle at the rider's rate; everything else uses the batch rate
  • Rider-info edit — manual prod click-through (Tests 1/2) — direct-apply
  • PR #140 — tab title "Spark ReconIQ" (drop v27)Done
  • CI actions Node-20 deprecation — already on `actions/checkout@v4` /
Car taxi module 7›
  • Mode B is not wired into `computeRiders` — THE known gap in phase 1Abandoned
  • `aggregate.ts:13` `const DEPOSIT = 50000` is still a motorbike hardcode
  • `seq NOT NULL DEFAULT 1` collides on a car's second loanAbandoned
  • `vehicle_loans.closed_outcome` has no CHECK constraint
  • 0031 is applied to staging from an unmerged branch, and is now immutable
  • The schema is guarded in-suite only by regexes over file text
Abandoned 1›
  • Subdomain delegation of reconiq.spark.taxi to our CF accountAbandoned