Block reminders show the block text, not its ID #1568

Closed
opened 2026-10-11 00:23:16 +00:00 by kayg · 13 comments
Owner

Block reminder Notifications show the raw block anchor (for example "2026-10-10 Daily Note · ^t00065d836c…"). Users must never see raw IDs.

Where: crates/plugins/notifications/src/block_reminders.rs. Around line 431 the body is format!("{} · ^{block_id}", safe_text(&title, 900)), and the cancellation body around line 313 also embeds ^{block_id}. The block_reminders query selects only the Note title.

Wanted: the body is " · " (block text as plain text: no Markdown markers and no task checkbox syntax, cut to a sane length with an ellipsis), with no ID. The deep link still uses the block ID. If the block text is not available (block deleted or empty), show only the Note title. The web client already strips · ^id from old stored rows (job/ui-users), so existing rows look right.

Block reminder Notifications show the raw block anchor (for example "2026-10-10 Daily Note · ^t00065d836c…"). Users must never see raw IDs. Where: `crates/plugins/notifications/src/block_reminders.rs`. Around line 431 the body is `format!("{} · ^{block_id}", safe_text(&title, 900))`, and the cancellation body around line 313 also embeds `^{block_id}`. The `block_reminders` query selects only the Note title. Wanted: the body is "<block text> · <Note title>" (block text as plain text: no Markdown markers and no task checkbox syntax, cut to a sane length with an ellipsis), with no ID. The deep link still uses the block ID. If the block text is not available (block deleted or empty), show only the Note title. The web client already strips `· ^id` from old stored rows (job/ui-users), so existing rows look right.
Author
Owner

Started work on job/remtext-1568 from origin/dev at 0c712b98c1. I’m locating the existing Notes plain-text extraction helper and reminder block lookup before implementing the body change and owner-isolation regression coverage.

Started work on job/remtext-1568 from origin/dev at 0c712b98c164b6734d54f63485012bd1a11005b4. I’m locating the existing Notes plain-text extraction helper and reminder block lookup before implementing the body change and owner-isolation regression coverage.
Author
Owner

Finding: the existing Notes projection stores only ; repo-wide search found no reusable plain-text block helper in the Notes plugin. I’m extending this projection with bounded plain text at Note indexing time and using an owner-scoped indexed lookup at reminder delivery, so delivery does not parse a Note when the projection is present.

Finding: the existing Notes projection stores only ; repo-wide search found no reusable plain-text block helper in the Notes plugin. I’m extending this projection with bounded plain text at Note indexing time and using an owner-scoped indexed lookup at reminder delivery, so delivery does not parse a Note when the projection is present.
Author
Owner

Finding: the existing Notes note_blocks projection stores only (user_id, path, block_id). A repo-wide search found no reusable plain-text block helper in the Notes plugin. I’m extending this projection with bounded plain text at Note indexing time and using an owner-scoped indexed lookup at reminder delivery, so delivery does not parse a Note when the projection is present.

Finding: the existing Notes note_blocks projection stores only (user_id, path, block_id). A repo-wide search found no reusable plain-text block helper in the Notes plugin. I’m extending this projection with bounded plain text at Note indexing time and using an owner-scoped indexed lookup at reminder delivery, so delivery does not parse a Note when the projection is present.
Author
Owner

The first focused Notes/Notifications test run passed 329 tests and found two migration bookkeeping assertions that still expected schema version 38. The new projection is migration 0039, so I updated the full-schema assertions to 39 and kept the simulated dev schema expectation at version 24.

The first focused Notes/Notifications test run passed 329 tests and found two migration bookkeeping assertions that still expected schema version 38. The new projection is migration 0039, so I updated the full-schema assertions to 39 and kept the simulated dev schema expectation at version 24.
Author
Owner

Completed #1568 on branch job/remtext-1568.

Head: 164a4abc8190d81640f9d7669329895d3e5dacce

Built a bounded plain-text projection for anchored Note Blocks in Notes migration 0039. Reminder delivery and cancellation now show the Block text with the Note title, use title only when the Block text is unavailable, and keep the stable Block ID in the deep link. Delivery joins the reminder owner's Index by User, path and Block ID. New projections avoid Note reads; legacy NULL projections use a 2 MiB-limited read from the owner's Home, cached once per owner/Note/Block within the 256-item delivery batch.

