Skip to content

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

@hyperpolymath

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

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions