ident
All repositories: gitoria
8.6 KB
# Report 009: ident code order, no behaviour change**Where:** commits on main in loreana:/media/STORAGE/projects/ident.worldapi.org:- `9101716`: file moves (1/4)- `d2e7f91`: topics, map and thin wrappers (2/4)- `fe18351`: `let` (3/4)- the docs + tests commit (4/4), which also holds this report and the mission briefNot pushed, not deployed. No `.env` read (the real-data runs use code-only copies without `.env`). Only ports 8750–8759 were used. Every server was stopped by its PID; nothing of mine is still running, and 8750–8759 are free.## Counts (before → after; `python3 tests/letcount.py .`)| | before (f8bdcbc) | after ||---|---|---|| `.hl` files in the root | 10 | **1** (project.hl) || project.hl lines | 338 | **132** (index comment, PWA config, routes, mailer, audience, server, one hook) || `let` total | 453 | 164 || `let` never reassigned | **290** | **0** |The 164 `let`s left are all needed:- 99 are reassigned;- 49 are in a loop body (Hybriel refuses a plain declaration there on the 2nd pass);- 14 have the name of a member of the file: `me` in the faces, which is also a component member;- 2 are declared twice in one function (see "Found").`tests/letcount.py` (from gitoria) now has the kinds `member` and `twice` too, so "never" means "should be plain".## LayoutThe full file map is in README "Files". Imports go one way only:- util ← identities-helpers ← identities ← accounts ← login-helpers ← login- util ← apps-helpers ← invites-helpers ← invites ← apps ← selector / notify ← api-helpers ← api ← project.hl**Topic files** (each holds its central logic and every write to its tables):- **`lib/login.hl`**: the code tables otp / sends / ipsends, the limits, `checkCode` and the pending sign-in.- It gained `signInWithCode`, the logic of the verifyCode face.- Helpers: `lib/login-helpers.hl` (`newOtp`, `otpHash`, `ipBucket`).- **`lib/accounts.hl`**: the accounts table, the sessions and sign out everywhere.- It gained `createAccount`, which before was inside `checkCode`.- `dropUserSessions` moved here from project.hl. project.hl hands it the server by reference.- **`lib/identities.hl`**: the identities table, the short ids and the identity CRUD.- It gained `addDefaultIdentity` (was in `checkCode`) and `identityRecord` / `accountOfIdentity` (were in notify.hl).- Helpers: `lib/identities-helpers.hl` (fields, avatar, label, the short id's alphabet).- **`lib/apps.hl`**: apps, connections, requests, grants, the login button and the exchange.- `appOfSecret` moved here from notify.hl.- The person's side of an invite moved here (`openInvite`, `grantInvite`), because it creates and uses login requests.- `grantRequest` is the dispatch that was in the chooseIdentity face.- Helpers: `lib/apps-helpers.hl` (app form, origins, return URL, keys).- **`lib/invites.hl`** now owns its table. `invitesTable` was declared in apps.hl, and apps.hl deleted invites directly.- Now `deleteApp` calls `dropInvitesOf`, and `acceptInvite` writes the acceptance.- Helpers: `lib/invites-helpers.hl`.- **`lib/selector.hl`**: the pick ids, the list and `codeOfPick` (was a loop inside the endpoint).- **`lib/notify.hl`**: kinds, effective settings, sending, the inbox and the per-app page.- Helpers: `lib/notify-helpers.hl` (checks, stamp, the two hand sorts, on/off).**Shared and routes:**- **`lib/util.hl`**: `dir`, `envNumber`, `countOf` / `first` / `merged`, `str`, `isId` / `isList` / `isObject`, `oldestFirst`, `hasControl`, `urlChars`, `normEmail` / `validEmail`, `checkTimeZone`.- Before, `isList`, `isObject` and `str` existed twice (apps / notify / store).- **`lib/api.hl`**: every function route from project.hl, as thin wrappers.- Also the selector's two CORS endpoints (were in selector.hl).- Also `codePage(route, req, &srv, Home)`.- **`lib/api-helpers.hl`**: the old api.hl, plus `inviteCaller`, `field`, `baseOf`, `hexId` and the selector's CORS answers and caller check.**Moved, unchanged:**- `mail.hl` → `lib/mail.hl`- `jsoncheck.hl` → `lib/jsoncheck.hl`- `styles.hl` → `components/styles.hl`- `tools/` import from `lib/`**Faces made thin:**- verifyCode → `signInWithCode`- chooseIdentity → `grantRequest`The one-line `signOut` session write stays in its face. A face's `session` is the framework's own (as gitoria did it).## Tests| test | result ||---|---|| gate `tests/browser.mjs` (8750, 8751, Chrome 8752–8759) | **152 passed, 0 failed** before and after each step || apps / selector / migration / iplimit / notify | **107 / 99 / 33 / 39 / 130, 0 failed** before and after each step || hardening / signoutall / shortid / invites | **17 / 6 / 19 / 44, 0 failed** before and after each step || live-data reads + writes, old vs new | **291 / 291 the same** |How the other nine gates run: `.scratch/m009/runall.mjs` runs them as temporary port-remapped copies (8750–8757), one by one. Outputs are in `.scratch/m009/gate-<name>-<before|step1|step2|step3>.txt`. The commands are in README "Test" → "Same output".**Live-data comparison** (new `tests/realdata-baseline.mjs` + `tests/realdata-compare.py`):- **Data:** a copy of Byrodin's `storage/mpackdb`, taken 2026-10-03. Each run gets a fresh copy.- **Code:** each tree runs from a code-only copy without `.env`. Mail goes to a sink file.- **Reads (187):**- every page, signed in as az5b2 (session file for account 0mufd5afy0xm) and signed out: `/`, `/start`, `/apps`, `/inbox`, the 8 live connection pages, `/code`, `/signin/…`;- the browser modules, the worker and the manifest;- every live app's `/login` variants and selector calls (in / out / foreign origin / preflight);- the refused API calls.- **Writes (104):**- identities and the time zone;- a new app with its secret and new secret;- the login button and the exchange, the selector choose and exchange;- kinds and notifications (also urgent, unregistered and refused ones);- inbox mark, switches and override;- invites (create, mail, list, open, accept, get, revoke) and migrate-ids;- the OTP login of a new address and of the creator's: wrong code, right code, the code page before and after;- the app login on `/signin/<rid>/code` and "Other address";- the address and IP limits;- sign out everywhere, disconnect, app delete;- finally the whole stored state (`tools/dump-store.hl` on a copy).- **Masks:** only what changes per run (times, random ids, codes, keys, short ids of new identities, source positions, module hashes). Two runs of the OLD tree compare clean (291/291).- **After step 2:**- 4 browser modules differ, but only in source positions and the import tables (the comparator checks the code and the imported functions);- the worker's `hl-shell-<hash>` cache name differs (it follows the code hash).- **After step 3:**- also `var` → `const` in the client code of main.hl;- 0 real differences.## Found (in STATUS "Lessons")1. **A plain declaration may not repeat a name inside one function.** In `lib/notify.hl sendNotification`, both `if` blocks declare `c` (`checkUrl` of the icon, then of the link). As plain declarations, the second one aborts with "Cannot reassign immutable variable 'c'". It showed up as notify gate 45/3 and a 500 on the real-data `w-notify`. Both stay `let`. `.scratch/m009/twice.py` searched every file: this was the only case.2. **A `let` with a member's name must stay.** Without `let`, `me = accountOfSession(session)` in a face would assign the component's member. gitoria's `unlet.py` already refuses these (CLASH, 14 cases).3. Moving statics between lib files did not change the browser modules at all; only the component's own line shifts move source positions.## Open- **Not deployed** (that is the architect's job). Use the normal `./deploy.sh`. There is no data change.- deploy.sh's rsync does not delete, so the 9 old root files stay on Byrodin: api.hl, apps.hl, invites.hl, jsoncheck.hl, mail.hl, notify.hl, selector.hl, store.hl, styles.hl. They are unused; delete them by hand after the deploy.- **Long files left as they are:**- `components/home.hl` (587 lines; it is UI);- `lib/notify.hl` (384);- `lib/apps.hl` (276).- **Not touched:** `testapp/` (a test app with its own project.hl). It is outside the scan, like in tickets and gitoria.- **Scratch** (gitignored) in `.scratch/m009/`. The folder also holds the 2026-09-24 UUID-migration files (old mission 009: deploy-*, rehearsal-*, cmp009.py …); they were not touched. Mine:- `old/` (the old tree, code only);- `gates.sh`, `runall.mjs`, `step.sh`;- `unlet.py`, `twice.py`, `letcount.py`;- the gate outputs.- **Deleted after the run:** the live-data copy, the dump and every baseline output (they hold live data).
Branches
- mainmain branch
Latest commits
- 5fdbb6b2ident mission 009: report — scratch folder notemre
- 74235815ident mission 009 (4/4): docs (README files map + same-output test, STATUS, LOG), report, tests/letcount.py + realdata-baseline/comparemre
- 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