Added unit coverage for tasks, headings, Markdown links and emphasis, emoji, RTL, long text, missing/deleted Blocks and cancellation formatting. Added a real SQLite reminder-flow test with two Users that share a path and Block ID, and added the due-notification check to tests/adversarial/attack.py (Python syntax checked; the live adversarial campaign was not run in this job).

Files: Cargo.lock; Notes manifest, migration 0039, src/lib.rs, src/store.rs, src/reminders_tests.rs; Notifications manifest and src/block_reminders.rs; tests/adversarial/attack.py.

Gates (final run after fetching and merging origin/dev; it had no migration beyond 0038):

cargo fmt --check; echo exit=$?

exit=0

cargo clippy -p calternal-plugin-notifications -p calternal-plugin-notes --all-targets -- -D warnings; echo exit=$?

    Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/notes)
    Checking calternal-plugin-files v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/files)
    Checking calternal-plugin-calendar v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/calendar)
    Checking calternal-plugin-notifications v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/notifications)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 31.99s
exit=0

cargo test -p calternal-plugin-notifications -p calternal-plugin-notes; echo exit=$?

test result: 331 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 141.94s
test result: 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s
test result: 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.32s
exit=0

Decisions: repo search found no existing Notes plain-text Block helper, so the projection uses the existing pulldown-cmark parser rather than a hand-written Markdown stripper. Body format is Block text · Note title; the existing 900-character body cap remains. Old projections use a bounded owner-Home fallback until Notes reconciliation fills the Index. The usual delivery path adds an indexed join to the existing bounded reminder batch and does not parse Notes.

UX gaps closed: reminder text no longer exposes a raw Block ID and keeps the Note title and stable Block link. UX gaps left: none found. No UI controls or screens changed, so screenshots were not applicable.

For the merge round, run tests/adversarial/run.sh against its real local server and confirm the new due-reminder assertion passes. No standalone performance run was done because this issue changes existing notification content; the additional lookup and legacy fallback costs are bounded as described above. cargo clean completed (Removed 13408 files, 10.6GiB total); no web build output existed in this worktree.

Completed #1568 on branch `job/remtext-1568`. Head: `164a4abc8190d81640f9d7669329895d3e5dacce` Built a bounded plain-text projection for anchored Note Blocks in Notes migration 0039. Reminder delivery and cancellation now show the Block text with the Note title, use title only when the Block text is unavailable, and keep the stable Block ID in the deep link. Delivery joins the reminder owner's Index by User, path and Block ID. New projections avoid Note reads; legacy NULL projections use a 2 MiB-limited read from the owner's Home, cached once per owner/Note/Block within the 256-item delivery batch. Added unit coverage for tasks, headings, Markdown links and emphasis, emoji, RTL, long text, missing/deleted Blocks and cancellation formatting. Added a real SQLite reminder-flow test with two Users that share a path and Block ID, and added the due-notification check to `tests/adversarial/attack.py` (Python syntax checked; the live adversarial campaign was not run in this job). Files: `Cargo.lock`; Notes manifest, migration 0039, `src/lib.rs`, `src/store.rs`, `src/reminders_tests.rs`; Notifications manifest and `src/block_reminders.rs`; `tests/adversarial/attack.py`. Gates (final run after fetching and merging `origin/dev`; it had no migration beyond 0038): `cargo fmt --check; echo exit=$?` ```text exit=0 ``` `cargo clippy -p calternal-plugin-notifications -p calternal-plugin-notes --all-targets -- -D warnings; echo exit=$?` ```text Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/notes) Checking calternal-plugin-files v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/files) Checking calternal-plugin-calendar v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/calendar) Checking calternal-plugin-notifications v0.0.1 (/home/kayg/Developer/calternal-wt/remtext-1568/crates/plugins/notifications) Finished `dev` profile [unoptimized + debuginfo] target(s) in 31.99s exit=0 ``` `cargo test -p calternal-plugin-notifications -p calternal-plugin-notes; echo exit=$?` ```text test result: 331 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 141.94s test result: 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s test result: 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.32s exit=0 ``` Decisions: repo search found no existing Notes plain-text Block helper, so the projection uses the existing pulldown-cmark parser rather than a hand-written Markdown stripper. Body format is `Block text · Note title`; the existing 900-character body cap remains. Old projections use a bounded owner-Home fallback until Notes reconciliation fills the Index. The usual delivery path adds an indexed join to the existing bounded reminder batch and does not parse Notes. UX gaps closed: reminder text no longer exposes a raw Block ID and keeps the Note title and stable Block link. UX gaps left: none found. No UI controls or screens changed, so screenshots were not applicable. For the merge round, run `tests/adversarial/run.sh` against its real local server and confirm the new due-reminder assertion passes. No standalone performance run was done because this issue changes existing notification content; the additional lookup and legacy fallback costs are bounded as described above. `cargo clean` completed (`Removed 13408 files, 10.6GiB total`); no web build output existed in this worktree.
Author
Owner

Started remtext2 on branch job/merge40 after the ratchet repair. Starting HEAD/base: bbd4e4a8b2. Scope: strip Daily Log capture-zone markers in the shared plain block-text projection, refresh existing projected rows by migration, and keep Note names unbroken in Notifications.

Started remtext2 on branch job/merge40 after the ratchet repair. Starting HEAD/base: bbd4e4a8b25c56ae998927b7dc6367bfd5cb9f78. Scope: strip Daily Log capture-zone markers in the shared plain block-text projection, refresh existing projected rows by migration, and keep Note names unbroken in Notifications.
Author
Owner

Finding from the first Notes test run: the new parser and migration rebuild tests pass, but two migration-head assertions still expect 39 (fresh version list in reminders_tests.rs and the head assertion in lib.rs); the new immutable 0040 is required to reset the Daily Log projection cursor. I will update only these migration-head expectations to 40. Suite result before that adjustment: 332 passed, 2 failed, 5 ignored.

Finding from the first Notes test run: the new parser and migration rebuild tests pass, but two migration-head assertions still expect 39 (fresh version list in reminders_tests.rs and the head assertion in lib.rs); the new immutable 0040 is required to reset the Daily Log projection cursor. I will update only these migration-head expectations to 40. Suite result before that adjustment: 332 passed, 2 failed, 5 ignored.
Author
Owner

Follow-up: the initial failure also had a second fresh-head expectation in the old-dev-schema upgrade fixture. The 0040 version-list assertion passed, the Daily Log cursor-head test now passes, and the upgrade fixture still expected 39; I am correcting that remaining version expectation to 40.

Follow-up: the initial failure also had a second fresh-head expectation in the old-dev-schema upgrade fixture. The 0040 version-list assertion passed, the Daily Log cursor-head test now passes, and the upgrade fixture still expected 39; I am correcting that remaining version expectation to 40.
Author
Owner

Web check findings: svelte-check rejected the new {@const} inside the row element; it must be a direct child of the keyed each block. The same UI edit changed the parser hash for the registered Notifications list surfaces, so perf-lint reported an unused exact exception. I am moving the binding to the each block and refreshing only those live hashes/registry locations; contracts/perf/ratchet.json stays unchanged.

Web check findings: svelte-check rejected the new {@const} inside the row element; it must be a direct child of the keyed each block. The same UI edit changed the parser hash for the registered Notifications list surfaces, so perf-lint reported an unused exact exception. I am moving the binding to the each block and refreshing only those live hashes/registry locations; contracts/perf/ratchet.json stays unchanged.
Author
Owner

Web check now has 0 Svelte errors and 0 warnings. Perf-lint reports that the same two exact list-site hashes also appear in the #1058 adoption checkpoint, so its identity check rejects the refreshed exception ledger. I will refresh those two checkpoint hashes only; the listed sites, rules, limits, exception counts and contracts/perf/ratchet.json remain unchanged.

Web check now has 0 Svelte errors and 0 warnings. Perf-lint reports that the same two exact list-site hashes also appear in the #1058 adoption checkpoint, so its identity check rejects the refreshed exception ledger. I will refresh those two checkpoint hashes only; the listed sites, rules, limits, exception counts and contracts/perf/ratchet.json remain unchanged.
Author
Owner

Production-build Notifications capture evidence for #1568. The real-server harness asserted the reminder was loaded and captured Chromium with macOS platform emulation at 390, 820 and 1440 px in light and dark. The six files are attached here:

Local copies are in artifacts/merge40/owner/merge39-review/ with the existing notifications-reminder-*-mac.png names. They are ignored and are not committed.

Production-build Notifications capture evidence for #1568. The real-server harness asserted the reminder was loaded and captured Chromium with macOS platform emulation at 390, 820 and 1440 px in light and dark. The six files are attached here: - 390 light: https://git.kayg.org/attachments/50f2956a-e7c5-4a07-aa91-8845d2406a1a - 390 dark: https://git.kayg.org/attachments/355a2fc0-1ed6-438b-9c72-ef9296eb1450 - 820 light: https://git.kayg.org/attachments/ddf50cb4-1aa0-4ad3-84c7-fdb15963a80f - 820 dark: https://git.kayg.org/attachments/ce41578b-60d1-4d18-853b-942bfa182d5a - 1440 light: https://git.kayg.org/attachments/b8851436-f31c-4e27-8880-18728a582f1a - 1440 dark: https://git.kayg.org/attachments/b36fc719-e0ab-4aa4-b5d5-e91b164a30d7 Local copies are in `artifacts/merge40/owner/merge39-review/` with the existing `notifications-reminder-*-mac.png` names. They are ignored and are not committed.
Author
Owner

#1568 complete on job/merge40.

Head SHA: 027695ae252548a02513f5cf625e6a7c6b08fe64.

Commits:

  • b634cb109 Strip Daily Log capture zones from reminder text
  • 4409aa613 Keep reminder note names together in the inbox
  • ba1dffce7 Record local Daily Log rebuild baseline
  • 027695ae2 Document Daily Log reminder rebuild migration

Built

plain_block_text now removes valid escaped and unescaped [tz=...] capture-zone tokens before Markdown parsing. It preserves the entry time and leaves malformed tokens alone. It borrows the original string when no marker exists. Migration 0040 resets the resumable Daily Log rebuild cursor; the existing rebuild refreshes persisted summaries with its per-Note transaction and batched Block writes. The upgrade test verifies old text is corrected and source Markdown bytes stay unchanged. A real publish_due test asserts the notification body is 10:37 Review the combined build · 2026-10-11 Daily Note, with no token, foreign Home text or Block ID.

The Notifications row renders a Note name as one unbroken, ellipsized text span. It keeps existing row/body styling and adds no new controls. The exact performance pins for the changed Svelte iteration sites were refreshed in contracts/perf/adoption-1058.json, contracts/perf/exceptions.json and contracts/perf/registry.json. contracts/perf/ratchet.json is unchanged from the starting commit.

Files

  • crates/plugins/notes/src/lib.rs
  • crates/plugins/notes/src/store.rs
  • crates/plugins/notes/src/reminders_tests.rs
  • crates/plugins/notes/migrations/0040_log_reminder_text_rebuild.sql
  • crates/plugins/notifications/src/block_reminders.rs
  • apps/web/src/lib/notifications/InboxPanel.svelte
  • apps/web/src/lib/notifications/model.ts
  • apps/web/src/lib/notifications/model.test.ts
  • contracts/perf/adoption-1058.json, contracts/perf/exceptions.json, contracts/perf/registry.json
  • docs/perf/baseline.json

UX gaps closed

  • Reminder text keeps its time and drops the capture-zone token.
  • The Daily Note date stays together in the Notifications panel.
  • The UI body parser retains the cancellation suffix and non-reminder body text.

UX gaps left: none found.

Performance

