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.
No code changes needed — land/property was already correctly wired through
Hibah (offer/acceptance/possession now), Waqf (dedicated corpus via Family
Waqf Designator), and Trust (via Nomination Registry, added earlier this
session). This adds explicit isolated verification since prior tests only
exercised one channel per property asset at a time.
e2e-property.cjs: three separate property assets, each covered through a
different channel, confirming Coverage Dashboard correctly attributes each
(Hibah/Waqf/Trust) and reaches 100%, and Death Trigger generates a
distinct execution packet for all three. 9/9 passing. Re-verified
e2e-uat.cjs (32/32), e2e-fastpath.cjs (16/16), e2e-trust.cjs (12/12),
e2e-business.cjs (10/10), e2e-digital-vehicle.cjs (10/10), e2e-info.cjs
(31/31) — 132/132 total, no regressions.