Shubo · Roadmap

Snapshot of ROADMAP.md · 2026-06-14 · the markdown is canonical (regenerate after edits)
file-based Linear · DIRECTION / DESIGN / FEAT / ROADMAP / HELP
To decide what's next, read this board — the Now cycle + the ranked backlog — and open a single FEAT- only when it's the in-flight one. Never read every FEAT to choose (that's how focus is lost). Closed FEATs archive, so the board stays a short list of in-flight work — a focused board, not a pile of stale tickets.
Now — current cycle
▶ WAVE 1 · personal-first

Light up import-bibtex → library → AI gate → ask

The first end-to-end personal-first path — free to validate, zero collab/billing.

Feature☑ done this waveStatus
reference-managerBibTeX import/export · CRUD · dedup · enrich · AI-gate wiring · OA full-text fetchBuilding · full-text + listing + OA landed
onboardingsilent personal workspace · import route → LibraryBuilding · workspace + DOI-paste shipped
AI gatewire to existing ingestion / RAG / chat (RM R3)Next
End-to-end acceptance: sign up → import (paste DOIs today; .bib/CSL-JSON file drop next) → library lights up → open the AI gate → ask your library, get a grounded answer with citations.
Not in Wave 1: PDF/Zotero/link doors · Scholar/topic routes · the write feature · all share-era (collab/comment/notification) · billing — all ☐, deferred.
Backlog — ranked, foundation before leaves

PHASE 0 personal-first foundation

Free to validate. The R-sequence everything else gates behind.

1Reference Manager
Building · full-text + listing + OA landed
now — full-text Part 1 (#113/#102) + listing controls (#119/#104) + Unpaywall OA (#120) landed; R3 AI-gate + full-text Part 2 + .bib import next
Pull 5Gate 5Effort 3Rev 5
2Onboarding · 3 routes
Building · workspace + DOI-paste shipped
silent workspace + DOI-paste import shipped (PR #99); .bib file import + route ① OpenAlex/ORCID claim next; ★ "add your work" is the killer-feature prerequisite
Pull 5Gate 4Effort 3Rev 4
depends on reference-manager (Library destination needs the Reference entity)
3Write
Next
after RM — hand-write + cite + resolve (non-AI core), then AI grounded-write (lazy gate)
Pull 4Gate 4Effort 3Rev 4
depends on reference-manager (cite from library + shared deterministic resolver)

PHASE 1 share era

Gated after personal-first is complete. Share verbs unlock these.

4Real-time Collaboration
Next · designed
when share lands — the collaboration base (Hocuspocus + Yjs)
Pull 3Gate 5Effort 3Rev 5
depends on personal-first complete
5Comments
Next · designed
right after collab — "share to comment", anchors free from Yjs
Pull 4Gate 3Effort 4Rev 5
depends on collaboration (Yjs anchor layer)
6Notification Center
Next · designed
with comment — mention/reply triggers; self-built center + Sonner toast
Pull 3Gate 3Effort 4Rev 5
depends on collaboration (event source)
Dependency order — who unblocks whom (no time scale)
Reference Managernon-AI core · root
RM · library + citation resolveR0 ✓
Onboardingneeds RM
Onboarding
Writeneeds RM · non-AI core
Write · hand-write + cite + resolve
AI tierlazy gate, on top
ask your library · AI grounded-writeAI
personal-first complete · share verbs unlock
Collaborationafter personal-first
Collaboration
Commentsneeds collab
Comments
Notificationneeds collab
Notification
Phase 0 · non-AI core (free) AI tier · lazy gate on top Phase 1 · share era ← left = dependency depth, not time
Status — just three (keep PM simple)
Next Building Shipped archive/ · closed
Next = queued (raw idea → fully-designed; readiness shows in the FEAT's own filled sections). Building = being built now (the Now wave). Shipped = a user can actually do the thing — that, not a green backend, is the bar; only Shipped triggers a help article (R7). Design-done and code-green (e.g. RM's R0) are Scope ☑ facts inside the FEAT, never board states. A finished FEAT closes to archive/ (self-labeled Shipped ✓) with the repo's docs/ + help/ as its living record. The board shows only: what's shipped, what's building, what's next.
System map — five concepts (frame → work → outward truth)

Two former "layers" were cut to stay simple: archive/ is a state (Retired), not a doc type — see Status above; and inward "how it works" is not a planning prefix — it lives in each repo's docs/ / docs/invariants/ next to the code (the quality gate), so planning owns only the outward help/.

LayerPrefix / fileManagesTime
VisionDIRECTION-why we exist / where to gorarely changes
DesignDESIGN-cross-feature laws a FEAT obeysrevised, never ships
FeatureFEAT-<name>one buildable unit (+ Scope ☑/☐)ships complete
BoardROADMAP.mdranking + Now + disciplinealways rolling
Help (outward)help/ · MkDocswhat a user can do today · en/zh-Hans/zh-Hant · on shiptracks shipped
Discipline — R1–R7 (the system stays alive)
R1 · discovery before creation
Discuss a feature → first check it's in a FEAT; if not, create one + register in ROADMAP. A conclusion that stays in chat didn't happen.
R2 · single source of truth
A decision/scope lives in one doc (its FEAT/DESIGN); ROADMAP only references.
R3 · status freshness
Code lands → mark the FEAT ☑→✓, update status, roll Now. A board that lies is worse than none.
R4 · wave rolling
Wave end-to-end green → check the next ☐ batch → roll Now to Wave N+1. One cycle at a time.
R5 · prefix / extract-DESIGN + archive-on-close
Hit a decision bigger than the feature (constrains others) → extract a DESIGN the FEAT references. Two things archive: dropped/superseded (✗) and fully-closed FEATs (✓, once the repo docs/ + help/ exist). The bloat valve — the live board shows only in-flight work.
R6 · no BUG-/IMPROVEMENT-
Improvement = a ☐ item or a new FEAT; a bug worth fixing is just fixed.
R7 · HELP on ship
When a user-facing feature ships: confirm the repo's docs/invariants reflect it (inward — already required by the quality gate) + write the help-center article (outward, en/zh-Hans/zh-Hant) from the user's POV. Tracks shipped reality — never pre-written from the roadmap.
⚙ enforced by
the shubo-planning skill — fires whenever a feature/scope is discussed.