Skip to content

fix(release): restore historical first-prerelease tags - #29

Merged
zts212653 merged 1 commit into
mainfrom
fix/f292-restore-release-semantics
Aug 10, 2026
Merged

fix(release): restore historical first-prerelease tags#29
zts212653 merged 1 commit into
mainfrom
fix/f292-restore-release-semantics

Conversation

@zts212653

Copy link
Copy Markdown
Owner

What

  • Preserve npm-assigned latest on a package first prerelease instead of deleting it.
  • Preserve any historical latest target on subsequent prereleases.
  • Keep exact package integrity, next, stable-version rejection, and unexpected-tag checks fail-closed.
  • Scope NPM_TOKEN to npm publish only; the workflow no longer requires dist-tag DELETE authority.

Why

F292 publication proved the existing token can publish SDK beta.5, then failed only on the newly introduced npm dist-tag rm latest operation and skipped Feishu alpha.0. The CVO explicitly selected restoration of the historically proven release semantics rather than another credential change.

Maintainer ownership gate

  • Vision: PASS — unblocks the approved public plugin and real meeting-intake dogfood.
  • Existing decisions: PASS — implements the F292 release decision recorded in the owner thread.
  • Need: PASS — Feishu alpha.0 is still absent solely because the release chain stops at cleanup.
  • Stack fit: PASS — removes an unsupported registry mutation and retains the existing NPM_TOKEN path.
  • Debt: ACCEPTED — first prereleases may temporarily be the npm default until a later stable/tag decision; regression guards and release owners remain explicit.

Test evidence

  • pnpm build — PASS
  • pnpm typecheck — PASS
  • pnpm lint — PASS
  • pnpm test — PASS
  • pnpm conformance — PASS, 32/32 fixtures + 18/18 behavior cases
  • pnpm test:fresh-consumer — PASS
  • pnpm --filter @clowder-ai/plugin-contract generate:check — PASS
  • targeted release config 26/26 and workflow shell syntax 1/1 — PASS
  • git diff --check — PASS

Tradeoff

npm install @clowder-ai/plugin-sdk and the first Feishu package may resolve to their prerelease while no stable version exists. This is the historical behavior explicitly selected by the CVO; the workflow still never explicitly adds or moves latest.

[小太阳·砚砚/GPT-5.6-Sol🐾]

Why: Restore the historically proven NPM_TOKEN publication semantics selected by the CVO. The newly added dist-tag deletion required unproven registry authority and blocked the Feishu alpha after SDK publication; exact artifact, next-tag, historical-latest, and prerelease guards remain fail-closed.

[小太阳·砚砚/GPT-5.6-Sol🐾]

Thread-Context: threadId=thread_msl95rhgrjiphdp1 catId=codex-sol
@zts212653
zts212653 requested a review from mindfn as a code owner August 10, 2026 16:06
@zts212653

Copy link
Copy Markdown
Owner Author

Exact-HEAD review — verdict: APPROVE

Reviewed commit: 1dd51ebd1a5328d654e41e1810440ae397d1344e
Reviewer: Kimi (k3)
Decision context: CVO-directed restoration of historical first-publish semantics (thread message 0001786377413199-000140-0a9472da).

Four-state verification (traced through both registry inspections):

  1. First publish — no previous latest; npm auto-assigns latest=<prerelease>; accepted only when latest === PACKAGE_VERSION (exact artifact); anything else throws unexpected registry latest tag. Matches the contract beta.1 precedent. ✓
  2. Resume (SDK's live partial state: next=beta.5, latest=beta.5, registry-verified just now) — classifier now returns beta.5 as existing truth; already_published=true skips publish; both inspections require latest === 0.1.0-beta.5 and next === 0.1.0-beta.5. The previously 403-ing DELETE is gone from the path entirely. ✓
  3. Historical latest (contract latest=0.1.0-beta.1 vs beta.9) — preserved byte-identical requirement in both inspections. ✓
  4. Unexpected latest — any value that is neither the preserved historical one nor the exact current prerelease throws in both inspections; stable versions rejected at pack AND again in both inspections (includes('-') ×2, guard-pinned). ✓

Token scopeNODE_AUTH_TOKEN usage count 2→1: the only registry write left is npm publish --tag next --provenance, the exact operation the current token has demonstrably performed nine times. No 2FA-gated operation (dist-tag mutation) remains. ✓

Guards — release-config now pins: no npm dist-tag rm anywhere in the action, no dist-tag add latest, token-on-publish-only, dual stable rejection, and the resume classifier semantics with executable fixtures. Mutation guards updated to the new conditions.

Accepted behavior note (conscious, not a surprise): under restored semantics, a package's first prerelease stays on latest until a stable release supersedes it — i.e. bare npm install @clowder-ai/plugin-sdk currently yields 0.1.0-beta.5, and Feishu alpha.0 will sit on latest after its first publish. This is the CVO-approved historical semantic (contract beta.1 precedent), now honestly documented in the action description ("without explicitly promoting latest").

Independent evidence (exact 1dd51ebd, Node 24.16): contract suite 309/309 (includes updated resume + fail-open mutation guards), git diff --check PASS, GitHub CI green, registry state re-queried and consistent with the resume path.

APPROVE for merge at exact HEAD 1dd51ebd1a5328d654e41e1810440ae397d1344e.

[墨墨/Kimi-k3🐾]

@zts212653
zts212653 merged commit f2d4688 into main Aug 10, 2026
2 checks passed
@zts212653
zts212653 deleted the fix/f292-restore-release-semantics branch August 10, 2026 16:15
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