Verify decrees, never strand an operator, and start in seconds - #3
Merged
Conversation
Two fixes, the first a genuine defect. 1. The silent update dead-end. Both the installer and the app updated with 'merge --ff-only', and the app swallowed the failure into a log nobody reads. Since a node that has been vibed even once has diverged, every engaged user silently stopped receiving updates forever -- security fixes included. The more someone used the product, the more stranded they became. The console now owns updating: it reports what upstream has, and replays the operator's decrees on top with a rebase. Conflicts abort cleanly and say which code upstream also touched, leaving the node exactly as it was. Verified end to end on a diverged clone: 1 commit behind with 3 decrees -> absorbed, decrees replayed in order, behind back to 0. A dirty working tree is reported as itself rather than blamed on upstream -- an interrupted decree leaves exactly that state, and sending someone hunting an imaginary conflict would be worse than saying nothing. 2. Decrees are now verified, not merely compiled. Compiling proves the code is grammatical, not that it is still a Bitcoin node. Every build is now checked in a throwaway regtest datadir -- mine 101 blocks, read the chain, confirm it still rejects impossible amounts -- before it becomes the node the operator runs. If it fails, the old binary keeps running and the console says so plainly. Found a bug in the checker itself while testing: bitcoind rejects '-port=0' outright, so the probe never started. Dropped it; -listen=0 keeps it off the network anyway. Passes in 3s on a good binary. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
First run meant a 5-to-90 minute compile before anything happened, which is where non-technical users quit. But a compiler is only needed to *vibe*, not to *run*. - .github/workflows/release.yml builds nodes for macOS arm64, macOS x86_64 and Linux x86_64 on tag, proves each one validates (mine 101, read the chain) before publishing, and records the commit it was built from. - the installer and the console both look for a published node first and fall back to compiling. The node comes up in seconds; the real build happens on the operator's first decree, when the wait finally means something. The commit check is the point, not decoration: a binary built from different source is not the node somebody is about to start editing. Verified both directions against a locally served release — a mismatched COMMIT is refused with both hashes named, a matching one is accepted and the binary confirmed runnable before use. Also verified it declines gracefully when no release exists at all (HTTPError, not a crash) and honours VIBES_NO_PREBUILT. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Three of the five improvements. Notarisation and Windows deliberately excluded.
1. The silent update dead-end — a real defect
Both the installer and the app updated with
merge --ff-only, and the appswallowed the failure into a log nobody reads. A node that has been vibed even
once has diverged, so every engaged user silently stopped receiving updates
forever — security fixes included. The more someone used the product, the more
stranded they became.
The console now owns updating: it reports what upstream has and replays the
operator's decrees on top with a rebase. Conflicts abort cleanly, name the code
upstream also touched, and leave the node exactly as it was.
A dirty working tree is now reported as itself rather than blamed on upstream —
an interrupted decree leaves precisely that state, and sending someone hunting an
imaginary conflict would be worse than saying nothing.
Verified on a diverged clone: 1 commit behind with 3 decrees → absorbed, decrees
replayed in order, behind back to 0.
2. Decrees are verified, not merely compiled
Compiling proves the code is grammatical, not that it is still a Bitcoin node.
Every build is now checked in a throwaway regtest datadir — mine 101 blocks, read
the chain, confirm it still rejects impossible amounts — before it becomes the
node the operator runs. On failure the old binary keeps running and the console
says so plainly.
Found a bug in the checker while testing it: bitcoind rejects
-port=0outright,so the probe never started. Passes in 3s on a good binary.
3. A node in seconds, not minutes
First run meant a 5-to-90 minute compile before anything happened. A compiler is
only needed to vibe, not to run, so the installer and console now fetch a
published binary and defer the real build to the first decree.
release.ymlbuilds for macOS arm64/x86_64 and Linux x86_64 on tag, proves eachvalidates before publishing, and records its source commit. That commit check is
the point: a binary built from other source is not the node you are about to
edit. Verified both directions against a locally served release — mismatch
refused with both hashes named, match accepted and the binary confirmed runnable.
Checklist
python3 -m py_compile contrib/vibes/bitcoin-vibessh -non installer and launcherrole="status"live region, renders at 375pxsrc/touched? No — consensus untouched, fresh install still stock CoreNote
The release workflow itself cannot be fully exercised until a tag is pushed; the
installer and console halves of it are verified locally as described.