wmj b9a98bd97a Restore all 8 pre-auth E2E suites with a sign-in prelude; fix bugs they found
New e2e-auth-helper.cjs: shared signInFreshFamily() prelude — signs in as
the confirmed test owner account and creates a uniquely-named family per
run, so accumulated data from a previous run's assets/hibah/etc. (now
persisted in Supabase, not wiped with the browser context like localStorage
was) can never bleed into another run's percentage/coverage assertions.
All 8 suites (e2e-uat, e2e-fastpath, e2e-trust, e2e-business,
e2e-digital-vehicle, e2e-property, e2e-other, e2e-info) now call it in
place of the old anonymous page.goto(BASE).

Restoring them surfaced two real product bugs, not just test staleness:

1. WassiyahGenerator.svelte was never migrated to Supabase in the earlier
   backend work — it still called the old local storage.js load()/save()
   for assets, bequests, and witnesses, so the one-third meter silently
   read an empty local cache and always showed 0. Migrated to family-scoped
   Supabase tables (new nf_wassiyah_bequests, nf_wassiyah_settings, with
   member-scoped RLS) matching the pattern used for Hibah/Nominations/etc.

2. storage.js's exportAll() did an unguarded JSON.parse on every
   "nf."-prefixed localStorage key, but family.js stores activeFamilyId as
   a raw string (not JSON-encoded) — one malformed parse threw and silently
   aborted the whole export before the file download fired. Made exportAll
   defensive: falls back to the raw string on a parse failure instead of
   throwing.

The remaining test failures were async-timing gaps inherent to the move
from synchronous localStorage reads to async Supabase fetches: several
assertions checked <select> option counts or newly-created rows immediately
after a fixed short wait, before the async load/refresh had actually
landed. Fixed by replacing blind isVisible()/fixed-timeout checks with
proper waitFor()/polling in the test helpers (selectByText, corpus-select
population, row-creation checks) — not a product bug, but worth fixing
since the old timing assumptions no longer hold now that data is live and
shared instead of instant and local.

Results: e2e-uat 32/32, e2e-fastpath 16/16, e2e-trust 12/12,
e2e-business 10/10, e2e-digital-vehicle 10/10, e2e-property 9/9,
e2e-other 4/4, e2e-info 31/31 — 124/124. Re-verified e2e-family-agent
(12/12) and e2e-smoke-authed (24/24) still pass after the
WassiyahGenerator migration. 160/160 total across all ten suites.
2026-08-13 21:30:46 +08:00

Nur Falah — Estate & Waqf Suite

Horizon 1 (Prevention Suite) + Horizon 2 (Unlock Programme, pre-pilot demo) from the Nur Falah PRDs, built as a standalone Svelte 5 + Vite PWA, styled to match the visual system of the live moslem03.falahos.my (Nur Falah Muslim Companion) app.

Modules

Module Horizon Status
Faraid Calculator 1 Shared calc core, 14 classical cases passing (src/lib/calc/faraid.test.js)
Asset Registry 1 Local-first, feeds every other module's estate total
Wassiyah Generator 1 1/3 meter, heir-exclusion block, jurisdiction-aware export
Hibah Tracker 1 Shared marad al-mawt guardrail
Family Waqf Designator 1 Built ahead of scholarly sign-off — see below
Digital Beneficial Claims 2 Pre-pilot demo only — see below

Important: two governance gates were overridden for this build

Per explicit product direction, this build proceeded past two gates stated in the project's own PRDs and review log:

  1. Family Waqf Designator (Horizon 1 PRD §8.5) is gated on scholarly sign-off. scholarly-review-log.md (in the digital-waqif docs repo) tracks OPEN-01 — whether a healthy-state waqf is subject to the one-third cap — as unresolved. This module ships anyway; the in-app copy states the open question rather than presenting invented certainty.
  2. Horizon 2 (Digital Beneficial Claims) PRD states: "No engineering work begins until Phase 0 (legal opinion + signed institutional partner agreement) is complete." No confirmation of Phase 0 completion was available. The Claims module ships as a local, non-custodial demonstration of the data model and transfer restriction only — no real legal wrapper, no institutional integration, no real claims issued. It carries a persistent in-app banner saying so.

Both are flagged here, in deploy/DEPLOY.md, and in the relevant module's source comments so this isn't silently presented as production-ready.

Development

npm install
npm run dev       # http://localhost:5173
npm run test      # classical faraid test suite
npm run build

Deploy

See deploy/DEPLOY.md. Target: moslem04.falahos.my.

S
Description
Nur Falah Horizon 1 Prevention Suite + Horizon 2 Unlock demo. Deploy target moslem04.falahos.my
Readme 1.1 MiB
Languages
Svelte 51.9%
JavaScript 47.9%
HTML 0.1%