Roadmap
This is a direction document, not a backlog. The milestone tables below are
projected from the docs/planning/milestones/
corpus — edit a milestone entity (or run sdlc milestone create) and
regenerate. The narrative threads under them are hand-authored direction,
reviewed as code.
Active
Section titled “Active”The milestones in flight now.
| Id | Title | Version | Target date | Summary |
|---|---|---|---|---|
| commonality-configs — one declared bar for every TypeScript project | commonality-configs — one declared bar for every TypeScript project | |||
| Initial Product Definition | Initial Product Definition | 0.1.0-alpha | ||
| Learning: one solution for interactive books on the determined platform, as a plugin | Learning: one solution for interactive books on the determined platform, as a plugin |
Emerging
Section titled “Emerging”Drafted or planned, not yet started.
| Id | Title | Version | Target date | Summary |
|---|---|---|---|---|
| A model for planning roots | A model for planning roots | 0.19.0 | ||
| Adopt flow | Adopt flow | 0.13.0 | ||
| Agent personas + verification skill (static + judgement) as implementation-process steps with rework loops | Agent personas + verification skill (static + judgement) as implementation-process steps with rework loops | |||
| Backup: retention and pruning | Backup: retention and pruning | |||
| Checks and judgement | Checks and judgement | 0.14.0 | ||
| Config explorer | Config explorer | 0.16.0 | ||
| Cross-project addressing | Cross-project addressing | |||
| Definition kinds compose | Definition kinds compose | |||
| Definition package publishes | Definition package publishes | |||
| Documentation strategy: taxonomy, drift, audiences, site | Documentation strategy: taxonomy, drift, audiences, site | |||
| Foreman stack lands | Foreman stack lands | |||
| graph-scheduler v0.1 — DAG core, push engine, rules, ordering, goal-direction, pull, tracker, docs | graph-scheduler v0.1 — DAG core, push engine, rules, ordering, goal-direction, pull, tracker, docs | 0.1.0 | ||
| Initial entity shape and roster | Initial entity shape and roster | 2026-06-17 | ||
| Lossless markdown CST core | Lossless markdown CST core | |||
| markdown-contract typed-cell wins | markdown-contract typed-cell wins | |||
| Module graph, in SDF first | Module graph, in SDF first | |||
| Multi-repo dispatch | Multi-repo dispatch | |||
| One contract layer across the fleet | One contract layer across the fleet | |||
| Polish schema validation live end-to-end | Polish schema validation live end-to-end | |||
| Pumice desktop app integration | Pumice desktop app integration | |||
| Pumice vault export | Pumice vault export | |||
| Query and index plane | Query and index plane | |||
| Record | Record | 0.17.0 | ||
| Routing and steering | Routing and steering | 0.15.0 | ||
| Scratch-root e2e for our apps | Scratch-root e2e for our apps | |||
| SDF serves several repositories through one interface | SDF serves several repositories through one interface | 0.20.0 | ||
| SDF shared on the web, with planning views | SDF shared on the web, with planning views | 0.9.0 | ||
| SDLC on foreman | SDLC on foreman | |||
| sdlc usable with nested projects | sdlc usable with nested projects | 0.10.0 | ||
| Secure execution environment | Secure execution environment | 0.18.0 | ||
| Self-hosting SDLC entities: scaffold and validate the planning model | Self-hosting SDLC entities: scaffold and validate the planning model | |||
| System overview | System overview | 0.12.0 | ||
| Task execution consistency | Task execution consistency | 2026-06-30 | ||
| Task: fully fleshed out and tightened end-to-end | Task: fully fleshed out and tightened end-to-end | |||
| Test repositories with starter data | Test repositories with starter data | 0.11.0 | ||
| The Agent Manager workbench | The Agent Manager workbench | |||
| TypeScript frontmatter consumers on markdown-util | TypeScript frontmatter consumers on markdown-util | |||
| Vault kernel and structural transforms | Vault kernel and structural transforms | |||
| WASM/TS distribution surface | WASM/TS distribution surface |
Shipped
Section titled “Shipped”Closed milestones, with what shipped.
| Id | Title | Version | Shipped |
|---|---|---|---|
| Adopt augmented_books into the monorepo | Adopt augmented_books into the monorepo | 0.6.0 | Complete, shipped as v0.6.0. The full augmented_books repo is folded into the monorepo. Phase 1 vendored 11 shared TS packages (T-LVLY #911) and 2 Rust crates (T-F0B2 #906) and adopted the apps — augmented-books desktop (T-JV2A #931), learn_web (T-6C0Z), augmented_web (T-KTGF), augmented_dot_com (T-LAKY), and the package demos + vimit_prototype (T-UPV1) — with obsidian-bases converged onto @sksizer/obsidian-bases (T-NLKF). Phase 2 reframed the up-front convergence audit as in-place staging (T-JCML superseded): added the solutions/ tier to D-0001 (T-1YSW), removed the three clear-duplicate packages (T-J5DI), and consolidated the family into solutions/augmented/ (T-C9RD #1010). vimit landed last as solutions/augmented/apps/vimit/ (T-B98V #1102); the upstream repo was archived (T-B1VB). vimit post-mortem follow-ups #1103/#1105/#1106/#1108 also merged. |
| Backup: standalone installable app on current Determined patterns | Backup: standalone installable app on current Determined patterns | 0.8.0 | Delivered. Backup is served by the Rust arm, the node arm and apps/vault-backup are gone from main, and the app installs as Determined Backup.app. It has an in-app schedule, file restore with Undo, markdown previews, and an end-to-end suite. PRs: #2443, #2444, #2446, #2448, #2442, #2447, #2449, #2445, #2466. Caveats. CI has never run on this work because GitHub Actions is blocked by billing, so the evidence is local runs. The installed app was launched with a Finder-style environment and took a snapshot, but its UI flows (first-run picker, Back Up Now, restore, Show in Finder) were not clicked in the real packaged window. The criterion about launching from Finder and asking for a vault is left unticked for that reason. Scheduled backups run only while the app is open, by scope. Storybook enrolment was narrowed out of the preview and restore tasks, because the experience has no Storybook host. |
| Books consolidation and augmented dissolution into solutions/augmented_learning | Books consolidation and augmented dissolution into solutions/augmented_learning | Superseded 2026-09-13 by [[M-8L1Z]] under [[D-LIRI]]: the books are rebuilt as one learning solution over vaults rather than relocated intact. | |
| Capability model adoption | Capability model adoption | 0.3.2 | Delivered by both member tasks. Capability schema v2 has no contains and every renderer — index, site projection, definition — derives children by inverting parent_key; kind is the optional 11-grain structural enum and audience (user | system, default system) carries the old feature / technical split and drives index sectioning; locations[] ships on the shared five-form Location grammar in lib/util/location.ts; and the combined v1→v2 migration runs clean across the corpus. Two footnotes, neither a gap: the criterion’s “20 instances (8 user / 12 system)” is arithmetic drift — the corpus grew to 27 and reads 8 user / 19 system, the user side unchanged; and the one remaining capability audit finding ([[C-409J-dag-core]] anchor rot) now points forward at packages/rust/graph-scheduler/src/graph.rs, which [[D-VSLI-distributed-work-runner-architecture]] implementation-ledger phase E3 builds — not this milestone’s work. version was assigned by the 2026-08-16 milestone audit from the delivery date (2026-07-18) to preserve roadmap order; no release tag was cut for it. |
| Claude Orchestrated Task Execution Prototype | Claude Orchestrated Task Execution Prototype | 0.2.0-alpha | Superseded by [[D-VSLI-distributed-work-runner-architecture]], whose implementation ledger records this disposition directly: the whole deliverable set is the prose orchestrator the engine replaces, and nothing distinct survives. The prototype was largely built and does run — the executable-task lifecycle operations ship on the TypeScript substrate, /sdlc:orchestrate selects ready tasks and classifies open PRs across ticks, git-ref leases coordinate parallel runs, and leaf-only kind: implementation dispatch landed with [[T-JOXA-task-kind-field-and-leaf-dispatch]] — so this is a goal reframed, not abandoned. What changed is the substrate: D-VSLI replaces ~3,750 lines of lifecycle SKILL.md with a Rust engine, and the four deliverables are re-specified as implementation-ledger phases E3 (scheduling and the filter chain), E4 (process registry), and E6 (engine v0). Track the work there rather than here. |
| Conflict-aware parallel dispatch | Conflict-aware parallel dispatch | [[D-VSLI-distributed-work-runner-architecture]] splits this three ways, and all three members are closed. Write-set conflict detection becomes implementation-ledger phase E3’s scope-conflict filter over declared scope claims ([[T-U3NR-task-write-set-conflicts]]). PR-fact drift becomes a detector on phase E2’s level-triggered reconciler rather than a lint ([[T-9TYJ-audit-pr-fact-status-drift]]). The routing table becomes the runner context a phase E4 process registration declares ([[T-Z56F-orchestrate-routing-table]]). | |
| D-0014 distribution migration — CLI-primary npm artifact | D-0014 distribution migration — CLI-primary npm artifact | Closed partial: six of eight deliverables shipped, the distribution half was superseded, and one integration question was neither delivered nor superseded. Shipped and live: runtime-agnostic shipped code, the skill corpus normalized onto the cli/sdlc launcher with the corpus-invocation gate enforcing it, code-root vs project-root fixes, the @sksizer/sdlc package reshape, sdlc harness install claude with doctor on the same install, and sdlc site build. Superseded: the git-pinned sksizer/sdlc-dist channel ([[T-75UD-release-ci-dist-repo]], closed obsoleted) was retired for [[D-2APS-sdlc-standalone-binary-app]]‘s compiled-binary public-npm channel, which [[M-XVOC]] delivered — that milestone also deliberately deleted this one’s gate runtime-agnostic, so criteria 1, 2 and half of 6 are answered elsewhere or negated on purpose. Not delivered and not superseded: the end-to-end consumer pilot ([[T-521G-pilot-consumer-polish]], closed obsoleted — polish stopped being a separate checkout and its tree is the frozen apps/legacy-polish per D-0011) and, with it, D-0014’s “Where the installed plugin lives” open question, which both install modes implement but no verdict ever settled. Those two want a fresh consumer-pilot task against the binary channel. [[D-0014-cli-primary-npm-distribution]] itself still describes the retired dist-repo channel as current and carries no link to D-2APS; amending it is separate follow-up. | |
| Forge port + pr-update extraction | Forge port + pr-update extraction | 0.7.0 | pr-update extraction, the port with GitHub and Forgejo adapters, and port-based pr classify shipped in #2373 (v0.7.0). Partial: pr-update survey/update still call GitHub directly, so they have no Forgejo path. Forgejo support is deferred; that work is [[T-KYRZ]]. Reconciled 2026-10-01. |
| Fully deterministic docs site: generated nav, supplemental mapping, corpus projections | Fully deterministic docs site: generated nav, supplemental mapping, corpus projections | 0.2.1 | Delivered by all ten member tasks (PRs #343-#360). The docs site is a pure build artifact: nothing generated is committed, the whole content root is swept for generator ownership and a foreign hand-written page exits NAMESPACE_CONFLICT, hand-written prose lives only under sites/df-docs/supplemental/ and maps in through sites/df-docs/site.yaml, the sidebar and site identity are generated modules astro.config.mjs merely imports, every registered entity type projects a roster plus child pages with a new type needing zero wiring, roadmap.md builds from milestone entities, and page bodies render through Eta templates. One criterion shipped amended rather than as written: the drift gate wired into quality_checks and lefthook is the real docs generate site build, not --check, because [[D-0010-deterministic-site-assembly]] made the site uncommitted and an uncommitted artifact has nothing to byte-diff against — byte-stability itself is test-pinned, and the build throws the same ownership errors. version was assigned by the 2026-08-16 milestone audit from the delivery date (2026-06-08) to preserve roadmap order; no release tag was cut for it. |
| Intersect v0.1 — pure core, path API, registry, fs layer | Intersect v0.1 — pure core, path API, registry, fs layer | 0.1.0 | Completed 2026-07-04. All six member tasks shipped test-first across PRs #551-#556: the JSON fixture corpus, the segment-core engine (automaton product + reachability), the path API, the labeled-pattern-set registry, the opt-in intersect/fs layer, and the package exports + README + extraction guards. Corpus is green with zero pending cases; . and ./segments pull zero runtime deps, only ./fs pulls tinyglobby. Docs followed in #557/#561 (TypeDoc + Astro Starlight) and #580 (docs-config guardrails). Follow-up beyond this milestone: the library was extracted from plugin/lib/ into the workspace package packages/ts/intersect (@sksizer/intersect); npm publish still deferred. |
| Markdown editing surface across the fleet | Markdown editing surface across the fleet | Closed partial: the engine, the chrome layer and the whole viewer rollout shipped, and SDF’s entity bodies became editable after it closed; only the surfaces that need a write op on a backend that still has none did not. 37 of 41 tasks closed done across sixteen merged PRs. Delivered — obsidian-editor v2 with a plugin contract, one command catalogue, overlay anchors, slash and wikilink completion, tables, math, mermaid, HTML details, a large-file guard, attachments and inline transclusion expansion, all on a swap-writer property the corpus enforces; @sksizer/markdown-ui as a Nuxt layer over @determined/ui carrying MdSurface and the toolbar, overlay, find and outline surfaces; notes and agent-pants rebuilt on MdSurface with eight experience-local components deleted; viewers rolled out to SDF entity bodies, suspenders, agent chat, pumice admin, learn_web, augmented_web and the canvas seam, deleting marked, dompurify and @nuxtjs/mdc at each site; and [[T-WUVP-sdf-entity-body-swap-write]], which shipped the body-write engine its own definition gap was waiting on — the frontmatter-preserving sibling of _update.ts, a compare-and-swap route over it, and an Edit toggle on all three SDF detail surfaces. Two Nuxt dashboards were retired to their CLIs. Not delivered — [[T-PFC2-suspenders-draft-body-editor]] stays planning/needs-definition because suspenders-core has no draft-body write; [[T-Q38X-editor-contract-validation-hint]] stays open/ready and is not blocked — its one dependency [[T-WUVP-sdf-entity-body-swap-write]] shipped inside this milestone, so it was simply not taken; [[T-HY7N-agentpants-drop-mdc]] is deliberately not taken, since [[D-A27T-suspenders-skill-experience-module]] marks apps/agentpants reference-only; and [[T-8H57-obsidian-md-review-bug-triage]] closed done on a later verification pass that traced all fifteen review findings to a fix with a targeted test — the work predates this milestone, which takes no credit for it, but the goal is met. | |
| markdown-contract adoption & cleanup | markdown-contract adoption & cleanup | 0.7.0 | Complete, shipped as v0.7.0. SDLC’s bespoke entity-markdown validator is fully replaced by the markdown-contract engine: one declarative contract per entity type is the live validator, and the SKILL.md-family project-check harness runs on it. The eight adoption PRs landed (Zod v4 migration, the contract substrate + registry, schema/contract consolidation, rewiring validate/audit/authoring, retiring the bespoke validator + AJV renderer + body-schema.yaml manifests, the implementation-ready task contract, tree-based readiness consumption, and the unified project-check harness), and every cleanup follow-up closed: stale body-schema.yaml / validate_frontmatter.ts / schema.json doc claims fixed (T-N19Y, T-MDJC, T-OQDE), audit.ts frontmatter parsing converged onto the contract path (T-19PE), dead exports + the cosmetic validate label removed (T-J8US), D-0004 reconciled with S-0005 (T-RXUK), and the read-side reads rebased onto markdown-contract (T-W7D5, T-1W6P, T-GOY0). 17/17 members closed. |
| markdown-util tier-0 extraction | markdown-util tier-0 extraction | 0.5.1 | Delivered. packages/rust/markdown-util/ exists at tier 0 with no non-dev dependencies, holding the byte-exact split/compose and the NoteShape/Split fidelity types; determined-vault re-exports them and its eight sibling crates stayed green; the D-4QGN framing corpus (tests/fixtures/conformance.json, 24 fixtures) runs against the crate and, because a peer TypeScript port reuses the same file, against both language arms. Every in-tree Rust splitter converged — apps/ontological-legacy, determined-polish (via the vault re-export), and the sdlc desktop reader ([[T-8K2M-converge-sdf-desktop-frontmatter-reader]], shipped 2026-07-31 and closed by this audit) — and the behaviour-sensitive ontological migration carries the named before/after fixture. Two documented exemptions, both deliberate and annotated in code: determined-authoring keeps its own BOM/CRLF-tolerant splitter pinned to a Node-regex golden, and apps/legacy-polish’s vaultpolish-core is declared a frozen reference tree rather than a migration source. version was assigned by the 2026-08-16 milestone audit from the delivery date (2026-07-31) to preserve roadmap order; no release tag was cut for it. |
| Milestone & orchestration: group, stack, and parallelize task execution | Milestone & orchestration: group, stack, and parallelize task execution | Superseded by [[D-VSLI-distributed-work-runner-architecture]]. Of the four success criteria, one shipped and three describe a shape the architecture replaces. Guided milestone definition shipped as /sdlc:milestone-new. Extracting a milestone’s hand-maintained tasks: list as the execution queue contradicts implementation-ledger phase C2, where milestone rosters become derived views and hand-maintained checklists retire — there is no list left to extract. Stacked-PR sequencing and parallel-PR-by-file-overlap selection become the phase E3 scope-conflict filter: scope claims stamped into the lease at claim, adjudicated pairwise by intersect, run by the engine on every dispatch rather than chosen per-batch by an operator, with dependency satisfaction as its own filter rather than a hand-built PR stack. No member tasks were ever scheduled against this milestone, so nothing is stranded by closing it. | |
| Monorepo restructure & dashboard migration | Monorepo restructure & dashboard migration | Closed partial: the monorepo half delivered in full, the dashboard’s packaging half stopped being wanted. Delivered — moon drives the workspace over Bun and Rust with justfile and lefthook intact and apps//packages/ts//packages/rust/ all live; the Astro site builds under Bun; the four-source active-work view (lease refs, task/milestone entities, local working state, GitHub PR status) ships in dashboard/server.ts; the generated typed client survives as packages/ts/dashboard-client and is what every read goes through; and [[S-0008-apps-consume-substrate-through-published-surfaces]] is open/active with its import-discipline validator wired into lefthook. Superseded — [[D-0018-sdf-control-plane-app]] excised apps/dashboard on 2026-07-16 and overrode D-0013’s Vite+Vue pick, so the SPA criterion is met in substance by SDF (Tauri 2 + Nuxt 4, [[M-5EEX]]) rather than by the app this milestone named; [[T-JDEV-dashboard-build-into-plugin]] and [[T-CKC1-tauri-desktop-wrapper]] closed superseded with it. The one genuinely unmet criterion is the committed drift-gated web-dist: it was declared moot rather than deferred — no web-dist exists, INDEX_HTML was kept as the legacy fallback instead of retired, and whether the plugin ships any consumer web UI at all is now an open question owned by D-0018, not by this milestone. Wave 4’s polyglot validation was promoted out exactly as the body anticipated, into [[M-0014]] and [[M-5EEX]]; the workspace is polyglot well past two ecosystems. | |
| Multi-harness control plane — canonical model + four targets | Multi-harness control plane — canonical model + four targets | 0.3.4 | Delivered by all five member tasks. HarnessModelSchema (v2) is host-neutral and markdown-contract-validated; deriveHarnessModel / importClaude bootstrap it from the live Claude surface with an import→export→import identity test; harness export <target> emits the full native surface for claude, codex, cursor and gemini, with json as a fifth interchange target; and examples/export-all.ts builds one model and reaches every target, pinned by tests. The only Claude asymmetry left is harness install claude, which this milestone’s Out-of-scope section explicitly permits. The code moved twice since the tasks shipped — the model and exporters now live in packages/ts/agent-plugin/, the CLI verbs in solutions/ontological/lib/services/harness/ops/ — so touchpoint paths in the member tasks read as missing without having regressed. Two housekeeping items ride along rather than block: [[C-HRNS-multi-harness-control-plane]] is still open/planned and carries no locations[] anchors, and conventions/harness-model.md still cites the pre-extraction model path. Publishing @sksizer/agent-plugin to npm is tracked separately on [[B-APKG-publish-path-resolve-agent-plugin-dependency]]. version was assigned by the 2026-08-16 milestone audit from the delivery date (2026-07-19) to preserve roadmap order; no release tag was cut for it. |
| One task vocabulary for every project | One task vocabulary for every project | 0.8.0 | Shipped as one branch and one PR, #1885 — all eleven tasks, 3,446 files. Every project now declares the same task vocabulary in its own ecosystem’s runner, with moon aspects supplying uniform names over the top. The ownership split is the rule: the native runner owns the command, the aspect owns the name, deps, inputs and caching, and the root justfile owns the parameterized entry points. publish-lib.yml rsyncs each mirror with --exclude 'moon.yml', so a task declared only in moon is lost on publish — which is why five of six publish-channel libraries had shipped with no typecheck. format, format:check and lint went from 11, 9 and 9 manifests to 153 of 153; typecheck from 45 to 77 of 77. layer: unknown and stack: unknown went to zero. scripts/guard-project-shape.ts holds all of it, with aspect coverage as a two-directional ratchet so the exception list shrinks instead of rotting. Verification was local throughout: GitHub Actions has run nothing since 2026-09-05. Six items are recorded in the Follow-up section rather than dropped, the largest being 19 projects that match no gate-supplying aspect because no application-tier aspect exists. |
| Op-substrate full sweep: capabilities born in lib | Op-substrate full sweep: capabilities born in lib | 0.2.0 | Completed 2026-06-06. 20/20 member tasks shipped across 24 PRs (#298-#327): the path[] op substrate (D-H7FS), every capability ported to lib ops on the 11-visible/4-hidden-noun surface, all callers codemodded to the sdlc CLI, plugin/scripts + plugin/validators + cli/lease_cli deleted behind the legacy-path guard, lefthook gates live, site reference + narrative docs regenerated against shipped reality. Exit criteria verified on main: 1322/0 tests, zero legacy refs, zero lib-to-skills imports, LEGACY_NOUNS=[backlog]. |
| Phase 0 — Keep the v0.3.1 capture local | Phase 0 — Keep the v0.3.1 capture local | This local-capture milestone is superseded by the later v0.4.0+ release campaign from the sksizer/sdlc product home (D-P3NF). The separate-clone tag and no-push criteria could not be verified in this checkout; this closure records supersession, not proof that those historical conditions were met. | |
| Phase 1 — Tracking, strict loop, relaxed task contract | Phase 1 — Tracking, strict loop, relaxed task contract | 0.4.0 | All five retroactive tasks are closed/done and carry landing commit evidence; the phase merged as #2289. The unchecked criteria and draft state were stale metadata. Reconciled 2026-09-30 against task notes and local merged history. |
| Phase 10 — OKF v0.2 conformance | Phase 10 — OKF v0.2 conformance | 0.7.0 | All three tasks shipped via #2412. T-P7F7’s hard-cutover rename (entity status -> state, schema bumps, migration transforms, every consumer, the GitHub label mirror, corpus-wide migration) landed first, then T-I1KJ (OKF’s own optional status: draft|stable|deprecated, provenance -> generated, wikilinks as capability-graph edges) and T-IZ3L (the docs/index.md OKF-bundle stamp, sdlc okf validate, wired into the strict check loop) built on it. No OKF v0.2 spec document exists anywhere in this repo, so every “optional key”/“bundle” design decision was made by judgment call and recorded in each task’s own completion_note. Phase gate: tsc --noEmit clean; bun test solutions/ontological scripts 4643 pass/0 fail (339 files); bun test ./.claude 85 pass/0 fail; entities audit --strict, roadmap check, docs generate --check, okf validate, and agent-pants check all exit 0. One code-review pass over the full three-task diff found 15 findings; 14 were confirmed real and fixed (leftover status reads in the verify/standards provider, the lease migration op, the desktop Tauri Rust control plane and its generated TS types, six folder-shaped decisions the corpus walker had missed, a migrate.ts bug affecting any entity type whose schema history doesn’t start at v1, audit.ts’s closed-entity fallback, a dead lifecycle check in .claude/skills/project-check, several stale docs/templates/ comments, and a fence-unaware wikilink scan); 1 was declined as a UX-only nit (an unmigrated file’s validation error message could be more helpful, but the validation itself is correct); 1 was declined as out of this phase’s charter (solutions/determined/tests/ui/serve-sdf.ts still emits the old field names for its SDF mock — a different solution area, flagged as a follow-up); a broader ask to deduplicate ~10 near-identical per-type migration-error classes and ~11 copy-pasted migration test files was declined as legitimate future cleanup rather than a phase-gate blocker. |
| Phase 11 — Cost and token tracking | Phase 11 — Cost and token tracking | 0.7.0 | Shipped in #2407 (branch sdlc/p11-usage, stacked on sdlc/sessions-v2). Both tasks landed: T-NIWS built the .sdlc/usage.jsonl ledger fed from headless engine JSON output and post-hoc interactive transcript discovery; T-YOUJ built sdlc usage report, the orchestrator’s per-tick all-time usage total, and the usage.budget rolling-window gate that pauses work-tick dispatch and fires usage.budget_exceeded. One correctness bug (budget-exceeded notify firing under --dry-run) and three CLI-surface/test fixups (two help goldens, one argparse choice list) were found and fixed during the phase gate; one S-0017 review pass found a single mechanical duplication (fixed: shared sumUsageRows helper) and no correctness issues otherwise. PR review rounds on #2407 additionally fixed: transcript usage dedupe (by max, not first line, shared across subagent files), codex cache-token double counting, and usage.budget comparing billable tokens instead of the cache-inclusive total. Full gate green: bunx tsc --noEmit clean; bun test solutions/ontological scripts 4628 pass / 1 skip (pre-existing) / 0 fail; bun test ./.claude 83/83; sdlc entities audit --strict no drift; sdlc roadmap check 0 findings; sdlc docs generate --check clean; agent-pants check 6/6 ok. The v0.7.0 local tag (Phases 10-11) is a separate action left to the caller, not performed as part of this close. |
| Phase 12 — Bring over the current UI | Phase 12 — Bring over the current UI | 0.7.0 | All three tasks closed/done. Shipped: a static SPA (packages/ts/dashboard-spa, @sdlc/dashboard-spa — plain Vite+Vue3+vue-router, no Nuxt, chosen over nuxt generate on real evidence — see [[T-NF6X]]) served by sdlc dashboard and shipped as a plugin asset; all 8 new views (roadmap progress, loop status/tick log, PR board, sessions with open-in-host, chain stages/labels, config read+edit, notifications, usage), each backed by a real dashboard JSON API endpoint and verified against real project data; terminal affordances now link out to the host (orca/cmux/tmux) instead of embedding a PTY in the browser. Real data-ceiling scope calls (see [[T-DJJ2]]‘s completion note for detail): the PR board shows current status/blockedBy/merge/conflicts/strategy/review-count rather than a review/respond “round” history, because no round concept exists anywhere in the underlying survey data; notifications is scoped to configuration + a manual send-test action, because no send history exists anywhere in the codebase. Both are honest reflections of what the data supports, not omissions. One real capability gap versus the desktop app it replaces, deliberately descoped to keep the initial port bounded: entity/task body EDITING (the SPA renders bodies read-only; the write endpoint already exists and is unused). Follow-up filed as [[T-324V]]. A second gap found in review: the retired hand-rolled INDEX_HTML view rendered active and archived lease detail tables that no SPA view replaced (ActiveWorkView shows only a lease-count pill). The active_leases/archived_leases data is still on /api/state; only the view was dropped. Follow-up filed as [[T-XFZC]]. Reviewed against the S-0017 rubric; 3 violations and 4 tensions fixed (duplicated polling composables, duplicated detail-view chrome, a fragile untested not-found check, two small duplicated constants/scanners, a duplicated poll/reload button pair, and one untested host-refusal branch). Full gate suite green: bunx tsc --noEmit, the full test suite (4861 pass / 1 pre-existing skip / 0 fail), bun test ./.claude, entities audit --strict (no drift), roadmap check (0 findings), docs generate --check (clean), okf validate (0 findings), agent-pants check (6/6 ok). |
| Phase 13 — TUI and pruning | Phase 13 — TUI and pruning | 0.8.0 | Complete, shipped as v0.8.0. All 28 member tasks closed — the Ink TUI (T-YFUN) and the 25 Phase-4-audit-derived Prune/Refactor/Fix tasks, plus T-PEUC and T-TOFK. The last two, T-QPL1 and T-YCHZ, had deferred a lib/services/dashboard/ sub-item pending P12’s dashboard landing on main; with P12 merged, T-QPL1 removed the dead tcpProbe function and projectRegistry() singleton, and T-YCHZ extracted the shared parseDashboardArgs used by both dashboard-service.ts and dashboard-service-main.ts. |
| Phase 14 — Publishing mechanics, pulled forward for the first public release at v0.4.0 | Phase 14 — Publishing mechanics, pulled forward for the first public release at v0.4.0 | 0.4.0 | The goal was met: v0.4.0 shipped publicly from sksizer/sdlc as a plugin-only push through these mechanics, followed by v0.7.0 and v0.8.0 (tags verified on GitHub 2026-09-30; no GitHub Release objects were created). [[T-WFVU]] is superseded by [[D-P3NF-sksizer-sdlc-is-product-home]]. Partial because two items carry forward to the product maintenance track: per-harness clean-install tests ([[T-N6OT]]; only the node- only probe exists) and npm publishing with the mirror-side release.yml ([[T-7H3A]]; @sksizer/sdlc is not on npm). Reconciled 2026-09-30. |
| Phase 2 — CLI orchestrator loops | Phase 2 — CLI orchestrator loops | 0.4.0 | The loops shipped in v0.4.0 and the merges wiring settled with the v0.7.0 lifecycle simplification ([[T-3HIC]], ticks/merges.ts). judge resolves through a project’s workflows.judge; the built-in is empty per [[D-LSLH]]. Making verify changes the built-in default moved to 0.10.0 as [[T-3N5B]] ([[M-FMVX]]). Reconciled 2026-09-30, amended 2026-10-01. |
| Phase 3 — Invert to the canonical agent-pants vault | Phase 3 — Invert to the canonical agent-pants vault | 0.4.0 | All seven deliverables and success criteria are checked, with tasks closed/done; the phase merged as #2312. Only milestone metadata was stale. Reconciled 2026-09-30 against the task records and local merged history. |
| Phase 4 — Audit | Phase 4 — Audit | 0.7.0 | Audit report merged as #2285. Its 29 recommendations are tracked tasks: 25 in Phase 13, two in Phase 2, one each in Phases 3 and 5. T-3HIC closed with [[M-Q7WL]]; T-3N5B moved to [[M-FMVX]]. Reconciled 2026-09-30 from the report, target task rosters, and local history. |
| Phase 5 — Full sdlc.yaml, meta-defined, with config CLI and hooks | Phase 5 — Full sdlc.yaml, meta-defined, with config CLI and hooks | All five tasks shipped. The last, [[T-UBKH]], moved lefthook.yml’s dependency bootstrap onto sdlc hooks run and retired scripts/bootstrap-deps.sh. | |
| Phase 6 — Hosts and sessions | Phase 6 — Hosts and sessions | 0.7.0 | All three tasks shipped in #2327 (v0.7.0 roll-up; the planned v0.5.0 tag was never cut). Criteria 1 and 3 are met by their successors rather than literally: [[M-TAYX]]‘s [[T-GG0N]] deliberately turned the claude/codex/cursor hosts into harnesses, and #2399 moved sessions: defaults into workflows.<name>. Reconciled 2026-09-30 against code and merged history. |
| Phase 7 — SDLC chain, label-driven autonomy, issue loop | Phase 7 — SDLC chain, label-driven autonomy, issue loop | 0.6.0 | All four tasks shipped on sdlc/p7-chain (tip 09bce2482, base sdlc/p5-config) per [[D-0019-sdlc-chain-stages-and-labels]]. Issue<->task mirroring landed report-only (task status is authoritative once linked; sdlc issues sync reports a conflict rather than auto-fixing it, D-0019 Option B) — a narrower cut than this milestone’s original Goal/Success-criteria prose implied; corrected below to match what shipped. |
| Phase 8 — Notifications | Phase 8 — Notifications | 0.6.0 | Both tasks shipped on sdlc/p8-notify (tip 900e77dc1, base sdlc/p7-chain at 9b6be34b1). The notify: config (channels plus all 9 named events, cross-field validated) and sdlc notify send/test ops both landed, plus every Phase-2 call site rewired onto the canonical event names and the two additional live-detector wirings (lease.expired, session.ended). An opus adversarial phase-gate review found one blocking bug (fixed: splitting notify: across sdlc.yaml/sdlc.local.yaml broke preflight validation) and a batch of should-fix/nit findings, all closed across six further fix-round commits — see the two tasks’ own completion_note fields and the phase hand-back for specifics and for the small set of non-blocking known gaps left for a follow-up pass. |
| Phase 8.5 — Lifecycle simplification + detection consolidation | Phase 8.5 — Lifecycle simplification + detection consolidation | 0.7.0 | All thirteen tasks are closed/done. The v0.7.0 changelog records lifecycle simplification and detection consolidation; the decision impact map documents the shipped migration and PR evidence. Reconciled 2026-09-30; unchecked milestone boxes and draft state were stale. |
| Phase 9 — MCP server | Phase 9 — MCP server | T-VJ13 shipped: sdlc mcp start (a stdio MCP server whose tools derive from the op registry, safe-default read-only + mcp: allow/deny config) and sdlc mcp register --harness claude|codex|cursor [--dry-run] (per-harness MCP client registration), hardened by the phase-gate review (every tool confined to the server’s own project root, stdout guarded, config typos warned, tool dispatch running the same preflight gate the CLI uses, ToolAnnotations derived from mutating), on branch sdlc/p9-mcp (#2313), stacked behind Phase 1’s pending history rewrite for now. Marked closed/partial rather than closed/done because the second success criterion below — apply registering the MCP server per harness — genuinely isn’t achievable yet: apply is Phase 5/6 territory and isn’t stacked on this branch. sdlc mcp register ships standalone, ready for a later phase’s apply to call. v0.6.0 tagging (this milestone’s own body text) is explicitly a cross-phase action gated on Phases 7-9 landing together, not on this milestone alone. | |
| Principles: the bootstrap layer | Principles: the bootstrap layer | Superseded by [[M-K7DP-initial-product-definition]], which reframed the construction-sequence milestones around product releases and took “Principles published” as one of its own success criteria. The content this milestone existed to produce did ship: all eleven principles it indexed exist as P-entities under docs/planning/principles/, ten are open/published (only [[P-0011-avoid-deferral-for-simple-tasks]] is still draft), and the corpus has since grown a twelfth ([[P-0012-rust-core-adapters-as-needed]]) and been reconciled against [[D-VSLI-distributed-work-runner-architecture]]. Its three open scope rows are done too — P-0006 and P-0007 were authored, and the related: cross-reference pass landed. Closed superseded rather than done because the milestone was never a product release and carries no version; the deliverable landed, the container did not survive. | |
| Retire invariants.yaml: adopt markdown-contract text constraints for skill-prose | Retire invariants.yaml: adopt markdown-contract text constraints for skill-prose | 0.3.0 | Completed 2026-07-04. Replaced the bespoke invariants.yaml SKILL.md prose linter with a markdown-contract contract, so skill-prose runs on the same engine as the entity corpus. All six member tasks shipped: T-3TAJ (the vendored mc 0.2.0 pin carries requires/forbids/textRule, #619), T-FQFJ (authored the per-skill SKILL_PROSE_REGISTRY contract, #629), T-6OS7 (rewired sdlc gate skill-prose onto it, #630), T-LNHL (deleted the 534-line _skill_prose_core.ts matcher, #635), T-UDY1 (retired the 14 invariants.yaml sidecars, #642), T-DNGZ (repointed standards/notes docs, #643). Verified on main: _skill_prose_core.ts gone, _skill_prose_contract.ts present, 0 invariants.yaml sidecars, sdlc gate skill-prose green on the real corpus (35 skills checked, 14 covered, no violations). |
| Router — live-session PR delivery | Router — live-session PR delivery | 0.7.0 | Shipped in #2368 (v0.7.0). All three criteria are met in code and tests: the prs tick delivers through the Router, DeliveryRecord makes delivery idempotent, and a task-less PR is serialized by an operation lease ([[T-KMPU]] superseded). Not built: [[T-BT9H]]‘s busy-policy queue_max and recovery.ensureServing. The live route is opt-in; turning it on by default is orchestrator-adoption scope (#2462, open). Reconciled 2026-09-30. |
| SDF control-plane app — scaffold to safe controls | SDF control-plane app — scaffold to safe controls | 0.3.3 | Delivered by all six member tasks (PRs #769, #770, #772, #773, #774). The app ships with check/build/dev/web moon tasks wired into .github/workflows/sdf-ci.yml; apps/dashboard is deleted and just dev drives SDF; the ontogen-generated HTTP, IPC, MCP and TS-client trees are committed and double-gated by sdf:codegen-drift and sdf:schema-parity; the read panels sit on refs/sdlc/tasks, the seven-value pr-check verdict enum, and a cursored tail of .sdlc/orchestrator-log.md; and mutating routes require x-platform-token while reads pass tokenless (as delivered; since amended by [[T-DBAL-sdf-safe-controls-token]], every /api/* request needs the token and only static files are open). Two notes for a reader: the body still says apps/sdf, but the app now lives at solutions/ontological/desktop/ (moon project id still sdf); and the [[D-VSLI-distributed-work-runner-architecture]] redirect this milestone needed — SDF as a day-one consumer of engine v0’s status API, landing as implementation-ledger phase E7 rather than inside this arc — is already applied to the Out-of-scope bullet, so nothing about D-VSLI blocked the close. version was assigned by the 2026-08-16 milestone audit from the delivery date (2026-07-19) to preserve roadmap order; no release tag was cut for it. |
| SDF sets up SDLC configuration for any registered project | SDF sets up SDLC configuration for any registered project | 0.4.0 | All four tasks merged (#2258, #2259, #2260, #2261), and both decision addenda are in [[D-0018-sdf-control-plane-app]] (“No ambient project”, and in-checkout scaffolding writes inside the bounded-controls envelope). The records still said planned/ready. Reconciled 2026-09-30; a live run of SDF against a second registered project was not re- verified. |
| SDLC distribution revamp — apps/sdlc/ app + compiled binary | SDLC distribution revamp — apps/sdlc/ app + compiled binary | 0.3.1 | Delivered. SDLC is self-contained and the compiled-binary channel exists end to end: scripts/build-binary.ts cross-compiles five targets with an embedded asset tar, scripts/build-npm-wrapper.ts assembles the main package plus five os/cpu-gated platform packages, and .github/workflows/release.yml runs a pack → clean-install → run smoke on every PR and tag. The plain-Node world is genuinely deleted — no build-artifact op, no runtime-agnostic gate. Three caveats a reader should have: the milestone’s apps/sdlc/ literal is stale, since the tool moved on to solutions/ontological/ (the D-0001 end state) — the goal landed, the address changed; the artifact has never actually been published (NPM_TOKEN is absent and the latest tags predate the channel), so “installs and runs” is proven by CI smoke rather than by a real consumer; and the npm channel’s entry point is a Node CJS shim, so only the binary itself is runtime-free. brew/curl stay deferred. version matches solutions/ontological/package.json and the v0.3.1 tag current when the channel landed. Not superseded: rewriting the sdlc CLI in Rust ([[D-VSLI-distributed-work-runner-architecture]] implementation-ledger phase C5) is anticipated, not decided, and closing here records what shipped rather than extending toward it. |
| Sessions v2 — host/harness split, tmux + pi, Host.send, live states | Sessions v2 — host/harness split, tmux + pi, Host.send, live states | 0.7.0 | Sessions v2 shipped in the v0.7.0 roll-up; all four task records are closed. Closure is partial because real per-harness hookArgs CLI injection was declined, and session attach does not consume live registry state. The milestone’s own criteria document these limits. Reconciled 2026-09-30 against changelog and task notes. |
| Shared app-frame across determined and the SDLC dashboard | Shared app-frame across determined and the SDLC dashboard | 0.4.0 | Extracted the generic app-frame (@sksizer/app-frame) out of @determined/shell, re-homed @determined/shell as a thin adapter with the 21 products at parity, and migrated the SDLC dashboard onto the frame (nav modules via defineModule, a SettingsTransport adapter, the DAppShell layout, and dashboard —d-* token overrides). Both front ends now run one shared shell; all nine member tasks are closed. |
| Task plane split — execution state to the lease substrate | Task plane split — execution state to the lease substrate | Implementation-ledger phase E2 of [[D-VSLI-distributed-work-runner-architecture]] delivered the plane split in one change instead of the seven-stage expand/cutover/contract staging this milestone planned. in-progress[/blocked] is never written to frontmatter again, append_pr_url.ts is deleted, the readers went lease-aware, and the reconciler is a live level-triggered controller. All seven member tasks are closed. Schema v6 and the v5-to-v6 sweep did not ship ([[T-11QZ-task-schema-v6-contract-sweep]]): the controller has to keep healing files that still carry the in-progress* values, so the enum outlives the sweep that removes them from the corpus. | |
| TypeScript conversion of current system | TypeScript conversion of current system | 0.1.0-alpha | Delivered via the en-masse TypeScript migration (single long-lived branch, one cutover PR) per [[D-0006-typescript-substrate]]. The entire plugin substrate — lease library (incl. byte-identical canonical_json), validators, the task/backlog/lease CLI nouns + unified sdlc dispatcher, all scripts, model migrations, and skill helpers — was ported to TypeScript under a local parity gate, with the Python substrate deleted in the cutover commit. Runtime is Bun (Node fallback documented in install-check). |
| yaml-splice extraction and writer migrations | yaml-splice extraction and writer migrations | 0.5.0 | Complete. yaml-splice extracted (T-3MZD / #1063), adopted by the six Rust consumers (#1064) and — via a WASM/TypeScript binding that emerged as a prerequisite (D-W4SM / T-820W / #1074) — by the SDLC frontmatter writers (T-68IB / #1081). The four field-edit writers now edit frontmatter through span-preserving editYaml; the whole-document generators stay on the canonical discipline. All success criteria and deliverables met. |
Near-term
Section titled “Near-term”The MCP and HTTP doors
Section titled “The MCP and HTTP doors”The registry was built so one op projects into many doors, and the
projection rules are already fixed — CLI segments verbatim, MCP tool name
by underscore-join, HTTP route by path with method by verb class
(D-H7FS-op-substrate-surface §5). The CLI is the one shipped door;
building the MCP and HTTP servers against the same generated tool/route
set is the natural next step, and the truest test of the
harness-agnostic claim. Until a
non-Claude door actually drives the ops, the claim is structural, not
proven.
Task transitions as ops
Section titled “Task transitions as ops”task transition (T-902K)
moves the lifecycle transition itself onto
the registry, with the commit as a declared side effect — so the
authoritative state change and the git write are one op, not a skill
remembering to do both. It sits flat on the task noun beside
create/update/sort, per the surface decision.
Walk-root for generic ops
Section titled “Walk-root for generic ops”The four cross-entity ops (entities audit|validate|migrate|check-identifiers)
register today via an explicit barrel import, because model/ops/ is not
a discovery-walk root. T-U72C
is the open question of whether to
promote it to one — removing the hand-maintained barrel — without
admitting non-op modules to the walk.
Mid-term
Section titled “Mid-term”A workflow-definition engine
Section titled “A workflow-definition engine”D-0007 left this as an open question: how deterministic multi-step workflows are declared and how they reference ops. It would be a composition layer over the registry — control flow, no LLM — not a parallel system. Several skills today are coarse deterministic sequences with a single human-judgment seam; those are the candidates a workflow engine would absorb.
Rethinking task state
Section titled “Rethinking task state”A cluster of backlog items circles the same tension: task state: is a
frontmatter cache of a fact the lease ref owns. Whether to make the event
log primary with frontmatter as a derived cache
(B-M9JX,
B-HUT2),
and what control plane backs it
(B-622T),
is unresolved direction, not committed work.
Tighter verification
Section titled “Tighter verification”Standards and principles can drift from the code they describe. Edit-time standard enforcement (B-J2KF), a standards/principles drift-audit skill (B-M9QZ), and validating markdown body structure by applying a schema to its AST (B-8FL9) are the threads here.
Deferred
Section titled “Deferred”Noted but not committed-to. Most live in the backlog and get triaged when they become relevant.
- Deployment of this docs site (GitHub Pages, Vercel, Netlify, or a custom domain) — it builds locally today.
- Evals for skills (B-5PY9) — a deterministic harness exercising each skill’s happy path plus one breakage.
- Scheduled / recurring tasks (B-1NN4).
- Custom Starlight theme / branding; multi-version docs; i18n.
- CI workflow on push (lint / build / deploy); automating changelog generation from git history.
Out of scope (probably forever)
Section titled “Out of scope (probably forever)”- A web UI for editing planning artifacts. The plain-markdown floor is the point; editors are downstream.
- A hosted SaaS version. This is personal software.
- Proprietary issue trackers as a primary store. The filesystem is the primary store; bridges to other systems are read-only views.
Source
Section titled “Source”This page is generated by sdlc docs generate site from the milestone
corpus and the static narrative above. The milestone tables track the live
entities; the narrative is hand-authored and reviewed as code. If something
here doesn’t match what plugin/ actually does, that’s a bug — file it.