Settings Jobs: plain job names (Updating search, Updating Daily Logs) #1538

Closed
opened 2026-10-10 13:59:07 +00:00 by kayg · 6 comments
Owner

Settings → Jobs shows internal names for background jobs, for example "Search index rebuild", "User Search index rebuild" and Daily Log projection rebuild. The owner rule is user-friendly names, no jargon.

Change the user-visible job labels (source: crates/calternal-server/src/wire.rs around line 6127, plus any other label sources the Jobs page shows) to plain names:

  • "Search index rebuild" / "User Search index rebuild" → "Updating search"
  • Daily Log projection rebuild → "Updating Daily Logs"
  • Audit every other label the Jobs page can show and give each a plain name in the same style ("Updating …", sentence case, glossary terms from CONTEXT.md).

Do not change migration descriptions, internal IDs or log keys; only the labels sent to the UI. Update apps/web/src/routes/settings/jobs/JobRow.svelte.test.ts fixtures and any server tests that assert labels.

Settings → Jobs shows internal names for background jobs, for example "Search index rebuild", "User Search index rebuild" and Daily Log projection rebuild. The owner rule is user-friendly names, no jargon. Change the user-visible job labels (source: `crates/calternal-server/src/wire.rs` around line 6127, plus any other label sources the Jobs page shows) to plain names: - "Search index rebuild" / "User Search index rebuild" → "Updating search" - Daily Log projection rebuild → "Updating Daily Logs" - Audit every other label the Jobs page can show and give each a plain name in the same style ("Updating …", sentence case, glossary terms from CONTEXT.md). Do not change migration descriptions, internal IDs or log keys; only the labels sent to the UI. Update `apps/web/src/routes/settings/jobs/JobRow.svelte.test.ts` fixtures and any server tests that assert labels.
Author
Owner

Starting #1538 on branch job/jobnames-1538. Base SHA: dbd621434d. I read CLAUDE.md, CONTEXT.md and docs/DESIGN.md; next I am auditing every job label emitted to Settings → Jobs and its test fixtures.

Starting #1538 on branch job/jobnames-1538. Base SHA: dbd621434d0a1133f16230cca5c6a83af0d8aed3. I read CLAUDE.md, CONTEXT.md and docs/DESIGN.md; next I am auditing every job label emitted to Settings → Jobs and its test fixtures.
Author
Owner

Finding: the Jobs API label comes from core worker registrations and Plugin JobHandler.display_name values. The current built-ins include internal names such as Mail change listener, Notes index refresh, and Voice memo backfill. I will map the current stable kinds to plain Settings labels at the server wire boundary, leaving kinds, handler names, descriptions and log keys unchanged.

Finding: the Jobs API label comes from core worker registrations and Plugin JobHandler.display_name values. The current built-ins include internal names such as Mail change listener, Notes index refresh, and Voice memo backfill. I will map the current stable kinds to plain Settings labels at the server wire boundary, leaving kinds, handler names, descriptions and log keys unchanged.
Author
Owner

Verification finding: after workspace dependency install, perf-lint flagged the changed JobView projection as an unused or changed exact exception. Its source digest covers the function body. I removed a new unresolved .to_owned() method call from the label projection and will refresh only still-live exception hashes; no rule or ratchet ceiling will change.

Verification finding: after workspace dependency install, perf-lint flagged the changed JobView projection as an unused or changed exact exception. Its source digest covers the function body. I removed a new unresolved `.to_owned()` method call from the label projection and will refresh only still-live exception hashes; no rule or ratchet ceiling will change.
Author
Owner

Audit finding: the missing-handler fallback can appear as a Jobs row for persisted work when its Plugin is not installed. A trial rename from “Unavailable handler” to “Work unavailable” changed the live read-path inventory from 160 to 178 exact scopes across the four Jobs projections (30 new scopes and 12 removed). That would require ratchet growth, so I reverted the fallback rename and kept this issue limited to registered job labels. The fallback wording remains a known gap.

Audit finding: the missing-handler fallback can appear as a Jobs row for persisted work when its Plugin is not installed. A trial rename from “Unavailable handler” to “Work unavailable” changed the live read-path inventory from 160 to 178 exact scopes across the four Jobs projections (30 new scopes and 12 removed). That would require ratchet growth, so I reverted the fallback rename and kept this issue limited to registered job labels. The fallback wording remains a known gap.
Author
Owner

#1538 finished on job/jobnames-1538.

Head SHA: c858f136c38b5019cd95c2f214e9ecd1a3c69a73.

Implemented plain labels for all 26 registered built-in job kinds, including “Updating search” and “Updating Daily Logs”. The server normalizes labels at worker registration, so Jobs reads do not add label mapping work. Unknown Plugin kinds retain their declared display name. The web fixture and server label test now cover the new labels.

