fix(publish): JSR first-publish package provisioning + one-shot e2e CI + deterministic release tool#122
Merged
Merged
Conversation
Owner
Author
|
[PHASE: IMPL] [VERDICT: READY_FOR_IMPL_EVAL] Implemented the JSR first-publish provisioning slice and pushed it to Scope
Commits
Validation
Gate Notes
Next
|
Owner
Author
|
[PHASE: IMPL] [VERDICT: FOLLOW_UP_READY_FOR_IMPL_EVAL] Applied the reviewer-requested JSR provisioning robustness fix. Commit
What Changed
Validation
Worklog and |
This was referenced Jun 26, 2026
rickylabs
added a commit
that referenced
this pull request
Jun 28, 2026
… (#164) * docs(release): one-shot deterministic release automation — research + plan (#147) Folds #122 (workspace-coordinated version bump: root+members+lock), #146 (drop --frozen rejected by Deno 2.9 deno ci), #123 (gate e2e-cli-prod behind publish via workflow_run, no JSR race), #133 (text-import preflight gate). Plan-only; no tooling code. Awaiting PLAN-EVAL before any implementation slice. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(openhands): apply agent changes * chore(openhands): record run trace 28304587059-1 * docs(release): PLAN-EVAL cycle-2 revision — narrow D3 + two-pass cross-line scan (#147) Addresses PLAN-EVAL cycle-1 FAIL_PLAN (sole blocker D3). D3 now scans only Deno.readTextFile/readFile (drops constructor false-positives) with a two-pass cross-line resolver for the openapi.ts:29->155 break class + positive/negative fixtures. Folds the 3 non-blocking clarifications: D4 artifact version handoff, D5 agentic:sync-claude regen, D2 exact edit sites. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(openhands): apply agent changes * chore(openhands): record run trace 28305083715-1 * chore(release): fix prod install args * chore(release): add text import preflight * chore(release): add release cut orchestrator * chore(release): order prod e2e after publish * docs(release): add release workflow skill * chore(harness): finalize release automation run artifacts * chore(openhands): apply agent changes * chore(openhands): record run trace 28305978962-1 * chore(lock): drop spurious @std/yaml entry from IMPL-EVAL ad-hoc parse The IMPL-EVAL evaluator ran an ad-hoc `@std/yaml parse` for workflow YAML sanity, which leaked jsr:@std/yaml@1 into the root deno.lock. No committed source imports @std/yaml, so the entry is unused churn. Restore deno.lock to the IMPL HEAD (58ab73c) state. Release-automation tooling is unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: OpenHands Bot <openhands@all-hands.dev>
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.
Summary
Fixes the first-publish JSR failure mode where every
@netscript/*package must be pre-created in the JSR registry and linked torickylabs/netscriptbefore OIDC publish can authorize. This PR adds idempotent package provisioning, wires it into the release publish workflow before the dry-run/publish steps, and adds a deterministic GitHub Release helper so the release cut uses argv arrays instead of hand-built shell quoting.Root Cause
The first OIDC publish failed because JSR does not auto-create packages non-interactively. OIDC publish can prove provenance, but the packages must already exist under the
@netscriptscope and be linked to the public GitHub repository before the first publish.Authoritative API
Provisioning uses
https://api.jsr.iowithAuthorization: Bearer <token>and JSON bodies:GET /scopes/{scope}/packages/{package}to check existence.POST /scopes/{scope}/packageswith{ "package": "<name>" }to create missing packages.PATCH /scopes/{scope}/packages/{package}with{ "githubRepository": { "owner": "rickylabs", "name": "netscript" } }to link OIDC authorization.Already-exists and already-linked/no-op responses are treated as idempotent success.
Scope
.llm/tmp/run/fix-jsr-first-publish-provisioning--e2e/Deliverables
.llm/tools/jsr-provision-packages.ts: discovers all publishable members viadiscoverWorkspaceMembers, lists the 31 package names, no-ops withoutJSR_API_TOKEN, and otherwise performsGET-> optionalPOST->PATCHsequentially..github/workflows/publish.yml: bumpsactions/checkoutto@v5, addsEnsure JSR packages existbeforePublish dry-run, keepsid-token: write, and keeps publish on.llm/tools/run-publish.tsrather than baredeno publish..llm/tools/release.ts: validates--tag, workspace version equality, and non-empty notes, then runsgh release createviaDeno.Commandargv;--dry-runprints the exact argv without creating a release.One-Shot Release Flow
@netscriptpackage-management/full access and add it as repo secretJSR_TOKEN.v0.0.1-alpha.1.actions/checkout@v5.Ensure JSR packages existusesJSR_TOKENto create and link all 31@netscript/*packages.Publish dry-runruns the existing per-member publish tool.Publishruns the existing per-member publish tool with OIDC provenance.Slices
3fcabc04b2065d91Validation
deno check --unstable-kv .llm/tools/jsr-provision-packages.ts .llm/tools/release.ts— PASS.deno run --allow-read --allow-run .llm/tools/run-deno-fmt.ts --root .llm/tools --ext ts --include '^(\\.llm/tools/(jsr-provision-packages|release)\\.ts)$'— PASS, 2 files selected, 0 findings.deno lint --config /dev/null .llm/tools/jsr-provision-packages.ts .llm/tools/release.ts— PASS, checked 2 files.deno eval --no-lock+jsr:@std/yaml— PASS.checkoutV4=false,checkoutV5Count=1,ensureBeforeDryRun=true, publish usesrun-publish.ts, no baredeno publishworkflow step.env -u JSR_API_TOKEN deno run --allow-net --allow-read --allow-env .llm/tools/jsr-provision-packages.ts --dry-run— PASS, listed 31 members and printedJSR_API_TOKEN not set — skipping provisioning (assuming packages already provisioned).deno run --allow-read --allow-run .llm/tools/release.ts --dry-run --tag v0.0.1-alpha.1 --notes-file <temp notes>— PASS, printedgh release create v0.0.1-alpha.1 --target main --notes-file ... --repo rickylabs/netscript --title v0.0.1-alpha.1 --prerelease.deno run --allow-read --allow-run .llm/tools/release.ts --dry-run --tag v0.0.2-alpha.1 --notes-file <temp notes>— PASS, failed clearly withRelease tag version 0.0.2-alpha.1 does not match workspace version 0.0.1-alpha.1.Known Gate Notes
deno run --allow-read --allow-run .llm/tools/run-deno-check.ts --root .llm/tools --ext tsis blocked by unrelated pre-existing.llm/tools/fitness/check-manifest-integrity.tserrors: missingpackages/fresh-ui/registry/manifest.tsand implicit-any parameters..llm/files because the root Deno lint config excludes.llm/; explicitdeno lint --config /dev/nullwas used for the touched tools.Drift / Debt