Skip to content

feat: show the owner whether we can reach their heir (#327) - #361

Merged
Jolah1 merged 1 commit into
mainfrom
fix/327-heir-reachable-card
Oct 19, 2026
Merged

Jolah1 merged 1 commit into
mainfrom
fix/327-heir-reachable-card

Conversation

@Jolah1

@Jolah1 Jolah1 commented Sep 11, 2026

Copy link
Copy Markdown
Owner

What's missing

Part of #327. The server already knows whether we can reach the heir:

  • heir_contact_verified_at: set when a practice invite is confirmed delivered (Tier 2, delivery.rs)
  • heir_unreachable_alerted_at: set when a message to the heir bounces or is marked spam, and cleared by the next good delivery

The owner can't see either one. The dashboard says nothing, so an owner learns their heir's address is wrong only if they happen to open the heir-contact page, or on the day the claim link fails.

What this does

Server. The owner GET /vaults/:id gains heir_reachability:

  • "unreachable": the latest message to the heir bounced or was marked spam
  • "unconfirmed": nothing sent to them has ever been confirmed delivered
  • "confirmed": something was
  • absent: the heir isn't on email. Only email gives us delivery reports, so we don't claim anything either way.

A failure wins over an old confirmation. heir_contact_verified_at is never cleared by a later bounce, but the alert flag is cleared by the next good delivery, so the alert always describes the latest verdict. Editing the heir's address already resets both (routes.rs, heir contact update).

Dashboard. A card under the confirm-email card:

  • Unreachable: warning style. "There's a problem reaching Ada. If your Bitcoin were claimed today, they might not get the link. Check the address you saved for them." Button: Check address, which opens the heir-contact page.
  • Unconfirmed: quiet style. "We haven't reached Ada yet. Send them a practice claim. It's how we check their address works." Button: Send practice.

The wording says "a problem reaching" rather than "didn't arrive", because the same flag fires for a spam complaint, where the mail did arrive.

The nudge hides once a practice is out, so an owner who did the right thing isn't nagged while the delivery report comes back. A failure still shows after a practice.

Neither card shows once a claim is underway. The link has already gone out, and fixing the address then wouldn't resend it, so the card would reassure the owner about something it can't fix.

Not in this PR

The last item on #327, blocking timelock_started on an unverified heir, is a product call that interacts with #326. Left for a separate decision.

Tests

  • heir_reachability (server): unconfirmed, confirmed, a bounce after a confirmation, NULL channel as email, SMS and WhatsApp as unknown, no sealed contact.
  • heirReachNotice (web): each state, the nudge hidden after a practice, the failure still shown after one, silence during a claim.

RUSTFLAGS="-D warnings" cargo clippy --workspace --all-targets, cargo test -p ghostkey-server, tsc, eslint and vitest all pass locally.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GraRi9SrkuinY5npjjkTA4

The server already records when a practice invite is confirmed delivered
(heir_contact_verified_at) and when a message to the heir bounces or is
marked spam (heir_unreachable_alerted_at). The owner could see neither
unless they opened the heir-contact page.

The owner GET /vaults/:id now reports heir_reachability: unreachable,
unconfirmed, confirmed, or absent for non-email heirs, since only email
gives us delivery reports. A failure wins over an old confirmation.

The dashboard shows a warning card when the heir is unreachable, and a
gentle nudge to send a practice claim when nothing has been confirmed.
The nudge hides once a practice is out; neither shows once a claim is
underway, because fixing the address then would not resend the link.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GraRi9SrkuinY5npjjkTA4
@vercel

vercel Bot commented Sep 11, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
ghost-key Ready Ready Preview Sep 11, 2026 12:24pm UTC

@Jolah1
Jolah1 merged commit 20eeeb1 into main Oct 19, 2026
9 checks passed

This branch was successfully deployed

1 active deployment
Preview — b52a5d68 Deployed Sep 11, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant