Files
bbs-md/.planning/STATE.md
T
ruohki 8ea4545c9b docs(03-01): complete link record extraction and wiki-link resolution plan
- 03-01-SUMMARY.md: documents LinkRecord struct, render_markdown signature change,
  resolve_wiki_link algorithm, is_within_vault guard, and all decisions
- STATE.md: advance to Phase 3 Plan 2, update progress to 75%, add 3 decisions,
  mark NAV path traversal blocker resolved
- ROADMAP.md: update phase 3 plan progress (1 of 2 summaries)
- REQUIREMENTS.md: mark NAV-01, NAV-02, NAV-10 complete
2026-02-28 23:06:30 +01:00

4.4 KiB

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 3 IN PROGRESS — Plan 01 done (LinkRecord, wiki-link resolver, path traversal guard)

Current Position

Phase: 3 of 4 (Navigation and Links) — IN PROGRESS Plan: 1 of 2 in current phase (03-01 done, 03-02 next) Status: 03-01 complete — link metadata extraction and wiki-link resolution implemented Last activity: 2026-02-28 — Plan 01 complete (LinkRecord, ENABLE_WIKILINKS, resolve_wiki_link, path traversal guard)

Progress: [████████░░] 75%

Performance Metrics

Velocity:

  • Total plans completed: 6
  • Average duration: 2.7 min
  • Total execution time: 0.27 hours

By Phase:

Phase Plans Total Avg/Plan
01-safety-foundation 3 7 min 2.3 min
02-vault-core-and-rendering 3 9 min 3.0 min
03-navigation-and-links 1 so far 3.5 min 3.5 min

Recent Trend:

  • Last 5 plans: 3 min, 2 min, 2 min, 4 min, 3 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 added to main.rs during Plan 02 (not Plan 03) — compiler needs them to check renderer.rs
  • 02-01: syntect default-fancy feature uses pure-Rust fancy-regex (avoids Oniguruma C lib)
  • 02-02: Full emit_code_block and emit_table written in Task 1 (not stubs) — avoids throwaway code
  • 02-02: Box width for code blocks capped at terminal width — prevents border overflow on long lines
  • 02-02: Table n_cols derived from max(alignments.len(), max row length) — handles malformed GFM tables
  • [Phase 02-03]: raw_content stored in App for resize re-render — avoids disk re-read on window resize
  • [Phase 02-03]: draw_error_screen() unified for Missing and Error via Option<&str> reason parameter
  • [Phase 02-03]: Scroll keys placed before _ catch-all — j/k during quit prompt does not dismiss it
  • [Phase 03-navigation-and-links]: vault_path added to render_markdown for render-time broken wiki-link detection
  • [Phase 03-navigation-and-links]: Broken wiki-links checked at render time; standard links deferred to navigation time
  • [Phase 03-navigation-and-links]: link_span_start_count field tracks span array position at Tag::Link Start for span_len computation

Pending Todos

None.

Blockers/Concerns

  • REND blocker resolved: renderer.rs uses no Widget trait at all — render_markdown() returns Vec<Line<'static>> which Plan 03 passes to Paragraph::new(). No custom Widget needed.
  • NAV path traversal resolved: is_within_vault() with canonicalize + starts_with guards all link resolution in vault.rs
  • 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 03-01-PLAN.md Resume file: .planning/phases/03-navigation-and-links/03-02-PLAN.md