Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Alef-managed generated bindings in packages/* and binding crates — the regeneration workflow (task alef:generate / alef:format), Go DocumentExtractor→Extractor rename mapping, the git-diff freshness check, and the key alef.toml sections. Load before editing anything under packages/* or a binding crate, or when regenerating, formatting, or verifying Alef output.
.claude/skills/xberg-io-alef-generated-bindings/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 17% | 0% |
Files under packages/*/ and in the binding crates are generated by Alef — do not hand-edit.
alef.toml before touching anything in packages/*/ or a binding cratealef.toml itselftask alef:generate → alef all --clean. This formats via poly as part of the run; thereis no task alef:format
task alef:verify → alef verify --exit-codetask e2e:generate then task e2e:test (or task e2e:all) to verify behaviouralef.toml + regenerated output atomicallyThe alef:* namespace is exactly: generate, verify, build, sync, docs, verify:readme-paths, verify:ffi-formats. Formatting is poly fmt / poly lint.
task alef:verify. A hand-rolled git diff over packages/ is under-scoped — generated output also lands in crates/xberg-py/, crates/xberg-php/, crates/xberg-jni/, crates/xberg-node/, crates/xberg-wasm/, crates/xberg-ffi/, packages/dart/rust/, packages/swift/rust/, and e2e/.
Alef tracks both sides under .alef/: sources_hash.cache (input hashes over the parsed Rust sources) and .alef/hashes/xberg.<lang>.output_hashes (per-file output content hashes). Neither makes a generated file safe to hand-fix — a regen restores it. Fix alef.toml or the Rust source, then regenerate and re-verify.
alef.toml sections[workspace], [workspace.sync] (version-sync extra_paths), [workspace.docs],[workspace.poly], [workspace.generate]
[[crates]] — the Rust source crate parsed for type/function extraction, plus[[crates.source_crates]]
[crates.<lang>] — one table per binding: python, node, ruby, php, elixir,wasm, ffi, go, java, dart, kotlin_android, jni, swift, csharp, zig (each carrying exclude_functions, target_dep_overrides, stubs, …)
[crates.e2e] — e2e generation (output = "e2e", [crates.e2e.call.overrides.<lang>])[crates.readme] — README generation (template_dir = "templates/readme",[crates.readme.languages.<lang>])
[crates.exclude], [crates.output], [crates.custom_modules], [crates.publish]There are no [crate], [languages.*], [e2e] or [readme] top-level tables, and alef.toml declares no rename mappings — the generated Go trait type is DocumentExtractor, unchanged.
Canonical e2e tasks: task e2e:generate, e2e:build, e2e:test, e2e:all, plus e2e:verify, e2e:lint, e2e:quick, e2e:lang. Do not add legacy aliases.
#[cfg_attr(alef, alef(skip))] on the struct declaration,not the impl block. Without it the regen aborts globally and nothing regenerates, leaving the tree silently stale. Check this first when a regen dies. (36 of the 42 modules in crates/xberg/src/extractors/ carry the attribute.)
#[non_exhaustive] — alef generatesimpl From<Mirror> for xberg::TheType with a struct literal in ~10 binding crates, and #[non_exhaustive] forbids that (E0639). Derive Default for forward-compat instead. Keep #[non_exhaustive] only on types listed in [crates.exclude].
generated binding crates.
The generated XbergOcrBackendBridge in crates/xberg-ffi/src/lib.rs marshals every trait method's return value through JSON (218 serde_json::from_str::<xberg::…> call sites today) and falls back to Default::default() on an uninitialised vtable slot, a failing host callback, or a null result. Whether a variant carries a payload is irrelevant.
Adding a method to a trait with a generated bridge means its return type needs Default + Serialize + Deserialize. Unit-only enums included.
crates/xberg-ffi is built by no ci-rust.yaml leg — only publish-path jobs — so cargo check --workspace cannot fail on it. Verify with the scoped cargo check -p xberg-ffi. That check rewrites crates/xberg-ffi/include/xberg.h and packages/go/include/xberg.h to match whatever feature set you invoked it with, which is usually not the committed one. Revert that churn rather than committing it.
task alef:generate shells out to the globally installed ~/.cargo/bin/alef, not a cargo run against a sibling checkout. A source fix there has zero effect until cargo install --path . --force. Generator fixes ship in order: land upstream → release alef → bump the pinned version → regen. Regenerating against a locally modified alef produces a tree the pinned version cannot reproduce.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,798 | 8,383 | -53% | 1 | 1 | 0% | 2,886 | 2,941 | +2% | 0 | 0 | — |
case-02 | fail→pass | 18,230 | 4,968 | -73% | 1 | 1 | 0% | 2,951 | 2,368 | -20% | 0 | 0 | — |
case-03 | fail→pass | 13,130 | 6,531 | -50% | 1 | 1 | 0% | 2,119 | 2,570 | +21% | 0 | 0 | — |
case-04 | fail→pass | 17,873 | 6,024 | -66% | 1 | 1 | 0% | 2,782 | 2,485 | -11% | 0 | 0 | — |
case-05 | fail→pass | 12,004 | 3,671 | -69% | 1 | 1 | 0% | 1,829 | 2,136 | +17% | 0 | 0 | — |
case-15 | fail→pass | 9,190 | 4,302 | -53% | 1 | 1 | 0% | 1,345 | 2,127 | +58% | 0 | 0 | — |
case-06 | fail→pass | 14,055 | 4,364 | -69% | 1 | 1 | 0% | 2,388 | 2,115 | -11% | 0 | 0 | — |
case-07 | fail→pass | 8,061 | 2,271 | -72% | 1 | 1 | 0% | 1,250 | 1,802 | +44% | 0 | 0 | — |
case-08 | fail→pass | 15,062 | 4,571 | -70% | 1 | 1 | 0% | 1,834 | 2,271 | +24% | 0 | 0 | — |
case-09 | pass→pass | 14,528 | 3,671 | -75% | 1 | 1 | 0% | 2,179 | 2,110 | -3% | 0 | 0 | — |
case-10 | fail→pass | 9,667 | 3,165 | -67% | 1 | 1 | 0% | 1,585 | 1,956 | +23% | 0 | 0 | — |
case-11 | pass→pass | 19,353 | 8,868 | -54% | 1 | 1 | 0% | 2,817 | 2,902 | +3% | 0 | 0 | — |
case-12 | fail→pass | 13,178 | 2,211 | -83% | 1 | 1 | 0% | 1,626 | 1,801 | +11% | 0 | 0 | — |
case-13 | fail→pass | 15,475 | 2,018 | -87% | 1 | 1 | 0% | 2,582 | 1,709 | -34% | 0 | 0 | — |
case-14 | fail→pass | 13,190 | 1,979 | -85% | 1 | 1 | 0% | 2,169 | 1,743 | -20% | 0 | 0 | — |
case-16 | fail→pass | 12,099 | 3,536 | -71% | 1 | 1 | 0% | 1,931 | 2,005 | +4% | 0 | 0 | — |
case-17 | fail→pass | 11,168 | 5,182 | -54% | 1 | 1 | 0% | 1,992 | 2,356 | +18% | 0 | 0 | — |
case-18 | fail→pass | 11,061 | 1,428 | -87% | 1 | 1 | 0% | 1,808 | 1,620 | -10% | 0 | 0 | — |
case-19 | fail→pass | 10,267 | 2,285 | -78% | 1 | 1 | 0% | 1,535 | 1,783 | +16% | 0 | 0 | — |
case-20 | pass→pass | 8,739 | 5,123 | -41% | 1 | 1 | 0% | 1,485 | 2,384 | +61% | 0 | 0 | — |
case-21 | pass→pass | 8,661 | 4,835 | -44% | 1 | 1 | 0% | 1,498 | 2,240 | +50% | 0 | 0 | — |
case-22 | fail→fail | 10,875 | 6,977 | -36% | 1 | 1 | 0% | 1,996 | 2,707 | +36% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/11/2026 | +59% |
Other measured skills in the registry, with their headline benchmark lift.