# Project State ## Project Reference See: .planning/PROJECT.md (updated 2026-02-28) **Core value:** Users can connect via SSH and seamlessly browse a vault of linked markdown documents with retro BBS aesthetics **Current focus:** Phase 2 in progress — Plan 01 complete (vault core + highlighter foundation) ## Current Position Phase: 2 of 4 (Vault Core and Rendering) — IN PROGRESS Plan: 1 of 3 in current phase (plan 01 done) Status: Phase 2 Plan 01 complete — Plan 02 (markdown renderer) next Last activity: 2026-02-28 — Plan 01 complete (deps, vault.rs, highlighter.rs) Progress: [████░░░░░░] 33% ## Performance Metrics **Velocity:** - Total plans completed: 4 - Average duration: 2.2 min - Total execution time: 0.14 hours **By Phase:** | Phase | Plans | Total | Avg/Plan | |-------|-------|-------|----------| | 01-safety-foundation | 3 | 7 min | 2.3 min | | 02-vault-core-and-rendering | 1 | 2 min | 2.0 min | **Recent Trend:** - Last 5 plans: 2 min, 3 min, 2 min, 2 min - Trend: Stable *Updated after each plan completion* ## Accumulated Context ### Decisions Decisions are logged in PROJECT.md Key Decisions table. Recent decisions affecting current work: - Pre-Phase 1: Verify `edition = "2024"` compiles before changing to 2021 — leave it if `cargo build` succeeds - Pre-Phase 1: Use pulldown-cmark event-based approach for markdown parsing (not comrak) - Pre-Phase 1: No tokio/async runtime — synchronous event loop only - Pre-Phase 2: Choose wiki-link parsing strategy before implementation (regex pre-pass vs post-parse interception) - 01-01: Resolve relative vault_path against config file parent dir (not cwd) — bbs.toml lives next to binary - 01-01: detect_login_shell() called before parse_cli() — both read argv[0], parse_cli strips the dash - 01-02: Use ratatui::crossterm re-export path — crossterm is transitive dep, not direct dep in Cargo.toml - 01-02: SIGINT not registered via signal-hook — crossterm key events handle double-press Ctrl+C in Plan 03 - 01-02: restore_terminal() skips ratatui::restore() — that would call LeaveAlternateScreen (never entered) - 01-03: show_goodbye() called after restore_terminal() — terminal must be in cooked mode before println! is safe - 01-03: app_config stored in App struct for Phase 2 access — vault_path accessible inside event loop - 01-03: Quit prompt cleared on any non-Ctrl+C key — pressing any key dismisses double-press window - 02-01: LinesWithNewlines iterator added to preserve trailing \n for syntect grammar correctness - 02-01: mod declarations omitted from main.rs — Plan 03 handles wiring for all Phase 2 modules - 02-01: syntect default-fancy feature uses pure-Rust fancy-regex (avoids Oniguruma C lib) ### Pending Todos None. ### Blockers/Concerns - **REND**: ratatui 0.30 Widget trait confirmed: `impl Widget for &Foo` pattern required (NOT WidgetRef) — Plan 02 must use reference-based impl - **NAV**: Path traversal via wiki-links must be addressed in Phase 3 link resolver — canonicalize and prefix-check every resolved path - **LIVE**: notify 8.x API must be verified at integration time; watch only current file (not full vault) to avoid inotify exhaustion ## Session Continuity Last session: 2026-02-28 Stopped at: Completed 02-01-PLAN.md — vault.rs and highlighter.rs created, cargo build clean Resume file: .planning/phases/02-vault-core-and-rendering/02-02-PLAN.md