Commit 511dae1
Replace the contract-integer compatibility gate with minor-version coupling (#468)
* Replace the contract-integer compatibility gate with minor-version coupling
Removes CONTRACT_VERSION, ParseRange, and the integer Compare math from
internal/contract in favor of a minor-exact major.minor compare over the
binary's own display version and the plugin manifest's version field — the
existing release stamps already couple both sides, so the floor now moves on
every release with zero hand-maintained integer to forget.
- internal/contract: new ParseMajorMinor + Compare(host, pluginVersion,
binaryVersion); PluginPredatesContract folds into TooOldPlugin;
MalformedRange renames to MalformedVersion.
- D3: the module root embeds .claude-plugin/plugin.json so an unstamped dev
build reports <checkout-version>+dev instead of the bare `dev` sentinel,
closing the always-pass carve-out.
- D4: two frozen cross-era sentinels preserved for integer-era installs — the
manifest tombstone requires-contract ">=3,<4" and the (contract 3)
--version token — so an old binary/FO still gets the correct abort remedy.
- D5: the FO shared-core Startup gate rewritten to parse the version line and
carry a single release-stamped "required binary minor" literal.
- D6: gateHost stops printing for too-old-plugin; both front doors now
auto-heal it (install, re-gate once, refuse on a second miss) alongside the
existing no-plugin-found heal. --skip-contract-check renames to
--skip-compat-check throughout.
- Fixture manifests and cli tests migrate off static contract-range fixtures
to versions derived from the effective binary version, so gating tests stay
self-consistent as the repo's own manifest version advances.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Release tooling: prose-stamp .md handler, minor-only tag gate, AC-1 fixture
Adds the D5 release-pipeline half of minor-version coupling:
- internal/release: StampProseVersion/ProseMinor rewrite and read back the FO
shared-core's single "required binary minor" literal, erroring on zero or
multiple matches (atomic by construction) or an unparseable release version.
- cmd/spacedock-release: stamp-version and manifest-tag-gate now dispatch by
file extension — a .md argument takes the prose handler/minor-only tag
compare, a .json argument keeps the existing full-version handling, in the
same multi-file invocation.
- EvaluateProseMinorTagGate compares a tag's major.minor against the
prose-stamped minor (the prose carries no patch, unlike the JSON gate).
- TestStampVersionFlipsCompatibilityFloor is AC-1's divergeable proof:
restamping ONLY the release version (no hand-edited integer) moves the SAME
fixed binary version from Compatible to TooOldBinary against both the
manifest and the prose gate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* release.yml: wire the FO prose file into all three stamp-version call sites
The D5 prose gate needs the same release-stamp coverage the plugin manifests
already get, or a branch's skills contradict their own manifest (next carries
manifests at X.(Y+1).0-pre1 while un-restamped prose still says the prior
minor). Adds skills/first-officer/references/first-officer-shared-core.md to
the manifest-tag-gate arg list, the main-reconcile stamp-version call + its
git diff/commit path lists, and the next edge-bump stamp-version call + its
commit path list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* internal/contractlint: sync test binds the FO prose minor to the manifests
Pins D5's cross-file invariant in the quarantine-sanctioned home for a check
that reads an instruction file: the FO shared-core's release-stamped "required
binary minor" literal must equal the major.minor each vendored plugin manifest
parses to, and the D4 tombstone (requires-contract ">=3,<4") stays frozen on
both manifests. skills/integration's manifest tests drop the now-duplicated
tombstone assertion, keeping only the manifest-shape checks that don't need an
instruction-file read.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs: reword the deleted contract-integer mechanism out of user-visible docs
docs/releasing.md's stamp-then-tag step now carries the FO prose file
alongside the manifests, notes the go-install proxy build's cosmetic +dev
suffix; docs/runtime-live-ci.md's --skip-contract-check example renames to
--skip-compat-check; the proof-policy worked example (docs/site/contributing/
proof-policy.md and docs/dev/README.md) rewords "the plugin manifest's
contract range bracketing the binary's contract version" to "the plugin
manifest's version sharing a major.minor with the binary's version" — the old
example named a mechanism this task deletes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* internal/ensigncycle: rename --skip-contract-check to --skip-compat-check
Mechanical follow-through of the front-door flag rename in the (build-tag
live) runtime-live drive fixtures, so a live-tagged run of these tests still
invokes a flag the binary recognizes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Cleanup pass: rename remaining stray contract-integer mentions in test prose
Grep-level sweep for CONTRACT_VERSION / ParseRange / MalformedRange /
PluginPredatesContract / --skip-contract-check turned up three leftover
prose spots the earlier passes missed: a subtest name, a doc comment citing
the renamed MalformedVersion verdict, and pi's --help negative-assertion list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Add D6 test coverage: too-old-plugin auto-heal was implemented but untested
resolveHealableGate's too-old-plugin arm (announce, install, re-gate once,
refuse on a second miss) had no direct test — the tooOldPluginManifest fixture
helper existed but nothing called it. Adds: gateHost stays silent for
too-old-plugin (mirrors the NoPluginFound silence test); both front doors
auto-refresh + re-gate + launch on success; --no-install refuses with the
gate's own mismatch remedy; a persisted mismatch after refresh refuses without
looping (exactly one Install call).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Add AC-5 dev-build coverage: the embed unit test and a real go-build fixture
displayVersion()'s dev-fallback (D3) had implementation but no dedicated
test: the unit half (embeddedManifestVersion reads this checkout's own
manifest, displayVersion falls back only when unstamped) and the behavior
fixture half (an actual `go build ./cmd/spacedock` + `--version` reports
<checkout-version>+dev on line 1) were both missing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Spike Test <spike@example.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent 3a04495 commit 511dae1
62 files changed
Lines changed: 1575 additions & 760 deletions
File tree
- .claude-plugin
- .codex-plugin
- .github/workflows
- cmd/spacedock-release
- docs
- dev
- site/contributing
- internal
- cli
- contractlint
- contract
- testdata
- ensigncycle
- release
- skills
- first-officer/references
- integration
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
135 | 137 | | |
136 | 138 | | |
137 | 139 | | |
138 | | - | |
| 140 | + | |
139 | 141 | | |
140 | 142 | | |
141 | 143 | | |
| |||
218 | 220 | | |
219 | 221 | | |
220 | 222 | | |
| 223 | + | |
221 | 224 | | |
222 | 225 | | |
223 | 226 | | |
| |||
226 | 229 | | |
227 | 230 | | |
228 | 231 | | |
229 | | - | |
230 | | - | |
231 | | - | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
232 | 235 | | |
233 | 236 | | |
234 | 237 | | |
235 | | - | |
236 | | - | |
| 238 | + | |
| 239 | + | |
237 | 240 | | |
238 | 241 | | |
239 | 242 | | |
| |||
303 | 306 | | |
304 | 307 | | |
305 | 308 | | |
| 309 | + | |
306 | 310 | | |
307 | | - | |
| 311 | + | |
308 | 312 | | |
309 | | - | |
| 313 | + | |
310 | 314 | | |
311 | 315 | | |
312 | 316 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
32 | 35 | | |
33 | 36 | | |
34 | 37 | | |
35 | | - | |
36 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
37 | 41 | | |
38 | 42 | | |
39 | 43 | | |
| |||
140 | 144 | | |
141 | 145 | | |
142 | 146 | | |
143 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
144 | 157 | | |
145 | 158 | | |
146 | 159 | | |
| |||
346 | 359 | | |
347 | 360 | | |
348 | 361 | | |
349 | | - | |
| 362 | + | |
350 | 363 | | |
351 | 364 | | |
352 | 365 | | |
353 | 366 | | |
354 | | - | |
| 367 | + | |
355 | 368 | | |
356 | 369 | | |
357 | 370 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
| 1 | + | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
20 | 23 | | |
21 | 24 | | |
22 | | - | |
| 25 | + | |
23 | 26 | | |
24 | 27 | | |
25 | | - | |
26 | | - | |
| 28 | + | |
| 29 | + | |
27 | 30 | | |
28 | 31 | | |
29 | 32 | | |
30 | 33 | | |
31 | 34 | | |
32 | 35 | | |
33 | 36 | | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
40 | 56 | | |
41 | | - | |
42 | 57 | | |
43 | 58 | | |
44 | 59 | | |
| |||
47 | 62 | | |
48 | 63 | | |
49 | 64 | | |
50 | | - | |
| 65 | + | |
51 | 66 | | |
52 | 67 | | |
53 | 68 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
0 commit comments