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) <noreply@anthropic.com>
123 lines
8.0 KiB
Markdown
123 lines
8.0 KiB
Markdown
---
|
|
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
|