feat(release): add mandatory canary publish gate#812
Conversation
|
[PHASE: RESEARCH] Re-baselined issue #811, PR #810, and the complete release toolbelt against Findings
Next
Artifact: |
|
[PHASE: PLAN] Locked a six-slice contract-first design for shared cut preparation, composed readiness, the canary workflow, SHA-bound green-pair enforcement, and mandatory release doctrine. Commit
Gate
Artifact: |
PLAN-EVAL — PASSSeparate evaluator: Claude Code + OpenRouter/Qwen 3.7 Max (high), direct-only session All 8 Plan-Gate items passed. The evaluator spot-checked the current release toolbelt and PR #810 boundary, confirmed the six implementation slices and negative-proof gates, and found no open decision that forces rework. Implementation is unblocked at commit Evidence: |
Implementation — slice 2/6: shared preparation + canary cutCommit:
Evidence:
Next: composed publish-readiness evidence and seeded negative checks. |
Implementation — slice 3: composed publish readinessCommit:
Evidence:
This slice is pushed with the explicit refspec to |
Implementation — slice 4: canary workflow + green-pair enforcementCommit:
Evidence: full release suite 59/59, focused slice suite 81/81, touched TypeScript check/format clean, and all three touched workflows parse under |
Implementation — slice 5: mandatory canary-first doctrineCommit:
|
|
[PHASE: IMPL-EVAL] [VERDICT: PASS] Separate direct OpenRouter/Qwen IMPL-EVAL completed against implementation/handoff head
The PR remains draft and is now labeled OWNER actions remain as documented in the PR body: confirm workflow permissions and JSR grants/linkage, then run the first live canary publish + canary-pinned production E2E pair and yank failed/obsolete immutable canaries as needed. |
|
[PHASE: IMPL-EVAL REPAIR] [STATUS: F1/F2 FIXED — RE-EVAL PENDING] Supervisor
Live merged-head proofs:
Repair gates:
Evidence: PR remains draft at |
…VAL FAIL_FIX Proves: preflight-vs-publish outcomes are no longer conflated (33 published / mcp failed / cli skipped, separate from the unauthenticated 10-failed/25-skipped graph preflight); byte-identity of already-published members is now a MANDATORY precondition for any tag move, with beta.10 recast honestly as a non-byte-identical move (6 plugins changed) that JSR's skip-existing/fill-unpublished behavior papered over, not a safe precedent; first-publish live-validation wording now matches #808/#809 (in-tree maintainer CLI against a real scaffolded app) with an explicit note that #812's canary channel changes this to canary-published surface + pinned prod E2E verdict. Cures findings 1-3 of .llm/runs/beta10-cli--orchestrator/slices/819-relskill-eval/evaluate.md. Finding 4 (non-blocking, #812 merge-conflict guidance) is untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017LHrkXyMzsQwb9bqr82EFK
…very doctrine Proves both streams coexist in netscript-release: #812's canary-first mandatory flow (canary pair precondition, publish:readiness, exact-version resolution bullets) AND the FAIL_FIX-corrected recovery doctrine (preflight/publish outcome separation, MANDATORY byte-identity tag-move precondition with beta.10 recast as non-compliant, min-dependency-age forensics, first-publish checklist). First-publish canary wording is now present-tense since #812 is merged. .claude mirror regenerated via agentic:sync-claude, not hand-resolved. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017LHrkXyMzsQwb9bqr82EFK
…, first-publish checklist (#819) * docs(release): codify same-semver republish recovery + min-dependency-age handling + first-publish checklist Owner directive after the v0.0.1-beta.10 cut (2026-07-17): two release patterns were proven live and need to be reachable before an agent defaults to an unwanted stable-channel semver bump. - Same-semver republish (partial-publish recovery): JSR version immutability binds only published members; a failed/skipped member can still publish at the same semver via fix-forward + tag fast-forward + publish.yml re-dispatch. Cites the beta.10 precedent (33/70 members published, mcp/cli recovered without a version bump — runs 29558968037 -> 29562537123). - Minimum-dependency-age at release time: Deno 2.9's ~24h default rejects same-day publishes; the harness pins --minimum-dependency-age=0 and keeps fresh-plugin resolution in one Deno process (child deno x re-exec drops the flag) — #813 + #817. User-facing 24h window tracked in #818. - First-publish checklist: manual README/tagline/license/exports/docs-site/live-validation checks until #811/#812's publish-readiness automation lands. Regenerated the .claude mirror via agentic:sync-claude; docs:links, sync-claude:check, and fmt all green on touched files. * fix(docs): correct beta.10 same-semver recovery accounting per IMPL-EVAL FAIL_FIX Proves: preflight-vs-publish outcomes are no longer conflated (33 published / mcp failed / cli skipped, separate from the unauthenticated 10-failed/25-skipped graph preflight); byte-identity of already-published members is now a MANDATORY precondition for any tag move, with beta.10 recast honestly as a non-byte-identical move (6 plugins changed) that JSR's skip-existing/fill-unpublished behavior papered over, not a safe precedent; first-publish live-validation wording now matches #808/#809 (in-tree maintainer CLI against a real scaffolded app) with an explicit note that #812's canary channel changes this to canary-published surface + pinned prod E2E verdict. Cures findings 1-3 of .llm/runs/beta10-cli--orchestrator/slices/819-relskill-eval/evaluate.md. Finding 4 (non-blocking, #812 merge-conflict guidance) is untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017LHrkXyMzsQwb9bqr82EFK --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
Adds the mandatory canary publish channel and composed publish-readiness gate for NetScript releases. The canary reuses the production OIDC publisher, dispatches and awaits the exact canary-pinned production E2E run, and records a SHA-bound green-pair status that stable publication must verify.
This remains a draft. Do not merge: the supervisor-triggered IMPL-EVAL returned
FAIL_FIX; findings F1/F2 are repaired at64184deb, and a fresh supervisor verdict is pending.Scope
release:preflight; no scanner logic is duplicated.Slices
1c84e1974f60ab365a41004fed4573aacce21549ddd4242e64184debDefinition of Done
release:canaryderives<target>-canary.Nfrom existing JSR versions, uses the shared stable-cut gates, creates no release PR, and retains only its provenance tag after workflow cleanup.release-canary.ymlruns readiness, provisioning, the existing real-publish path, and the exact canary-pinnede2e-cli-prodrun without marking a release Latest.release:publishfails closed without a matching successful pair.origin/mainis merged and the three conflicts are resolved.publish:readinesswith the required evidence.Validation
FAIL_FIXon pre-merge headddd4242e: F1 missing real fix(mcp): registry-safe README embedding — JSR rejects text-import attributes #810 detector; F2 conflicts with current main.64184deb, a merge commit with parentsddd4242eand current mainaa14e452.preflight-text-imports.tsCLI against a seeded text-import fixture; the mocked detector throw is removed.import-attribute-preflightreports generated-constant remediation, deno publish rejects ("import attribute type of text is unsupported") even though it is runtime-stable and --dry-run accepts it denoland/deno#35546, and authenticated-canary sunset.versionless-specifiersreports the required version.first-publishreports missing production H1/install/quick/docs requirements.deno task publish:readiness— PASS, exit 0, all eight composed rows green.--unstable-kv.Harness
.llm/runs/feat-811-release-canary--canary-readiness/.llm/runs/feat-811-release-canary--canary-readiness/repair-evidence.mdFAIL_FIXrepair complete; fresh supervisor IMPL-EVAL pending.Integration with #810
Merged PR #810 owns the import-attribute scanner and its conditional sunset. Current main is now merged into this branch, so
publish:readinessdelegates to the real canonical detector. The real-fixture test and live seed prove that boundary. Lift the ban only after denoland/deno#35546 is fixed, merged, and released in the pinned Deno version and an authenticated canary text-import probe is green.OWNER actions after merge
actions: write,statuses: write, andcontents: writefor the canary workflow.JSR_API_TOKENhas package-edit permission for first-publish provisioning and that every new@netscript/*package is linked torickylabs/netscript; OIDC remains the publish credential.Drift / Debt