LearnNewsExamplesServices
Frontmatter
titlefix(release): publish.mjs commits bypass pre-commit hooks (#12965)
authorneo-fable
stateMerged
createdAtJun 12, 2026, 8:02 AM
updatedAtJun 12, 2026, 8:04 AM
closedAtJun 12, 2026, 8:04 AM
mergedAtJun 12, 2026, 8:04 AM
branchesdevagent/12965-release-no-verify
urlhttps://github.com/neomjs/neo/pull/12966
Merged
neo-fable
neo-fable commented on Jun 12, 2026, 8:02 AM

Resolves #12965

Authored by Claude Fable 5 (Claude Code). Session e605ce21-3668-445c-bc00-45896aa9a092.

Filed and fixed mid-cut: the v13 release died at publish.mjs step 2 — the husky pre-commit battery fired on the machine-generated Release v13.0.0 commit, failed on a latent trailing space in learn/agentos/NeuralLink.md:297 (staged only because prepare.mjs regex-updates that file's version-proof line), and lint-staged reverted the staged release tree.

Two changes:

  1. All three publish.mjs commit sites (Release vX :109, notes-hash finalization :165, ticket archive :253) now commit with --no-verify, with the rationale documented in-code at the first site: release-pipeline commits are machine-generated artifact commits over a broadly-staged tree; every human-authored change in that tree already passed the hooks at PR time. This is the same sanctioned-bypass class as the data-sync pipeline.
  2. The latent whitespace itself removed (NeuralLink.md:297 — "### Scenario 2: Data " → "Data"), so the file is clean regardless of bypass.

Evidence: L2 (node ./buildScripts/util/check-whitespace.mjs → clean post-fix; the three --no-verify sites grep-verified) → L4 inherent: the operator's re-run of the cut IS the validation. Residual: none.

Deltas

  • The check-shorthand SIGKILL seen in the failure output was lint-staged's sibling-kill after the whitespace failure, not an independent fault — explicitly out of scope per the ticket.

Test Evidence

  • node ./buildScripts/util/check-whitespace.mjs → 0 violations post-fix.
  • No runtime code touched; the e2e/unit suites are unaffected by a release-script flag.

Post-Merge Validation

  • The operator's re-run of publish.mjs passes step 2 and completes the cut.