Skip to content

Preserve release tags by creating GitHub Releases after npm publish - #1521

Draft
schickling-assistant wants to merge 4 commits into
mainfrom
schickling-assistant/2026-07-29-2026-07-29-release-tag-relocation
Draft

Preserve release tags by creating GitHub Releases after npm publish#1521
schickling-assistant wants to merge 4 commits into
mainfrom
schickling-assistant/2026-07-29-2026-07-29-release-tag-relocation

Conversation

@schickling-assistant

@schickling-assistant schickling-assistant commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Problem

Core creates GitHub Releases and their implicit git tags inside the DevTools
Chrome ZIP publisher. Deleting that publisher in the repository split would
therefore silently stop core releases and tags, even though npm publication
continues.

The initial version of this PR moved gh release create without adding
--target. That was a correctness defect: for a missing tag, gh resolves the
latest state of the default branch rather than the checked-out release-plan
commit. A concurrent main advance could therefore make v<version> point at
code different from the code npm received. Moving creation earlier also changed
the resolution window, so the initial claim that commitish behavior was
preserved was incorrect.

The old path also falls back to a generic Release <version> body when the
committed release notes are missing, which can preserve stale release notes.

Goal

Keep core GitHub Release and tag creation independent of DevTools artifact
machinery while guaranteeing the tag names the exact workflow commit that
published the release.

This is a standalone prerequisite for #1497 and can merge independently of the
rest of that epic.

Decisions

  • Create or update the GitHub Release in the existing publish-release job,
    immediately after stable npm publication succeeds.
  • Pin automatic tag creation with --target "$GITHUB_SHA". For the release-plan
    push and main-only manual dispatch paths, that immutable SHA is the workflow
    commit whose checkout was published.
  • Keep the existing rerun behavior: edit notes when the Release exists,
    otherwise create the Release/tag and mark prerelease versions.
  • Require nonempty committed release/release-notes.md. Missing or
    whitespace-only notes fail during extraction and again at publish time.
  • Do not add a publish-release concurrency stanza. It cannot prevent unrelated
    pushes from advancing main, and cancellation or serialization would change
    release recovery behavior. Pinning the immutable target directly closes the
    integrity hole.
  • Leave gh release upload in devtools-artifact.ts. The Chrome ZIP does not
    move to a core Release destination; its removal remains part of the later
    DevTools cleanup.

Verification

Initial relocation checks before the P1 follow-up:

  • CI=1 devenv tasks run genie:check (passed)
  • CI=1 devenv tasks run lint:full (passed)
  • CI=1 devenv tasks run ts:check (passed)
  • CI=1 devenv shell -- vitest run scripts/src/commands/release.test.ts
    (8 tests passed)
  • CI=1 devenv shell -- vitest run tests/package-common/src/intent-layer/intent-layer.test.ts
    (8 tests passed)
  • CI=1 devenv tasks run test:unit (passed)

P1 follow-up verification:

  • Final HEAD 19bed7f24737189139c0f5adb68722cb32b14c0e passed all executable
    GitHub checks: 26 succeeded, 8 release-event-only jobs skipped, 0 failed.
    Main CI run 30464531113, Release run 30464531326, and DevTools manifest
    run 30464531272 all completed successfully.
  • The workflow guard now parses generated YAML and asserts npm-before-Release
    ordering, no continue-on-error, exact --target "$GITHUB_SHA", Release
    view/edit/create behavior, prerelease behavior, semantic nonempty notes, and
    the absence of core-side upload in the relocated step.
  • The release-note extractor has negative tests for empty and whitespace-only
    version sections.
  • Final CI passed lint, type-check, unit, all seven sync-provider cells,
    Playwright (DevTools/misc/TodoMVC), wa-sqlite, perf, package snapshot,
    examples, docs, source policies, release-plan validation, and manifest
    update.
  • In particular, test-integration-sync-provider (cf-ws-do) passed on this
    branch. Its comparison branch Fix extension Playwright launches by preserving caller args #1520 also passed after correcting a missing
    lockfile entry; an earlier Fix extension Playwright launches by preserving caller args #1520 cell never reached tests because frozen
    install rejected that lockfile.

Local builds were intentionally frozen during the dev3 disk incident. The
one-off commit-hook bypass cost two deterministic CI formatting round-trips:
the first manual repair guessed incorrectly, then the approved single-file
configured oxfmt output and matching --check produced the green final
commit. This is evidence of the verification-relocation trade, not precedent
for skipping local gates.

The documented devenv tasks run test:run command is absent in this checkout.
An earlier aggregate CI=1 devenv shell -- mono test attempt observed unrelated
webmesh and package-common failures, then the integration launcher hit the
repository's direct-pnpm passthrough guard. The dedicated managed unit task
passed before that aggregate attempt.

Demo

publish commit A to npm
         |
         v
gh release create v<version> --target A
         |
         v
tag v<version> permanently names published commit A

Complexity

No new job, permission, dependency, or abstraction. The change adds one
generated workflow step and parsed structural coverage for its release
integrity contract.

Concerns

Friction & bottlenecks

  • Repository instructions still name a removed test:run task.
  • The aggregate local test command invokes Playwright through direct pnpm,
    which the repository task guard rejects.
  • P1 follow-up verification moved to off-host CI because dev3 is under an
    explicit build freeze after rapid disk consumption.

Follow-ups

