LearnNewsExamplesServices
Frontmatter
id12965
titleRelease pipeline commits must bypass pre-commit hooks (publish.mjs died mid-cut)
stateClosed
labels
bugaibuild
assigneesneo-fable
createdAtJun 12, 2026, 8:00 AM
updatedAtJun 12, 2026, 8:04 AM
githubUrlhttps://github.com/neomjs/neo/issues/12965
authorneo-fable
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 12, 2026, 8:04 AM

Release pipeline commits must bypass pre-commit hooks (publish.mjs died mid-cut)

neo-fable
neo-fable commented on Jun 12, 2026, 8:00 AM

Context

Live failure during the v13 cut (2026-06-12 ~05:55, operator-run): publish.mjs step 2's git commit -m "Release v13.0.0" triggered the husky pre-commit battery, which failed on pre-existing trailing whitespace in learn/agentos/NeuralLink.md:297 (staged because prepare.mjs regex-updates the version-proof line in that file) and sibling-killed check-shorthand. lint-staged reverted the staged release state; the cut died at step 2 of 6.

Release classification: release-blocking — the cut cannot complete without it (filed mid-cut).

The Problem

The release pipeline's commits are machine-generated artifact commits (build outputs, archive moves, notes finalization) staged via broad git add .. Developer-workflow hooks (whitespace, shorthand, ticket-archaeology) gate HUMAN-authored changes; running them against a release tree means ANY latent dirt anywhere in generated-or-touched files kills the release at its most fragile moment — mid-pipeline, after prepare/build mutated the tree. The hooks' purpose is already served upstream: every change in the tree arrived through hook-gated PR commits.

The Architectural Reality

buildScripts/release/publish.mjs has three commit sites: :109 (the Release commit), :165 (notes-hash finalization), :253 (ticket archive). All use plain git commit. The husky pre-commit (check-chore-sync + lint-staged) fires on each. The whitespace instance itself: learn/agentos/NeuralLink.md:297 carries a pre-existing trailing space ("### Scenario 2: Data ") — latent until prepare.mjs's version-replace staged the file.

The Fix

  1. --no-verify on all three git commit invocations in publish.mjs — the release pipeline is the sanctioned bypass (same class as the data-sync pipeline's exception to branch protection).
  2. Fix the latent whitespace at NeuralLink.md:297 so the file is clean regardless.

Acceptance Criteria

  • All three publish.mjs commit sites bypass hooks; re-running the cut passes step 2.
  • NeuralLink.md:297 trailing whitespace removed.

Out of Scope

  • The check-shorthand SIGKILL under resource pressure (separate, non-blocking — it was the sibling-kill here, not the cause).

Related

#12696 (the cut), the freshness/lint substrate family.

Origin Session ID: e605ce21-3668-445c-bc00-45896aa9a092

Retrieval Hint: "publish.mjs husky pre-commit no-verify release commit died"

tobiu referenced in commit f3bbf8b - "fix(release): publish.mjs commits bypass pre-commit hooks (#12965) (#12966) on Jun 12, 2026, 8:04 AM
tobiu closed this issue on Jun 12, 2026, 8:04 AM