The migration runs the existing bounded rebuild once per User. Work is proportional to that User's Daily Notes and their blocks; it commits one Note at a time, batches Block rows, and waits 10 ms between Notes. The existing profile measured 100 Notes over 5 runs at 2,732.492 ms p50 / 2,822.462 ms p95; 656 Notes over 3 runs at 19,174.86 ms / 19,240.451 ms. Peak RSS p95 was 137,551,872 bytes for 100 Notes and 137,211,904 bytes for 656 Notes. The 656-Note fixture has 7,732 Log entries. These are local measurements, recorded as the first Notes rebuild reference in docs/perf/baseline.json; there was no previous Notes rebuild baseline for a before/after comparison. The checked-in profile wrapper expects /usr/bin/time, which is absent on this host, so a temporary Python sampler ran the same focused profile test and collected child CPU and peak RSS. The wrapper was not changed.

Verification output (verbatim summary lines)

cargo fmt --check
(exit 0; no output)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s
test result: ok. 334 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 125.87s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.87s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.66s
test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.24s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages
perf-lint: PASS; 0 violations; 20383 scoped exceptions
User browser caches use userStorage; only documented device/public-link exceptions remain.
Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Focus policy passes: 48 focus ring rules, 133 DOM focus calls and 2 data-input writers audited.
UI transitions and animation options use shared motion tokens or documented exceptions.
svelte-check found 0 errors and 0 warnings
 Test Files  321 passed (321)
      Tests  2337 passed (2337)
   Start at  15:04:15
   Duration  208.82s (environment 29%, transform 24%, import 21%, tests 20%, setup 5%)
Removed 19093 files, 16.5GiB total

The real production harness captured and uploaded Notifications screenshots at 390, 820 and 1440 px, light and dark, with Chromium macOS platform emulation. Each capture asserted the reminder was loaded. Files remain in artifacts/merge40/owner/merge39-review/ and are attached to this issue:

Decisions not specified in DESIGN

  • Use the same allowed zone characters as restore_daily_timezone_markers; malformed marker-like text stays visible.
  • Use migration 0040 to reset the shared rebuild cursor and reuse the existing resumable, batched projector.
  • Keep Note names atomic in the row and ellipsize long names.
  • Record the first local profile as a reference because no prior Notes rebuild baseline existed.

origin/dev was fetched and merged once before final gates; it was already up to date. Its Notes migrations ended at 0038, while this branch already contained 0039, so 0040 is the next migration in the combined branch. Production build output was deleted and cargo clean ran. Worktree is clean.

#1568 complete on `job/merge40`. Head SHA: `027695ae252548a02513f5cf625e6a7c6b08fe64`. Commits: - `b634cb109` Strip Daily Log capture zones from reminder text - `4409aa613` Keep reminder note names together in the inbox - `ba1dffce7` Record local Daily Log rebuild baseline - `027695ae2` Document Daily Log reminder rebuild migration ## Built `plain_block_text` now removes valid escaped and unescaped `[tz=...]` capture-zone tokens before Markdown parsing. It preserves the entry time and leaves malformed tokens alone. It borrows the original string when no marker exists. Migration 0040 resets the resumable Daily Log rebuild cursor; the existing rebuild refreshes persisted summaries with its per-Note transaction and batched Block writes. The upgrade test verifies old text is corrected and source Markdown bytes stay unchanged. A real `publish_due` test asserts the notification body is `10:37 Review the combined build · 2026-10-11 Daily Note`, with no token, foreign Home text or Block ID. The Notifications row renders a Note name as one unbroken, ellipsized text span. It keeps existing row/body styling and adds no new controls. The exact performance pins for the changed Svelte iteration sites were refreshed in `contracts/perf/adoption-1058.json`, `contracts/perf/exceptions.json` and `contracts/perf/registry.json`. `contracts/perf/ratchet.json` is unchanged from the starting commit. ## Files - `crates/plugins/notes/src/lib.rs` - `crates/plugins/notes/src/store.rs` - `crates/plugins/notes/src/reminders_tests.rs` - `crates/plugins/notes/migrations/0040_log_reminder_text_rebuild.sql` - `crates/plugins/notifications/src/block_reminders.rs` - `apps/web/src/lib/notifications/InboxPanel.svelte` - `apps/web/src/lib/notifications/model.ts` - `apps/web/src/lib/notifications/model.test.ts` - `contracts/perf/adoption-1058.json`, `contracts/perf/exceptions.json`, `contracts/perf/registry.json` - `docs/perf/baseline.json` ## UX gaps closed - Reminder text keeps its time and drops the capture-zone token. - The Daily Note date stays together in the Notifications panel. - The UI body parser retains the cancellation suffix and non-reminder body text. UX gaps left: none found. ## Performance The migration runs the existing bounded rebuild once per User. Work is proportional to that User's Daily Notes and their blocks; it commits one Note at a time, batches Block rows, and waits 10 ms between Notes. The existing profile measured 100 Notes over 5 runs at 2,732.492 ms p50 / 2,822.462 ms p95; 656 Notes over 3 runs at 19,174.86 ms / 19,240.451 ms. Peak RSS p95 was 137,551,872 bytes for 100 Notes and 137,211,904 bytes for 656 Notes. The 656-Note fixture has 7,732 Log entries. These are local measurements, recorded as the first Notes rebuild reference in `docs/perf/baseline.json`; there was no previous Notes rebuild baseline for a before/after comparison. The checked-in profile wrapper expects `/usr/bin/time`, which is absent on this host, so a temporary Python sampler ran the same focused profile test and collected child CPU and peak RSS. The wrapper was not changed. ## Verification output (verbatim summary lines) ```text cargo fmt --check (exit 0; no output) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s test result: ok. 334 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 125.87s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.87s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.66s test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.24s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages perf-lint: PASS; 0 violations; 20383 scoped exceptions User browser caches use userStorage; only documented device/public-link exceptions remain. Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Focus policy passes: 48 focus ring rules, 133 DOM focus calls and 2 data-input writers audited. UI transitions and animation options use shared motion tokens or documented exceptions. svelte-check found 0 errors and 0 warnings Test Files 321 passed (321) Tests 2337 passed (2337) Start at 15:04:15 Duration 208.82s (environment 29%, transform 24%, import 21%, tests 20%, setup 5%) Removed 19093 files, 16.5GiB total ``` The real production harness captured and uploaded Notifications screenshots at 390, 820 and 1440 px, light and dark, with Chromium macOS platform emulation. Each capture asserted the reminder was loaded. Files remain in `artifacts/merge40/owner/merge39-review/` and are attached to this issue: - 390 light: https://git.kayg.org/attachments/50f2956a-e7c5-4a07-aa91-8845d2406a1a - 390 dark: https://git.kayg.org/attachments/355a2fc0-1ed6-438b-9c72-ef9296eb1450 - 820 light: https://git.kayg.org/attachments/ddf50cb4-1aa0-4ad3-84c7-fdb15963a80f - 820 dark: https://git.kayg.org/attachments/ce41578b-60d1-4d18-853b-942bfa182d5a - 1440 light: https://git.kayg.org/attachments/b8851436-f31c-4e27-8880-18728a582f1a - 1440 dark: https://git.kayg.org/attachments/b36fc719-e0ab-4aa4-b5d5-e91b164a30d7 ## Decisions not specified in DESIGN - Use the same allowed zone characters as `restore_daily_timezone_markers`; malformed marker-like text stays visible. - Use migration 0040 to reset the shared rebuild cursor and reuse the existing resumable, batched projector. - Keep Note names atomic in the row and ellipsize long names. - Record the first local profile as a reference because no prior Notes rebuild baseline existed. `origin/dev` was fetched and merged once before final gates; it was already up to date. Its Notes migrations ended at 0038, while this branch already contained 0039, so 0040 is the next migration in the combined branch. Production build output was deleted and `cargo clean` ran. Worktree is clean.
Author
Owner

Deployed to calternal.cloud in merge round 40 (build c0f8da461, 01:38 IST 2026-10-12). Health state ok, /readyz 200, served-page check passed. Pre-deploy backup taken.

Deployed to calternal.cloud in merge round 40 (build c0f8da461, 01:38 IST 2026-10-12). Health state ok, /readyz 200, served-page check passed. Pre-deploy backup taken.
kayg closed this issue 2026-10-11 20:08:42 +00:00
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal-v0#1568
No description provided.