Skip to content

[#92 Class D] abbreviation / acronym-boundary drift across DB + cloud cartridges #156

Description

@hyperpolymath

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 — Transactiontx (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

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtKnown shortcut, drift, or hygiene owed - includes cleanup

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions