Skip to content

release(0201): decouple marketplace into standalone repo + pinned channels (Model B) [gp]#352

Merged
clkao merged 5 commits into
mainfrom
spacedock-ensign/marketplace-repo-and-pinned-channels
Jun 13, 2026
Merged

release(0201): decouple marketplace into standalone repo + pinned channels (Model B) [gp]#352
clkao merged 5 commits into
mainfrom
spacedock-ensign/marketplace-repo-and-pinned-channels

Conversation

@clkao

@clkao clkao commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

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 its devBranch stamp — spacedock@spacedock (stable, ref v0.20.0) vs spacedock-edge@spacedock (edge, ref next). The @<branch>-into-plugin-repo shorthand is removed.

What changed

  • Channel selection by entry name (AC-3): host_exec.go/init.godevBranch=main → install spacedock@spacedock; devBranch=nextspacedock-edge@spacedock. marketplaceSource repointed to spacedock-dev/marketplace. Drops the @branch source shorthand (folds w6). Source vocabulary stays "url" (host rejects "git"). Both claude + codex hosts.
  • Manifest removed from the plugin branch (AC-2): .claude-plugin/marketplace.json deleted — it now lives in the standalone repo. The per-release source.ref divergence the decouple removes is gone; re-expressed as TestPluginBranchCarriesNoMarketplaceManifest + TestChannelSurfacesDoNotDivergeAfterDecouple (the two obsolete tri-surface guards retired into these — no invariant dropped).
  • Decoupling behavior test (AC-1): decoupling_behavior_test.go — tag-pinned stable freezes while edge tracks HEAD, byte-verified on-disk; passes against live claude when present.
  • Contract-chain cleanup: the predates-contract remedy no longer names the plugin repo or rebuilds the @branch shorthand; the now-dead branch/devBranch param is dropped from Compare/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 one url source (github.com/spacedock-dev/spacedock.git): spacedock ref v0.20.0, spacedock-edge ref next. Both channels install end-to-end on claude 2.1.170; stable byte-identical to the v0.20.0 tag tree.

Evidence

  • Whole-repo go test ./... green (16 packages); affected packages (contract/cli/release/integration) force-re-run green.
  • Detached adversarial audit (release machinery): 6/7 claims clean; 1 Material — a stale plugin-repo ref in the predates-contract remedy — found, fixed in this branch, re-verified clean.

Known limitation (documented follow-up)

The edge channel installs correctly but won't auto-advance to subsequent next commits between releases until next-publish stamps next's plugin.json version (the host keys claude plugin update on the source ref's plugin.json version, not the marketplace entry version). The documented spacedock install refresh path does re-pull. Deferred to the release-machinery lane.

[gp]

🤖 Generated with Claude Code

clkao and others added 5 commits June 13, 2026 08:59
…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 clkao temporarily deployed to CI-E2E-CODEX June 13, 2026 16:57 — with GitHub Actions Inactive
@clkao clkao merged commit cc5937c into main Jun 13, 2026
9 checks passed
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 clkao deleted the spacedock-ensign/marketplace-repo-and-pinned-channels branch June 13, 2026 17:25
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>
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