Wrap fireEvent.keyDown calls in act() and assertions in waitFor() so
React state updates flush before checking side effects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- .claude/commands/create-adr.md: full template, ID numbering, superseding flow, best practices
- CLAUDE.md: ADR section now delegates to /create-adr for how-to details
- docs/adr/README.md: format spec, rules, index
- 0001: Tauri v2 + React stack
- 0002: filesystem as source of truth
- 0003: single note model (no tabs)
- 0004: vault vs app settings storage
- 0005: Tauri iOS for iPad (vs SwiftUI)
- CLAUDE.md: ADR process — when to read, when to create, when to supersede
Extract useSearchKeyboard, useCreateAndOpen, and useCreateOption hooks from
duplicated logic in InlineAddNote, NoteTargetInput, and AddRelationshipForm.
File score: 7.8 → 8.48. Raise average code health gate threshold to 9.31.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Both hotspot (≥9.5) and average (≥8.9) gates now block commit/push/CI
- Current average: 8.97 — threshold set at 8.9 to block regressions without
blocking the current state; aspirational target remains 9.5
- pre-commit: replaced phantom pre_commit_code_health_safeguard with real inline check
- pre-push: CodeScene step is now blocking (was informational-only)
- CLAUDE.md: explicit instructions to monitor both scores via MCP CodeScene
Claude Code must also test with pnpm tauri dev (not just Playwright)
when the task touches: filesystem, AI context pipeline, MCP server,
git integration, or native Tauri commands.
Playwright tests mock-tauri handlers — they cannot catch bugs in the
real file read/write layer. Phase 1b closes this gap.
Lesson from ai-chat-empty-body: bug was in MCP server reading from disk,
invisible to Playwright. Phase 1b would have caught it in attempt 1.
- Require Claude Code to write a new task-specific Playwright test for
every task (not just run existing smoke tests)
- Test must fail before fix and pass after — proves coverage
- Clarify that Phase 1 is Claude Code's quality gate, not Brian's
- Brian's Phase 2 is a reinforcement check; if he finds a bug that
Phase 1 should have caught, that is a Phase 1 failure
Lesson from ai-chat-empty-body: 5 QA cycles happened because Phase 1
never verified that the AI actually received note content end-to-end.
Updated all three docs to reflect significant features added since they were last written:
- AI agent panel (Claude CLI subprocess with tool execution + NDJSON streaming)
- Vault cache system (git-based incremental caching in cache.rs)
- Theme system (vault-based themes, useThemeManager, ThemePropertyEditor)
- Search & indexing (qmd integration, keyword/semantic/hybrid modes)
- Pulse view (git activity feed with pagination)
- GitHub OAuth (device flow, vault clone/create)
- Vault management (multi-vault, vault config, onboarding, WelcomeScreen)
- Raw editor mode (CodeMirror 6 alternative)
- Command palette (Cmd+K registry)
- Auto-sync & conflict resolution
Also added mandatory docs-update rule to CLAUDE.md: docs/ files must be
updated in the same commit as significant feature changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds headless Chromium smoke tests that run before push, catching
UI/UX bugs before Brian QA. Includes shared helpers for command
palette and keyboard shortcut testing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude Code must now run Playwright smoke tests against the dev server
before firing the done signal. This catches UI/UX bugs (missing Cmd+K
commands, broken shortcuts, layout issues) before Brian's native QA.
- Phase 1 (Playwright, headless) = Claude Code's responsibility
- Phase 2 (native Tauri, keyboard-only) = Brian's responsibility
Phase 1 covers: command palette entries, keyboard shortcuts, Tab
navigation, UI state changes. Phase 2 covers: file system, git, native
Tauri behaviors that can't run in the browser.
- Add --no-clean to cargo llvm-cov for incremental builds (~5s vs ~8min)
- Skip Rust checks when no src-tauri/ files changed
- Merge redundant frontend test + coverage into single coverage step
- Reorder: fast lints (fmt, clippy) before slow coverage for quick feedback
- Add timing output and LAPUTA_FULL_COVERAGE=1 escape hatch
Expected: frontend-only push ~1 min, frontend+Rust ~2-3 min
All checks now run locally via .husky/pre-push before any push.
This eliminates GitHub Actions queue, runner saturation, and
'waiting for status' blocks entirely.
Hook runs: tsc, Vite build, frontend tests, frontend coverage (≥70%),
Rust coverage (≥85%), Clippy, rustfmt, CodeScene (≥9.2).
Claude Code is explicitly forbidden from using --no-verify (documented
in CLAUDE.md). Branch protection required status checks removed.
Remote CI kept as non-blocking safety net only.
The project currently scores ~9.33, so raising the CI gate from 8.45
to 9.2 prevents significant regressions while leaving headroom.
Updates both the CI workflow threshold and CLAUDE.md documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>