You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Master tracking issue for all planned work after the v0.1.0 release. Each item links to a detailed issue with its own PRD.
Status Key
✅ Complete
🚧 In Progress
⚪ Not Started
Checkbox convention. A checked box means the referenced issue is closed. Partial
progress is recorded as a prose bullet with no checkbox, naming what landed and what
remains. This exists because (partial) / (doc half) qualifiers previously allowed
incomplete work into sections headed "landed" — readers scan checkboxes and section
headings before qualifier text.
v0.2.0 — Language Enrichment ✅
The core language gets the features users will hit first. Focus: make templates self-sufficient without external preprocessing.
feat: structured JSON output (chat message arrays) #56 — Structured output → shipped as the intrinsic output format: @message templates compile to a JSON array, all others to Markdown; mixed content is a hard error (mds::mixed_content)
Expand reach beyond JS/TS. Add the quality-of-life tooling that mature languages provide.
Released: 2026-09-02 — tag v0.4.0 at 6673dc3,
cut by release run 33569514359 (attempt 2, after a
crates.io token rotation). Published and independently verified: mds-core and mds-cli at 0.4.0 on crates.io
(not yanked); all 15 @mdscript/* npm packages at 0.4.0 with SLSA provenance (8 published packages + 7 native
platform packages); the GitHub Release is live. The v0.4.0 milestone is closed (0 open / 18 closed).
Wave 1 closed in PR #308 (339df37), watch-correctness in PR #323 (b34d8ac), the dogfood defect sweep in
PR #335 (0cd08d6), release prep in PR #338 (df2fe71), the version bump in PR #343 (c0aa732), and the
CI-history gate fix in PR #344 (6673dc3).
Ship gate — cleared ✅
Fix the CHANGELOG LintConfig::from_rules entry — it documented a deprecation with migration path for a function REMOVED in 339df37. Nothing published ever exposed LintConfig::from_rules since lint/config.rs did not exist at v0.3.0, so it was not breaking; the entry now sits under ### Removed with the migration text dropped.
Clean the working tree: uncommitted .gitignore edit (+!.devflow/conventions.md). RELEASING.md pre-flight requires a clean working tree.
node scripts/bump-version.mjs 0.4.0, landed via CI-gated PR chore(release): v0.4.0 #343 (c0aa732), verified with node scripts/verify-pr-checks.mjs (PF-017) and merged with the exact printed command.
git tag -a v0.4.0 -m v0.4.0 && git push origin v0.4.0
Two release-prep fixes landed on main before the tag: PR #338 (df2fe71) — aarch64-musl link flag, linux-x64-musl now genuinely musl-linked behind a readelf gate, setup-zig pin, verifier allowance — and PR #344 (6673dc3) — the CI-history gate now asserts from the CI workflow run rather than branch protection. The release run itself needed a second attempt after a crates.io token rotation; recovery was a rerun of the staged run, never a re-tag. The run's gates all passed at 6673dc3: version-gate (synchronized versions, live credential probe, CI-history assertion), the A3 napi name↔loader gate, and the readelf musl-linkage assertion on both musl legs.
Expose basePath on CompileOptions to match LintOptions #180 — BUG (live, shipped): basePath is accepted by assertKnownKeys and then silently discarded by compileOpt()/varsOpt(). Affects both compileandcheck in the published npm package. Fixed.
Everything here was out of scope for the v0.4.0 tag and remains open. Items that have since
been scoped to v0.4.3 are listed in the v0.4.3 section below and are not repeated here.
debug_assert!-only invariants silently degrade in release builds (3 sites) — PF-005 #220 — the assert lives at resolver.rs:2437 and guards a UTF-8 char-boundary precondition, not a sortedness invariant. It is also not the last remaining instance: there are 3 sites — resolver.rs:2437, resolver/inheritance.rs:77, resolver/inheritance.rs:174. The issue has been retitled accordingly.
Fixed wall-clock waits on filesystem events share the watch-startup defect class #318 — real but factually drifted: cli_build.rs site count is 1, not several (cli_build.rs:1138-1148), and it is a bounded content-predicate poll rather than a sleep-then-assert anti-pattern — the residual defect is only that it doesn't use the MDS_TEST_READY handshake; HMR harness consumer count is 4 spec files (rollup/rspack/vite/webpack *-e2e.spec.mjs), not 8; note that most call sites override the 5000ms default anyway
Shipped to crates.io and npm on 2026-09-03. The PyPI publish failed: pypa/gh-action-pypi-publish
was pinned to the SHA of an annotated tag object, which has no corresponding GHCR image, so the
publish step could not resolve its container. The GitHub Release was backfilled on 2026-09-04 with --latest=false. v0.4.2 is the recovery release. The v0.4.1 milestone is closed and carries
no issues: every follow-up originally scoped to this section moved to v0.4.3 and is listed there.
v0.4.2 — First PyPI publication ✅ SHIPPED 2026-09-03
The recovery release for v0.4.1's failed PyPI step, and the first publication of markdown-script
to PyPI: 8 distributions (7 cp311-abi3 wheels + 1 sdist) with PEP 740 attestations via OIDC
trusted publishing. The v0.4.2 milestone is closed.
Milestone v0.4.3 is open with 23 issues (0 closed). Execution order is housekeeping → pipeline hardening → correctness batch → release, one step per session.
The headline features are listed above. The v0.5.0 milestone (22 open / 3 closed) additionally
carries the tech debt and review deferrals catalogued under "Deferred past v0.4.0" — notably #182, #222 and the Wave-1 deferrals #309–#312 and #314. (#292 was closed as satisfied by v0.4.2.)
v1.0.0 — Editor Experience (Deferred)
Full editor integration. Intentionally last — language features and production readiness come before distribution overhead. These items require significant DevOps, testing, and maintenance investment beyond the code itself.
Editor experience (v1.0.0) is intentionally deferred. Language enrichment and production readiness take priority — we want to ship features users can use before investing in distribution and tooling overhead.
The v0.4.0 pre-tag set was deliberately biased toward things that become expensive after the tag: wire formats, exported type names, and deprecation windows. Pure-quality tech debt was listed but never treated as a blocker.
Release path is tag-push, and it is the path v0.4.0 shipped on: node scripts/bump-version.mjs X.Y.Z → land on main via CI-gated PR → git tag -a vX.Y.Z && git push origin vX.Y.Z. The workflow_dispatch -f version= path was deleted in chore: harden release machinery (5 independent fixes) #287; bare gh workflow run release.yml is now the dry-run. A staged run that fails mid-publish is recovered with gh run rerun --failed, never by re-tagging.
MDS Roadmap
Master tracking issue for all planned work after the v0.1.0 release. Each item links to a detailed issue with its own PRD.
Status Key
v0.2.0 — Language Enrichment ✅
The core language gets the features users will hit first. Focus: make templates self-sufficient without external preprocessing.
Released: 2026-06-06 — v0.2.0
v0.3.0 — Production Readiness ✅
Bridge MDS from "template language" to "production LLM input format." Add the developer workflow tooling that makes daily use pleasant.
Released: 2026-06-28 — v0.3.0
Headline Features (Complete)
@messagetemplates compile to a JSON array, all others to Markdown; mixed content is a hard error (mds::mixed_content)^1.0.0 || ^2.0.0#106 — rspack-loader: verify @rspack/core 2.x compat + widen peer to^1.0.0 || ^2.0.0— merged in feat(ecosystem): verify & harden HMR across bundler plugins + add @mdscript/rspack-loader #105Tech-Debt Sweep (Complete)
Do-set — all 11 landed in PR #117 (
88ddbcc):Already Closed (verified done): #98, #101, #80, #77
v0.4.0 — Ecosystem Expansion ✅ SHIPPED
Expand reach beyond JS/TS. Add the quality-of-life tooling that mature languages provide.
Ship gate — cleared ✅
LintConfig::from_rulesentry — it documented a deprecation with migration path for a function REMOVED in339df37. Nothing published ever exposedLintConfig::from_rulessincelint/config.rsdid not exist atv0.3.0, so it was not breaking; the entry now sits under### Removedwith the migration text dropped..gitignoreedit (+!.devflow/conventions.md). RELEASING.md pre-flight requires a clean working tree.node scripts/bump-version.mjs 0.4.0, landed via CI-gated PR chore(release): v0.4.0 #343 (c0aa732), verified withnode scripts/verify-pr-checks.mjs(PF-017) and merged with the exact printed command.git tag -a v0.4.0 -m v0.4.0 && git push origin v0.4.0Two release-prep fixes landed on
mainbefore the tag: PR #338 (df2fe71) — aarch64-musl link flag,linux-x64-muslnow genuinely musl-linked behind areadelfgate, setup-zig pin, verifier allowance — and PR #344 (6673dc3) — the CI-history gate now asserts from theCIworkflow run rather than branch protection. The release run itself needed a second attempt after a crates.io token rotation; recovery was a rerun of the staged run, never a re-tag. The run's gates all passed at6673dc3: version-gate (synchronized versions, live credential probe, CI-history assertion), the A3 napi name↔loader gate, and thereadelfmusl-linkage assertion on both musl legs.Headline Features — landed ✅
{x}→{{x}}double-brace interpolation, with a lint--fixmigration path — PR feat!: double-brace {{x}} interpolation with lint --fix migration (v0.4.0) #237 (aac4070)Fix / hardening waves — landed ✅
{…}inside them is interpolated #149 Blank line after frontmatter is stripped on compile #150 Blank lines at@block/@endboundaries are consumed (blank runs collapse to 1) #151--set x=truecoerces to boolean, silently breakingx == "true"#152 Interpolation error suggests the wrong escape; hint\{{fails,\{works #153 Base-only frontmatter keys are in scope but omitted from the child output frontmatter #154 — v0.4.0 bug batch: indented + wide fences, interior-verbatim whitespace,--set-stringtype safety, merged@extendsfrontmatter,\{hint — PR fix!: v0.4.0 bug batch — fences, whitespace, type safety, @extends FM (#149–#154) #161 (3ce9f1d)base_pathrelative-import resolution for string sources — PR fix(core): resolve string-source @import on Windows verbatim paths #146IfBlock.elseif_branchesfor precise@elseifdiagnostics #181 — per-branch offsets onIfBlock.elseif_branchesfor precise@elseifdiagnostics — PR fix: v0.4.0 remediation — dogfooding blockers, bug batch, UX polish, docs sweep #196 (3aef465)3aef465)--fixfull-block-span removal for block-spanning Tier A fixes; CLI/config UX; typed Python lint; WASM guard → 850K — PR fix: v0.4.0 dogfooding remediation — block-span lint fixes, span attribution, CLI/config UX, binding alignment, docs (#172 batch) #228 (f06a2d1)MdsErrorvariants (CWE-150) — PR fix: harden terminal-escape rendering across all MdsError variants (CWE-150) #253 (b681129). Render path rebuilt per PF-014: sanitize inputs, not frames.atomic_write_filewarns onmetadata()failure instead of silently falling back to mode 0600 — PR fix: atomic_write_file: warn on metadata failure instead of silently using 0600 #240 (de8857d)acb8a86) landed the limitation note atcrates/mds-cli/src/output.rs:600-602andRELEASING.md:164, closing the "won't fix: hard links" documentation deliverable. The implementation half did not land:atomic_write_file(output.rs:603-664) still restores only the Unix mode (output.rs:641); nocopyfile/setxattr/chowncall exists anywhere incrates/. ACLs, xattrs and owner/group remain unpreserved — tracked under "Deferred past v0.4.0 › Write path" below.LintDiagnosticmarked#[non_exhaustive]+ constructor added — PR feat(mds-core)!: mark LintDiagnostic #[non_exhaustive] and add constructor [#259] #286 (d8766af)workflow_dispatch -f version=path deleted,cargo publishidempotency check, bounded crates.io index poll,bump-version.mjsCHANGELOG link-table corruption fixed,examples/outputs gitignored +examples-gitignore-coverageCI job — PR chore: harden release machinery (5 independent fixes) #287 (cb44b56)c8b4062)113f472) removed the dead Discussions link (.github/ISSUE_TEMPLATE/config.yml) and the stale supported-versions table (SECURITY.md) — both already listed under "Config drift — RESOLVED, no longer in scope" in Release hygiene: fix config drift and close gold-standard gaps #182's own body. None of the six gold-standard gaps were closed by chore(docs): remove dead Discussions link and stale version table (#182) #291. See "Deferred past v0.4.0 › Release infrastructure" below.Wave 1 — pre-tag set ✅ all 12 closed in PR #308 (339df37)
Wire format — bytes consumers parse; cheap today, a semver event after the tag
--format jsoncontract.@importkeyword: wrong offset/length in JSON output, wrong squiggle for any future LSP client.build --quietprints summary while lint/check/fmt suppress;linthas no directory summary #216 —build.rs:1596prints the directory summary unconditionally, violating the documented--quietcontract;linthas no aggregate summary at all.Decisions resolved
--format jsonwire format #211 — stdin labels. Resolved: stdin label unified to<stdin>across all four CLI subcommands. Bindings (napi/WASM/Python) still emitinput.mdsandmds::STRING_SOURCE_MAP_LABELis unchanged. Documented atspec.md:1033,:1071.from_rules_checkedreturns an unknowns report;from_rulesremoved.Deprecation window
apply_fixesfrom publicmds-coreAPI and schedule removal — 0 callers sinceapply_fixes_incrementalshipped #209 — deprecateapply_fixes(0 production callers). Deprecated at v0.4.0, scheduled for removal at v0.5.0.TS public surface
basePathonCompileOptionsto matchLintOptions#180 — BUG (live, shipped):basePathis accepted byassertKnownKeysand then silently discarded bycompileOpt()/varsOpt(). Affects bothcompileandcheckin the published npm package. Fixed.lint/lintFile/lintVirtualexports tobrowser.ts(pre-existing gap) #215 —browser.tslint exports added (lint+lintVirtualonly —lintFileis not implementable in a browser).varsOpttype narrowing #213 —options.tssecond pass: value-type validation, indexed-access safety, andvarsOpttype narrowing.Community / release hygiene
CODE_OF_CONDUCT.md(Contributor Covenant 2.1). Carried since v0.2.0.Release-safety gates
0x1Bthree times;b94ef80stripped the most recent one from the escape-handling PR itself.node scripts/verify-no-control-bytes.mjsadded to CI;scripts/hooks/pre-commitgate for local development.--adminsquash-merge will not notice.node scripts/verify-pr-checks.mjsadded; required before any--adminmerge.Unplanned, forced during the wave
sort_unstablerather than raising the 850K budget.markdown-script(ADR-012). Note:mdscripton PyPI is a genuine dormant 2021 project (ownerInoft.Robinson) with a collidingtop_level.txt, not a squat; zero consumers;publish = false; no PyPI step inrelease.yml.Watch correctness — landed ✅ PR #323 (b34d8ac)
mds watchsilently lost a save made during startup; both modes now arm change detection before publishing first output.@importdependencies; a failed compile no longer discards the dependency list, and the idle probe now diffs(mtime, size)across all tracked sources and dependencies.New CI job
watch-startup-race(ci.yml:395) runs the suite with the startup-race probe enabled.✅ Did not block the tag — since resolved
markdown-script(importmarkdown_script) + register on PyPI #292 — registermarkdown-scripton PyPI — CLOSED, satisfied.markdown-scripthas been live on PyPI since v0.4.2 (2026-09-03), the first Python publication (7cp311-abi3wheels + sdist, PEP 740 attestations, OIDC trusted publishing). The rename had already landed for v0.4.0 (pyproject.tomlname = "markdown-script", ADR-012); v0.4.0 itself shipped nothing Python becauserelease.ymlhad no PyPI step at the time. The wheel matrix and publishing work is Python bindings: cross-platform wheel matrix + PyPI publishing (+ cp314t) #132, closed under v0.4.2.⚪ Deferred past v0.4.0
Everything here was out of scope for the v0.4.0 tag and remains open. Items that have since
been scoped to v0.4.3 are listed in the v0.4.3 section below and are not repeated here.
mds lintCLI per-file dispatch spine #173, Centralize Severity string parsing across bindings #175, Consolidate lint entry-file reads through NativeFs (single source of truth) #179, Restructureapply_fixes_incremental: decompose 135-line function, collapse impossible-state guard, deduplicate regression triple #208, lint fix-pipeline test hardening: dedup coverage and cross-rule validation #230, cosmetic consistency sweep: tone/naming/style across lint rules and docs #231, lint rules: simplify check_if_block and sortedness guard logic #235mds_cli_binfixture silently falls through on malformedMDS_CLI_BINenv var — supportCARGO_TARGET_DIR/--targetlayouts #214, Python binding polish: optimize to_dict() and simplify files() closure chain #232, examples/python/demo.py: harden None-safety for strict mypy/pyright #234markdown-scriptis live on PyPI with 7cp311-abi3wheels + sdist and PEP 740 attestations (thecp314tfree-threaded wheel is not in the shipped set). Name registration Rename Python distribution tomarkdown-script(importmarkdown_script) + register on PyPI #292 is closed as satisfied.MAX_DEPTHfrom 4 per-file constants to one shared constant adjacent tocollect_mds_files#218, Rust minor cleanups from PR #196 review: bounded-loop form, discarded infallible Result, saturating_sub, unwrap_or defensibility, error label wording #219 (every line ref stale;finalize_subdoes not exist insourcemap.rs), Tech debt: decompose oversized modules —resolver.rs(2554L) andbuild.rs(2020L) block safe incremental work #223, build.rs DRY: consolidate embed_sources warnings and sidecar/stdout ladder duplication #229, perf: collect_mds_files eagerly walks excluded dirs to count .mds files — fixed FS cost per run #238scripts/hooks/pre-commitin v0.4.0 Wave 1: breaking changes, live-bug fixes, and release-safety gates #308 is the ci: reject control bytes and bidi codepoints in tracked source (authoring toolchain injects live ESC) #288 control-byte gate, a different thing)FileOptionstoCompileFileOptionsfor intent clarity (breaking — target v0.5.0) #222 → v0.5.0, conditional on shipping a deprecatedFileOptionsaliasoutput.rspath helpers fail-open onstrip_prefixedge cases and non-UTF-8 paths #217,debug_assert!-only invariants silently degrade in release builds (3 sites) — PF-005 #220, build::write_output still uses truncate-then-write (non-atomic) for compiled artifacts #227output.rspath helpers fail-open onstrip_prefixedge cases and non-UTF-8 paths #217 — citedoutput.rs:177-183stale; pattern moved tolint.rs:321-333debug_assert!-only invariants silently degrade in release builds (3 sites) — PF-005 #220 — the assert lives atresolver.rs:2437and guards a UTF-8 char-boundary precondition, not a sortedness invariant. It is also not the last remaining instance: there are 3 sites —resolver.rs:2437,resolver/inheritance.rs:77,resolver/inheritance.rs:174. The issue has been retitled accordingly.build::write_outputthroughatomic_write_filetrips themetadata()warning branch fix: atomic_write_file: warn on metadata failure instead of silently using 0600 #240 added atoutput.rs:459-472, which spuriously fires on first build when the output file does not yet exist. Fix that branch in the same change.FileSystemtrait break in v0.5.0 is cheaper than a security regression before the tag.rustCI job (Rust suite is ubuntu-only) #147, ci: SHA-pin GitHub Actions + assert lockfile version in verify-versions.mjs #163, Release hygiene: fix config drift and close gold-standard gaps #182 — none of these were scoped to v0.4.1. The five follow-ups the v0.4.0 release run surfaced in its own pipeline (ci(release): move both musl zig wrappers to cargo-zigbuild's maintained linker-arg filter #339, ci(release): load-test the linux-x64-musl addon on Alpine before upload #340, scripts(verify-pr-checks): key the skipped-publish allowance on the release.yml check suite, not the job name #341, ci(release): release.yml's build matrix never runs on pull_request #342, ci(release): validate CARGO_REGISTRY_TOKEN against crates.io in the version-gate probe (security-08 gap) #345) are in the v0.4.3 section below.ci.yml:77; budget NOT re-tightened, still-gt 850000atci.yml:149cli_watch.rs:1108, 100ms sleep at:1151unchangedrustCI job (Rust suite is ubuntu-only) #147 — therustjob is bareruns-on: ubuntu-latestatci.yml:21-24, no matrix; the windows matrix at:160belongs to thejsjobuses:pinned, all 8 new pins incidental to ci(wasm): pin wasm build toolchain for deterministic size; re-tighten size budget #128; 48 floatrelease.yml:325-347) andcargo publishidempotency (:317-324,:353-359), both from PR chore: harden release machinery (5 independent fixes) #287 (cb44b56, predating v0.4.0 Wave 1: breaking changes, live-bug fixes, and release-safety gates #308); the npm-side idempotency check (:464-477) landed in v0.4.0 Wave 1: breaking changes, live-bug fixes, and release-safety gates #308 itself (339df37). Not done: OIDC trusted publishing (tokens still live at:315,:351,:378— theid-token: writeat:373is npm provenance, not trusted publishing), SHA256SUMS + build-provenance attestations (:501-507uploads nothing), Conventional Commits enforcement (claimed atCONTRIBUTING.md:162-164andPULL_REQUEST_TEMPLATE.md:3,:16, enforced nowhere), OpenSSF Scorecard + coverage.unused_assignmentson a cold build; the issue self-contradicted by citing the repo's own newer 1.96.0 wasm pincli_build.rssite count is 1, not several (cli_build.rs:1138-1148), and it is a bounded content-predicate poll rather than a sleep-then-assert anti-pattern — the residual defect is only that it doesn't use theMDS_TEST_READYhandshake; HMR harness consumer count is 4 spec files (rollup/rspack/vite/webpack*-e2e.spec.mjs), not 8; note that most call sites override the 5000ms default anywaycrates/mds-cli/tests/common/mod.rs;bytes()at:63-65is still a non-blocking clone and the drain thread'sJoinHandleis discarded at spawn (:93) so no caller can join it; real analogues of the old refs arecli_watch.rs:582-585and:3463-3465; fix(watch): eliminate silent edit loss in mds watch startup and cross-root dependencies #323 widened exposure to 21stderr_tap.bytes()call sites; readiness now travels over a temp file named byMDS_TEST_READY(common/mod.rs:136-165) — the hazard remains reachable because startupcompile_and_writeis atwatch.rs:1158andemit_ready_marker()at:1326Stale-open resolved:
.mapsidecar on--inline85a4c05(PR #183)build.rs:1326-1347"Stale sidecar reconciliation (AC-FUNC-10)" callingverify_then_delete_map; testsm13_inline_build_removes_stale_sidecaratcli_source_map.rs:556-583asserting!map_path.exists()Closed as duplicate — tracked by the survivor:
#178 and #210 are likewise closed as duplicates; their analysis now lives in the surviving issues.
v0.4.1 — Release-Infrastructure Follow-ups ✅ (crates.io + npm 2026-09-03)
Shipped to crates.io and npm on 2026-09-03. The PyPI publish failed:
pypa/gh-action-pypi-publishwas pinned to the SHA of an annotated tag object, which has no corresponding GHCR image, so the
publish step could not resolve its container. The GitHub Release was backfilled on 2026-09-04 with
--latest=false. v0.4.2 is the recovery release. The v0.4.1 milestone is closed and carriesno issues: every follow-up originally scoped to this section moved to v0.4.3 and is listed there.
v0.4.2 — First PyPI publication ✅ SHIPPED 2026-09-03
The recovery release for v0.4.1's failed PyPI step, and the first publication of
markdown-scriptto PyPI: 8 distributions (7
cp311-abi3wheels + 1 sdist) with PEP 740 attestations via OIDCtrusted publishing. The v0.4.2 milestone is closed.
v0.4.3 — Pipeline hardening + correctness batch 🚧
Milestone v0.4.3 is open with 23 issues (0 closed). Execution order is
housekeeping → pipeline hardening → correctness batch → release, one step per session.
Pipeline
Correctness
debug_assert!-only invariants silently degrade in release builds (3 sites) — PF-005 #220 —debug_assert!-only invariants silently degrade in release builds (3 sites) — PF-005output.rspath helpers fail-open onstrip_prefixedge cases and non-UTF-8 paths #217 —output.rspath helpers fail-open onstrip_prefixedge cases and non-UTF-8 pathsDocs
v0.5.0 — Advanced Features
Enable sharing and reuse across projects and teams.
FileOptionstoCompileFileOptionsfor intent clarity (breaking — target v0.5.0) #222 — Public TS: renameFileOptions→CompileFileOptions(with deprecated alias)The headline features are listed above. The v0.5.0 milestone (22 open / 3 closed) additionally
carries the tech debt and review deferrals catalogued under "Deferred past v0.4.0" — notably #182,
#222 and the Wave-1 deferrals #309–#312 and #314. (#292 was closed as satisfied by v0.4.2.)
v1.0.0 — Editor Experience (Deferred)
Full editor integration. Intentionally last — language features and production readiness come before distribution overhead. These items require significant DevOps, testing, and maintenance investment beyond the code itself.
Completed Milestones
v0.4.0 (2026-09-02) ✅
mds fmt,mds lint, source maps for compiled output{x}→{{x}}double-brace interpolation, with a lint--fixmigration pathMdsErrorvariants (CWE-150);LintDiagnosticmade#[non_exhaustive]mds watchcorrectness fixes (mds watch silently loses edits made during startup #317, mds watch idle-tick self-heal never fires when irrelevant filesystem events stream continuously #319, mds watch directory mode has no content-level backstop for cross-root dependencies #321)v0.3.0 (2026-06-28) ✅
v0.2.0 (2026-06-06) ✅
v0.1.0 (2026-05-31) ✅
Notes
node scripts/bump-version.mjs X.Y.Z→ land onmainvia CI-gated PR →git tag -a vX.Y.Z && git push origin vX.Y.Z. Theworkflow_dispatch -f version=path was deleted in chore: harden release machinery (5 independent fixes) #287; baregh workflow run release.ymlis now the dry-run. A staged run that fails mid-publish is recovered withgh run rerun --failed, never by re-tagging.