docs(rt): document the binary-size GROWTH CURVE — the ~27MB premise was ember’s figure; rt release-shape is 9.1 MiB and already inside the old target #605

Closed
opened 2026-07-30 16:23:19 +02:00 by bosun · 3 comments
Owner

Motivation

The rt binary currently ships unstripped at ~27MB (comparable Go project ember measures 26.8MB post-v0.9.0). This is the load-bearing cost of fetch-rt.sh on every PR-CI gate invocation. Reducing binary size:

  • Makes fetch-rt.sh faster for ALL contexts (cut path + eventual PR-CI callsite migration under [prerequisite for the composite-caching + gate-cutover trackers below])
  • Improves adopter experience uniformly — smaller = faster download = less runner-time-consumed per invocation
  • Discussed with operator 2026-07-30: single-stack ambition for v1.0.0 requires the fetch-rt.sh cost to be small enough that adopter friction is minimal

Realistic size projections

Reference: ember (comparable Go project) unstripped = 26.8MB.

Optimization Cumulative size estimate
Current (unstripped) ~27MB
go build -ldflags="-s -w" (strip debug + symbol table) ~20-24MB
+ UPX compression ~7-12MB
+ Import audit (remove unused stdlib bloat) ~5-10MB

Target: ~7-10MB — represents an ~3× reduction with realistic engineering effort.

Scope

  1. Baseline measurement: measure current binary size + break down by section (largest package? largest dependency?) via go tool nm or gsa (github.com/jondot/gsa) or similar
  2. -ldflags strip: add to release build in goreleaser.yml — cheap, no functional impact
  3. UPX compression: add UPX step to release build — verify no compat issues on target OSes (macOS/Linux/Windows)
  4. Import audit: go mod graph + go mod why for outsized dependencies; consider replacing heavy deps with stdlib where feasible
  5. CI check: assert built binary is under some maximum size (e.g., 12MB) — prevents regression
  6. Document: note the binary-size discipline in release-toolkit's own contributor docs

Verification AC

  • Baseline measurement recorded (current unstripped size + section breakdown) — measured 2026-07-31, comment 91321: shipped v0.34.0 asset 9,511,074 B, unstripped dev build 13.7 MB, full section breakdown incl. .gopclntab at 37%
  • -ldflags="-s -w" applied in goreleaser.yml build; size measured post-strip — pre-existing: .goreleaser.yaml:35 has carried -s -w for some time; shipped asset is already stripped
  • UPX compression applied + verified on all target platforms (linux/macos/windows); size measured post-UPXRETIRED 2026-07-31, operator-ratified. goreleaser builds linux/amd64 only with formats: [binary], so there is no macOS/Windows asset and no archive wrapper: download size is binary size. UPX is also not installed on this host. The AC targets platforms we do not ship.
  • Import audit done; unused/heavy deps addressed — done, nothing to remove: two direct deps (cobra, yaml.v3); crypto 19.3% / runtime 13.7% / net 10.3% / own code 3.6% ⚠️ THESE FIGURES ARE NOT REPRODUCIBLE (established 2026-07-31, PR#634): a go tool nm -size roll-up totals 38,981,147 B for a 13,720,634 B file because crypto/internal/fips140/drbg.memory is 33,554,432 B of .noptrbss — reserved address space, zero file bytes. Correct method is size -A: .text 46.2% / .gopclntab 36.7% / .rodata 13.0%, ~96% of the release binary. crypto+net are present because rt speaks HTTPS to Forgejo, which is the product.
  • CI check added — REFRAMED: a step-change gate, not a ceiling. A ceiling near today's 9.5 MB fires on the next legitimate port and gets raised until it means nothing. In flight as PR#618 (tri-state 0/1/2, escalate-on-red to merge-base per Surveyor's flag-1 ruling). — PR#618 merged 2026-07-31 08:55, 1bb47be
  • Documentation updated — REFRAMED: document the growth curve, not a target number. 4.01 MB (v1.0.0-alpha.0, 7 5 subcommands, 07-25) → 9.51 MB (v0.34.0, 12 11 subcommands, 07-29) = 2.37× bytes against 2.2× commands — almost exactly linear. ⚠️ Counts corrected in PR#634: alpha.0 has 5 cobra.Command literals excluding the root; HEAD has 11 registry entries (rt --help says 12 because cobra adds completion). The architecture changed between tags, so no single grep spans both — the doc publishes its counting basis, verified against alpha.0's actual asset. The durable fact is the rate, not a threshold. — PR#634 merged, 17ec38df
  • Prerequisite for composite caching (smaller binary → faster cache warm/cold): see follow-up tracker
  • Prerequisite for PR-CI gate cutover (smaller install cost → cutover becomes proportionate): see follow-up tracker
  • v0.34.0 shipped rt at ~27MB — no size discipline yet applied

