Problem
Beyond the Class A/B/C/E/P drift classes already filed under standards#92, the boj-server full-tree survey surfaces a further class — abbreviation / acronym-boundary drift between the Idris2 ABI source and the hand-written Zig FFI. The Idris2 source spells a word out; the Zig FFI uses an abbreviation (or vice-versa), and iseriser abi-verify has no candidate-generation rule that can bridge the two.
Verified against boj-server/main with the up-to-date iseriser binary (iseriser#20 / #21 / #22 all merged: GADT-skip, runtogether candidate, terminal-false arm).
Affected cartridges + concrete evidence
postgresql-mcp — Transaction ↔ tx (3 pairs)
[variant-missing-in-zig] PostgresqlAction.BeginTransaction (candidates: begin_transaction / begintransaction) — Zig has begin_tx
[variant-missing-in-zig] PostgresqlAction.CommitTransaction (candidates: commit_transaction / committransaction) — Zig has commit_tx
[variant-missing-in-zig] PostgresqlAction.RollbackTransaction (candidates: rollback_transaction) — Zig has rollback_tx
hetzner-mcp — SSHKey / SSHKeys acronym word-boundary (4 items)
[variant-missing-in-zig] HetznerResource.SSHKeys (candidates: sshkeys) — Zig has ssh_keys
[variant-missing-in-zig] HetznerAction.ListSSHKeys (candidates: list_sshkeys) — Zig has list_ssh_keys
[variant-missing-in-zig] HetznerAction.CreateSSHKey (candidates: create_sshkey) — Zig has create_ssh_key
(SSH is all-caps in Idris2, so to_snake_case produces sshkeys — the Zig spelling treats SSH + Keys as separate words and inserts the underscore.)
redis-mcp — *Action suffix dropped in Zig (debatable Class D — could be a separate Class)
[variant-missing-in-zig] RedisAction.SubscribeAction (candidates: subscribe_action / subscribeaction) — Zig has subscribe
[variant-missing-in-zig] RedisAction.UnsubscribeAction (candidates: unsubscribe_action / unsubscribeaction) — Zig has unsubscribe
This is suffix-omission, not abbreviation. Should probably be per-cartridge Idris2/Zig alignment, not a converter rule.
aws-mcp / gcp-mcp — not Class D after the iseriser fixes
Memory originally lumped these under Class D, but verified evidence shows their remaining drift is variant-extra-in-zig only — i.e. the Zig FFI exposes Action enum variants (cw_get_metrics, cloud_run_deploy_service, firestore_*, etc.) that simply have no Idris2 counterpart. This is incomplete Idris2 source, a different class entirely (likely "Class F: Idris2 lags Zig"). Out of scope for this issue.
Fix options
Owner decision required. Each row below is one path.
| Path |
Pros |
Cons |
A. iseriser-side Transaction/SSH etc. acronym dictionary |
Mechanical; one rule covers many cartridges |
Hard to bound — every new abbreviation requires a code change |
| B. iseriser-side common-prefix / common-suffix stripping |
Generalises Class B's runtogether approach |
Heuristic; risk of over-matching unrelated variants |
| C. Cartridge-side rename: align Idris2 to Zig (or vice-versa) |
Closes drift permanently; no converter complexity |
Touching every cartridge; cosmetic-but-noisy diffs |
| D. Accept as known per-cartridge drift; allowlist |
Zero code work; documents real divergence |
Manifests stay misaligned; codegen Phase 3 (#92) blocked on these cartridges |
Recommendation: A only for known abbreviations the corpus actually contains (Transaction → tx, SSH → ssh, possibly Database → db), plus C for redis-mcp's suffix-omission case. Keep B off the table — too heuristic to land safely.
Acceptance criteria
After fix (whichever path): re-running the standards#92 survey on these 3 cartridges (postgresql-mcp, hetzner-mcp, redis-mcp) shows abi-verify exit 0 or variant-extra-in-zig-only (i.e. Class F, separately tracked).
Refs #92 (Phase 2 allowlist expansion).
Refs #89 (epic).
🤖 Generated with Claude Code
Problem
Beyond the Class A/B/C/E/P drift classes already filed under standards#92, the boj-server full-tree survey surfaces a further class — abbreviation / acronym-boundary drift between the Idris2 ABI source and the hand-written Zig FFI. The Idris2 source spells a word out; the Zig FFI uses an abbreviation (or vice-versa), and
iseriser abi-verifyhas no candidate-generation rule that can bridge the two.Verified against
boj-server/mainwith the up-to-dateiseriserbinary (iseriser#20 / #21 / #22 all merged: GADT-skip, runtogether candidate, terminal-false arm).Affected cartridges + concrete evidence
postgresql-mcp —
Transaction↔tx(3 pairs)hetzner-mcp —
SSHKey/SSHKeysacronym word-boundary (4 items)(
SSHis all-caps in Idris2, soto_snake_caseproducessshkeys— the Zig spelling treatsSSH+Keysas separate words and inserts the underscore.)redis-mcp —
*Actionsuffix dropped in Zig (debatable Class D — could be a separate Class)This is suffix-omission, not abbreviation. Should probably be per-cartridge Idris2/Zig alignment, not a converter rule.
aws-mcp / gcp-mcp — not Class D after the iseriser fixes
Memory originally lumped these under Class D, but verified evidence shows their remaining drift is
variant-extra-in-zigonly — i.e. the Zig FFI exposes Action enum variants (cw_get_metrics,cloud_run_deploy_service,firestore_*, etc.) that simply have no Idris2 counterpart. This is incomplete Idris2 source, a different class entirely (likely "Class F: Idris2 lags Zig"). Out of scope for this issue.Fix options
Owner decision required. Each row below is one path.
Transaction/SSHetc. acronym dictionaryRecommendation: A only for known abbreviations the corpus actually contains (
Transaction → tx,SSH → ssh, possiblyDatabase → db), plus C for redis-mcp's suffix-omission case. Keep B off the table — too heuristic to land safely.Acceptance criteria
After fix (whichever path): re-running the standards#92 survey on these 3 cartridges (postgresql-mcp, hetzner-mcp, redis-mcp) shows abi-verify exit 0 or
variant-extra-in-zig-only (i.e. Class F, separately tracked).Refs #92 (Phase 2 allowlist expansion).
Refs #89 (epic).
🤖 Generated with Claude Code