At 75% it drops caches (unused images, the journal, stale /tmp and build caches); at 80% it labels the node hanzo.ai/disk=pressure so disk-heavy pods stay off; at 85% it purges rotated logs and the forge's push quarantines, then grows the EBS volume by half (6 h cooldown, 4 TiB ceiling) and the filesystem with it; at 90% it cordons the node. Its own module, standard library only, shipped as ghcr.io/hanzoai/disk.
Co-authored-by: Hanzo Dev <[email protected]>
The forge reads .github/workflows natively and github.com reads nothing else,
so one directory serves both planes instead of two conventions that disagree
about which one is live. The reusable in hanzoai/ci already lives there, so a
caller naming that path now resolves to a file that exists.
Co-authored-by: Hanzo Dev <[email protected]>
One word stood for several: the MCP server, one address that accepts requests,
the single way in, and the boundary a credential is validated at. Each site now
names its own sense — endpoint, entry point, the MCP server, the edge, address,
relay — or, where none of those fit, takes the word the surrounding code already
uses.
Prose and comments only, 1:1 line for line. Identifiers keep their names: CSS
classes, DOM ids, struct fields, enum variants, config values and the doc
comments that must open with the identifier they document.
LLM.md is the source and stays the source; CLAUDE.md is a symlink to it, so there is
one file and it cannot drift from itself. What changes is that the link is committed
rather than left for each checkout to recreate.
Left untracked, the doc was conditional on a step outside the repo: a fresh clone had
no CLAUDE.md, nothing loaded LLM.md, and an agent worked here having never read what
this repo already explains. 516 repos in the estate already track theirs; this is the
rest agreeing with them.
The caller sat in .github/workflows and named the reusable workflow by its
GitHub path. git.hanzo.ai collects from .hanzo/workflows, and the reusable it
resolves is hanzoai/ci/.hanzo/workflows/build.yml — so the caller now lives
where the runner pool that serves these labels will find it.
No source change was required. The breaks in this range are the composition
verb (Use widened to ...Component), the removal of App.Add and App.Graft,
Prepare() becoming an exported Build() error, Router losing Fiber(), and in
v1.24 the removal of the last wrapRouter.Fiber escape hatch. This repo
touches none of them: its one Use call passes middleware already typed
zip.Handler, it declares no local zip.Router, it never composed with Add or
Graft, it already calls Build() and checks the error, and both .Fiber() call
sites hold the concrete *zip.App, which still has the method.
Operation ids are unchanged, which is the result that mattered here, since
this repo publishes an openapi.json and a k8s.plugin.json that name ops in
36 places. Two independent reasons. All 36 typed ops register on the root
app and on the root peer app -- there is no Group in the module -- so
composeOps takes the depth-0, empty-prefix path and leaves them untouched.
And every one of them declares its id with zip.WithOperationID, which v1.24
made immune to composition outright: occurrenceID now returns a declared id
verbatim at any prefix and any depth, so these ids also survive being
mounted under a prefix by a host. Both committed projections regenerate
byte-identical to the v1.20.0 output.
Sole branch chore/zip-v1.19 renamed to main; same commit, nothing else in
the repo.
Co-authored-by: Hanzo Dev <[email protected]>
The tree was staged but never committed — this is the repo's first commit, so it
carries both the existing content and the zip v1.18.8 -> v1.20.0 migration.
Migration: Prepare() is replaced by Build() error, and both test harnesses assert
the verdict rather than discarding it. main.go:59's Use call needed no change —
the three middleware constructors already return zip.Handler, which satisfies the
closed Component interface.
The committed projections (k8s.plugin.json, openapi.json, ops/zipdoc_gen.go) are
regenerated: v1.20.0 splits an op's prose into summary (first line) + description
and zipdoc now emits per-field docs, so all three artifacts move with the bump.
Co-authored-by: Hanzo Dev <[email protected]>