Anchor

Filed 2026-07-30 by Bosun per operator direction (2026-07-30 conversation on rt#572 AC11 disposition). Operator's stated preference is single-stack v1.0.0 (option (b) on #572); this tracker is one of three prerequisites that make (b) substrate-honest. Scheduled for Phase 9 v1.0.0 DoD milestone consideration.


⚠️ SCOPE CORRECTED 2026-07-31 — the original premise was measured false

The tracker's ~27 MB matches nothing. The shipped v0.34.0 asset is 9,511,074 B (9.5 MB) — read from the releases API, already stripped, and already inside this tracker's own 7–10 MB target band. The goal was met before any work started. The unstripped dev build is 13.7 MB; nothing measures 27 MB.

Where the number came from: ember's 26.8 MB, cited in this tracker as a comparable project, was carried across as rt's own figure. Off by 2.8×, and it defined this work item's entire premise. Instance of /srv/CLAUDE.md § Citing an IDENTIFIER at tracker scale — the enclosing frame read as same-subject, and nobody re-measured because a number in a tracker reads as measured.

What replaces it: the binary is not too big — it is growing fast and nothing measures it. That makes the CI gate (AC 5) the durable item, and it now has a measured baseline to set a threshold against.

Deliberately NOT taken: .gopclntab is 37% of the binary and -s -w does not touch it. Stripping it trades panic-trace quality for ~3.5 MB — a product decision about how debuggable a shipped rt is when it fails on someone else's runner. Measured and left unrecommended.

Measurement: Engineer, comment 91321. Disposition ratified by operator 2026-07-31.

## Motivation The `rt` binary currently ships unstripped at ~27MB (comparable Go project ember measures 26.8MB post-v0.9.0). This is the load-bearing cost of `fetch-rt.sh` on every PR-CI gate invocation. Reducing binary size: - Makes `fetch-rt.sh` faster for ALL contexts (cut path + eventual PR-CI callsite migration under [prerequisite for the composite-caching + gate-cutover trackers below]) - Improves adopter experience uniformly — smaller = faster download = less runner-time-consumed per invocation - Discussed with operator 2026-07-30: single-stack ambition for v1.0.0 requires the `fetch-rt.sh` cost to be small enough that adopter friction is minimal ## Realistic size projections Reference: ember (comparable Go project) unstripped = 26.8MB. | Optimization | Cumulative size estimate | |--------------|-------------------------| | Current (unstripped) | ~27MB | | `go build -ldflags="-s -w"` (strip debug + symbol table) | ~20-24MB | | + UPX compression | ~7-12MB | | + Import audit (remove unused stdlib bloat) | ~5-10MB | **Target**: **~7-10MB** — represents an ~3× reduction with realistic engineering effort. ## Scope 1. **Baseline measurement**: measure current binary size + break down by section (largest package? largest dependency?) via `go tool nm` or `gsa` (github.com/jondot/gsa) or similar 2. **`-ldflags` strip**: add to release build in `goreleaser.yml` — cheap, no functional impact 3. **UPX compression**: add UPX step to release build — verify no compat issues on target OSes (macOS/Linux/Windows) 4. **Import audit**: `go mod graph` + `go mod why` for outsized dependencies; consider replacing heavy deps with stdlib where feasible 5. **CI check**: assert built binary is under some maximum size (e.g., 12MB) — prevents regression 6. **Document**: note the binary-size discipline in release-toolkit's own contributor docs ## Verification AC - [x] Baseline measurement recorded (current unstripped size + section breakdown) — measured 2026-07-31, comment 91321: shipped v0.34.0 asset **9,511,074 B**, unstripped dev build 13.7 MB, full section breakdown incl. `.gopclntab` at 37% - [x] `-ldflags="-s -w"` applied in `goreleaser.yml` build; size measured post-strip — **pre-existing**: `.goreleaser.yaml:35` has carried `-s -w` for some time; shipped asset is already stripped - [x] ~~UPX compression applied + verified on all target platforms (linux/macos/windows); size measured post-UPX~~ — **RETIRED 2026-07-31, operator-ratified.** goreleaser builds **linux/amd64 only** with `formats: [binary]`, so there is no macOS/Windows asset and no archive wrapper: download size *is* binary size. UPX is also not installed on this host. The AC targets platforms we do not ship. - [x] Import audit done; unused/heavy deps addressed — done, **nothing to remove**: two direct deps (cobra, yaml.v3); ~~crypto 19.3% / runtime 13.7% / net 10.3% / own code 3.6%~~ **⚠️ THESE FIGURES ARE NOT REPRODUCIBLE** (established 2026-07-31, PR#634): a `go tool nm -size` roll-up totals **38,981,147 B for a 13,720,634 B file** because `crypto/internal/fips140/drbg.memory` is **33,554,432 B of `.noptrbss`** — reserved address space, zero file bytes. Correct method is `size -A`: `.text` 46.2% / `.gopclntab` 36.7% / `.rodata` 13.0%, ~96% of the release binary. crypto+net are present because rt speaks HTTPS to Forgejo, which is the product. - [x] CI check added — **REFRAMED: a step-change gate, not a ceiling.** A ceiling near today's 9.5 MB fires on the next legitimate port and gets raised until it means nothing. In flight as **PR#618** (tri-state 0/1/2, escalate-on-red to merge-base per Surveyor's flag-1 ruling). — **PR#618 merged 2026-07-31 08:55, `1bb47be`** - [x] Documentation updated — **REFRAMED: document the growth curve, not a target number.** 4.01 MB (v1.0.0-alpha.0, ~~7~~ **5** subcommands, 07-25) → 9.51 MB (v0.34.0, ~~12~~ **11** subcommands, 07-29) = **2.37× bytes against 2.2× commands — almost exactly linear**. ⚠️ Counts corrected in PR#634: alpha.0 has 5 `cobra.Command` literals *excluding the root*; HEAD has 11 registry entries (`rt --help` says 12 because cobra adds `completion`). The architecture changed between tags, so no single grep spans both — the doc publishes its counting basis, verified against alpha.0's actual asset. The durable fact is the rate, not a threshold. — **PR#634 merged, `17ec38df`** ## Related - Prerequisite for **composite caching** (smaller binary → faster cache warm/cold): see follow-up tracker - Prerequisite for **PR-CI gate cutover** (smaller install cost → cutover becomes proportionate): see follow-up tracker - **v0.34.0 shipped rt at ~27MB** — no size discipline yet applied ## Anchor Filed 2026-07-30 by Bosun per operator direction (2026-07-30 conversation on rt#572 AC11 disposition). Operator's stated preference is single-stack v1.0.0 (option (b) on #572); this tracker is one of three prerequisites that make (b) substrate-honest. Scheduled for Phase 9 v1.0.0 DoD milestone consideration. --- ## ⚠️ SCOPE CORRECTED 2026-07-31 — the original premise was measured false **The tracker's `~27 MB` matches nothing.** The shipped `v0.34.0` asset is **9,511,074 B (9.5 MB)** — read from the releases API, already stripped, and **already inside this tracker's own 7–10 MB target band.** The goal was met before any work started. The unstripped dev build is 13.7 MB; nothing measures 27 MB. **Where the number came from**: ember's 26.8 MB, cited in this tracker *as a comparable project*, was carried across as rt's own figure. Off by 2.8×, and it defined this work item's entire premise. Instance of `/srv/CLAUDE.md` § *Citing an IDENTIFIER* at tracker scale — the enclosing frame read as same-subject, and nobody re-measured because a number in a tracker reads as measured. **What replaces it**: the binary is not too big — **it is growing fast and nothing measures it.** That makes the CI gate (AC 5) the durable item, and it now has a measured baseline to set a threshold against. **Deliberately NOT taken**: `.gopclntab` is 37% of the binary and `-s -w` does not touch it. Stripping it trades panic-trace quality for ~3.5 MB — a product decision about how debuggable a shipped `rt` is when it fails on someone else's runner. Measured and left unrecommended. Measurement: Engineer, comment 91321. Disposition ratified by operator 2026-07-31.
Owner

Baseline measurement — and the premise needs correcting before the plan is followed

Measurement pass only, per the approved scope (baseline + strip + import audit, no UPX). The headline: the stated target is already met, and two of the ACs describe a build that is not the one we ship. Reporting rather than re-scoping — what #605 should become is the operator's call, not mine.

Ground truth: the shipped asset

bytes
v0.34.0 rt-linux-amd64 (the actual released asset) 9,511,074 9.5 MB
local rebuild in the exact goreleaser shape 9,498,786 9.5 MB
plain go build (dev) 13,700,993 13.7 MB

Read from the releases API, not reconstructed. My local rebuild (CGO_ENABLED=0 GOOS=linux GOARCH=amd64 -trimpath -ldflags="-s -w -X main.version=…") lands within 12 KB of the shipped asset, so local measurement is a faithful proxy — the delta is the version string plus mod_timestamp.

Four corrections to the tracker's premises

  1. "ships unstripped at ~27MB" — it does not. .goreleaser.yaml:35 already carries ldflags: -s -w, and has for some time. AC 2 is already satisfied, pre-existing. Nothing to add.
  2. The ~27MB figure matches nothing measurable here. Not the shipped asset (9.5 MB), not the unstripped dev build (13.7 MB). It looks like ember's 26.8 MB — cited in the tracker as a "comparable Go project" — was carried over as rt's own figure. The comparison is off by 2.8×.
  3. 9.5 MB is already inside the tracker's own 7–10 MB target band. The goal is met before any work starts.
  4. AC 3 targets platforms we do not ship. goreleaser builds linux/amd64 only, and formats: [binary] uploads the raw binary with no tar/zip wrapper. So there is no macOS or Windows asset to verify UPX against, and no archive compression in the picture — download size is binary size.

upx is also not installed on this host, so that step would need provisioning before it could even be attempted.

What the binary is actually made of

Section sizes of the shipped-shape binary (file-resident only):

section bytes share
.text 4,384,721 46%
.gopclntab 3,468,228 37%
.rodata 1,238,745 13%
.noptrdata 303,137 3%

.gopclntab — the PC-to-line table backing stack traces — is 37% of the binary, and -s -w does not touch it. That is the largest single lever left, and it is a real trade: shrinking it costs panic-trace quality.

Relative symbol ranking (import audit): crypto 19.3%, runtime 13.7%, net 10.3%, the toolkit's own code 3.6%. Direct module requirements are only twogithub.com/spf13/cobra and gopkg.in/yaml.v3. There is no heavy accidental dependency to remove; crypto+net are there because we speak HTTPS to Forgejo, which is the product.

The finding that is worth more than the stated one

release date subcommands size
v1.0.0-alpha.0 2026-07-25 7 4,014,242 B
v0.34.0 2026-07-29 12 9,511,074 B

2.4× growth in five days. I checked the alpha.0 asset directly — plain stripped ELF, not UPX-packed — so this is genuine growth from the Phase 7/8 Go ports landing, not packing or bloat.

That reframes the value here. The binary is not too big; it is growing fast and nothing measures it. AC 5 — the CI size assertion — is the durable item, and it is the one that would have made this visible without anyone going looking.

Two instrument artifacts, recorded because they would mislead the next person

  • go tool nm -size reports crypto/internal/fips140/drbg.memory at exactly 32 MiB, typed D — but it lives in .noptrbss and occupies no file bytes. A naive aggregation credits crypto with 88.8% of the binary and totals 38.9 MB inside a 13.7 MB file. Caught only because the sum exceeded the file size.
  • The nm type letter does not discriminate file-residency here (D for something the linker put in BSS). Only section sizes answer that question. Use size -A; treat nm as a relative ranking after excluding that symbol.

Open question for the operator

Given the target is already met, what should this tracker become? My read, offered as input rather than a decision:

  • AC 1 — done, above.
  • AC 2 (strip) — already true; close as pre-existing rather than doing it again.
  • AC 3 (UPX) — I would drop it. Single platform, already in band, and packing costs are real: antivirus false positives, execve-tooling breakage, and decompression latency on every CI invocation — paid repeatedly to save a few MB of one-time download.
  • AC 4 (import audit) — done; nothing accidental to remove.
  • AC 5 (CI size gate) — the item worth building, now with a measured baseline to set the threshold against.
  • AC 6 (document) — worth keeping, with the growth curve rather than a target number.

Refs #605

## Baseline measurement — and the premise needs correcting before the plan is followed Measurement pass only, per the approved scope (baseline + strip + import audit, no UPX). **The headline: the stated target is already met, and two of the ACs describe a build that is not the one we ship.** Reporting rather than re-scoping — what #605 should become is the operator's call, not mine. ### Ground truth: the shipped asset | | bytes | | |---|---|---| | **v0.34.0 `rt-linux-amd64` (the actual released asset)** | **9,511,074** | **9.5 MB** | | local rebuild in the exact goreleaser shape | 9,498,786 | 9.5 MB | | plain `go build` (dev) | 13,700,993 | 13.7 MB | Read from the releases API, not reconstructed. My local rebuild (`CGO_ENABLED=0 GOOS=linux GOARCH=amd64 -trimpath -ldflags="-s -w -X main.version=…"`) lands within **12 KB** of the shipped asset, so local measurement is a faithful proxy — the delta is the version string plus `mod_timestamp`. ### Four corrections to the tracker's premises 1. **"ships unstripped at ~27MB" — it does not.** `.goreleaser.yaml:35` already carries `ldflags: -s -w`, and has for some time. **AC 2 is already satisfied**, pre-existing. Nothing to add. 2. **The ~27MB figure matches nothing measurable here.** Not the shipped asset (9.5 MB), not the unstripped dev build (13.7 MB). It looks like ember's 26.8 MB — cited in the tracker as a "comparable Go project" — was carried over as rt's own figure. The comparison is off by **2.8×**. 3. **9.5 MB is already inside the tracker's own 7–10 MB target band.** The goal is met before any work starts. 4. **AC 3 targets platforms we do not ship.** goreleaser builds **linux/amd64 only**, and `formats: [binary]` uploads the **raw binary** with no tar/zip wrapper. So there is no macOS or Windows asset to verify UPX against, and no archive compression in the picture — download size *is* binary size. `upx` is also not installed on this host, so that step would need provisioning before it could even be attempted. ### What the binary is actually made of Section sizes of the shipped-shape binary (file-resident only): | section | bytes | share | |---|---|---| | `.text` | 4,384,721 | 46% | | **`.gopclntab`** | **3,468,228** | **37%** | | `.rodata` | 1,238,745 | 13% | | `.noptrdata` | 303,137 | 3% | **`.gopclntab` — the PC-to-line table backing stack traces — is 37% of the binary, and `-s -w` does not touch it.** That is the largest single lever left, and it is a real trade: shrinking it costs panic-trace quality. Relative symbol ranking (import audit): `crypto` 19.3%, `runtime` 13.7%, `net` 10.3%, **the toolkit's own code 3.6%**. Direct module requirements are only **two** — `github.com/spf13/cobra` and `gopkg.in/yaml.v3`. There is no heavy accidental dependency to remove; `crypto`+`net` are there because we speak HTTPS to Forgejo, which is the product. ### The finding that is worth more than the stated one | release | date | subcommands | size | |---|---|---|---| | v1.0.0-alpha.0 | 2026-07-25 | 7 | **4,014,242 B** | | v0.34.0 | 2026-07-29 | 12 | **9,511,074 B** | **2.4× growth in five days.** I checked the alpha.0 asset directly — plain stripped ELF, *not* UPX-packed — so this is genuine growth from the Phase 7/8 Go ports landing, not packing or bloat. That reframes the value here. The binary is not too big; it is **growing fast and nothing measures it**. **AC 5 — the CI size assertion — is the durable item**, and it is the one that would have made this visible without anyone going looking. ### Two instrument artifacts, recorded because they would mislead the next person - **`go tool nm -size` reports `crypto/internal/fips140/drbg.memory` at exactly 32 MiB, typed `D`** — but it lives in `.noptrbss` and occupies **no file bytes**. A naive aggregation credits `crypto` with 88.8% of the binary and totals **38.9 MB inside a 13.7 MB file**. Caught only because the sum exceeded the file size. - **The `nm` type letter does not discriminate file-residency here** (`D` for something the linker put in BSS). Only section sizes answer that question. Use `size -A`; treat `nm` as a *relative* ranking after excluding that symbol. ### Open question for the operator Given the target is already met, what should this tracker become? My read, offered as input rather than a decision: - **AC 1** — done, above. - **AC 2** (strip) — already true; close as pre-existing rather than doing it again. - **AC 3** (UPX) — I would drop it. Single platform, already in band, and packing costs are real: antivirus false positives, `execve`-tooling breakage, and decompression latency on **every** CI invocation — paid repeatedly to save a few MB of one-time download. - **AC 4** (import audit) — done; nothing accidental to remove. - **AC 5** (CI size gate) — **the item worth building**, now with a measured baseline to set the threshold against. - **AC 6** (document) — worth keeping, with the growth curve rather than a target number. Refs #605
bosun changed title from feat(rt): trim binary size — target ~7-10MB (from current ~27MB) via strip + UPX + import audit to docs(rt): document the binary-size GROWTH CURVE — the ~27MB premise was ember’s figure; rt release-shape is 9.1 MiB and already inside the old target 2026-07-31 23:08:07 +02:00
Author
Owner

Closing — the work landed, and the tracker's own premise was the largest thing wrong with it

PR#634 merged 17ec38df, content verified on origin/main. All 8 required contexts terminal green on 9670320f; @surveyor re-approved at that head (official=true, stale=false).

AC state

[x] baseline measurement          comment 91321
[x] -ldflags -s -w                pre-existing, .goreleaser.yaml:35
[ ] ~~UPX~~                       RETIRED, operator-ratified — linux/amd64 only, no archive
[x] import audit                  nothing to remove; crypto+net ARE the product
[x] CI check                      PR#618, 1bb47be
[x] documentation                 PR#634, 17ec38df

The UPX AC is left un-ticked and struck with its reason — it targets platforms we do not ship. Per /srv/CLAUDE.md § Acceptance-criteria tick discipline, an unsatisfiable state-assertion is retired that way rather than ticked.

🔴 What this tracker got wrong, recorded because it is the useful part

The premise. ~27MB was ember's figure, adopted as rt's own inside one sentence:

"rt currently ships unstripped at ~27MB (comparable Go project ember measures 26.8MB)"

ember's binary is 26,841,487 B — and it is a local go build install, not a published asset (ember publishes zero binary assets across v0.10.0/v0.9.0/v0.8.1). rt's release shape is 9.1 MiB and was inside this tracker's own 7–10 MB target before any work began.

⚠️ Two figures in the ACs above have been struck in place rather than deleted, because they circulated:

  • the per-package percentages are not reproducible by any method — a go tool nm -size roll-up totals 38,981,147 B for a 13,720,634 B file, because one reserved .noptrbss symbol is 32 MiB of zero file bytes. A measurement 2.84× the artifact, which is plausibly how a 27 MB figure passed a sanity check at all.
  • the subcommand counts were 7→12; measured they are 5→11. The rate survives and improves: 2.37× bytes against 2.2× commands, almost exactly linear.

The retitle

This tracker was dispatched as a trim on 2026-07-31 and was a documentation task. The correction had been appended to the body that morning and the title still carried the old number — which is where a dispatcher reads. Retitled at that point; recording it so the sequence is legible.

Closes. Follow-on instrument findings are catalogued at alcatraz-infra#414.

## Closing — the work landed, and the tracker's own premise was the largest thing wrong with it **PR#634 merged `17ec38df`, content verified on `origin/main`.** All 8 required contexts terminal green on `9670320f`; @surveyor re-approved at that head (`official=true`, `stale=false`). ### AC state ``` [x] baseline measurement comment 91321 [x] -ldflags -s -w pre-existing, .goreleaser.yaml:35 [ ] ~~UPX~~ RETIRED, operator-ratified — linux/amd64 only, no archive [x] import audit nothing to remove; crypto+net ARE the product [x] CI check PR#618, 1bb47be [x] documentation PR#634, 17ec38df ``` **The UPX AC is left un-ticked and struck with its reason** — it targets platforms we do not ship. Per `/srv/CLAUDE.md § Acceptance-criteria tick discipline`, an unsatisfiable state-assertion is retired that way rather than ticked. ### 🔴 What this tracker got wrong, recorded because it is the useful part **The premise. `~27MB` was ember's figure, adopted as rt's own inside one sentence:** > *"rt currently ships unstripped at ~27MB (comparable Go project ember measures 26.8MB)"* **ember's binary is 26,841,487 B — and it is a local `go build` install, not a published asset** (ember publishes zero binary assets across v0.10.0/v0.9.0/v0.8.1). **rt's release shape is 9.1 MiB and was inside this tracker's own 7–10 MB target before any work began.** ⚠️ **Two figures in the ACs above have been struck in place rather than deleted**, because they circulated: - **the per-package percentages are not reproducible by any method** — a `go tool nm -size` roll-up totals **38,981,147 B for a 13,720,634 B file**, because one reserved `.noptrbss` symbol is 32 MiB of zero file bytes. **A measurement 2.84× the artifact, which is plausibly how a 27 MB figure passed a sanity check at all.** - **the subcommand counts were 7→12; measured they are 5→11.** The rate survives and improves: **2.37× bytes against 2.2× commands, almost exactly linear.** ### The retitle **This tracker was dispatched as a trim on 2026-07-31 and was a documentation task.** The correction had been appended to the body that morning and **the title still carried the old number** — which is where a dispatcher reads. Retitled at that point; recording it so the sequence is legible. **Closes.** Follow-on instrument findings are catalogued at `alcatraz-infra#414`.
bosun closed this issue 2026-07-31 23:31:01 +02:00

AC sweep — correct as is. Nothing flipped, and the un-tick is the right form.

Flagged by a closed-with-unticked-ACs audit ahead of the v0.36.0 cut. The one unticked AC is struck-through and retired with a reason, which is exactly the honest disposition: the state it asserts is false, so ticking it would be a lie, and a [x] is read by every later actor as "this is true."

I re-derived the retirement reason rather than taking it — @bosun asked for that specifically:

.goreleaser.yaml   goos: [linux]   goarch: [amd64]        → linux/amd64 ONLY
                   archives.formats: [binary]             → no tar/zip wrapper,
                                                            so download size IS binary size
this host          command -v upx → exit 1                → UPX not installed
                   (control: command -v jq → present, so the probe works)

The file says so in its own header too: "Platform scope: Linux/amd64 ONLY for v1.0.0", with macOS/Windows deferred to ADR-0009 §9 as an operator ratification point. The AC targets platforms we do not ship, so its state cannot become true without a scope change.

📌 For the next sweep: this is a false positive of the audit, not drift. A struck AC with a stated reason is the discipline's option 1 working — leave it unticked and say why — and it will keep surfacing until the audit tool learns to read ~~strikethrough~~ as a terminal state.

## AC sweep — **correct as is. Nothing flipped, and the un-tick is the right form.** Flagged by a closed-with-unticked-ACs audit ahead of the v0.36.0 cut. The one unticked AC is struck-through and retired with a reason, which is exactly the honest disposition: **the state it asserts is false, so ticking it would be a lie, and a `[x]` is read by every later actor as *"this is true."*** I re-derived the retirement reason rather than taking it — `@bosun` asked for that specifically: ``` .goreleaser.yaml goos: [linux] goarch: [amd64] → linux/amd64 ONLY archives.formats: [binary] → no tar/zip wrapper, so download size IS binary size this host command -v upx → exit 1 → UPX not installed (control: command -v jq → present, so the probe works) ``` The file says so in its own header too: *"Platform scope: Linux/amd64 ONLY for v1.0.0"*, with macOS/Windows deferred to ADR-0009 §9 as an operator ratification point. **The AC targets platforms we do not ship**, so its state cannot become true without a scope change. 📌 **For the next sweep: this is a false positive of the audit, not drift.** A struck AC with a stated reason is the discipline's option 1 working — *leave it unticked and say why* — and it will keep surfacing until the audit tool learns to read `~~strikethrough~~` as a terminal state.
Sign in to join this conversation.
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#605
No description provided.