gitoriaLog in with ident

ident

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commitfe183516fe183516ident mission 009 (3/4): let only where reassigned — 293 never-reassigned lets are plain declarations; kept: reassigned, loop bodies, names of a file member, a name declared twice in one function; same outputmrefe183516/missions/004-ident-selector.md

5.2 KB

  1. # Mission 004 (old 007) — ident 3/6: identity selector (ticket #26)
  2. One-shot worker. The architect (Claude Code on Byrodin) verifies your report, then the creator tests.
  3. ## Read first — in this order
  4. 1. **`loreana:/media/STORAGE/projects/ident.worldapi.org/CONCEPT.md`** — the creator's concept, source
  5. of truth. Section "Flow 2: identity selector" and "Decided 2026-09-24" are this mission. Do not add
  6. features it does not describe; where it is silent, make the smallest choice and list it under
  7. "Questions for the creator".
  8. 2. The app's `README.md` and `STATUS.md` (pieces 1 and 2 done and confirmed by the creator; piece 2 =
  9. apps, API key + secret, per-app identity ids, login button, `POST /api/exchange`).
  10. 3. `/CONTAINERS/projects/antcolony/README.md` (section "Lessons learned").
  11. 4. Ticket: `GET http://100.77.141.84:8350/api/tickets/26`.
  12. ## Hybriel (standard block)
  13. Read `/CONTAINERS/projects/antcolony/docs/hybriel-for-app-workers.md` first — it lists which docs to
  14. trust, the known pitfalls with workarounds (#31 forged face sessions, #36 face names are global), and
  15. the open hybriel tickets. Report new Hybriel findings under "Hybriel issues"; do not edit that guide.
  16. ## Where
  17. - Host Loreana (`ssh loreana`, fish login shell → `bash -c '…'` or script files).
  18. - App: `/media/STORAGE/projects/ident.worldapi.org`, dev port **8351**; test app `testapp/` on **8354**.
  19. Hybriel repo READ ONLY.
  20. ## Scope (piece 3 of 6)
  21. From the concept:
  22. - The app's page includes **a script from ident, configured with the app's public API key**.
  23. - The script **fetches from ident** (with credentials). ident answers with the identities of the
  24. signed-in ident user **only if** the request comes from one of that app's registered origins and
  25. carries its API key (CORS: exact origin + credentials, never `*`).
  26. - The selector is a **shadow-DOM element in ident's design** that the host page **can restyle**
  27. (document how: CSS custom properties and/or `::part`).
  28. - It first says **"choose ident"**. **Selecting an identity is the login**: ident hands the script a
  29. **one-time code** (same rules as the button flow's code), the script gives it to the host page (e.g. a
  30. DOM event); the **host's server exchanges it** with `POST /api/exchange` (key + secret) → per-app id.
  31. - **The host tells the selector it is logged in** (`logged-in` attribute / property). The selector sets
  32. no cookie of its own. Logout on the website = the host resets the selector.
  33. - What happens after login is up to the app: **the test app switches its frontend to logged in
  34. without a reload** (our apps' behaviour).
  35. Where the concept is silent (make the smallest choice, list it): what the selector shows when the user
  36. is not signed in to ident (e.g. a link into the existing login button flow); what it shows in the
  37. logged-in state; how the host restyles it.
  38. Extend the test app (`testapp/`) to use the selector, keeping its login button too.
  39. **Out of scope**: notifications (#27+), foreign-domain / Safari-Firefox third-party cases (all our
  40. apps are same-site; dev ports on one IP count as same-site too), client-only apps.
  41. Also, only if you can read it without being refused: fix the 2 obsolete checks in the piece-1 gate
  42. `tests/browser.mjs` (ticket #37 — they expect `/login` and `/api/exchange` to be gone; replace them
  43. with checks of the current behaviour). If reading it is refused, leave it and say so.
  44. ## Mail — IMPORTANT (unchanged)
  45. The dev server on :8351 sends **real mail**. Never trigger an OTP on :8351; don't run
  46. `tests/dev-smoke.mjs` against it. Your gate starts its own servers with `IDENT_MAIL_SINK`.
  47. **Do not read, print, copy or edit any `.env`.** At the end restart :8351 (only the PID in
  48. `server.pid`) and the test app (only the PID in `testapp/testapp.pid`) and check both answer 200
  49. without logging in.
  50. ## Data
  51. The dev store holds the creator's account and a registered app. Back up `storage/` (and `.sessions/`)
  52. to `.scratch/storage-backup-<ts>/` before the restart; migrate, never wipe. Verify afterwards
  53. (read-only, on a copy) that accounts, identities, apps and connections are still there. The test
  54. app's own `testapp/storage/` holds the creator's key/secret setup — keep it.
  55. ## Rules
  56. - No git. Don't touch other project folders. Only kill your own PIDs or the ones in ident's pid files.
  57. Clean up headless Chromes (`--disable-gpu`). Scratch in `.scratch/`.
  58. - Do NOT POST to the live tickets server (:8350).
  59. - A test is the whole process: real headless browsers — signed in to ident on the ident origin, then
  60. the test app's page on its own origin shows the selector with the right identities, select → code →
  61. host exchange → test app switches to logged in without reload → `logged-in` state → host logout
  62. resets. Negatives: unregistered origin / wrong key gets no identities; signed out of ident gets no
  63. identities; forged face sessions (#31); code reuse; a restyle by the host actually changes the look.
  64. - Strict API as before. Screenshots at 390px and 1280px (selector closed and open), look at them.
  65. - Update `README.md` ("How apps use ident": the selector snippet a host needs) and `STATUS.md`.
  66. Do NOT edit `CONCEPT.md`.
  67. ## Report (final answer, this structure)
  68. ```
  69. ## Done
  70. ## Verified (each: command run + observed output)
  71. ## Not verified / open
  72. ## Hybriel issues (repro, observed, expected)
  73. ## Questions for the creator
  74. ## Running (URL, PID, log path)
  75. ```

Branches

Latest commits

  • fe183516ident mission 009 (3/4): let only where reassigned — 293 never-reassigned lets are plain declarations; kept: reassigned, loop bodies, names of a file member, a name declared twice in one function; same outputmre
  • d2e7f91bident mission 009 (2/4): one lib file per topic (login, accounts, identities, apps, invites, selector, notify + helpers, util), function routes as thin wrappers in lib/api.hl, project.hl = the map; same outputmre
  • 91017164ident mission 009 (1/4): file moves — the root .hl files into lib/ (api.hl → lib/api-helpers.hl), styles.hl → components/styles.hl; imports adjusted, no other changemre
  • f8bdcbc2ident: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); all gates greenmre
  • ff78726cident: Hybriel master 190aa11d (fc838894 GC correctness, #127, #126 closure scopes); gates all greenmre
  • a3a7d21aident: Hybriel master 8efba065 (#126 GC by bytes, #48 lambda params copy); session-writing lambdas take &sessionmre
  • 98226b41antcolony#40: mission references point to the moved missionsmre
  • ff805b9aantcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 51a7bcdfident: Hybriel master 73267707 (#122); /code uses the new page() signature; pending address passed as parameter; once-checksmre
  • 836f644fident#24: installable app (manifest, service worker, data-free offline /start), own iconmre
  • 8bebbbf2deploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • cc063ea2deploy.sh: never send .git or .gitignore to Byrodinmre
  • 81b15b7bState of 2026-09-27, before the move to gitoriamre