Refactor Roadmap
Date: 2026-06-08
This roadmap assumes source changes happen in later work. No source code was modified during this audit.
Slice 0: Set Product Contracts Before Code#
Goal: remove ambiguity before moving files.
Decisions:
- Is local GitHub ingest
gh-based, Composio-based, or are these two explicitly separate products? - Is scheduled Garden installed by default or opt-in?
- Are deprecated aliases temporary or permanent compatibility?
- Is
almanac servea current-wiki viewer or a global local Almanac console?
Outputs:
- Update active repo instructions and wiki pages after decisions.
- Write tests around chosen public behavior before deleting alternatives.
Why first:
Several smells are product conflicts, not TypeScript problems. Refactoring them without a product decision would just move the ambiguity.
Slice 1: Lazy CLI Registration And SQLite-Free Cleanup#
Goal: delete or sharply shrink src/cli/sqlite-free.ts.
Implementation direction:
- Make registration files safe to import without loading SQLite-heavy modules.
- Lazy-import command implementations inside Commander action handlers.
- Keep the early ABI guard and setup/update/doctor recovery behavior.
- Preserve setup shortcut behavior only if Commander itself cannot own it.
Likely files:
src/cli.tssrc/cli/register-*.tssrc/cli/sqlite-free.tsbin/codealmanac.ts- setup, automation, doctor, update tests
Tests:
- ABI guard behavior for broken
better-sqlite3. - Setup/update/doctor/uninstall commands still run in recovery mode.
- Help output and deprecated groups stay stable where intentionally retained.
Success condition:
There is one command parser for public flags, or a very small documented recovery parser for the minimum repair surface.
Slice 2: Typed Lifecycle Start APIs#
Goal: stop routing durable lifecycle facts through CLI output.
Implementation direction:
- Add
src/capture/start.tswithstartCaptureRun(). - Add
src/ingest/start.tsif ingest-specific operation setup remains thick. - Make
runCaptureCommand()andrunIngestCommand()render typed results. - Make
capture sweepconsume typed capture-start results directly. - Move GitHub PR report-output policy out of
src/cli/commands/operations.ts. - Replace message-substring operation error classification with typed errors.
Likely files:
src/cli/commands/operations.tssrc/cli/commands/capture-sweep.tssrc/capture/sweep.tssrc/capture/start.tssrc/ingest/start.tssrc/operations/*
Tests:
capture sweeprecords run ids without parsing stdout.- JSON and text CLI output can change without breaking sweep ledger behavior.
- Ingest output behavior remains stable.
- Error rendering covers typed missing-wiki and source setup failures.
Success condition:
CLI command rendering is no longer an internal API.
Slice 3: Unified Capture Discovery#
Goal: make manual capture and scheduled sweep use the same session candidate model.
Implementation direction:
- Reuse
src/capture/discovery/*for manual capture. - Remove Claude-only directory/content fallback from
src/capture/input.tsor replace it with shared candidate discovery. - Implement manual selection policy over
SessionCandidate. - Either support
capture --app codexor remove the flag until supported. - Keep quiet-window and ledger policy in sweep.
Tests:
- Manual capture can select Claude and Codex candidates when requested.
- Explicit transcript file capture still works.
- Sweep behavior stays unchanged for quiet-window eligibility.
- Large transcript discovery uses bounded reads.
Success condition:
"Transcript discovery" has one code path and two selection policies.
Slice 4: Provider Identity And Runtime Contract Cleanup#
Goal: remove duplicated provider facts and stale runtime fields.
Implementation direction:
- Add a small shared
ProviderIdidentity catalog. - Rename readiness provider interfaces/types to avoid looking like runtime providers.
- Use one provider-id guard in config, process spec validation, and records.
- Remove
AgentRunSpec.connectorsunless a chosen product path requires it. - Keep
networkAccessor a neutral runtime requirement for sandbox behavior. - Remove nested
display.rawfrom persisted harness tool events. - Normalize Codex thread/turn ids as explicit fields if viewer/jobs need them.
- Delete doctor's injected provider-status branch and use readiness providers.
- Decide and remove or quarantine legacy Codex exec exports/tests.
Tests:
- Provider default model and display name are consistent in setup, agents, operations, and records.
- Doctor injected status follows the same readiness catalog.
- Run logs do not persist raw provider protocol payloads by default.
- Codex app-server network access still works for source ingest.
Success condition:
There is one provider identity vocabulary and no stale Composio-shaped runtime field in provider-neutral specs.
Slice 5: Query Read Models And Viewer Split#
Goal: make CLI and viewer read from shared wiki query projections.
Implementation direction:
- Add
src/wiki/query/pages.ts. - Add
src/wiki/query/topics.ts. - Move page summary, topic detail, topic list/count, and path mention projections out of CLI/viewer modules.
- Split
src/viewer/api.tsinto wiki, jobs, review, and connections modules. - Decide whether
serveis global local console or current-wiki viewer and update help/docs accordingly.
Tests:
- CLI
search,show,topics, and viewer API agree on archive filters, topic counts, file mention semantics, and page summaries. - Global viewer behavior is covered if retained.
- Binding help/docs reflect exposed scope.
Success condition:
Viewer and CLI can differ in presentation, not in duplicated graph semantics.
Slice 6: Health And Source Maintenance Split#
Goal: keep diagnosis, source checks, and deterministic repairs separate.
Implementation direction:
- Move source/citation checks into
src/wiki/sources/health.ts. - Move legacy source-frontmatter repair into
src/wiki/sources/maintenance.ts. - Keep
src/wiki/health/index.tsas report composition. - Reuse shared frontmatter parsing for empty-page body checks.
- Keep
health --fixnarrow and explicit.
Tests:
- Existing health categories stay stable.
health --fixonly rewrites safe legacy source frontmatter.- Empty page detection uses the same frontmatter semantics as the indexer.
Success condition:
Health is not the place where arbitrary wiki repair logic accumulates.
Slice 7: Source Access Product Cleanup#
Goal: resolve the local gh versus Composio split.
If local gh wins:
- Remove or park
connect github/source githubif they are not current product. - Remove connector runtime tests and config fields that no production path uses.
- Keep source-ref parsing and
ingest github:pr:Nas a simple local tool path.
If Composio wins:
- Move GitHub source resolution to connector account selection.
- Pass connector requirements through a connector/source boundary, not directly through harness provider-neutral specs.
- Replace
ghprompt guidance and tests.
Tests:
- One happy path and one missing-auth path for the chosen source model.
- No stale docs/wiki claim the opposite source model.
Success condition:
There is one obvious answer to "how does local GitHub ingest read PR material?"
Slice 8: Documentation And Wiki Cleanup#
Goal: align repo instructions with source truth after the code moves.
Targets:
MANUAL.mdAGENTS.md/ imported instructions if needed- active
.almanac/pages/*architecture pages - command help text
- stale plans only when directly harmful
Updates:
- Narrow the no-AI/page-write invariant.
- Document provider runtime/readiness split with current names.
- Document viewer product scope.
- Remove stale
bootstraplanguage. - Record any intentional permanent compatibility aliases.
Success condition:
Future agents do not rebuild deleted architecture from stale docs.