Skip to content

Release v0.1.0-beta.3 - #47

Merged
ThomasK33 merged 5 commits into
mainfrom
release/v0.1.0-beta.3
Oct 30, 2026
Merged

ThomasK33 merged 5 commits into
mainfrom
release/v0.1.0-beta.3

Conversation

@ThomasK33

Copy link
Copy Markdown
Member

Why

Ship the snapshot() crash fix (#46) to npm. Every earlier version, 0.1.0-beta.2 included, crashes Node when a JS accessor on Object.prototype disposes the terminal while snapshot() builds its result.

What changed

  • package.json and package-lock.json go from 0.1.0-beta.2 to 0.1.0-beta.3. The branch name matches the version, so publish.yml creates v0.1.0-beta.3 after merge.
  • The release-changelog workflow adds the CHANGELOG entry to this branch.

Blast Radius

The merge publishes 0.1.0-beta.3 to npm under the beta dist-tag. latest stays on 0.1.0-beta.0. Snapshot output is byte-identical to beta.2, as #46's verifier checked.

Verification

  • prepare-release-changelog.mjs prints should_generate=true and version-changed. resolve-npm-publish-tag.mjs prints beta.
  • On main 9f8ec06 with Node 26.12.1: npm test (77 passed), build:prebuild, verify:prebuilds (loads prebuilds/linux-x64) and npm pack --dry-run all pass.

Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high

_Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_

Change-Id: I021f79b32f2433d3d9bfa1abde9f6bf3bf341bad
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33 ThomasK33 self-assigned this Oct 30, 2026
github-actions Bot and others added 2 commits October 30, 2026 07:28
_Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_

Change-Id: Idc6f2b658f92fa2289c12ac0775ee57173708d9c
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-30T07:42:28.742266Z 3365375 Manual request
🔒 Security Review ✅ Completed 2026-10-30T07:43:45.258554Z 3365375 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d5f94ba7c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread CHANGELOG.md Resolved
@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 7d5f94ba7c

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@ThomasK33

Copy link
Copy Markdown
Member Author

FAIL

Independent release verify of #47. I did not write this PR or #46.

Why FAIL. The CHANGELOG at the head breaks the v0.1.0-beta.2 section. The bot commit dfb1839 ("docs: update changelog for v0.1.0-beta.3") joined beta.2's ## Fixed heading onto the end of the previous bullet. 7d5f94b kept it. The tarball ships this file byte for byte, and npm cannot change it after publish. In the rendered file, beta.2 has no "Fixed" section, so the #23 and #30 fixes show up under beta.2 "Changed". The beta.3 code, the new entry's facts and the packaging all pass.

SHAs

  • PR head: 7d5f94ba7c736f0d4b4c9bdc990738417a80ac41 (matched pulls/47 .head.sha at the start and again before posting).
  • Base origin/main: 9f8ec068e112572aacb2163c1f7904e28f0c7542 (= merge-base with the head).
  • v0.1.0-beta.2: 35a554ab0b11344fd92d2589432473eb9f2cc092. git log v0.1.0-beta.2..origin/main lists one commit: 9f8ec06 (fix(native): keep snapshot() from running JS while it uses the terminal #46).

Checks

# Check Result Evidence
1 Diff vs main is only the version bump and the new entry FAIL package.json and package-lock.json change only 0.1.0-beta.2 → 0.1.0-beta.3. CHANGELOG.md also edits the beta.2 section: it removes the blank line and the ## Fixed line, and it appends ## Fixed to the #4 bullet.
2a Entry matches #46 and the head code PASS (one wording note) BuildSnapshot, BuildLines and BuildCellObject use DefineValue/DefineIndex (napi_define_properties). Snapshot reads both options before RequireTerminal.
2b "Fixed" is right against v0.1.0-beta.2 PASS Published 0.1.0-beta.2 from npm, one child process per case (table below). The bug shipped in beta.2.
2c Commits since v0.1.0-beta.2 covered PASS The only commit is 9f8ec06 (#46), and the entry covers it.
2d Links PASS #46 link is right, and its author is ThomasK33. The releases/tag/v0.1.0-beta.2 link returns 200. The releases/tag/v0.1.0-beta.3 link returns 404 now, and publish creates that release.
2e CHANGELOG structure FAIL Headings at head: beta.2 has Added, Changed, Security (Fixed is gone). On main it has Added, Changed, Fixed, Security.
3 Packaging at head PASS npm ci, build:libghostty (Ghostty 83fb956, Zig 0.17.0), build, build:prebuild (node-gyp on node@26.12.1), verify:prebuilds, npm pack: all rc=0. verify-prebuilds loaded prebuilds/linux-x64/@coder+libghostty-vt-node.node with packageVersion 0.1.0-beta.3. Tarball coder-libghostty-vt-node-0.1.0-beta.3.tgz, 31 files, shasum 16d7946d0c171829f1e9ff0a2cf4532f8c2b475f.
3b Scratch consumer PASS Installed version 0.1.0-beta.3. The only loaded .node is node_modules/@coder/libghostty-vt-node/prebuilds/linux-x64/@coder+libghostty-vt-node.node, and the package has no build/ directory. The tarball CHANGELOG.md equals the head file. All 8 repro cases exit 0.
4 Publish preconditions PASS resolve-npm-publish-tag.mjs prints beta. prepare-release-changelog.mjs origin/main gives reason=changelog-entry-exists. git ls-remote --tags origin refs/tags/v0.1.0-beta.3* is empty. npm view @coder/libghostty-vt-node@0.1.0-beta.3 gives E404. Dist-tags: beta = 0.1.0-beta.2.

Crash repro (public API, createTerminal({ cols: 20, rows: 4 }), the trap calls dispose())

Case 0.1.0-beta.2 (npm) 0.1.0-beta.3 (packed head)
control (no trap, styled cells) exit 0, returned exit 0, returned
Object.prototype.includeCells getter, snapshot() SIGABRT, terminal.cc:577 BuildSnapshot: Assertion 'terminal_ != nullptr' exit 0, threw GhosttyVtTerminal has been disposed
Object.prototype.includeScrollback getter, snapshot() SIGABRT, same assertion exit 0, threw GhosttyVtTerminal has been disposed
row setter, plain screen, snapshot() SIGABRT, terminal.cc:650 ReadLine: Assertion 'terminal_ != nullptr' exit 0, returned, setter ran 0 times
text setter, styled cells, includeCells SIGSEGV exit 0, returned, setter ran 0 times
row setter, styled cells, includeCells SIGSEGV exit 0, returned, setter ran 0 times
row setter, plain cells, includeCells exit 0, threw ghostty_terminal_grid_ref failed: GHOSTTY_INVALID_VALUE exit 0, returned, setter ran 0 times
Array.prototype[0] setter, snapshot() SIGABRT, ReadLine assertion exit 0, returned, setter ran 0 times

Required fix

In CHANGELOG.md, replace this line:

- Documentation no longer lists macOS x64 as a published prebuild target ([#4](https://github.com/coder/libghostty-vt-node/pull/4)).## Fixed

with these three lines (main's text):

- Documentation no longer lists macOS x64 as a published prebuild target ([#4](https://github.com/coder/libghostty-vt-node/pull/4)).

## Fixed

After the fix, git diff origin/main -- CHANGELOG.md adds lines only. The fix commit stays in place: the release-changelog job skips regeneration because the entry exists (check 4).

Notes

  1. Optional wording fix, not a FAIL. The entry says a row/text setter "segfaulted Node". The repro shows a segfault only with styled cells and includeCells. A plain snapshot() aborts on an assertion, and plain cells throw. The entry also quotes the error as "disposed", but the message is GhosttyVtTerminal has been disposed. Suggested last two sentences of the bullet:
    so a getter that disposes the terminal during that read throws "GhosttyVtTerminal has been disposed". Before, such a setter (for example on `row` or `text`) crashed Node with a segfault or an assertion abort, and such a getter aborted it on an assertion ([#46](https://github.com/coder/libghostty-vt-node/pull/46) by @ThomasK33).
    
  2. The GitHub release notes come from a separate Communique run in publish.yml. Nobody can review them before merge, but you can edit them after publish.
  3. I verified linux-x64 only. The publish workflow builds linux-arm64 and darwin-arm64.

Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high

Change-Id: Ibcc80d00b6c4ab91748a858fdeb7aa79ace8df7a
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

Fixed in da96287: restored the blank line before beta.2's ## Fixed heading. git diff origin/main -- CHANGELOG.md now adds lines only.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@ThomasK33

Copy link
Copy Markdown
Member Author

PASS

Re-verify of #47 at head da9628731b97950a84d7b8796547a1fb98ae69d3. It supersedes my FAIL at 7d5f94b. I did not write this PR or #46.

SHAs

  • PR head: da9628731b97950a84d7b8796547a1fb98ae69d3 (matched pulls/47 .head.sha at the start and again before posting).
  • Base origin/main: 9f8ec068e112572aacb2163c1f7904e28f0c7542.
  • git log 7d5f94b..da96287: one commit, da96287 ("docs: restore beta.2 Fixed heading and name the real disposed error"). It changes CHANGELOG.md only (4 insertions, 2 deletions).

Checks

# Check Result Evidence
1 Diff vs main is the version bump plus added beta.3 lines PASS git diff --numstat origin/main da96287: CHANGELOG.md 5 added, 0 removed. package.json 1/1 and package-lock.json 2/2 change only 0.1.0-beta.2 → 0.1.0-beta.3. No other files.
2 beta.2 section headings PASS Headings at head: beta.3 Fixed, then beta.2 Added, Changed, Fixed, Security, then beta.1 Added, Changed. No heading is glued to a bullet.
3 beta.3 text vs code and the beta.2 repro PASS native/terminal.cc is unchanged since 7d5f94b, and it throws "GhosttyVtTerminal has been disposed" (lines 282, 289), as the entry now says. "a segfault or an assertion abort" matches the beta.2 repro (SIGSEGV with styled cells and includeCells, SIGABRT on the ReadLine assertion otherwise). The getter abort matches (SIGABRT, BuildSnapshot assertion).
4 npm pack --dry-run PASS @coder/libghostty-vt-node 0.1.0-beta.3, and the file list includes CHANGELOG.md.
5 Publish preconditions PASS prepare-release-changelog.mjs origin/main gives reason=changelog-entry-exists. resolve-npm-publish-tag.mjs prints beta. The remote has no v0.1.0-beta.3 tag.

Carried over from 7d5f94b

Only CHANGELOG.md changed since then, so I did not rebuild the prebuild. At 7d5f94b, the full pipeline (npm ci through npm pack) passed on Node 26.12.1 and Zig 0.17.0. The scratch consumer loaded the addon from prebuilds/linux-x64, and all 8 snapshot trap cases exited 0. On the published 0.1.0-beta.2, 6 of the 8 crashed. See my previous comment for the tables.

Notes

  1. The GitHub release notes come from a separate Communique run in publish.yml. Nobody can review them before merge, but you can edit them after publish.
  2. I verified linux-x64 only.
  3. ci at da96287 was in_progress when I posted.

Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

Reviewed commit: da9628731b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: da9628731b

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

Reviewed commit: 3365375b1e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 3365375b1e

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@ThomasK33
ThomasK33 merged commit 646fde4 into main Oct 30, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant