Generated assets v12 on Berkeley S3
Release runbook ·
v20260807 release notes ·
Cahill–Keyes generated snapshot
The public S3 release exposes the complete generated tree for direct web use
without checking assets.generated/ into Git. It mirrors the immutable
assets.generated.v12.tar.xz package attached to GitHub release v20260807.
The package remains the byte-for-byte recovery artifact; the S3 tree/ is the
browser-delivery form.
Identity and layout
| Field | Value |
|---|---|
| Endpoint | https://s3-ewh.ist.berkeley.edu |
| Signing region | us-east-1 |
| Bucket | adekosnik-bucket01 |
| Immutable prefix | cartofreako/v12/ |
| Source tag | v20260807 |
| Source commit | 2bd3d760fef540addfcbb4f8002ef7b283d8000f |
| Recovery package | package/assets.generated.v12.tar.xz |
| Package SHA-256 | dc1d761def31d77a05a7cc42f9bc0705ee864046f2e235f50c701c9c42fe960a |
cartofreako/v12/
├── tree/
│ ├── svg/
│ ├── pdf/
│ ├── png/
│ └── thumbnail/cahill-keyes/
├── package/assets.generated.v12.tar.xz
├── README.md
├── viewer.html
├── SHA256SUMS
└── release.json
The archive remains unchanged and contains 673 files below
assets.generated/. The browser-delivery tree contains 589 files because its
187 source SVGs become 187 explicit gzip objects: the 84 supplied .svg.gz
members are retained and the other 103 are generated deterministically.
README.md describes the object release, viewer.html renders the compressed
SVGs, SHA256SUMS covers the stored bytes of all 592 payload objects, and
release.json records the destination, source identity, inventory, and
delivery contract. The complete release has 594 objects. The completion marker
is uploaded last; its absence means the prefix must be treated as incomplete.
Browser delivery and compression
The S3 tree publishes all 187 full SVGs only as tree/svg/*.svg.gz, plus 187
PDFs, 187 full-size PNGs, and 28 existing 480-by-240 PNG thumbnails. Large
uncompressed .svg objects are deliberately absent:
| Object class | Content-Type |
Content-Encoding |
Access and cache |
|---|---|---|---|
tree/svg/*.svg.gz |
application/gzip |
absent | public-read; public,max-age=31536000,immutable |
tree/thumbnail/cahill-keyes/*.png |
image/png |
absent | public-read; public,max-age=31536000,immutable |
viewer.html |
text/html |
absent | public-read; public,max-age=31536000,immutable |
| PDF, full PNG, package, and release metadata | inferred from the filename | absent | public-read; public,max-age=31536000,immutable |
The documentation grid embeds the small PNG previews rather than downloading
full SVGs. A preview link opens the S3-hosted viewer with the gzip filename in
its query string. The viewer validates that filename, fetches the adjacent
tree/svg/*.svg.gz object with a relative URL, pipes the response body through
DecompressionStream("gzip"), and displays the resulting SVG from a local blob
URL. It also offers direct compressed and decompressed downloads. Hosting both
files at the same S3 origin avoids cross-origin fetch requirements. Browsers
without DecompressionStream retain the compressed-download fallback.
The public base URL is:
https://s3-ewh.ist.berkeley.edu/adekosnik-bucket01/cartofreako/v12/
For example, the CK geometry preview, compressed SVG, and viewer are:
tree/thumbnail/cahill-keyes/geometry-ck-44-22.pngtree/svg/geometry-ck-44-22.svg.gzviewer.html?asset=geometry-ck-44-22.svg.gz
Build, validate, and publish
The implementation follows the alpha60 cluster-operations upload boundary. It
uses an empty temporary rclone configuration, asks for S3 credentials silently
on /dev/tty, exports them only to the uploader process, unsets them on exit,
and writes a sanitized log under /tmp/cartofreako-upload-logs/. Credentials
must not be pasted into documentation, command arguments, chat, or a committed
rclone configuration.
Build the S3 form only from the release archive, not from a potentially mixed
live assets.generated/ directory:
scripts/build-generated-assets-s3-release.sh
scripts/upload-generated-assets-s3-release.sh --validate-only
The builder writes the ignored staging tree at build/s3-release-v12/. It
checks the package digest and archive structure, extracts into a temporary
directory, validates fixed inventories and the explicit gzip pairs, creates
the other deterministic SVG gzip files, round-trips all 187 against the
archive’s source SVGs, removes raw SVGs only from the temporary publication
tree, installs the viewer, and constructs the sorted manifest and completion
marker.
Run an authenticated remote inventory check and dry run:
scripts/upload-generated-assets-s3-release.sh
Publish only after reviewing that plan:
scripts/upload-generated-assets-s3-release.sh --apply --verify-download
Applied publication requires typing the exact destination
adekosnik-bucket01/cartofreako/v12/. The uploader rejects remote objects not
present in the release, uses checksum comparison plus rclone’s immutable mode,
and never invokes sync or move. It first uploads one explicit SVG-gzip and
one PNG pilot, verifies their S3 metadata and stored bytes through anonymous
HTTPS, then verifies the same-origin viewer. The remaining payload is uploaded
in MIME-specific phases, checked against the local stored bytes, and
release.json is uploaded last. --verify-download performs an additional
full remote read.
Uploader 2 stopped after creating two pilots and before creating
release.json. Its obsolete tree/svg/geometry-ck-44-22.svg key is not part
of the final explicit-gzip layout. Uploader 4 recognizes only that exact
unexpected key on an incomplete prefix and requires a second exact-object
confirmation before calling rclone deletefile for that object alone. It then
refreshes the retained PNG pilot’s missing cache metadata. Any other unexpected
object, or any cleanup attempt after a completion marker exists, is rejected.
The rclone remote root intentionally ends in /. Without that delimiter,
rclone probes the root as a possible object with HeadObject; Berkeley’s
Cloudian service has returned HTTP 500 rather than the expected not-found
response for a brand-new prefix. Pilot and completion-marker uploads therefore
use root-relative include filters instead of addressing a nonexistent object
as the rclone remote root. This preserves normal HEAD-based integrity checks
after each object exists.
HTTP system metadata is supplied with rclone’s direct upload-header mechanism.
In rclone 1.74, --metadata-set is gated by --metadata; using it alone leaves
Content-Encoding and Cache-Control unset, while enabling all metadata would
also copy local UID, GID, mode, and timestamp fields. Direct upload headers set
only the intended HTTP values. SVG gzip objects intentionally receive no
Content-Encoding; the viewer, not the HTTP stack, performs decompression. If
a retained pilot from an incomplete attempt has the right bytes but lacks its
headers, the uploader may refresh that pilot after exact-destination
confirmation. It never performs that repair after a release.json completion
marker exists.
Active Archive report and delivery
The completed deposit has a Devastation Pacific Summer 2026 v1.1 report titled
cartofreako v12 checked in to UCB Active Archive Object Storage. It uses the
canonical archival palette, hard grid, evidence labels, and Atkinson
Hyperlegible Next/Mono typography established by the Alpha60 year/2025 report.
The recurring-notification randoma11y-style option is intentionally not used
for this one-off release record.
Uploader 5 adds report production as stage 9 of a successful applied run. It
unsets the S3 credential environment first, then calls
scripts/build-generated-assets-s3-report.sh with the uploader run ID, Pacific
verification time, and full-download status. The builder validates the local
release evidence, renders tagged HTML-to-PDF output with Chrome, checks
metadata, page size, page count, embedded/subset fonts, Unicode mappings, and
text extraction, then renders all pages into a temporary QA directory for
mandatory visual inspection. Its tracked source template is
docs/releases/v12-active-archive-report.html.in; generated files are written
to:
reports/cartofreako-v12-ucb-active-archive-check-in.html
reports/cartofreako-v12-ucb-active-archive-check-in.pdf
The actual v12 upload completed with uploader 4 run 20260807T091154Z; after
the report integration was added, the builder was run against that exact
release and its recorded full-readback completion time, 2026-08-07 02:22:51
PT. Final QA confirmed three US Letter pages, a tagged structure, coherent text
extraction, embedded/subset Atkinson fonts with Unicode mappings, and visual
inspection of every rendered page. The 132,115-byte PDF has SHA-256:
670a370ff6e3388fba0df5473ee05091f176347ca747e9f8b30243e2be4624ce
At 2026-08-07 03:00:48 PT, Gmail sent one message with that PDF attached to
b.dekosnik@gmail.com and abigail.dekosnik@gmail.com. The subject was the
exact report title above, and the mail service reported successful completion.
The generated HTML, PDF, and QA renders remain ignored delivery artifacts;
post-publication reports do not mutate the immutable S3 prefix.
The delivery artifact is specifically the three-page
cartofreako-v12-ucb-active-archive-check-in.pdf. The separate two-page
cartofreako-v12-deposit-report.pdf is a generic deposit-verification layout,
not the Active Archive check-in style, and must not be selected by the uploader
or attached to the completion notice. The report builder gates the canonical
document-kind marker, exact title, three-page Letter structure, Active Archive
kicker, and embedded Atkinson Next/Mono fonts; it also rejects the generic
deposit report’s Liberation Sans and DejaVu Sans Mono fonts.
Immutability and later versions
Do not repair or replace bytes under cartofreako/v12/. If a published object,
metadata value, source render, or manifest needs correction, build a new
versioned prefix such as cartofreako/v13/ and update documentation to point
to it. Mutable catalogs or post-publication reports belong outside the
immutable release root.