Skip to content

feat: minMillVersion is enforced — a plugin needing a newer Mill is refused, visibly (goal 0245) - #518

Merged
alicoding merged 2 commits into
mainfrom
feat/0245-min-mill-version
Aug 29, 2026
Merged

feat: minMillVersion is enforced — a plugin needing a newer Mill is refused, visibly (goal 0245)#518
alicoding merged 2 commits into
mainfrom
feat/0245-min-mill-version

Conversation

@alicoding

Copy link
Copy Markdown
Owner

The plugin stability contract's teeth (goal 0245's boundary slice). minMillVersion was parsed since 0249 but never checked — a plugin demanding a newer Mill loaded silently against a surface it postdates.

  • Enforced at manifest scan (checkMinMillVersion), so every valid-manifest-only consumer — loader, asset route, ingestion claims, guarded actions — inherits the refusal through the existing fail-closed paths.
  • The Extensions row names both versions ("needs Mill 9.9.9 or newer — this is Mill 1.0.0").
  • A beta satisfies the release it is stamped against (prerelease/build stripped from the app side before compare — main.go's own build-stamp comment documents exactly why plain semver would rank a beta below its target forever).
  • A malformed minimum fails closed like any other manifest error; an unstamped source build skips enforcement rather than refusing every pinned plugin.
  • Stability promise recorded in Extending-the-canvas (the plugin surface versions against Mill's version — the converged app-plugin model — with the compiled-in tier's honest non-promise kept); install-a-plugin gains the one-line behavior.
  • SPEC §9.5 locks the contract; 0245's boundary acceptance line is measured complete in the same docs commit.

Proof: 8-row table test on the comparator + a scan-level test pinning that the refusal reaches ListPlugins.

🤖 Generated with Claude Code

https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq

…efused, visibly (goal 0245)

The stability contract's teeth: the plugin surface versions against
Mill's own version (the converged app-plugin model), and the manifest's
minMillVersion — parsed but never checked until now — is enforced at
scan, so every valid-manifest-only consumer (loader, assets, ingestion
claims, guarded actions) inherits the refusal. The Extensions row names
both versions; a beta satisfies the release it is stamped against
(prerelease stripped before compare); a malformed minimum fails closed;
an unstamped source build skips enforcement. Stability promise recorded
in the Extending-the-canvas docs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding enabled auto-merge (squash) August 29, 2026 15:46
…urce build's version const is the last release, not this build's lineage

Caught by CI: the e2e/dev server builds unstamped (version const 0.5.0)
and refused mill-bookmark's 0.9.0 pin -- the freshest possible code
failing a minimum it satisfies. Channel-aware now: source skips, beta/
stable enforce; pinned-plugin behavior proven per channel in wiring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding merged commit d50670a into main Aug 29, 2026
30 checks passed
@alicoding
alicoding deleted the feat/0245-min-mill-version branch August 29, 2026 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant