release(0201): decouple marketplace into standalone repo + pinned channels (Model B) [gp]#352
Merged
clkao merged 5 commits intoJun 13, 2026
Conversation
…rop @Branch shorthand (AC-3) Repoint marketplaceSource to the standalone marketplace repo (spacedock-dev/marketplace) and select the channel by ENTRY NAME via the binary's devBranch stamp: stable (devBranch=main) installs spacedock@spacedock, edge (devBranch=next) installs spacedock-edge@spacedock. The marketplace add now carries the bare marketplace-repo source — the @<branch>-into-plugin-repo shorthand (claude) and --ref <branch> (codex) are removed; the version pin lives in the manifest, not the install command. New channelEntry/channelPluginID helpers drive both host install sequences and the codex add-prose. Channel-resolution seam tests (channel_selection_test.go) replace the obsolete codex_channel_smoke_test.go, which encoded the @branch/--ref model. Install- tolerance + init seam tests updated in lockstep to the entry-name model. Folds w6. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tracks HEAD
Reproduce the recorded decoupling spike against the real claude host with local
fixture git repos: a plugin repo with tag v0.0.1 and next HEAD ahead at 0.0.2, a
marketplace dir with two entries of one {source:url,url:file://,ref} source
(spacedock stable ref v0.0.1, spacedock-edge edge ref next). Install both channels,
byte-verify stable=v0.0.1 / edge=v0.0.2 from the installed skill body, then advance
plugin HEAD to 0.0.3 + bump only the edge entry + update — assert stable stays frozen
(cache holds only 0.0.1) while edge advances to 0.0.3, from on-disk cache state.
Validated live on claude 2.1.170 (PASS, 2.96s). Host-gated: skips when claude is
absent, hermetic via CLAUDE_CONFIG_DIR/cache isolation + file:// git urls (offline).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…place repo (AC-2) Model B moves the marketplace manifest OUT of the plugin branch into the separate spacedock-dev/marketplace repo, so the per-release source.ref re-settle (the field that kept next→main from being a clean fast-forward) is gone. Remove .claude-plugin/marketplace.json from this (main-bound) branch; the plugin's own .claude-plugin/plugin.json stays. Retire the two guard tests that encoded the in-branch-manifest model and replace them with the AC-2 git-state invariant (the plugin branch carries no marketplace.json): internal/release TestTriSurfaceChannelAgreement → TestPluginBranchCarriesNoMarketplaceManifest (the binary-side pair guards stay intact), and skills/integration TestRootMarketplaceSelfReferentialEntry → TestPluginBranchCarriesNoMarketplaceManifest. The next-branch manifest removal + full main/next alignment is the separate deferred trunk reconcile, not touched here. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-gone invariant (AC-2) Per FO disposition: the old tri-surface agreement meaningfully asserted the channel surfaces AGREE, so re-express it for Model B rather than drop it outright. The in-branch marketplace.json source.ref surface is gone (guarded by the absence check); the channel is now determined solely by the binary's devBranch stamp selecting a marketplace entry name. TestChannelSurfacesDoNotDivergeAfterDecouple asserts the surviving non-tautological invariant: the stable and edge devBranch stamps are independent values that can disagree and MUST differ — identical stamps would collapse both channels onto one marketplace entry. Verified the check fires on a collapsed config (scratch mutation test, removed). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…udit MATERIAL) The detached audit found the decouple half-done at one site the tree-grep missed: contract.pluginPredatesContractRemedy still named the PLUGIN repo (spacedock-dev/spacedock) and rebuilt the removed @Branch shorthand, so an edge binary's predates-contract verdict printed "...reinstalls from spacedock-dev/spacedock@next" — the wrong repo + a shorthand removed everywhere else. Post-decouple the reinstall (spacedock install --host X) auto-selects the channel from the binary's own devBranch stamp (marketplace entry name), so the source parenthetical and the branch param have no purpose. Drop the dead `branch`/`devBranch` param from the contract chain (pluginPredatesContractRemedy, Compare, compareWithManifest, ManifestVerdict, RunDoctor) and the CLI callers; the remedy becomes the clean "Upgrade it: spacedock install --host %s." with no wrong-repo or @Branch text. TDD: flipped the assertions first (predates-contract remedy must NOT name the plugin repo / @Branch), watched fail, then fixed. Negative guards now lock against regression. Polish (same root cause): corrected the stale .goreleaser.yaml comment that said devBranch "pins the marketplace @ref" — post-decouple it selects an entry NAME (the ldflag values were already correct). Stale-ref sweep clean: no plugin-repo source literal, no @"+branch build survives. Whole-repo go test ./... green; zero .md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
clkao
added a commit
that referenced
this pull request
Jun 13, 2026
… merged to main Centerpiece Model B decouple. Validation PASSED + detached adversarial audit (6/7 clean, 1 Material fixed in feedback cycle 1) + live-e2e all hosts green. marketplace repo provisioned + live-validated. Edge-advance gap deferred to ezn.
clkao
added a commit
that referenced
this pull request
Jun 13, 2026
…ardening) (#353) gp (#352) removed .claude-plugin/marketplace.json from main, but the released v0.20.0 binary and the manual install docs resolve their install from main's manifest via `claude plugin marketplace add spacedock-dev/spacedock@main` (default branch = main) — so the removal broke v0.20.0 installs. Model B's manifest removal must be cutover-last, not decouple-first. - Restore the bridge marketplace.json on main (single spacedock entry, ref main) so v0.20.0 installs resolve again. Removal is deferred until after the v0.20.1 cutover ships the binary pointing at the standalone spacedock-dev/marketplace repo and v0.20.0 installs have migrated. - Re-express the two AC-2 absence guards (-> TestMainCarriesMarketplaceBridgeManifest) to guard the bridge's PRESENCE: a regression guard against premature re-removal. - Add the Apache-2.0 LICENSE to main (the release-prep blob never merged) so the README front-door license link resolves. gp's binary repoint + entry-name channel selection are untouched (correct for v0.20.1). Whole-repo go test ./... green. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
clkao
added a commit
that referenced
this pull request
Jun 13, 2026
…w] (#355) * docs: slim README to front door + drop banned prose-grep test [yw] Wave 1 structural cleanup for the site-is-canonical doc architecture: - Remove internal/release/install_doc_test.go — a banned prose-grep that os.ReadFile'd docs/site/get-started/install.md and asserted author substrings. readInstallJourney was file-local; executableShellCommands stays (defined in workflow_exec_guard_test.go, 9 other call sites). - Slim README.md to the front-door skeleton: keep title + Why hook, What's different, Install, License, Contributing. Drop Quick start, How it works, Usage (now on the canonical site). - Install now links the published site https://spacedock.md/docs/ (site_url in mkdocs.yml), keeping the in-repo install.md as secondary. go test ./... green; install-journey grep-clean over live docs/code. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: land the five 0.20.1 behaviors on canonical site pages [yw] Wave 2 behavior-doc pass — yw is the sole doc-owner; the five members shipped zero .md. Each behavior documented on its reverified anchor: - gj (#350): new `## --version` section in command-reference.md showing the version+contract line, the Sandbox: posture, and the per-runtime install/enablement block (wording exercised from `spacedock --version`). - te (#351): command-reference `## Setup` names the contract-compatible- but-behind opt-in upgrade hint (doctor + front-door print it; never blocks). - zrc (#349): command-reference `## Launch` names the unsandboxed posture — claude `--permission-mode auto`, codex `--ask-for-approval on-request`, vs the sandboxed skip/bypass. Scoped to claude/codex; pi injects none. - gp (#352): releasing.md made decouple-accurate — marketplace manifest moved to the standalone spacedock-dev/marketplace repo, no plugin-branch manifest, marketplace.json dropped from the release steps; build-from- source.md adds a spacedock-edge edge-channel user pointer. - 8p (#347): install.md Homebrew tab notes brew also installs agentsview; safehouse is installed separately. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: rewrite --version section to match version-forward output (#354) [yw] #354 (da) replaced the enablement-jargon per-runtime block with a version-forward one. Rewrite the `## --version` section to match: - `<host>: spacedock <version>` when a plugin is installed - ` (disabled)` appended only when the host reports it disabled - `pi: spacedock ready` (pi launches from skills, no versioned plugin) - `<host>: spacedock not installed` when host present but no plugin - `<host>: not installed` when the host binary is absent Drops the obsolete "installed, spacedock enabled" / "enablement unknown" phrasing. Wording read from runtimeLine in internal/cli/host_runtime.go; example output built and exercised via `go build && ./spacedock --version`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The plugin marketplace manifest moves OUT of the plugin git branches into a standalone repo (
spacedock-dev/marketplace), and the binary selects between two pinned channels by marketplace entry name via itsdevBranchstamp —spacedock@spacedock(stable, refv0.20.0) vsspacedock-edge@spacedock(edge, refnext). The@<branch>-into-plugin-repo shorthand is removed.What changed
host_exec.go/init.go—devBranch=main→ installspacedock@spacedock;devBranch=next→spacedock-edge@spacedock.marketplaceSourcerepointed tospacedock-dev/marketplace. Drops the@branchsource shorthand (folds w6). Source vocabulary stays"url"(host rejects"git"). Both claude + codex hosts..claude-plugin/marketplace.jsondeleted — it now lives in the standalone repo. The per-releasesource.refdivergence the decouple removes is gone; re-expressed asTestPluginBranchCarriesNoMarketplaceManifest+TestChannelSurfacesDoNotDivergeAfterDecouple(the two obsolete tri-surface guards retired into these — no invariant dropped).decoupling_behavior_test.go— tag-pinned stable freezes while edge tracks HEAD, byte-verified on-disk; passes against liveclaudewhen present.@branchshorthand; the now-deadbranch/devBranchparam is dropped fromCompare/compareWithManifest/ManifestVerdict/RunDoctor+ the CLI callers (the reinstall auto-selects the channel from the binary's own stamp). Negative guards lock against regression.Marketplace repo (provisioned)
spacedock-dev/marketplace(public) — two entries of oneurlsource (github.com/spacedock-dev/spacedock.git):spacedockrefv0.20.0,spacedock-edgerefnext. Both channels install end-to-end on claude 2.1.170; stable byte-identical to thev0.20.0tag tree.Evidence
go test ./...green (16 packages); affected packages (contract/cli/release/integration) force-re-run green.Known limitation (documented follow-up)
The edge channel installs correctly but won't auto-advance to subsequent
nextcommits between releases untilnext-publishstampsnext'splugin.jsonversion (the host keysclaude plugin updateon the source ref'splugin.jsonversion, not the marketplace entry version). The documentedspacedock installrefresh path does re-pull. Deferred to the release-machinery lane.[gp]
🤖 Generated with Claude Code