Files changed:

  • crates/calternal-server/src/wire.rs
  • apps/web/src/routes/settings/jobs/JobRow.svelte.test.ts

Gate output:

  • cargo fmt --check: no output; exit 0.
  • cargo clippy -p calternal-server --all-targets -- -D warnings:
    Finished \dev` profile [unoptimized + debuginfo] target(s) in 33.38s`
  • Focused server label test:
    test wire::tests::settings_job_labels_use_plain_names ... ok
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 288 filtered out; finished in 0.00s
  • cargo test -p calternal-server:
    test result: ok. 277 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 180.56s
    test deterministic_performance_guards ... ok
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 31.02s
    test sqlite_index_sidecars_and_snapshots_use_mode_0600 ... ok
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s
  • bun run check:
    perf-lint: PASS; 0 violations; 22247 scoped exceptions
    Focus policy passes: 50 focus ring rules, 133 DOM focus calls and 2 data-input writers audited.
    svelte-check found 0 errors and 3 warnings in 1 file
  • bun run test -- --maxWorkers=2 src/routes/settings:
    Ran 140 tests in 0.046s
    Test Files 21 passed (21)
    Tests 101 passed (101)
    Duration 34.35s (transform 34%, environment 25%, tests 19%, import 16%, setup 6%)
  • bun run build: exit 0.

Known gap: persisted jobs whose Plugin is not installed still use the “Unavailable handler” fallback. A trial rename would change the four Jobs read paths from 160 pinned live scopes to 178 live scopes (30 new, 12 removed), which would require ratchet growth. I reverted that part; the finding is recorded in the earlier comment. The three Svelte warnings are existing unused selectors in apps/web/src/lib/mail/MailMorphCard.svelte lines 137–139.

Decision: normalize labels during startup registration and preserve custom Plugin labels. The issue and DESIGN do not specify wording for unknown or future Plugin kinds. cargo clean removed 15,996 files (11.1 GiB); the production web output was removed after verification.

#1538 finished on `job/jobnames-1538`. Head SHA: `c858f136c38b5019cd95c2f214e9ecd1a3c69a73`. Implemented plain labels for all 26 registered built-in job kinds, including “Updating search” and “Updating Daily Logs”. The server normalizes labels at worker registration, so Jobs reads do not add label mapping work. Unknown Plugin kinds retain their declared display name. The web fixture and server label test now cover the new labels. Files changed: - `crates/calternal-server/src/wire.rs` - `apps/web/src/routes/settings/jobs/JobRow.svelte.test.ts` Gate output: - `cargo fmt --check`: no output; exit 0. - `cargo clippy -p calternal-server --all-targets -- -D warnings`: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 33.38s` - Focused server label test: `test wire::tests::settings_job_labels_use_plain_names ... ok` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 288 filtered out; finished in 0.00s` - `cargo test -p calternal-server`: `test result: ok. 277 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 180.56s` `test deterministic_performance_guards ... ok` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 31.02s` `test sqlite_index_sidecars_and_snapshots_use_mode_0600 ... ok` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s` - `bun run check`: `perf-lint: PASS; 0 violations; 22247 scoped exceptions` `Focus policy passes: 50 focus ring rules, 133 DOM focus calls and 2 data-input writers audited.` `svelte-check found 0 errors and 3 warnings in 1 file` - `bun run test -- --maxWorkers=2 src/routes/settings`: `Ran 140 tests in 0.046s` `Test Files 21 passed (21)` `Tests 101 passed (101)` `Duration 34.35s (transform 34%, environment 25%, tests 19%, import 16%, setup 6%)` - `bun run build`: exit 0. Known gap: persisted jobs whose Plugin is not installed still use the “Unavailable handler” fallback. A trial rename would change the four Jobs read paths from 160 pinned live scopes to 178 live scopes (30 new, 12 removed), which would require ratchet growth. I reverted that part; the finding is recorded in the earlier comment. The three Svelte warnings are existing unused selectors in `apps/web/src/lib/mail/MailMorphCard.svelte` lines 137–139. Decision: normalize labels during startup registration and preserve custom Plugin labels. The issue and DESIGN do not specify wording for unknown or future Plugin kinds. `cargo clean` removed 15,996 files (11.1 GiB); the production web output was removed after verification.
Author
Owner

Deployed to production in merge38 4ebeba0b8 (backup /srv/calternal/backup-pre-merge38-20261010-2214). Prod ready after 42 s; served-check true.

Deployed to production in merge38 4ebeba0b8 (backup /srv/calternal/backup-pre-merge38-20261010-2214). Prod ready after 42 s; served-check true.
kayg closed this issue 2026-10-10 20:32:02 +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#1538
No description provided.