Fixed
-
The v1.5.1 release published nothing: the plugin version pin was left at 1.5.0 while the
crate moved to 1.5.1, sovalidate-versionsfailed and took the whole workflow with it.
The bump chain behindtask version:syncrunsalef sync-versionsand then seven further
steps that regenerate everything derived from the version -- stubs, scaffolding, README
install snippets, test-app installers, e2e download scripts, and
scripts/sync_plugin_version.py, which re-pins the coding-agent plugin. Those seven were
written as{{.ALEF}} <subcommand>, butALEFwas never defined in.task/or
Taskfile.yml, so each one rendered as a baregenerate/stubs/verifyand the chain
aborted with exit 127 on the first of them. Only the literalalef sync-versionsahead of
them ever ran. That is why the alef-managed binding manifests tracked the crate while
plugin/.ai-rulez/config.toml-- and theplugin/package.json,
plugin/gemini-extension.jsonandplugin/kimi.plugin.jsonbundles rendered from it --
stayed behind on 1.5.0.validate-versionsgates nearly every publish job, so its failure
skipped 36 of them and no artifact reached any registry.ALEFis now defined, so the full
chain runs and thealef verifygate at the end of it is reachable for the first time
since it was added. Because the release shipped nothing, v1.5.0 and v1.5.1 never reached
npm; the latest npm release remained 1.4.2, and this is the first 1.5.x to land there. -
task version:set VERSION=Xcould not set any version other than the one already in
Cargo.toml..task/config/vars.ymldefined aVERSIONvariable computed from
Cargo.toml, and Task resolves{{.VERSION}}inside an included taskfile from that
shared file in preference to a CLI-passedVERSION=.... Bothversion:setand
alef:bumplive in included taskfiles, so both read the computed value instead of the
argument:version:setre-set the version it already had, andalef:bumpwould have
written the crate version into alef.toml'salef_versionpin. Therequires: vars: [VERSION]guard never caught it, because the variable was always defined. Root-level
tasks resolve the argument correctly, which is what made the shadowing easy to miss. The
computed variable is renamedCARGO_VERSION; it had no other readers. -
Every test app and e2e harness installed crawlberg 1.2.1 -- nine releases behind -- and the
Zig test app downloaded av1.2.1release asset.test_apps/node,test_apps/wasm,
test_apps/go,test_apps/javaandtest_apps/zigeach pin the published package they exist
to validate, and every one of those pins had sat at 1.2.1 since 2026-08-11, across 1.3.0,
1.3.1, 1.3.2, 1.3.3, 1.4.0, 1.4.1, 1.4.2, 1.5.0 and 1.5.1 -- so the suite that answers "does
the released artifact work" was answering it about a package from three weeks and nine releases
earlier.test_apps/zig/build.zig.zonis the worst case, because its.urlpointed at
releases/download/v1.2.1/crawlberg-zig-v1.2.1.tar.gzand that asset still returns 200: the
fetch succeeded, so the staleness never surfaced as an error. (e2e/go/go.modcarried the same
stale pin, though areplacedirective redirects it to the local tree, so there it was
cosmetic.) Nothing kept these lines in step because alef classifies all of them as create-once
seeds -- it writes each only when the path is absent and never re-renders it -- so no
regeneration step has ever touched them. Adopting the files is not the fix: the same paths hold
hand-grown build logic (e2e/zig/build.zigalone is 903 lines of FFI, rpath and mock-server
wiring), and adopting a create-once seed consents to alef replacing that content with a
placeholder on the next overwriting regen. Six[[workspace.sync.text_replacements]]entries
now stamp only the version-bearing line in each file on everytask version:sync, leaving
everything around it untouched. The Zig.hashdeliberately keeps its placeholder value, which
zig fetchresolves once the release publishes. -
The published TypeScript interaction examples did not type-check. Every generated
interactsnippet and the Node e2e interaction suite readresult.actionResults[0].success
directly, butactionResultsis optional onInteractionResult, so all eleven failedstrict
type-checking withTS18048: 'result.actionResults' is possibly 'undefined'-- a reader who
copied one out of the docs got a compile error rather than a working example. Regenerating on
alef 0.84.2 emitsresult.actionResults?.[0]?.successinstead. The effect is confined to
TypeScript and Node: alef gates the fix on the target language at the accessor's entry point,
and regenerating every backend against 0.84.2 changed no other language's output.
Changed
-
Regenerated all language bindings on alef 0.84.2 (from 0.82.2), picking up its
reproducible-generation fix. -
Upgraded
vitest4 -> 5 across all six Node and WASM suites, and@vitest/coverage-v8to the
matching major, since it is version-locked to vitest. Dev-dependency only -- no published
package carries vitest, and no shipped code changed.
Zig
Add to your build.zig.zon:
.dependencies = .{
.crawlberg-zig = .{\n .url = \"https://github.com/xberg-io/crawlberg/releases/download/v1.5.2/crawlberg-zig-v1.5.2.tar.gz\",\n .hash = \"crawlberg-1.5.2-IoY1CkApQyKrx8uR6JC5C-y8CxIPu5jn5PUCSFsmDA8X\",\n },\n},\n```\n