Adopting the data-first roadmap workflow in this repo specifically. Companion to DESIGN.md and dashboard_roadmap.md.
ROADMAP.md— ~130+ tasks across phases, prose tables. Source of truth today.ROADMAP.livemd— staged (AM ingit status). Experimental Livebook workbench.- Skills assuming current shape:
task-driver,audit-review,task-prioritizationinclude,linear-workflow.md§ "ROADMAP-Fallback Flow". - Cross-repo coordination:
ccxt_clientROADMAP referenced in CLAUDE.md § "Documentation invariants" rule 6.
roadmap/tasks.toml— source of truth (schema inDESIGN.md).ROADMAP.md— regenerated byrmap render. Marker-bounded table blocks; phase prose, "Current Focus," and notes hand-edited above/below markers.roadmap/data.json— gitignored, regenerated, consumed by portfolio dashboard.ROADMAP.livemd— keep as workbench (readdata.json) OR deprecate. Decide separately.- Skills: continue reading
ROADMAP.md(rendered) initially. Migrate to readtasks.tomldirectly only after the rendering shape stabilizes.
- Ship
rmapPhase 1-2 in~/_DATA/code/rmap/.validate+renderto ROADMAP.md must work end-to-end. - Pilot phase: Phase 12 — recent, mid-size, well-understood ticker bundle. Hand-author
roadmap/tasks.tomlcovering only Phase 12 tasks. Runrmap render --dry. - Iterate template until rendered Phase 12 block matches the existing ROADMAP.md Phase 12 table closely enough that the diff is intentional improvements, not noise.
- Add markers
<!-- TASKS:BEGIN phase=12 -->/<!-- TASKS:END -->around the current Phase 12 table. Runrmap render. Verify only the marked block changed. - Pre-commit guard:
scripts/check-roadmap-sync.shrunsrmap validate --check-renderand exits non-zero iftasks.tomlwas edited without re-rendering. Wire via existing hook setup (no new framework). - Round-trip test: flip Task 74 status in
tasks.toml, rerunrmap render, confirm only the relevant row changed in ROADMAP.md. - Migrate remaining phases one at a time. Order: current focus phase first (active editing), then in reverse chronological order (recent phases more likely to need flips).
- Update
.gitignorewithroadmap/data.jsonandroadmap/dist/(the HTML render output dir from rmap Phase 6). - (Deferred) Update skills to read
tasks.tomldirectly. Preferrmapcommands over hand-parsing TOML — keeps skills schema-version-aware automatically:task-driver: replaceROADMAP.mdgrep withrmap next --json(rmap Phase 8). Addrmap show <id> --jsonfor body/AC lookup.audit-review: replace markdown regex-rewrite withrmap status N done(already shipped). Usermap diff(Phase 8) to summarize roadmap changes per PR.linear-workflow/ cloud delegation: usermap delegate <id> --to <agent>(Phase 9) to generate the prompt payload instead of templating by hand.task-prioritizationinclude: update doc references if the canonical scoring location moves.
- Decide ROADMAP.livemd fate. If keeping: have it read
roadmap/data.json(consume the same source the dashboard does, no parallel parsing logic). If deprecating: archive note in CHANGELOG + remove from CLAUDE.md references.
scripts/check-roadmap-sync.sh:
#!/usr/bin/env bash
set -euo pipefail
rmap validate || exit 1
diff <(rmap render --stdout) ROADMAP.md > /dev/null || {
echo "ROADMAP.md out of sync with roadmap/tasks.toml — run 'rmap render'"
exit 1
}Wire into existing hook configuration. If harness.yml (CI) runs the same check, drift can't even land in a PR.
Existing ROADMAP.md task IDs (74, 75, 90, 121, etc.) MUST be preserved during migration. They're referenced by:
task-driverskill ("pick task N")audit-reviewcommit messages- Linear issues (when applicable)
- PR titles (
Task 74: parseTicker field map (#21)) TODO(Task N):markers in source code per CLAUDE.md convention
The TOML migration is a reformat, not a renumber. Verification: a one-time script that asserts every Task N heading in old ROADMAP.md has a matching id = N row in tasks.toml after migration.
Delegation and parallelism markers in current ROADMAP.md rows (Task 80 [CX]) must round-trip through markers = ["cx"] in tasks.toml. Render template emits the [CX] suffix. Verify on pilot phase before broad migration.
CLAUDE.md § "Documentation invariants" rule 6 says: "a ccxt_extract task is not complete until its downstream ccxt_client impact is reflected." In the new schema, this is cross_repo = { repo = "ccxt_client", task_id = N }. The dashboard's cross-repo DAG view depends on this field being populated correctly during migration.
Audit existing ROADMAP.md for prose-form cross-repo notes ("blocks ccxt_client Task X", "depends on ccxt_client Y") and convert them to the structured field.
rmap Phases 9–10 add assignee, acceptance_criteria, created_at, started_at, done_at, scored_at, and blocked_reason. Do not backfill these during migration. They're all optional; populate going forward as tasks transition states. Backfilling 130+ tasks burns a day for low marginal value — the recently-active tasks accrue timestamps naturally as you flip statuses post-migration.
Exception: blocked_reason becomes required once rmap Phase 10 ships. Any task currently status = "blocked" needs a one-liner reason added at that point — that's a focused sweep, not a backfill.
- After Phase 12 pilot migration: full skill roundtrip —
task-driverpicks a Phase 12 task correctly,audit-reviewflips status,commit-reviewparses correctly. If any skill breaks, the rendering template needs adjustment, not the skill. - After full migration: synthetic drift test — edit
tasks.toml, skiprmap render, attempt commit, confirm pre-commit hook blocks. - After full migration:
rmap doctor(rmap Phase 11) returns clean — no orphan deps, no cycles, no stalein_progressolder than the migration date. - After portfolio dashboard ships: dashboard successfully consumes ccxt_extract's
data.jsonand renders all phases correctly.
rmapPhases 1-2 (in~/_DATA/code/rmap/): 1-2 days- Phase 12 pilot migration in this repo: half a day
- Template iteration to match existing format: half a day
- Remaining phases migration: 1 day (mechanical, paste-and-shape)
- Skill updates (deferred step 9): 1 day when triggered
Total to "fully migrated, skills unchanged": ~3-4 days. Skills migration: another day when you decide to do it.
- Renumbering tasks. IDs stay stable forever, even when tasks are superseded.
- Migrating CHANGELOG.md to structured format. Markdown changelog is fine — humans read it sequentially, not query-style.
- Migrating SCHEMA.md, CONSUMER_CONTRACT.md, REFACTOR.md. These are prose docs, not task databases.
- Linear sync from
tasks.toml. Skills handle that externally.