Decree sharing, Linux ARM64, and a 276MB debug-symbol bug in the shipped binary - #7
Merged
Merged
Conversation
Two features. LINUX ARM64 ubuntu-24.04-arm is GA and free for public repos, so it is one matrix entry — but the artifact would have been unreachable without teaching both installers the aarch64 slug, so those land together. x86_64 is pinned from ubuntu-latest to ubuntu-24.04: latest is migrating to 26.04, whose CMake 4 is hostile to this tree's cmake_minimum_required(3.22), and a release tag is the worst moment to discover that. Investigating the ARM build turned up a live bug in the shipped x86_64 artifact: it is 291MB of which 276MB is DWARF, because the default build type is RelWithDebInfo and Linux embeds debug info in the ELF where macOS keeps it in a separate .dSYM — which is why macOS looked fine at 6.9MB. The Strip step was supposed to catch this and silently did not: it ended in '2>/dev/null || true', and its own ls printed 292M while the job reported success. Now builds Release, strips without masking errors, and fails the job if bitcoind exceeds 60MB. DECREE SHARING A decree travels as a wish, never a patch. The recipient's own agent writes their own code under their own guardrails; shipping a diff would turn 'a stranger suggests words to your agent' into 'a stranger ships C++ into your Bitcoin node'. Promulgate produces a vibe1.<base64url> token in three envelopes: a localhost link carrying it in the URL *fragment* (never the query, so it never reaches the server or its logs), a markdown block that always carries the decree in readable plain text beside the token, and a .vibe.json file. The link is built from location.origin and never location.href, because the console URL carries ?key= and href would paste the operator's session key into a chat channel. Receiving is entirely client-side and the accept action does exactly one thing: fill the textarea. It calls no API, so a shared decree can do nothing the operator could not have typed, and the whole existing gauntlet — YOLO confirm, consensus judgement on the real diff, the smoke test — applies unchanged. A paste box backs up the link, which cannot be relied on: SameSite=Strict withholds the cookie on cross-site navigation and the recipient's port may differ. Verified against a deliberately hostile payload: script tags and an onerror img render as inert text (every payload element has zero child nodes), no handler fires, bidi overrides are detected and flagged rather than silently stripped, a claimed-consensus flag shows a warning while an empty one grants no reassurance, and the textarea stays empty until the operator accepts. Also fixes a selector that never matched: the Book of Decrees had no book-section id, so Repent stayed live during first-run setup. 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.
Two features, plus a live bug found while building them.
Linux ARM64 prebuilt nodes
ubuntu-24.04-armis GA and free for public repos, so it is one matrix entry —but a published arm64 tarball would have been unreachable without teaching
both installers the
aarch64slug, so those land together (install.shand theconsole's
PREBUILT_SLUGS, accepting bothaarch64andarm64spellings).x86_64 is pinned from
ubuntu-latesttoubuntu-24.04.latestis mid-migrationto 26.04, whose CMake 4 is hostile to this tree's
cmake_minimum_required(3.22),and a release tag is the worst possible moment to discover that.
The live bug this turned up
The currently published
vibes-node-linux-x86_64is 291 MB, of which276 MB is DWARF. I pulled the release asset and parsed its ELF section
headers:
.debug_infoalone is 165 MB, while.textis 8.7 MB.Cause: the default build type is
RelWithDebInfo, and Linux embeds debug info inthe ELF while macOS keeps it in a separate
.dSYM— which is exactly why macOSlooked healthy at 6.9 MB and nobody noticed.
The Strip step was supposed to prevent this and silently didn't. It ended in
2>/dev/null || true, and its ownls -lhprinted292Mwhile the job reportedsuccess. Now: build
Release, strip without masking errors, and fail the jobif
bitcoindexceeds 60 MB.Honest caveat for the commit record: binaries built on 24.04 require
GLIBCXX_3.4.32(GCC 13). I verified this against the published artifact —glibc floor is 2.34, so that is not the constraint, but libstdc++ is: this will
not run on Debian 12 / Raspberry Pi OS Bookworm, which tops out at 3.4.30. It
runs on Trixie and Ubuntu 24.04+. Those users fall back to compiling, which is
the already-tested graceful path.
Decree sharing
A decree travels as a wish, never a patch. The recipient's own agent writes
their own code under their own guardrails. Shipping a diff would convert "a
stranger suggests words to your agent" into "a stranger ships C++ into your
Bitcoin node" — that is deliberately out of scope and noted in the schema.
Promulgate produces a
vibe1.<base64url>token in three envelopes:payload never reaches the server or its logs
beside the token; base64 alone, pasted into a Bitcoin node, is
indistinguishable from malware and deserves to be refused
.vibe.jsonfile for anything past the URL budget (live length meter,disables the link button past 1800 chars)
The link is built from
location.origin, neverlocation.href— the consoleURL carries
?key=andhrefwould paste the operator's session key into a chatchannel. That is the highest-consequence possible bug in this feature.
Receiving is entirely client-side, and accepting does exactly one thing: fill
the textarea. It calls no API. A shared decree therefore can do nothing the
operator could not have typed, and the entire existing gauntlet — the YOLO
confirm, consensus judgement on the real diff, the smoke test — applies
unchanged. A paste box backs up the link, because a link cannot be relied on:
SameSite=Strictwithholds the cookie on cross-site navigation and therecipient's port may differ.
Verified against a hostile payload
Round-tripped a decree containing
<script>, anonerrorimg, and a bidioverride:
markup became inert text
would change the operator's decree behind their back)
because a claim of safety may never be believed
Also fixes a selector that never matched: the Book of Decrees had no
book-sectionid, so Repent stayed live during first-run setup.Checklist
python3 -m py_compile,sh -non installerssrc/untouched — consensus unaffected