References

@schickling-assistant schickling-assistant added area:ci CI workflows, runners, and pipeline configuration · Set: manual type:task Scoped implementation/follow-up work (not bug/feature/docs/incident/RCA/epic) · Set: manual labels Jul 29, 2026
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

PR preview

Subject Status Report Details Updated
LiveStore docs preview success Docs preview deployed (livestore-docs-dev) PR aliases: pr-1521-d7a588c, pr-1521 2026-07-29 15:34 UTC
web-linearlite success web-linearlite deployed (preview) Worker: example-web-linearlite-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc success web-todomvc deployed (preview) Worker: example-web-todomvc-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc-script success web-todomvc-script deployed (preview) Worker: example-web-todomvc-script-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc-sync-cf success web-todomvc-sync-cf deployed (preview) Worker: example-web-todomvc-sync-cf-preview.livestore.workers.dev 2026-07-29 15:32 UTC
Report history

PR 1521 · 2026-07-29 15:44 UTC

Subject Status Report Details Updated
LiveStore docs preview success Docs preview deployed (livestore-docs-dev) PR aliases: pr-1521-d7a588c, pr-1521 2026-07-29 15:34 UTC
web-linearlite success web-linearlite deployed (preview) Worker: example-web-linearlite-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc success web-todomvc deployed (preview) Worker: example-web-todomvc-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc-script success web-todomvc-script deployed (preview) Worker: example-web-todomvc-script-preview.livestore.workers.dev 2026-07-29 15:32 UTC
web-todomvc-sync-cf success web-todomvc-sync-cf deployed (preview) Worker: example-web-todomvc-sync-cf-preview.livestore.workers.dev 2026-07-29 15:32 UTC

PR 1521 · 2026-07-29 15:26 UTC

Subject Status Report Details Updated
LiveStore docs preview success Docs preview deployed (livestore-docs-dev) PR aliases: pr-1521-5a043d5, pr-1521 2026-07-29 15:16 UTC
web-linearlite success web-linearlite deployed (preview) Worker: example-web-linearlite-preview.livestore.workers.dev 2026-07-29 15:10 UTC
web-todomvc success web-todomvc deployed (preview) Worker: example-web-todomvc-preview.livestore.workers.dev 2026-07-29 15:10 UTC
web-todomvc-script success web-todomvc-script deployed (preview) Worker: example-web-todomvc-script-preview.livestore.workers.dev 2026-07-29 15:10 UTC
web-todomvc-sync-cf success web-todomvc-sync-cf deployed (preview) Worker: example-web-todomvc-sync-cf-preview.livestore.workers.dev 2026-07-29 15:10 UTC

PR 1521 · 2026-07-29 15:11 UTC

Subject Status Report Details Updated
LiveStore docs preview success Docs preview deployed (livestore-docs-dev) PR aliases: pr-1521-79ba70a, pr-1521 2026-07-29 15:01 UTC
web-linearlite success web-linearlite deployed (preview) Worker: example-web-linearlite-preview.livestore.workers.dev 2026-07-29 14:53 UTC
web-todomvc success web-todomvc deployed (preview) Worker: example-web-todomvc-preview.livestore.workers.dev 2026-07-29 14:53 UTC
web-todomvc-script success web-todomvc-script deployed (preview) Worker: example-web-todomvc-script-preview.livestore.workers.dev 2026-07-29 14:53 UTC
web-todomvc-sync-cf success web-todomvc-sync-cf deployed (preview) Worker: example-web-todomvc-sync-cf-preview.livestore.workers.dev 2026-07-29 14:53 UTC

PR 1521 · 2026-07-29 14:20 UTC

Subject Status Report Details Updated
LiveStore docs preview success Docs preview deployed (livestore-docs-dev) PR aliases: pr-1521-a9fffce, pr-1521 2026-07-29 14:11 UTC
web-linearlite success web-linearlite deployed (preview) Worker: example-web-linearlite-preview.livestore.workers.dev 2026-07-29 14:02 UTC
web-todomvc success web-todomvc deployed (preview) Worker: example-web-todomvc-preview.livestore.workers.dev 2026-07-29 14:02 UTC
web-todomvc-script success web-todomvc-script deployed (preview) Worker: example-web-todomvc-script-preview.livestore.workers.dev 2026-07-29 14:02 UTC
web-todomvc-sync-cf success web-todomvc-sync-cf deployed (preview) Worker: example-web-todomvc-sync-cf-preview.livestore.workers.dev 2026-07-29 14:02 UTC

Pin automatic tag creation to the exact workflow SHA and reject empty release notes at extraction and publish time.

One-off: the commit hook was bypassed during the dev3 host build freeze. Verification is deliberately relocated to the confirmed-live GitHub Actions CI for PR #1521; this is not a precedent for skipping local gates.
Apply the deterministic formatting correction reported by GitHub Actions after the one-off host-freeze hook bypass. This extra CI round-trip is the concrete cost of relocating verification; it is not precedent for skipping local gates.
Apply the exact single-file oxfmt output after GitHub Actions showed the manual formatting repair was incomplete. The hook remains bypassed only under the one-off dev3 host freeze; the matching configured formatter check passed before this push.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:ci CI workflows, runners, and pipeline configuration · Set: manual type:task Scoped implementation/follow-up work (not bug/feature/docs/incident/RCA/epic) · Set: manual

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant