gitoriaLog in with ident

calendar

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit7bd0337c7bd0337ccalendar: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gates 78/0 + 18/0mre7bd0337c/STATUS.md

15.9 KB

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

  • 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