Founder correction after the 3.5 sign-off (2026-08-18): the ring division is per-tier. Shield/Family draw THREE segments — each standing-by row, including Insurance application submitted, draws a third: the ring is the tier’s roster assembling, and the title commits at ring close, after the third leg (≈3.5 s, riding the insurance stamp — the accepted cost). Essential draws two halves, unchanged, committing at ≈2.9 s. This supersedes 3.5’s fork-A halves-always reasoning; within a tier the ring is consistent. Everything else in 3.5 stands: the box composition, the trifecta and its honesty-checked verb, the ≥2 s read hold, the fold, the readiness residue. Status: SIGNED OFF.
notificationSuccess at ring close
· no sound · no confetti · no gold · no score · first-render-only; the
settled layout persists as the new normal of the protected home.Family Shield, five open items — trusted contact, documents, medical notes, family roster and practice-the-hold all open. Under the 3.5 composition its box held the full trifecta (Family Shield carries the insurance row) and has already folded into the bar below; what remains is the readiness residue. The residue caps at the ruled three (contact → documents → medical); the remaining two collapse to the quiet line, which opens home’s full readiness list. Collapsed here, verbatim from the shipped rows: Add the people Family Shield protects · Adults and dependants your cover includes. and Practice the hold · Rehearse the arm gesture — nothing is sent.
Honest flag: the shipped cap keep-priority
(documents → family_shield_roster → trusted_contact → medical) predates the 3.2
order ruling and would pick a different three — the build aligns it to the ruled order, one-line change
in resolveReadinessChecklist.
Left: primary — Shield, three facts in the box each drawing a third of the ring, contact missing. Right: Essential, two facts, two halves — same fold choreography, per-tier ring arithmetic. Live CSS loops, shipped disc geometry and home furniture. Each frame is labelled with the demo-loop boundary — in the app this plays once; stamps and the settled layout persist. Opened, the standing-by sheet lists all four rows including trusted-contact status (already true in the shipped app) — the contact-present case needs no separate frame.
Beat 1 — cold (0–1.0 s). The real confirming-with-server frame: ghost title, grey dot, dark track ring — and the labeled box already framing three dim rows: WHO’S STANDING BY, the shipped sheet’s surface in expanded preview form, present from the first frame. Beat 2 — protection attests (1.0–2.6 s). Law firm on call and Consulate route ready ignite on server confirmations inside the box: dot, label, mono stamp; on Shield each draws a third of the ring. Beat 3 — insurance attests (2.8–3.3 s). Insurance application submitted ignites and draws the final third — per-tier ruling: the ring is the tier’s roster assembling. Essential never renders the row; its two legs draw halves. Beat 4 — the ring closes (3.3–3.6 s). Bloom, the haptic, and the title commits at ≈3.5 s — after the insurance stamp, the accepted cost of the per-tier ring (Essential commits at ≈2.9 s). Beat 5 — the read hold (3.3–5.9 s). Stillness, ≥2 s after the last ignition (2.5 s here). Nothing may vanish while it is being read. Beat 6 — the fold (5.9–7.0 s). The box folds down into the peek bar — a true shared-element transition: the header morphs into the bar’s label (same words, the type ramp travels), rows fade as the container compresses, and the bar is the landed residue. The box becoming the bar IS the story. Beat 7 — home settles (7.2–8.7 s). READINESS, the contact ask first, then documents (post-payment homework) and medical notes fade up into the freed space. The residue IS the home.
No score, no ticks unearned: facts get timestamps, the gap gets an ask. Honesty check: the insurance row says submitted — “notified” or “activating” would overclaim at payment; submitted is true the moment it is rendered. The sheet shows four: tapping the landed bar opens the standing-by sheet listing all four rows including trusted-contact status — already true in the shipped app — so the contact-present case needs no separate frame. Residue cap: at most three readiness rows; further open items collapse to a quiet +N more in Readiness line (see 01). Build: ignitions are Animated opacity; the arc is one react-native-svg dashoffset via Reanimated; the fold is a single shared-element layout transition — box height/position + label morph on Reanimated shared values, rows clipped by the folding container. Read hold: the fold may not start until ≈2 s after the last ignition (founder read-speed rule) — late server acks push the fold later, never sooner. Battery: nil — no idle motion. Reduce-motion: one cross-fade from cold to settled home + the haptic. Timing: cold→commit ≈3.5 s (the commit rides the insurance stamp — per-tier ruling cost, accepted; Essential commits ≈2.9 s); fold lands ≈7.0 s; settle completes ≈8.7 s. Commit-beat option: C2’s seal-press haptic weight (archived) may replace the ring-close beat.
The same choreography with the tier’s own ring count: both protection legs ignite (1.0–2.6 s) drawing halves, the ring closes and the title commits at ≈2.9 s — earlier than Shield, whose commit rides the insurance stamp — the read hold runs 2.6→4.7 s, and the box folds 4.7→5.8 s. No insurance row — Essential self-pays; rendering a third row would overclaim. Readiness settles 6.1→7.5 s with the Essential documents wording: They confirm your identity for responders.
One choreography, server-shaped: the client renders whatever rows the confirmation read attests, and the ring divides by the tier’s roster count — thirds on Shield/Family, halves on Essential; consistent within a tier. Presentation queue staggers acks ≥140 ms, caps total wait ≈1.2 s; the read hold then runs from the final ack.
Every ignition renders a fact the arrival confirmation read returns. What exists today vs. what the beat asks the server to add.
| Leg / fact | Exists today | The arrival read needs |
|---|---|---|
| Entitlement active — gates the whole beat | Entitlement read after webhook (own Postgres table, Stripe-fed) — tier, status |
activated_at (server timestamp) — likely already stored; expose it |
| Law firm on call — row 1 | Standing-by leg status, server-derived (JQ-014 stakeholder readiness; emirate-roster matching) | firm_on_call_at per-row timestamp (new) |
| Consulate route ready — row 2 | Nationality → consulate duty-desk mapping, server-side (standing-by sheet rows) | consulate_route_at per-row timestamp (new) |
| Insurance application submitted — row 3, Shield/Family Shield only | Entitlement tier (own Postgres table, Stripe-fed) + the Sukoon application record created at payment | insurance_application_submitted_at stamp (new); render the row only
when the tier carries insurance — the verb stays submitted until the carrier confirms; on
Shield/Family this row draws the ring’s final third (per-tier ruling) and the commit follows it |
| Trusted contact — NOT a row; first readiness ask + a standing-by sheet line | Contact roster count via stakeholder-readiness read (refreshTrustedContactReadiness) |
contact_count — already exists; nothing new for the arrival beat |
| Readiness residue — rows after the beat | resolveReadinessChecklist — self-emptying, fail-closed per item, max 3 rows |
Nothing new — the residue renders the shipped resolver’s output in the ruled order, plus the +N overflow line when it returns more than fits |
v1 fallback, zero new endpoints: stamp every attested leg with the entitlement’s
activated_at — one server truth on all rows, still mono, still honest. Per-leg stamps are
the ideal; the beat does not block on them. The client never invents a timestamp (hydration law: normalize
timestamptz via toISOString()). | ||
Kept animated for one reason: the seal-press commit beat — room dims, disc presses, haptic strikes at full press, release lands one stop brighter. If C1’s ring-close beat tests thin on device, this press is the approved escalation for that single beat.
Archived for the record. No carry-forward.