gitoriaLog in with ident

gitoria

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit8660544686605446mission 002 (code order) 4/4: README file map + import order + 'Same output' test + gate run with a tickets HEAD copy, STATUS (entry, lessons), LOG, report; tests/realdata-baseline.mjs + realdata-compare.py (a cleanup answers the same on live data: pages, modules, API, git over HTTPS and SSH, faces), tests/letcount.pymre86605446/reports/002-code-order.md

7.5 KB

  1. # Report 002 (w082): gitoria code order, no behaviour change
  2. **Where:** commits on main in loreana:/media/STORAGE/projects/gitoria.worldapi.org:
  3. - `110c279`: file moves (1/4)
  4. - `090a20c`: topics, map and thin wrappers (2/4)
  5. - `cc7bf7b`: `let` (3/4)
  6. - the docs + tests commit (4/4), which also holds this report and the mission brief
  7. Not pushed, not deployed. No `.env` read. Only ports 8750–8759 were used. Every server and sshd container was stopped by its PID or name; nothing of mine is still running.
  8. ## Counts (before → after; `python3 tests/letcount.py .`)
  9. | | before (fdfb4b1) | after |
  10. |---|---|---|
  11. | `.hl` files in the root | 14 | **1** (project.hl) |
  12. | project.hl lines | 251 | **126** (index comment, PWA config, routes, audience, server) |
  13. | `let` total | 530 | 213 |
  14. | `let` never reassigned | **296** | **0** |
  15. The 213 `let`s left are all needed:
  16. - 125 are reassigned;
  17. - 88 are re-bound in a loop body. Hybriel refuses a plain declaration there on its 2nd pass (tickets lesson).
  18. ## Layout
  19. The full file map is in README "Files". Imports only go one way: util / git-helpers / markdown ← users ← repos-helpers ← git ← repos ← tickets-helpers ← homepage / code / pulls / releases ← tickets ← tokens / sshkeys ← transport ← api-helpers ← api ← project.hl.
  20. - **`lib/git.hl`** was 732 lines covering five topics. It is now split:
  21. - `git.hl`: the git calls, branches, `initRepo`, `isEmptyNow`, `tmpDir` (moved here from transport.hl);
  22. - `homepage.hl`, `code.hl`, `pulls.hl`, `releases.hl`: one per topic;
  23. - `git-helpers.hl`: path, name and id checks, tab fields, sizes, and the `|||PR` / `|||RL` subject parsers.
  24. - **`lib/repos.hl`**: the table and every write to it.
  25. - `mayPush` is new here. It is the single "only the owner pushes" rule; before, transport.hl and sshgate.hl each had their own copy.
  26. - `repos-helpers.hl`: slug rules, the row a page shows, `withChange`, `pageTitle`, the Markdown view.
  27. - **`lib/users.hl`**: users and ident.
  28. - `userOfLoginCode` is the one exchange + `ensureUser` step. Before, the login route and the selector face each had their own copy.
  29. - `tagOf` moved here out of project.hl.
  30. - **`lib/tickets.hl`** gained `finishConnect`, the logic of `/settings/connected` (taken out of project.hl).
  31. - `tickets-helpers.hl`: the tickets URL, the answer shapes, `#12` references.
  32. - **`lib/transport.hl`** holds `gitTransport` and `callGit`.
  33. - `transport-helpers.hl`: the Basic password, plain answers, `Git-Protocol`, pkt-line.
  34. - **`lib/sshkeys.hl`** gained `keyLine`, the authorized_keys line (taken out of sshgate.hl).
  35. - **`lib/api.hl`**: every function route, as thin wrappers:
  36. - `/api/repos…`;
  37. - `/login/callback`;
  38. - `/settings/connect…`;
  39. - `/__git/keys` and `/__git/access` (this was sshgate.hl).
  40. - **`lib/api-helpers.hl`**: JSON / Markdown / text answers, `goTo`, `sshGuard`, `repoOfRequest`, `safeNext`.
  41. - **`lib/util.hl`**:
  42. - was localtime.hl;
  43. - also holds env, `storageDir`, the addresses (`publicUrl`, `slugOfHost`, `domainFor`), lists, text checks;
  44. - `newestFirst` replaces three copies of the same insertion sort.
  45. - **Faces made thin:**
  46. - "Make main" → `code.hl makeMain`;
  47. - the Merge answer → `pulls.hl pullsView`;
  48. - the selector login → `userOfLoginCode`.
  49. - The session writes stay in the faces, because a face's `session` parameter is the framework's own.
  50. - **Removed:**
  51. - `jsoncheck.hl` was imported nowhere;
  52. - `git.hl parseView` was called nowhere.
  53. - **Moved:** `styles.hl` → `components/styles.hl`. `tools/migrate-short-ids.hl` now imports from `lib/`.
  54. ## Tests
  55. | test | result |
  56. |---|---|
  57. | gate `tests/browser.mjs` (8750–8759) | **200 passed, 0 failed** before and after each step |
  58. | `tests/push.mjs` | **46/0** before and after each step |
  59. | `tests/ssh.mjs` | **44/0** before and after each step |
  60. | live-data reads + writes | identical, except **1 intended difference** (below) |
  61. The gate commands are in README "Test". The browser gate runs with `GITORIA_GATE_TICKETS_DIR` set to a `git archive HEAD` copy of tickets. The reason: the tickets working tree is currently being changed by another worker, and with it the gate crashed at the start ("tickets name failed").
  62. **Live-data comparison** (new `tests/realdata-baseline.mjs` and `tests/realdata-compare.py`; how to run: README "Test" → "Same output"):
  63. - **Data:** a copy of Byrodin's `storage/mpackdb` + `storage/git`, taken 2026-10-03. Each run gets a fresh copy.
  64. - **Reads** (678), signed in as az5b2 through a session file:
  65. - every page of all 13 repos, signed in and out: `/` including the 3 MB tracker README, code, files, folders, branches, commits, pulls, releases, tickets, settings;
  66. - unknown addresses;
  67. - the 20 browser modules;
  68. - `/api/repos…` as JSON and as Markdown;
  69. - every refs advertisement, v0 and v2;
  70. - the refusals;
  71. - the login, connect and `/__git` routes.
  72. - **Writes** (80):
  73. - faces: create, token, ssh key, Make main, Merge, open ticket, disconnect, remove, login, logout;
  74. - over HTTPS: clone, then push with a token (also refused without one or with a bad one);
  75. - over SSH, through the real sshd container: clone tracker, push a branch to email, refused after the key is removed;
  76. - the pages that follow each write.
  77. - **Tickets:** the connected repo's tickets are a snapshot, served on port 8759, so nothing reaches live tickets. The live tickets API changed its links during this run, which is why a snapshot is needed.
  78. - **Masks:** two runs of the OLD code compare clean (758/758).
  79. - **Browser modules:** they differ only in the tables of imported statics and in source positions. The script checks the component code and the kind of every imported name it uses. Step 3 also changes `var` → `const`.
  80. **The 1 difference (intended, a fix that came with the cleanup):**
  81. - **What changed:** a failed `/login/callback` in a browser that already has a session now shows its reason on `/login/failed`. For example: "login is not set up …".
  82. - **Before:** it always showed "the login did not finish — try again".
  83. - **Cause:** the old `failed(req, why)` was a second call. It got a COPY of `req` and so a copy of the session, and its write was lost.
  84. - **Fix:** project.hl now hands `&req` and `&server.sessions` to the session-writing routes, the same fix as in tickets mission 010.
  85. - **To undo it:** pass `req` by value to `loginFailed` in lib/api.hl.
  86. **Other checks:**
  87. - `tools/migrate-short-ids.hl` loads and refuses exactly as before (no storage, no key, ident down).
  88. - `tests/short-id-switch.mjs` was **not run**: it is historical and uses fixed ports 8724/8725, which are outside my range.
  89. ## Found (in STATUS "Lessons")
  90. 1. **A session-writing route needs `&req` and `&server.sessions`.** gitoria lost the login-failure reason through a by-value `req`.
  91. 2. **The browser module carries the statics of every file a component imports.** Moving a static changes the module's tables and the `?v=` hashes, but not the page. Compare the component code instead.
  92. 3. **The tickets working tree can be mid-change.** Gate against a `git archive HEAD` copy.
  93. 4. **A crashed gate leaves its servers running.** Check `ss -ltnp | grep :875` and kill by PID.
  94. ## Not done / open
  95. - **Not deployed** (that is the architect's job). Use the normal `deploy.sh`. There is no data change.
  96. - deploy.sh's rsync does not delete, so the old root `.hl` files stay on Byrodin. They are unused and can be removed by hand.
  97. - **Scratch** (gitignored) in `.scratch/w082/`:
  98. - `old/` (the old tree, code only);
  99. - `tickets-head/` (code only);
  100. - `gates.sh` (the three gates on 8750–8759);
  101. - `unlet.py`.
  102. - **Deleted after the run:** the live-data copy and every baseline output (they hold live data).

Branches

Latest commits

  • 86605446mission 002 (code order) 4/4: README file map + import order + 'Same output' test + gate run with a tickets HEAD copy, STATUS (entry, lessons), LOG, report; tests/realdata-baseline.mjs + realdata-compare.py (a cleanup answers the same on live data: pages, modules, API, git over HTTPS and SSH, faces), tests/letcount.pymre
  • cc7bf7bamission 002 (code order) 3/4: let only where a variable is reassigned or re-bound in a loop body (289 lets → plain declarations; 213 left: 125 reassigned, 88 loop-bound; no member/import/param clash). gates 200/0, 46/0, 44/0; real-data reads + writes identical (browser modules: var → const only)mre
  • 090a20c6mission 002 (code order) 2/4: one lib/ file per topic — git.hl split into git (calls, branches, init, temp folder) / homepage / code / pulls / releases (+ git-helpers: paths, ids, |||PR/|||RL markers); repos-helpers, tickets-helpers, transport-helpers; util.hl = localtime + env, storage dir, addresses, lists, text checks, one newest-first sort (was 3 copies); the function routes out of project.hl into lib/api.hl (thin; plumbing in api-helpers.hl), sshgate.hl folded into api.hl + sshkeys.hl keyLine + repos.hl mayPush; 'Make main' and the merge answer out of the faces (code.hl makeMain, pulls.hl pullsView), one login helper (users.hl userOfLoginCode); project.hl is the map. Session-writing routes get &req + &server.sessions. gates 200/0, 46/0, 44/0; real-data identical except /login/failed now shows the parked reason for a browser that already had a session (the old copy-of-req lost it)mre
  • 110c2799mission 002 (code order) 1/4: .hl files out of the root — lib/ (api, git, localtime, markdown, repos, sshgate, sshkeys, tickets, tokens, transport, users), components/styles.hl; jsoncheck.hl removed (imported nowhere); import paths only. gates 200/0, 46/0, 44/0; real-data reads + writes identicalmre
  • fdfb4b1bgitoria: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); gates 200/0, 46/0, 44/0mre
  • 5b46ac84antcolony#40: LOG.md — missions 069/072 are antcolony missions (report paths on Byrodin)mre
  • 5602ff41gitoria: Hybriel master 190aa11d (fc838894 GC correctness, #127 mountKids by reference, #126, #48) — tracker README flat; gates 200/0, 46/0, 44/0mre
  • e85eaf01gitoria: 069 round 2 — hybriel 1a096ad3 not adopted (Markdown SSR still grows); browser gate waits for the server-side logout before restartmre
  • 09ce4f3fgitoria: mission 069 re-vendor hybriel 8efba065 stopped (big SSR pages grow + slow down); lambda audit clean; old vendor keptmre
  • 3dc43108antcolony#40: mission references point to the moved missionsmre
  • 8d9450fdantcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 205d5fe4gitoria: Hybriel master ff51cf46; ssh keys/tokens no double rows (session sync); gates follow #20mre
  • 9b27cb26gitoria#21: installable app (manifest, service worker, offline start page), own iconmre
  • 68dcb603deploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • e2deed6dgitoria#20: "Add code" only on the Code page of an empty repository, no collapsiblemre
  • 8bb97ffddeploy.sh: never send .git or .gitignore to Byrodinmre
  • fd981932State of 2026-09-27; bin/ no longer tracked (Hybriel commit is in README)mre
  • 4a2d7125initial commitmre