65 lines
3.6 KiB
Markdown
65 lines
3.6 KiB
Markdown
# IndeeHub native signer follow-up
|
|
|
|
## Reproduced on Yaya
|
|
|
|
The installed app and dashboard have the same provider SHA256
|
|
`529fe82e7c16b51c62678427f565048c3dd93ca28320bd8494c17236ff57bb81`.
|
|
A clean mobile Chromium session opens the identity picker. After selecting the
|
|
existing profile and Authenticate, the picker disappears but the broker stays
|
|
full-screen (`aria-hidden=false`, 390 by 844). Its document has no visible text
|
|
or buttons, and the app still shows Sign In. The trace contains signer-ready and
|
|
signer-show but no signer-identity or signer-hide through 18 seconds.
|
|
|
|
The picker emits an entry from a Vue reactive array. NostrTabSigner passes that
|
|
proxy object directly to cross-frame postMessage after hiding the picker.
|
|
Structured cloning rejects reactive proxies, interrupting the handoff before
|
|
it schedules the broker hide. Reload uses the already-serialized identity from
|
|
localStorage, explaining why refresh can appear to repair the problem.
|
|
|
|
## Candidate fix
|
|
|
|
Send an explicit plain object containing only the selected public identity
|
|
fields. The private signer remains on the node; unrelated metadata is excluded.
|
|
Consent behavior and the existing green completion animation are unchanged.
|
|
|
|
A regression uses a real Vue reactive identity and structuredClone, verifies
|
|
that the proxy itself is rejected, the public handoff is cloneable, metadata is
|
|
excluded, and the overlay closes. Eleven focused signer/provider tests pass,
|
|
and frontend typecheck passes. A browser qualification using candidate dashboard
|
|
assets with the actual Yaya app/auth backend is in progress. No deployment or
|
|
actual companion acceptance is claimed yet.
|
|
|
|
## App source and further review
|
|
|
|
The canonical app is the Vite/Vue source in the separate IndeeHub repository,
|
|
not the obsolete Next.js Dockerfile under apps/indeedhub. Its existing local
|
|
nginx edit and untracked workflow documentation were preserved; new app work
|
|
uses a separate worktree.
|
|
|
|
Review found additional app-side concerns to test: production network failures
|
|
can flip the app into mock mode and fabricate subscribed users, and the header
|
|
can discard a valid backend Nostr session when the local signer account has not
|
|
been restored. Do not claim these repaired by the broker object-cloning fix.
|
|
|
|
## Live candidate qualification and restored-session prompting
|
|
|
|
2026-10-05: actual Yaya NIP-98 session exchange returns201 and authenticated
|
|
profile returns200 using candidate dashboard and app assets. The overlay hides;
|
|
a full refresh reuses the session and profile without another auth exchange.
|
|
Evidence: /tmp/archy-indeehub-full-candidate-2.log. This uses headless Chromium
|
|
390x844, real cookies/signatures/RPC/API, with only static candidate assets routed
|
|
locally. Initial asset-routing attempts hit Chromium private-network checks;
|
|
forwarding real API requests in the fixture resolved that test harness failure.
|
|
No backend authentication was mocked or bypassed.
|
|
|
|
Public-key lookups can inherit transient activation from the identity-picker
|
|
click/reload. The provider now avoids interpreting a restored-session hint or
|
|
already selected identity as a new account-switch request. Requests still pass
|
|
to the authenticated broker; the hint grants no signature permission. Explicit
|
|
selectIdentity remains available. Twelve provider/tab-signer regressions pass.
|
|
|
|
The combined frontend production check found strict TypeScript nullability
|
|
errors in Fleet test array indexing; the fixture now asserts both cards exist
|
|
and uses non-null indexing. No production Fleet behavior changed in that repair.
|
|
Actual deployment, companion lifecycle and the remaining recovery cases stay open.
|