From 0ca4e0ef9e0a9b78f2e41b185a4257d9a63fe8d9 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 25 Apr 2026 00:21:01 +0100 Subject: [PATCH] docs(phase9): mark Phase 9 mostly shipped + refresh HANDOVER Phase 9 export plumbing, LLM content tags (with migration v14 + storage + Tauri-command extension that picks up the latent manualTags persistence bug as a side effect), and sparkline polish all on main. SettingsPage deeper restructure and walkthrough-driven a11y sweeps deferred to a follow-up polish session and Phase 10a QC respectively. Roadmap Phase 9 entry updated with shipped + deferred notes. HANDOVER captures the full session including the plan-correction discovery and the Codex-blocked retries. Phase 8 handover preserved as the dated archive HANDOVER-2026-04-24.md. Co-Authored-By: Claude Opus 4.7 (1M context) --- HANDOVER-2026-04-24.md | 122 ++++++++++++++++ HANDOVER.md | 134 +++++++++--------- ...6-04-23-corbie-feature-complete-roadmap.md | 25 +++- 3 files changed, 210 insertions(+), 71 deletions(-) create mode 100644 HANDOVER-2026-04-24.md diff --git a/HANDOVER-2026-04-24.md b/HANDOVER-2026-04-24.md new file mode 100644 index 0000000..0e7d278 --- /dev/null +++ b/HANDOVER-2026-04-24.md @@ -0,0 +1,122 @@ +--- +name: handover-2026-04-24 +type: reference +tags: [handover, session, kon, phase-8, gamification] +description: Session handover — 2026/04/24 Phase 8 forgiving gamification shipped end-to-end +--- + +# Corbie Handover — 2026/04/24 + +Phase 8 session. Executed the forgiving-gamification spec + plan written at the top of the session against `main`. Shipped 14 commits end-to-end. All automated gates clean; manual dogfood walkthrough still owed when Jake next opens the running app. + +## Rebrand note + +Product rename **Kon → Corbie** still in flight. Copy in new docs is "Corbie"; codebase paths / package names / repos still carry `kon`. No rebrand work this session. See `~/.claude/projects/-home-jake-Documents-CORBEL-Main/memory/project_corbie_rebrand.md`. + +## What shipped this session + +### Phase 8 — forgiving gamification + +Today's header now shows `Tasks · 3 today` alongside a 7-day momentum sparkline. No streaks, no grace days, no loss language. Commits on `main`, `729b82c` onwards: + +| SHA | Summary | +|---|---| +| `2cc0697` | docs: design spec for Phase 8 | +| `d5eb212` | docs: implementation plan for Phase 8 | +| `729b82c` | migration v13, `auto_completed` column | +| `92b3228` | cascade sets `auto_completed = 1` on parent | +| `b992967` | style fix, drop em-dash from cascade comment | +| `839754f` | `uncomplete_task` clears `auto_completed` | +| `83bd338` | `list_recent_completions` storage fn + `DailyCompletionCount` + 5 tests | +| `42b423e` | `list_recent_completions_cmd` Tauri wrapper | +| `cb32285` | `DailyCompletionCount` type + `showMomentumSparkline` setting | +| `4ffdae9` | `completionStats.svelte.ts` store | +| `54ddd41` | `CompletionSparkline.svelte` component | +| `3cadbb0` | badge + sparkline wired into Tasks header (+ `$derived` → getter fix) | +| `c29720e` | emit `kon:task-uncompleted` + `kon:task-deleted` events | +| `fa93033` | settings toggle for momentum sparkline | + +### Counting semantics (locked) + +- Manual top-level completions count. +- Manual subtask completions count. +- Cascade-completed parents (`auto_completed = 1`) do **not** count. +- Uncompletions remove from the count on the spot. +- Day boundaries are local time via `DATE(done_at, 'localtime')`. + +### Architectural notes worth carrying forward + +- **`serde` is now a dependency of `kon-storage`.** Added because `DailyCompletionCount` is serialised directly to the frontend via Tauri. The existing `TaskRow` → `TaskDto` split wasn't reused because the struct has no camelCase translation need (`day`, `count` are already frontend-friendly). Simpler, one fewer file to maintain. +- **`$derived` cannot be exported at module scope in `.svelte.ts`.** Svelte 5 errors with `derived_invalid_export`. Originally hit during Task 9 integration; fix landed in the same commit (`3cadbb0`). `svelte-check` misses this; only Vite catches it. Plan/spec both mistakenly prescribed `$derived`; future stores should use `export function fooCount(): number` + `(...)` call sites, or a `$derived` wrapped inside a component script. +- **Tuple `FromRow` in storage.** `kon-storage` strips sqlx's `derive` feature, so `#[derive(sqlx::FromRow)]` is not available. Use tuple `FromRow` `(String, i64)` etc. instead. Noted for future tasks in this crate. + +## Verification state at session end + +Fresh run on `main` tip `fa93033`: + +- `cargo fmt --check`: clean. +- `cargo clippy --all-targets -- -D warnings`: clean. +- `cargo test`: **273 tests pass**, 0 failed, 0 ignored. Storage crate alone: 55 passed (6 new Phase 8 tests: column exists + default 0, cascade flag, uncomplete clear, 5-day series shape, cascade excluded, manual top-level counted, uncomplete excluded, local-day boundary). +- `npm run check`: 0 errors, 0 warnings across 3955 files. +- `npm run build`: clean production build via `@sveltejs/adapter-static`. + +## Owed to Jake (next session) + +1. **Manual dogfood walkthrough.** Cannot be driven by an automated agent. When opening Corbie next: + - Fresh state, no completions → header shows only "Tasks" title; no badge, no sparkline. + - Complete one top-level task → badge "1 today"; sparkline appears. + - Complete two more → badge "3 today". + - Uncomplete one → badge "2 today". + - Micro-step a task; complete its final subtask so the cascade closes the parent → badge increments by 1 (subtask), not 2. + - Settings → Rituals → toggle sparkline off → sparkline disappears, badge remains. + - Toggle on → sparkline returns. + +2. **Phase 9 polish backlog items surfaced during review:** + - Sparkline `aria-label` currently reads numeric list ("0, 1, 3, 2, 0, 4, 3"). Friendlier summary form ("3 completed today, 14 total over 7 days") would reduce screen-reader tedium. Not changed because spec prescribed the numeric list verbatim. + - Per-day tooltip on sparkline hover was explicitly deferred to Phase 9 by the spec. + - Motion curves / enter animations on badge + sparkline deferred to Phase 9. + - Settings toggle currently co-located under "Rituals" section. Code reviewer flagged that placement reads as part of the "Launch at login" subgroup (the `border-t` above is visually claimed by a different setting). Two options for Phase 9 polish: wrap the sparkline toggle in its own `mt-4 pt-4 border-t border-border-subtle` subgroup, or move it to its own "Tasks" / "Progress" section. Rituals copy ("All off by default. Rituals only appear when you ask for them.") is mildly broken by the default-on sparkline; relocate the toggle rather than soften the copy. + +3. **Plan quality note for future Phase 9+ plans.** Two patterns I prescribed turned out to be wrong on this codebase and only surfaced during execution: + - `$derived` at `.svelte.ts` module scope: not supported. + - `#[derive(sqlx::FromRow)]` in `kon-storage`: feature is stripped. + + Worth a one-screen "kon-storage gotchas" reference file or at least a note at the top of future plans that touch these areas. + +## What's left for v0.1 + +Unchanged except for Phase 8 now being closed: + +| Phase | State | +|---|---| +| Phases 1 to 8 | **All shipped.** | +| Phase 9 | Polish debt (file-system .md save dialog, bulk select/export in History, LLM content tags, settings UX pass, visual polish, accessibility sweep). Absorbs backlog above. 1 to 2 days. | +| Phase 10a | QC: dogfood walkthrough, Rachmann's RB-08 Mac verification (parallel), cross-platform CI, a11y regression, clean-install test. Half day. | +| Phase 10b | Kon → Corbie rename sweep: package name, all 10 crates, bundle ids, install paths, `kon.db` → `corbie.db`, event names, repo rename on both remotes. Half to 1 day. | +| Phase 10c | Release: 0.1.0 version sync, CHANGELOG seeded from roadmap phases, release notes, tag + push. Half day. | + +### Release-blocker state + +- **0 open CRITICAL.** +- **1 open MAJOR.** RB-08 `power-assertion-macos-objc2` (awaits Rachmann's manual runtime verification on his Mac: `pmset -g assertions` during a live session). Gates v0.1 tagging. + +### Cargo.lock + +- `Cargo.lock` is committed as of `b333c62` (Jake's hardening pass). Roadmap doc updated this session to reflect resolution. + +## Repo state at session end + +- `main` at `fa93033`. +- 14 Phase 8 commits + 2 doc commits on top of yesterday's tip. +- Local branches: `main` only. +- `cargo build --workspace` green / `cargo test --workspace` green (273 passing) / `cargo clippy --workspace --all-targets -- -D warnings` 0 warnings / `cargo fmt --check` clean / `npm run check` 0/0 / `npm run build` clean. + +## Anchors + +- Spec: [docs/superpowers/specs/2026-04-24-phase8-forgiving-gamification-design.md](docs/superpowers/specs/2026-04-24-phase8-forgiving-gamification-design.md) +- Plan: [docs/superpowers/plans/2026-04-24-phase8-forgiving-gamification.md](docs/superpowers/plans/2026-04-24-phase8-forgiving-gamification.md) +- Roadmap: [docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md](docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md) +- Previous handover: [HANDOVER-2026-04-19.md](HANDOVER-2026-04-19.md) +- Release-blocker index: [docs/issues/README.md](docs/issues/README.md) +- Rebrand memory: `~/.claude/projects/-home-jake-Documents-CORBEL-Main/memory/project_corbie_rebrand.md` +- Active-focus upstream: `context/active-focus.md` in CORBEL-Main diff --git a/HANDOVER.md b/HANDOVER.md index 0e7d278..ddb2b81 100644 --- a/HANDOVER.md +++ b/HANDOVER.md @@ -1,13 +1,13 @@ --- -name: handover-2026-04-24 +name: handover-2026-04-25 type: reference -tags: [handover, session, kon, phase-8, gamification] -description: Session handover — 2026/04/24 Phase 8 forgiving gamification shipped end-to-end +tags: [handover, session, kon, phase-9, polish-debt] +description: Session handover — 2026/04/24-25 Phase 9 polish debt mostly shipped --- -# Corbie Handover — 2026/04/24 +# Corbie Handover — 2026/04/25 -Phase 8 session. Executed the forgiving-gamification spec + plan written at the top of the session against `main`. Shipped 14 commits end-to-end. All automated gates clean; manual dogfood walkthrough still owed when Jake next opens the running app. +Phase 9 session. Spec + plan written from scratch and committed; plan corrections layered in after critical review against the actual codebase (Codex was unreachable for cross-model review, three retries failed at the ChatGPT-account-entitlement layer). Sub-phases 9a + 9b + sparkline polish landed end to end. Sub-phase 9c reduced to the Phase 8 carryover bug fix; sub-phase 9d's walkthrough sweeps deferred to Phase 10a QC. ## Rebrand note @@ -15,108 +15,102 @@ Product rename **Kon → Corbie** still in flight. Copy in new docs is "Corbie"; ## What shipped this session -### Phase 8 — forgiving gamification +### 9a — Export plumbing +- `write_text_file_cmd` Rust command in new `src-tauri/src/commands/fs.rs`, with two unit tests (UTF-8 round-trip + bad-parent error path). Registered in `invoke_handler!`. `tempfile = "3"` added as `[dev-dependencies]` on the kon crate. +- `src/lib/utils/saveMarkdown.ts` utility centralises `suggestedFilename`, `saveTranscriptAsMarkdown`, `exportTranscriptsToDir` (directory-mode bulk export with in-batch collision suffixing). +- HistoryPage `exportMarkdown` no longer copies to clipboard; it opens the OS save dialog and writes the file. Cancel returns silently. +- HistoryPage gained a slim leading checkbox per row, a bulk-action toolbar (select-all / clear / export / delete), `Esc` to clear, `Cmd/Ctrl+A` to select-all-visible when focus is inside the list and not in a text input. -Today's header now shows `Tasks · 3 today` alongside a 7-day momentum sparkline. No streaks, no grace days, no loss language. Commits on `main`, `729b82c` onwards: +### 9b — LLM content tags +- `kon-llm` exports a new `ContentTags { topic, intent }`, an `INTENT_CLOSED_SET`, an `is_valid_intent` helper, a `CONTENT_TAGS_SYSTEM` prompt and a `CONTENT_TAGS_GRAMMAR` GBNF (recursive style matching the existing `TASK_ARRAY_GRAMMAR`). +- `LlmEngine::extract_content_tags` method follows the same render-chat → generate → JSON-parse shape as the existing `cleanup_text` and `extract_tasks`. Truncates to the trailing 2000 chars on a UTF-8 boundary; max_tokens 96 is enough for the JSON envelope. Smoke test in `crates/llm/tests/content_tags_smoke.rs` is gated on `KON_LLM_TEST_MODEL` matching the Phase 8 pattern. +- `extract_content_tags_cmd` Tauri wrapper bridges through `state.llm_engine` with the standard `spawn_blocking` + `PowerAssertion` guard. -| SHA | Summary | -|---|---| -| `2cc0697` | docs: design spec for Phase 8 | -| `d5eb212` | docs: implementation plan for Phase 8 | -| `729b82c` | migration v13, `auto_completed` column | -| `92b3228` | cascade sets `auto_completed = 1` on parent | -| `b992967` | style fix, drop em-dash from cascade comment | -| `839754f` | `uncomplete_task` clears `auto_completed` | -| `83bd338` | `list_recent_completions` storage fn + `DailyCompletionCount` + 5 tests | -| `42b423e` | `list_recent_completions_cmd` Tauri wrapper | -| `cb32285` | `DailyCompletionCount` type + `showMomentumSparkline` setting | -| `4ffdae9` | `completionStats.svelte.ts` store | -| `54ddd41` | `CompletionSparkline.svelte` component | -| `3cadbb0` | badge + sparkline wired into Tasks header (+ `$derived` → getter fix) | -| `c29720e` | emit `kon:task-uncompleted` + `kon:task-deleted` events | -| `fa93033` | settings toggle for momentum sparkline | +### 9b structural — migration v14 + persistence wiring +A correction layered in after the critical-review pass discovered the original Task 9 was assuming a writable `saveHistory()` path that turned out to be a no-op stub. +- Migration v14 adds `transcripts.llm_tags TEXT NOT NULL DEFAULT ''`. +- `kon-storage` `database.rs` SELECT statements include the column. `TranscriptRow` + `transcript_row_from` carry it. `update_transcript_meta` accepts an `Option<&str>` for `llm_tags` (sixth optional, `#[allow(too_many_arguments)]` keeps clippy happy without inverting the signature into a struct). +- `commands/transcripts.rs` `TranscriptDto` + `UpdateTranscriptMetaRequest` add `llm_tags`; `update_transcript_meta_cmd` forwards. +- Frontend types: `TranscriptEntry.llmTags: string[]`, `TranscriptRow.llmTags: string`, `ContentTags`, optional `TranscriptMetaPatch.llmTags`. +- `mapTranscriptRow` hydrates `llmTags`. `saveTranscriptMeta` now also forwards `llmTags` payloads. `buildFrontmatter` unions auto + manual + LLM tags into the exported markdown frontmatter. +- HistoryPage tag UI: per-row "Tag" button, dashed-italic LLM chips that promote-to-manual on click, top-toolbar "Tag all untagged" with progress text. Existing `addManualTag` / `removeManualTag` handlers swap their no-op `saveHistory()` calls for `saveTranscriptMeta` — picks up the latent `manualTags` persistence bug as a side effect. -### Counting semantics (locked) +### 9b incidental fix — Phase 8 brittle test +`list_recent_completions_uses_local_day_boundary` failed today because its UTC-anchored `'-2 days', '+12 hours'` offset drifts across UTC midnight relative to the local-day spine the query uses. Fixed by anchoring the timestamp to the local date 2 days ago directly: `datetime(DATE('now', 'localtime', '-2 days') || ' 12:00:00')`. Phase 9 was not the cause; the test happened to fail on today's clock. -- Manual top-level completions count. -- Manual subtask completions count. -- Cascade-completed parents (`auto_completed = 1`) do **not** count. -- Uncompletions remove from the count on the spot. -- Day boundaries are local time via `DATE(done_at, 'localtime')`. +### 9c — Settings (scaled down) +- `SettingsGroup.svelte` reusable progressive-disclosure wrapper landed (animated chevron, hover, focus-visible, prefers-reduced-motion). +- Sparkline toggle (Phase 8 carryover backlog) relocated from the Rituals section into a new dedicated "Tasks" section. Closes the Phase 8 review note that the toggle was visually claimed by the launch-at-login subgroup. +- **Deferred:** the deeper restructure to seven progressive-disclosure groups + search box. The 2309-line `SettingsPage.svelte` uses a hand-rolled accordion that needs careful unwinding; full restructure was too invasive to land safely in this session. `SettingsGroup` component is in tree, ready for that follow-up pass. -### Architectural notes worth carrying forward - -- **`serde` is now a dependency of `kon-storage`.** Added because `DailyCompletionCount` is serialised directly to the frontend via Tauri. The existing `TaskRow` → `TaskDto` split wasn't reused because the struct has no camelCase translation need (`day`, `count` are already frontend-friendly). Simpler, one fewer file to maintain. -- **`$derived` cannot be exported at module scope in `.svelte.ts`.** Svelte 5 errors with `derived_invalid_export`. Originally hit during Task 9 integration; fix landed in the same commit (`3cadbb0`). `svelte-check` misses this; only Vite catches it. Plan/spec both mistakenly prescribed `$derived`; future stores should use `export function fooCount(): number` + `(...)` call sites, or a `$derived` wrapped inside a component script. -- **Tuple `FromRow` in storage.** `kon-storage` strips sqlx's `derive` feature, so `#[derive(sqlx::FromRow)]` is not available. Use tuple `FromRow` `(String, i64)` etc. instead. Noted for future tasks in this crate. +### 9d — Polish (partial) +- `CompletionSparkline.svelte`: friendlier sentence-form aria-label ("3 completed today. 14 total over the last 7 days." rather than a bare numeric list), per-bar `` tooltips with absolute date + count, 30 ms staggered scaleY entrance animation. Earlier draft `tabindex=0` on the SVG removed: `role="img"` + aria-label is sufficient for SR navigation without putting it in the keyboard tab order (svelte-check's `noninteractive_tabindex` warning, correctly). +- TasksPage badge: 180 ms opacity + translate-Y entrance animation on conditional mount. Both new animations respect `prefers-reduced-motion`. +- **Deferred to Phase 10a QC:** keyboard traversal walkthrough across every page, focus-visible ring sweep, WCAG AA contrast audit in both themes, dark-mode parity check, icon-only-button aria-label audit. These are walkthrough-driven and need a running dev server to validate. ## Verification state at session end -Fresh run on `main` tip `fa93033`: +Fresh run on `main` tip `dd45f10`: - `cargo fmt --check`: clean. - `cargo clippy --all-targets -- -D warnings`: clean. -- `cargo test`: **273 tests pass**, 0 failed, 0 ignored. Storage crate alone: 55 passed (6 new Phase 8 tests: column exists + default 0, cascade flag, uncomplete clear, 5-day series shape, cascade excluded, manual top-level counted, uncomplete excluded, local-day boundary). -- `npm run check`: 0 errors, 0 warnings across 3955 files. +- `cargo test`: **277 tests pass**, 0 failed. Storage gained 1 new test (`update_transcript_meta_writes_llm_tags`), kon-tauri gained 2 (write_text_file). The Phase 8 brittle test fix is in this count. +- `npm run check`: 0 errors, 0 warnings across 3957 files. - `npm run build`: clean production build via `@sveltejs/adapter-static`. +## Plan correction summary (for any future reader) + +The original Phase 9 spec + plan committed at `49a795f` + `48d3db7` had three mismatches against the actual codebase, surfaced by a critical-review pass before execution. Layered as a corrections appendix in commit `3eb24f2`: + +1. `kon-llm` is `LlmEngine::generate(prompt, config)` synchronous, not the speculated `LlamaEngine::generate_chat(messages, config).await`. +2. `AppState.llm_engine: Arc<LlmEngine>` is direct, not behind a `RwLock`. +3. **Structural** — `transcripts.llm_tags` requires a real SQLite migration plus Tauri command extension because the frontend `saveHistory()` is a no-op stub. Original plan assumed `manualTags`-mirroring would suffice. Migration v14 + `update_transcript_meta` extension landed as a new task to cover this. Picked up the latent `manualTags` persistence bug for free. + ## Owed to Jake (next session) 1. **Manual dogfood walkthrough.** Cannot be driven by an automated agent. When opening Corbie next: - - Fresh state, no completions → header shows only "Tasks" title; no badge, no sparkline. - - Complete one top-level task → badge "1 today"; sparkline appears. - - Complete two more → badge "3 today". - - Uncomplete one → badge "2 today". - - Micro-step a task; complete its final subtask so the cascade closes the parent → badge increments by 1 (subtask), not 2. - - Settings → Rituals → toggle sparkline off → sparkline disappears, badge remains. - - Toggle on → sparkline returns. + - Export one transcript via the History "Export .md" button — save dialog opens, file written to chosen path. Cancel — no toast, no fallback. + - Select 3 history rows via checkboxes — toolbar surfaces, "Export selected" writes one .md per row to a chosen folder, collisions suffixed " (2)" etc. + - Click "Tag" on one row — within a few seconds, dashed `topic:*` and `intent:*` chips appear. Click a chip — it moves into `manualTags` (solid accent chip). Page refresh — both `manualTags` and `llmTags` survive (this is the persistence-fix outcome). + - "Tag all untagged" runs across the corpus, progress text updates, success toast at the end. + - Settings → new "Tasks" section appears with the sparkline toggle. Toggle off → sparkline disappears on Tasks page; badge stays. Toggle on → sparkline returns. + - Sparkline keyboard-focus-or-hover on a bar shows the date + count tooltip. Screen reader announces the sentence-form summary. + - `prefers-reduced-motion` set in OS — badge entrance + sparkline stagger both stop. -2. **Phase 9 polish backlog items surfaced during review:** - - Sparkline `aria-label` currently reads numeric list ("0, 1, 3, 2, 0, 4, 3"). Friendlier summary form ("3 completed today, 14 total over 7 days") would reduce screen-reader tedium. Not changed because spec prescribed the numeric list verbatim. - - Per-day tooltip on sparkline hover was explicitly deferred to Phase 9 by the spec. - - Motion curves / enter animations on badge + sparkline deferred to Phase 9. - - Settings toggle currently co-located under "Rituals" section. Code reviewer flagged that placement reads as part of the "Launch at login" subgroup (the `border-t` above is visually claimed by a different setting). Two options for Phase 9 polish: wrap the sparkline toggle in its own `mt-4 pt-4 border-t border-border-subtle` subgroup, or move it to its own "Tasks" / "Progress" section. Rituals copy ("All off by default. Rituals only appear when you ask for them.") is mildly broken by the default-on sparkline; relocate the toggle rather than soften the copy. +2. **Phase 9 follow-up to absorb in a future polish session:** + - Full `SettingsPage` regroup using `SettingsGroup` (already in tree), search box, Start-here always-expanded, six collapsed groups by domain. + - The walkthrough-driven a11y sweeps from Phase 9 Tasks 14-15. Phase 10a QC will catch most; document any issues for a follow-up polish commit. -3. **Plan quality note for future Phase 9+ plans.** Two patterns I prescribed turned out to be wrong on this codebase and only surfaced during execution: - - `$derived` at `.svelte.ts` module scope: not supported. - - `#[derive(sqlx::FromRow)]` in `kon-storage`: feature is stripped. - - Worth a one-screen "kon-storage gotchas" reference file or at least a note at the top of future plans that touch these areas. +3. **Codex unavailability.** Three retries on the codex-rescue subagent failed because the local `~/.codex/config.toml` pins `model = "gpt-5.5"` which the ChatGPT account doesn't have access to, and explicit overrides (`gpt-4o`, `o4-mini`, `codex-mini-latest`, `gpt-5.3-codex-spark`) are also blocked at the ChatGPT-account level. Either upgrade the ChatGPT plan tier or switch Codex auth to an OpenAI API key (`codex login` with key) to unblock cross-model review on future plans. ## What's left for v0.1 -Unchanged except for Phase 8 now being closed: - | Phase | State | |---|---| -| Phases 1 to 8 | **All shipped.** | -| Phase 9 | Polish debt (file-system .md save dialog, bulk select/export in History, LLM content tags, settings UX pass, visual polish, accessibility sweep). Absorbs backlog above. 1 to 2 days. | -| Phase 10a | QC: dogfood walkthrough, Rachmann's RB-08 Mac verification (parallel), cross-platform CI, a11y regression, clean-install test. Half day. | +| Phases 1-8 | All shipped. | +| Phase 9 | **Mostly shipped this session.** Export plumbing, LLM content tags (with persistence), polish on sparkline + badge are live. SettingsPage deeper restructure + walkthrough a11y sweeps deferred. Roadmap entry updated. | +| Phase 10a | QC: dogfood walkthrough (above), Rachmann's RB-08 Mac verification (parallel), cross-platform CI, a11y regression, clean-install test. Half day. | | Phase 10b | Kon → Corbie rename sweep: package name, all 10 crates, bundle ids, install paths, `kon.db` → `corbie.db`, event names, repo rename on both remotes. Half to 1 day. | | Phase 10c | Release: 0.1.0 version sync, CHANGELOG seeded from roadmap phases, release notes, tag + push. Half day. | ### Release-blocker state - **0 open CRITICAL.** -- **1 open MAJOR.** RB-08 `power-assertion-macos-objc2` (awaits Rachmann's manual runtime verification on his Mac: `pmset -g assertions` during a live session). Gates v0.1 tagging. - -### Cargo.lock - -- `Cargo.lock` is committed as of `b333c62` (Jake's hardening pass). Roadmap doc updated this session to reflect resolution. +- **1 open MAJOR.** RB-08 `power-assertion-macos-objc2` (awaits Rachmann's manual runtime verification). Gates v0.1 tagging. ## Repo state at session end -- `main` at `fa93033`. -- 14 Phase 8 commits + 2 doc commits on top of yesterday's tip. +- `main` at `dd45f10`. +- 18 Phase 9 commits (3 docs + 15 feat/polish) on top of yesterday's tip. - Local branches: `main` only. -- `cargo build --workspace` green / `cargo test --workspace` green (273 passing) / `cargo clippy --workspace --all-targets -- -D warnings` 0 warnings / `cargo fmt --check` clean / `npm run check` 0/0 / `npm run build` clean. +- `cargo build --workspace` green / `cargo test --workspace` green (277 passing) / `cargo clippy --workspace --all-targets -- -D warnings` clean / `cargo fmt --check` clean / `npm run check` 0/0 / `npm run build` clean. ## Anchors -- Spec: [docs/superpowers/specs/2026-04-24-phase8-forgiving-gamification-design.md](docs/superpowers/specs/2026-04-24-phase8-forgiving-gamification-design.md) -- Plan: [docs/superpowers/plans/2026-04-24-phase8-forgiving-gamification.md](docs/superpowers/plans/2026-04-24-phase8-forgiving-gamification.md) +- Spec: [docs/superpowers/specs/2026-04-24-phase9-polish-debt-design.md](docs/superpowers/specs/2026-04-24-phase9-polish-debt-design.md) +- Plan: [docs/superpowers/plans/2026-04-24-phase9-polish-debt.md](docs/superpowers/plans/2026-04-24-phase9-polish-debt.md) - Roadmap: [docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md](docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md) -- Previous handover: [HANDOVER-2026-04-19.md](HANDOVER-2026-04-19.md) +- Previous handover: [HANDOVER-2026-04-24.md](HANDOVER-2026-04-24.md) (Phase 8) - Release-blocker index: [docs/issues/README.md](docs/issues/README.md) - Rebrand memory: `~/.claude/projects/-home-jake-Documents-CORBEL-Main/memory/project_corbie_rebrand.md` - Active-focus upstream: `context/active-focus.md` in CORBEL-Main diff --git a/docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md b/docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md index f902c71..2efb0e3 100644 --- a/docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md +++ b/docs/roadmap/2026-04-23-corbie-feature-complete-roadmap.md @@ -229,7 +229,7 @@ The bus applies suppression rules, then dispatches via Rust commands for platfor --- -## Phase 9 — Polish debt +## Phase 9 — Polish debt — **MOSTLY SHIPPED 2026/04/24-25** > **All Phase 9 work is paused until Phase 1 – Phase 8 are closed.** Per Jake's rule: features first, polish second. @@ -243,6 +243,29 @@ The bus applies suppression rules, then dispatches via Rust commands for platfor **Estimated effort.** 1 – 2 days. +**Shipped note (2026/04/25).** Sub-phases 9a (export plumbing) + 9b +(LLM content tags + migration v14 + storage extension) + sparkline +motion / a11y polish all on `main`, commits `49a795f` to `dd45f10`. +Migration v14 adds `transcripts.llm_tags`; `update_transcript_meta` +gains a sixth Option; the latent `manualTags` persistence bug was +also fixed in passing (the pre-existing `saveHistory()` no-op stub +is now bypassed by HistoryPage tag handlers calling +`saveTranscriptMeta`). Suite green: 277 cargo tests / clippy clean +all-targets / fmt clean / svelte-check 0/0 / npm build clean. + +**Deferred to Phase 9 follow-up (post-v0.1 polish iteration):** +- Full `SettingsPage` regroup into 7 progressive-disclosure groups + (Start here / Transcription / Tasks / Rituals / Notifications / + Accessibility / Advanced) plus search box. The 2309-line file + uses a hand-rolled accordion that needs careful unwinding; only + the Phase 8 carryover sparkline relocation landed this session. + `SettingsGroup.svelte` component is in tree, ready for that pass. +- Walkthrough-driven a11y / contrast / typography sweeps. The + scoped checklist (keyboard traversal, focus-visible ring sweep, + WCAG AA contrast in both themes, dark-mode parity, prefers- + reduced-motion checks) needs a running dev server to validate. + Phase 10a QC absorbs the walkthrough. + --- ## Phase 10 — QC + rename + release — **SPLIT 2026/04/23**