gitoriaLog in with ident

calendar

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit3b2a4cd03b2a4cd0calendar mission 001 (3/4): code order — let only where reassigned (147 dropped incl. components/month-view; 110 left: 67 reassigned, 43 loop-bound); gates 78/0 (3 of 4 runs; 1 known 'next month' flake) + 18/0, live-data run = step 2mre3b2a4cd0/STATUS.md

16.6 KB

  1. # STATUS
  2. ## 2026-10-03 — antcolony mission 074: re-vendored Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4) — gates green, NOT deployed by me
  3. bin sha256 `21059cc7…d77bdb`, same plugins (old copy `.scratch/pre-074/` = 190aa11d). No app change. Gates (8760–8769): browser
  4. **78/0**, short-id-switch **18/0**. Real-data copy (deleted), 0muh8y8myb5z signed in, Chrome: 200 loads + 200 pagings new 194 → 211 →
  5. 212 MB, 55 ms (old 194 → 214 → 215 MB, 85 ms); 1000 + 1000 new 211/212/213/214 (loads, every 250) then 216/217/218/218 MB
  6. (pagings) — flat; old 215 → 227 then 229 → 231 MB. Server logs clean.
  7. ## 2026-10-02 — antcolony mission 072: re-vendored Hybriel master 190aa11d (GC correctness fc838894, #127) — gates green, NOT deployed by me
  8. bin sha256 `860f5e61…0a23626`, same 11 plugins (old copy `.scratch/pre-072/` = 8efba065). No app change. Gates: browser **78/0**,
  9. short-id-switch **18/0** (`.scratch/w072/`). Live-data copy, signed in: 200 loads + 200 month pagings new 194 → 214 → 215 MB,
  10. avg 48 ms (old 283 → 368 → 376 MB, 59 ms); 1000 + 1000: 229 → 233 MB — flat now (069's 8efba065 reached 528 MB).
  11. ## 2026-10-02 — antcolony mission 069: re-vendored Hybriel master 8efba065 (#126 memory, #48 lambda copy) — gates green, NOT deployed
  12. `bin/hybriel` + `plugins/` (same 11 plugins) = hybriel master 8efba065 (sha256 `56b108f3…f4f201ea`), built read-only in
  13. `~/scratch-069-calendar` (removed). Old copy (ff51cf46) + project/components/tests/README/STATUS in `.scratch/pre-069/`. No app code change.
  14. - #48 audit (64 lambdas, `.scratch/w069/lambdas.py`, `lambdas2.py`): nothing needs `&`. `project.hl:43` failed / `:55` loginCallback change
  15. `req.session` as `s` and save it themselves; `reminders.hl` toReminders/toRows/withIndex/plan and `events.hl` build/createEvent/changeEvent
  16. only read their params and build new values. `.scratch/w069/probe48.hl`: new binary `copy: n=1 len=0`, old `n=2 len=1` (#48 is active).
  17. - Gates (ports 8720–8731): `CALENDAR_GATE_PORT=8720 CALENDAR_GATE_IDENT_PORT=8721 CALENDAR_GATE_CHROME=8722-8729 node tests/browser.mjs`
  18. → **78 passed, 0 failed**; `CALENDAR_SWITCH_IDENT_PORT=8730 CALENDAR_SWITCH_PORT=8731 node tests/short-id-switch.mjs` → **18 passed, 0 failed**.
  19. - Memory (#126), live storage copy (1 user, 5 events, deleted), signed in by a session file, 200 loads of `/` + 200 month pagings (calLoad):
  20. old ff51cf46 boot 447 → 1597 after loads → 1620 MB after paging; new 8efba065 boot 283 → 370 → 384 MB. Long run (new, 1000 + 1000):
  21. 488 / 528 MB — growth slows (~0.15 MB/load, ~0.04 MB/paging) but no flat plateau; watch live RSS after a deploy.
  22. ## 2026-10-01 — antcolony mission 048: re-vendored Hybriel master ff51cf46 — gates green, NOT deployed
  23. `bin/hybriel` + `plugins/` (same 11 plugins) = hybriel master ff51cf46 (#113, #115/#116, #118, client SVG namespace, hl:markdown),
  24. built read-only in `.scratch/m048-build/`; old copy (e6720b1f) + old `components/calendar.hl` in `.scratch/pre-048/`.
  25. - Workaround removed: `components/calendar.hl` `validWindow`, `soonOf` no longer `static` (#115/#116); 2 new gate checks (bad window
  26. refused 'not a date', calLoad answers `soon`). Kept: module-level `static` helpers in dates/names/reminders/clock/events/users.hl
  27. (plain modules, not workarounds). No #118 detours, no SVG in the app.
  28. - `tests/short-id-switch.mjs`: ports overridable (`CALENDAR_SWITCH_IDENT_PORT`, `CALENDAR_SWITCH_PORT`).
  29. - Gates (ports 8732–8739): `CALENDAR_GATE_PORT=8732 CALENDAR_GATE_IDENT_PORT=8733 CALENDAR_GATE_CHROME=8734-8739 node tests/browser.mjs`
  30. → **78 passed, 0 failed** (76 before the 2 new checks, also green on the new binary with `static`);
  31. `CALENDAR_SWITCH_IDENT_PORT=8732 CALENDAR_SWITCH_PORT=8733 node tests/short-id-switch.mjs` → **18 passed, 0 failed**.
  32. - Live data duplicate-@id check (#113, copy of Byrodin storage/ 2026-10-01, deleted afterwards): events 5 live rows / 0 duplicate ids,
  33. users 1 / 0, settings 0 / 0.
  34. ## 2026-09-26 — ticket #8: the offline check was wrong, not the app (gate edited, not yet 3 clean runs in a row)
  35. `tests/browser.mjs`: "offline: … its reminder is planned" expected `>= 5`, but the counter only holds reminders still to come; the ones
  36. that already fired are gone, so 4 is right (Bus to the lake 1 + Own reminders 2 + the new one). Now `>= 4`; the notification-on-time wait is
  37. 240 s (was 150 s). Runs on ports 8710-8719: 75/0, 75/0, then one run each with a CDP timeout, a missed notification, a 10 s "next month"
  38. wait — all on a loaded machine (other workers), each in a DIFFERENT place; the offline check passed in every run that reached it. Still open:
  39. three clean runs in a row (run when the machine is quiet; `.scratch/run3.sh`).
  40. ## 2026-09-26 — antcolony mission 039: ident#23 short ids — switch tool + gate, NOT deployed
  41. `users.hl`: the exchange answer is checked with the new `isIdentId` (lower-case letters/digits, 1–64) instead of
  42. `isHex(…, 64)`, which refused ident#23's short ids (`a68sz`) — without it nobody could log in after the switch (shown on
  43. tickets, whose code antcolony mission 039 could not change). New `tools/migrate-short-ids.hl` (users.identity old → short id via
  44. ident `POST /api/migrate-ids`, idempotent, never `finish`, prints `users seen / mapped / already short / unmapped /
  45. conflicts / failed`, key/secret from env only; non-zero exit on refusal/failed write/conflict). New gate
  46. `node tests/short-id-switch.mjs` (ports 8722/8723; old ident `ident.worldapi.org/.scratch/pre-023-ident` → data → copies →
  47. new ident → control copy = NEW empty user → tool twice → same user + same data, old session too): **18 passed, 0 failed**.
  48. `tests/browser.mjs` (ports 8730-8739): 74 passed, 1 failed — "offline: the event shows on its day … 4 reminders"; the SAME
  49. failure with the pre-039 code + the old ident (`.scratch/m039-gate-orig.out`), so not from this change (known flaky part, below).
  50. Runbook (architect, one go for all four apps): Loreana `antcolony-docs/docs/short-id-switch.md`. Deploy this code BEFORE
  51. ident#23 (accepts old ids too). Not deployed.
  52. ## 2026-09-26 — antcolony mission 037: re-vendored Hybriel master e6720b1f, LOCAL PATCH and timer workaround dropped
  53. `bin/hybriel` + `plugins/` = hybriel master e6720b1f (includes #103/#104, #105 f15a2f7f, #106 04b0fa3d, #94 c12065d8); old copy
  54. (13ef4f9b + the Accept-Language LOCAL PATCH) in `.scratch/pre-037/` (bin, plugins, src = calendar.hl, month-view.hl, tests).
  55. `plugins/` is byte-identical to master (`diff -rq`), no `LOCAL PATCH`/`pageLang` in it.
  56. - calendar#6: `components/calendar.hl` has `headers = null` → `requestLanguage` → `MonthView { acceptLanguage = requestLanguage }`.
  57. - calendar#4: the "function per timer" (`schedule(p, ms)`) is gone; `arm()` builds the closure inline (`let p` per pass, #106).
  58. - Gate `node tests/browser.mjs`: 70/0 before (old copy), **76 passed, 0 failed** after (6 new language checks: de / en first page
  59. with the browser itself in the other language, server HTML, names kept after next/next/prev). Negative control: the new code on
  60. the OLD binary (scratch copy) → the notifications check FAILS (only the last reminder fired) → the gate guards #106.
  61. - Dev server (`~/scratch-037/hashcheck.sh calendar.worldapi.org CALENDAR /`, port 8720): `hl-runtime.js`, `web/client.js`,
  62. `app.css` all `?v=414caca04855c4be` (immutable), bare app.css no-cache; `/__hl/manifest.webmanifest` stays unhashed (framework).
  63. Curl: `Accept-Language: de` → `Mo Di …`, `en` → `Mon Tue …`, `fr` → `septembre 2026`, none → `09 2026` + dots. Not deployed.
  64. ## 2026-09-26 — ticket #7: editing an event saved offline no longer makes a second copy
  65. The page gives a new offline event its temporary id (`local-…`) BEFORE queuing the save; the server keeps it as `ref` on the event
  66. (`events.hl`: `saveEvent`, `realId`) and a later edit/delete with that id reaches the same event. Server logic tested (create, edit, delete
  67. with a `local-` id → one event, edited title). Browser offline gate not re-run. Not deployed (architect).
  68. ## 2026-09-26 — ticket #4: reminders and notifications, also offline — built, gate green (see the report for numbers)
  69. Calendar settings (default reminders, 1 hour before + the day before at 20:00), own reminders per event, WorldAPI `$reminders`; the page sets
  70. a timer per reminder of the next 7 days and shows the notification through the service worker; offline the timers and the stored
  71. `soon` keep working, and an event saved offline is queued (hl:web emit queue) and set at once. Not built: waking a CLOSED app (needs a
  72. server push, ident#8); the notification is English only; an event saved offline keeps a temporary id until the page reloads (editing it again
  73. before that would save a second copy). Real Android/desktop notification not tested (headless Chrome only). Not deployed (architect).
  74. ## 2026-09-26 — ticket #3: installable app (PWA) — DONE, with Hybriel's own support
  75. Took over the half-done work (manifest, icons, theme colour). Now `project.hl` declares `appIcons`, `appThemeColor`,
  76. `appBackgroundColor` and `offline = [ Calendar ]`; hl:web writes the manifest link into every head and serves the manifest and
  77. the service worker itself (`/__hl/manifest.webmanifest`, `/__hl/sw.js`). The own manifest file/route is gone (kept as
  78. `.scratch/manifest.webmanifest.old`); the icons stay in `icons/`. No JavaScript of ours, no framework patch.
  79. Gate: 48 passed, 0 failed (head links the manifest, Chrome `Page.getInstallabilityErrors` empty, service worker scope `/`).
  80. Not tested: a real install on Android/desktop (needs https on the live site), Firefox. Not deployed (architect).
  81. ## 2026-09-25 — ticket #6, second session: names in the visitor's language on the FIRST page
  82. The server now reads the request's Accept-Language: `plugins/web/WebFramework.hl` has a LOCAL PATCH (`pageLang`; a component member
  83. `acceptLanguage = null` is constructed with it — a Hybriel gap, reported; KEEP IT when re-vendoring). `components/month-view/names.hl`
  84. holds month/weekday names for en, de, fr, es, it, nl, pt (same as Intl); the first render writes them and the browser keeps them
  85. (paging never switches). Another language → neutral names until the first pointer/key, then the browser's Intl (as before).
  86. Gate 45 passed, 0 failed with Chrome `--lang=de` and `--lang=en-US` (new check: names present before any mouse move).
  87. ## 2026-09-25 — ticket #6: names no longer switch language
  88. The server can't know the browser's language (page components get no request headers), so it no longer guesses English: the first render shows
  89. language-neutral names (month number, dots, ‹ ›), and the browser fills in its own language on the first pointer / focus / touch and keeps it
  90. while paging. Gate: 44 passed, 0 failed (the gate now moves the mouse first, like a user). Not deployed (architect).
  91. ## 2026-09-25 — ticket #5, second session: re-checked on the current folder (after the Hybriel update)
  92. No code change needed: `node tests/browser.mjs` → 44 passed, 0 failed in 7 of 7 runs (signed-out login button shows, no classList crash). Only hand-written JS: `login.js`.
  93. ## 2026-09-25 — ticket #5: pure-Hybriel month view, no month-view.js
  94. `components/month-view/month-view.hl` is now the components.hybriel.worldapi.org month view (browser today / language read by a
  95. Hybriel handler on the first pointer / focus / touch, `browserEnv()`), with the calendar's events and editor carried over; the time
  96. zone name comes from `Intl` there too. `month-view.js`, its route, its script tag and the hidden `#month-view-env` input are gone:
  97. the only hand-written JS left is `login.js` (ident bridge). The month rules moved from `styles.hl` into the component's own `Style`
  98. (token `var()`s with fallbacks, as in the components repo; `styles.hl` sets `--color-accent`). The form dates start empty (were `= today`)
  99. so nothing re-derives them mid-edit; no re-sent env any more. Gate: 44 passed, 0 failed in 18 of 19 runs; one run failed early
  100. (after 7 passed), not reproduced in 18 more. Not deployed (architect).
  101. ## 2026-09-25 — antcolony mission 035: re-vendored Hybriel master 13ef4f9b
  102. `bin/hybriel` + `plugins/` from hybriel master 13ef4f9b (old copy `.scratch/pre-035/`). No local patch existed.
  103. Dev server: `/__hl/app.css?v=<hash>`, `hl-runtime.js?v=`, `web/client.js?v=` (immutable); bare `/__hl/app.css` → no-cache.
  104. Gate (`CALENDAR_GATE_PORT=8720 CALENDAR_GATE_IDENT_PORT=8721 CALENDAR_GATE_CHROME=8722-8729 node tests/browser.mjs`):
  105. 44 passed, 0 failed in 3 of 7 runs (9d608332 + 13ef4f9b), else 26 passed, 1 failed ("three all-day days"); the OLD binary
  106. (scratch copy with `.scratch/pre-035/`) fails the same way: 2 of 5 runs green, else 18 passed, 1 failed ("event shows on its day"). **Flaky events part,
  107. NOT the re-vendor — cause found, not fixed (no feature work in 035):** `month-view.js` re-sends `#month-view-env` whenever hl:web
  108. re-creates that input (seen after a save); `monthEnv` assigns `today`, and `fStartDate`/`fEndDate` are declared `= today`, so
  109. they re-derive to today in the middle of an open editor (seen: day 20 clicked → form shows today; the end date typed is
  110. overwritten). Fix idea: keep the form dates in monthEnv (save/restore) or don't initialise them from `today`; better, drop
  111. month-view.js (no-JS rule). The PWA of ticket #3 can now use hl:web's project.hl settings (hybriel #95–#97) — not done.
  112. Not deployed (architect).
  113. ## 2026-09-25 — ticket #3: installable app (PWA) — HALF DONE, waits for Hybriel
  114. Done in Hybriel/JSON only: web manifest (`/manifest.webmanifest`: standalone, start `/`, dark background, 192/512 icons any +
  115. maskable), icons (`icons/`), theme colour (`meta` in project.hl). The first attempt's `sw.js` and `pwa.js` were hand-written
  116. JavaScript and are removed (kept in `.scratch/removed-js/` for reference only).
  117. Missing, both Hybriel gaps: (1) hl:web writes no `<link rel="manifest">` into the head (a `link` in the body View is not
  118. used by Chrome: `Page.getInstallabilityErrors` → `no-manifest`); (2) Hybriel has no way to write a service worker file
  119. (needs its own script file at `/sw.js`, plus offline caching). Without them Chrome does not offer "Install".
  120. Gate: `node tests/browser.mjs` → 44 passed, 0 failed (manifest fields, icons real PNGs, theme colour). The events part was
  121. flaky once in a while (one failed run in three, not reproduced on re-run).
  122. ## 2026-09-25 — ticket #2: login with ident, private events
  123. Built: ident login (button + identity selector, as in notes), the events table (WorldAPI Event records), click a day → editor
  124. (title, at a time / all day, from–to, place, notes), click an event → edit / delete, events on every day they cover, paging
  125. loads the visible six weeks. Every server face refuses without a login and reaches only the owner's events.
  126. Gate: `node tests/browser.mjs` → 41 passed, 0 failed (own ident copy; signed out: no editor, faces refuse; login by the
  127. callback with a real one-time code; add / reload / edit / move / all-day of three days / end-before-start refused / paging /
  128. log out / second identity sees nothing and cannot change or delete / delete / phone width no overflow / no console errors).
  129. A store reopened in a fresh process still holds the events; the record on disk carries the `$` keys.
  130. Not deployed (architect). Not tested: ident's own button page in the browser (the gate takes the code from ident's selector
  131. API and hits the callback, the same URL the button returns to), a real Byrodin container, Firefox, the real ident key.
  132. Workarounds (Hybriel): a nested `for` does not repaint when the outer list is reassigned (#86, fixed on a branch only) →
  133. a day has four fixed chips; a form field bound to `f.title` (member object) did not follow a copy into `f` → scalar
  134. members `fTitle` … as in ident; a member arrow function is not callable from a face → `static`; a face that crashes
  135. never answers the page (the call just hangs).
  136. ## 2026-09-25 — ticket #1: month view
  137. Built the app (Hybriel/hl:web, Dockerfile, docker-compose on port 45005, deploy.sh, browser gate) and put the vendored month
  138. view on `/`. Gate: `node tests/browser.mjs` → 10 passed, 0 failed (server render of 42 days with one today; title in the
  139. browser language; today marked by the browser's date; next / prev; Feb 2028 = 29 days starting Tuesday; Dec 2027 starts
  140. Wednesday; no console errors; no overflow at 390 px). `./deploy.sh --dry-run --target <local dir>` passes the gate.
  141. Not deployed (architect). Not tested: a real Byrodin container, Firefox. No data, no login yet (tickets #2–#4).
  142. The old vendored `plugins/webex` was removed (hl:web is used).
  143. ## Browser gate (ticket #8)
  144. Offline count check is "at least 4" pending reminders; check waits widened (waitFor 30 s, CDP call 60 s) for loaded machines. 3 clean runs in a row: 76 passed, 0 failed. Run with CALENDAR_GATE_PORT/IDENT_PORT/CHROME env inside the worker port range (see .scratch/run3.sh).

Branches

Latest commits

  • 3b2a4cd0calendar mission 001 (3/4): code order — let only where reassigned (147 dropped incl. components/month-view; 110 left: 67 reassigned, 43 loop-bound); gates 78/0 (3 of 4 runs; 1 known 'next month' flake) + 18/0, live-data run = step 2mre
  • f5ce6b1dcalendar mission 001 (2/4): code order — topics, map, thin faces: lib/util.hl, lib/events(-helpers).hl (+calendarView/settingsView/soonOf), lib/settings.hl, lib/users.hl (+userOfLoginCode, tagOf), lib/api(-helpers).hl; project.hl = map; login route takes &req/&sessions (failed-login reason now kept); gates 78/0 + 18/0mre
  • c6fbd011calendar mission 001 (1/4): code order — files moved: lib/events.hl, lib/users.hl, components/styles.hl (imports only); gates 78/0 + 18/0, live-data run identicalmre
  • d6c59290calendar: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); gates 78/0 + 18/0mre
  • 7bd0337ccalendar: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gates 78/0 + 18/0mre
  • ff41310ccalendar: Hybriel master 8efba065 (#126 memory, #48 lambda copy; audit: no & needed)mre
  • 14ba08c7antcolony#40: mission references point to the moved missionsmre
  • 99c73346antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 76edaa62calendar: Hybriel master ff51cf46 (re-vendor round, static workaround removed)mre
  • 90a3fc2cdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • 6722b72ddeploy.sh: never send .git or .gitignore to Byrodinmre
  • be099807State of 2026-09-27, before the move to gitoriamre