ident
All repositories: gitoria
3.9 KB
# Mission 001 (old 003) — ident.worldapi.org MVP in Hybriel (ticket #2)One-shot worker. Architect (Claude Code on Byrodin) verifies your report.Read first: `/CONTAINERS/projects/antcolony/README.md`, `STATUS.md`, `loreana:/media/STORAGE/projects/tickets.worldapi.org/missions/001-tickets-mvp.md`and its result: the tickets app `loreana:/media/STORAGE/projects/tickets.worldapi.org`(README, STATUS, project.hl, store.hl, tests/) — same stack, same conventions, copy its setup.## Where- Host Loreana (`ssh loreana`, fish login shell → `bash -c '…'` or script files).- New app folder: `/media/STORAGE/projects/ident.worldapi.org`. Vendor `bin/hybriel` + pluginsexactly like the tickets app does (same binary, sha256 c51d163d…).- Hybriel repo `/media/STORAGE/projects/hybriel` READ ONLY. Reference for login:`projects/demo-social-network` (mail.hl, login_form.hl, signup_form.hl, store.hl, tests/).- Dev port **8351**, bind 0.0.0.0. Gate ports: pick your own range, not 8352 and not the socialgate's 8600-8619 (another worker runs the tickets gate at the same time).## What ident isLogin for all worldapi apps (tickets, gitoria, …). Email one-time codes only, no passwords.Accent orange `--color-accent: #ce9178` (tokens: `/CONTAINERS/projects/layouts.worldapi.org/css/foundation/tokens.css`on Byrodin, read only; markup rules in `docs/conventions.md` there).## Scope1. Users: email (unique, lowercased), display name, created. Sign up = first login with a new email(ask for a name once). Codes: 6 digits, expire after 10 min, single use, max 5 attempts, ratelimit sends per email.2. Pages: `/` (signed out: login form; signed in: "signed in as …", sign out), code entry,name prompt for new users.3. **Login for other apps — architect decision, redirect + code exchange (OAuth-code style,works across domains and dev ports):**- App sends browser to `ident/login?return=<url>&app=<name>`.- After successful OTP, ident redirects to `<return>?ident_code=<one-time code>` (code valid 60 s,single use). Only return URLs whose origin is on an allow list (config, for now: the tickets devorigins `http://100.77.141.84:8350`, `http://192.168.178.75:8350`, `http://127.0.0.1:8350`, pluswhatever your test client uses). Unknown origin → error page, no redirect.- App's server calls `POST ident/api/exchange {code}` → `{ user: { id, email, name } }` or 400.- ident keeps its own session cookie so a second app login does not need a new OTP.- Write this down as a short spec in the app README ("How apps use ident").4. Mail: do NOT send real mail in this mission. Use a file sink like the social app(`HL_SOCIAL_MAIL_SINK` pattern) configured via `.env`; tests read the code from the sink.Leave the hl:smtp path wired and configurable (SMTP_* env) for mail.byrod.in later.5. A minimal test client (a tiny second hybriel app or a route in the gate) that proves the wholeredirect → OTP → return → exchange flow end to end.Out of scope: wiring tickets to ident (next mission), deploy, Docker.## Rules- No git. Don't touch other project folders (read the tickets app only). Only kill your own PIDs.Clean up every headless Chrome (`--disable-gpu`, GPU is wedged). Scratch in `.scratch/`.- A test is the whole process: real headless browser drives login, observe the result;plus API negative cases (expired/reused code, wrong code 5x, bad return origin, reused exchange code).- Strict API from day one: unknown/missing fields → 400 naming the field.- Hybriel bugs: don't fix in the repo; report with repro.- Leave the dev server RUNNING on 8351 (setsid/nohup, `server.pid`, `server.log`).- Deliver `README.md`, `STATUS.md`, `tests/browser.mjs`.## Report (final answer, this structure)```## Done## Verified (each: command run + observed output)## Not verified / open## Hybriel issues (repro, observed, expected)## Questions for the creator## Running (URL, PID, log path)```
Branches
- mainmain branch
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