From ff49b9b32815cd9015a80d048ed853af43507276 Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Wed, 20 May 2026 11:19:07 +0100 Subject: [PATCH 1/2] ci(abi-drift): expand allowlist 56 -> 66 (Refs standards#92 Phase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-surveyed all 81 paired cartridges against the freshly-merged iseriser binary (#20 GADT-skip emitter, #21 runtogether candidate, #22 terminal-`false` switch-arm tolerance). Net change: + 11 newly clean — unblocked by the three iseriser fixes chapeliser-mcp, cloud-mcp, comms-mcp, container-mcp, git-mcp, gitlab-api-mcp, ml-mcp, mongodb-mcp, queues-mcp, research-mcp, vordr-mcp - 1 newly drifting — browser-mcp now flagged Idris2 `BrowserAction.Type` (Zig candidate `type`) vs Zig `type_text`; cartridge-side fix, not a verifier defect. Filed as drift outside Class B/C/D taxonomy; out of scope here. Remaining 15 carry real drift across Classes B/C/D — see standards#92 plus standards#150-155 (Class C: missing Zig enum declarations) and standards#156 (Class D: abbreviation / acronym-boundary, just filed). Class P (verifier parser limit) and Class E (malformed Idris2 source) are now empty: * iseriser#22 closed Class P (5 cartridges: bsp / container / dap / lsp / vault — container-mcp landed in the allowlist; the other 4 are still drifting on separate per-cartridge issues that are no longer parser limits). * iseriser#20 closed Class E (vordr-mcp); the cartridge's manifest now emits cleanly (no enums — its only ADT `IntegrityState` has no `stateToInt` mapping, intentionally) and abi-verify is clean. Comment block updated to reflect post-iseriser-fix taxonomy + survey date so future re-surveys have an audit trail. Refs hyperpolymath/standards#92, hyperpolymath/standards#89, hyperpolymath/iseriser#20, hyperpolymath/iseriser#21, hyperpolymath/iseriser#22. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/abi-drift.yml | 39 ++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/.github/workflows/abi-drift.yml b/.github/workflows/abi-drift.yml index 04df1e8..f5317ce 100644 --- a/.github/workflows/abi-drift.yml +++ b/.github/workflows/abi-drift.yml @@ -70,15 +70,24 @@ jobs: - name: Resolve cartridge allowlist id: discover - # 80 cartridges in the tree carry a paired Safe*.idr + *_ffi.zig. - # 56 are audited green against the Phase 1b emitter + Phase 1 - # verifier (re-run 2026-05-20 with current `main` iseriser binary; - # earlier 16-cartridge survey was contaminated by a stale local - # build pre-iseriser#15). 18 carry real drift (Class B name-norm, - # Class C missing-enum-in-Zig, Class D abbreviation drift — see - # standards#92 + sub-issues iseriser#18 / standards#150-155 / - # standards#TBD-class-D). 5 hit a verifier parser limit - # (iseriser#19). 1 has a malformed Idris2 source (boj-server#111). + # 81 cartridges in the tree carry a paired Safe*.idr + *_ffi.zig. + # 66 are audited green against the Phase 1b emitter + Phase 1 + # verifier (re-run 2026-05-20 after iseriser#20 / #21 / #22 merged: + # GADT-skip in the emitter, runtogether candidate for multi-cap + # acronyms, and terminal `false` switch-arm tolerance in the + # verifier). Versus the previous 56-cartridge allowlist this: + # * ADDS 11 cartridges that the three iseriser fixes unblocked + # (chapeliser, cloud, comms, container, git, gitlab-api, ml, + # mongodb, queues, research, vordr) + # * REMOVES browser-mcp — newly-detected genuine drift + # (`BrowserAction.Type` ↔ Zig `type_text`; cartridge-side + # fix, not a verifier defect) + # 15 cartridges carry real drift across Classes B/C/D — see + # standards#92 plus open sub-issues standards#150-155 (Class C) + # and standards#156 (Class D). Class P (verifier parser limit) + # and Class E (malformed Idris2 source) are now empty: iseriser#22 + # closed Class P (5 cartridges) and the vordr-mcp Class E case + # was closed via iseriser#20 + the cartridge's clean re-survey. run: | set -euo pipefail { @@ -88,10 +97,13 @@ jobs: echo 'agent-mcp' echo 'airtable-mcp' echo 'arango-mcp' - echo 'browser-mcp' echo 'buildkite-mcp' + echo 'chapeliser-mcp' echo 'clickhouse-mcp' + echo 'cloud-mcp' echo 'cloudflare-mcp' + echo 'comms-mcp' + echo 'container-mcp' echo 'crates-mcp' echo 'discord-mcp' echo 'dns-shield-mcp' @@ -100,8 +112,10 @@ jobs: echo 'feedback-mcp' echo 'fleet-mcp' echo 'fly-mcp' + echo 'git-mcp' echo 'github-actions-mcp' echo 'github-api-mcp' + echo 'gitlab-api-mcp' echo 'google-docs-mcp' echo 'google-sheets-mcp' echo 'grafana-mcp' @@ -114,6 +128,8 @@ jobs: echo 'linear-mcp' echo 'local-coord-mcp' echo 'matrix-mcp' + echo 'ml-mcp' + echo 'mongodb-mcp' echo 'neo4j-mcp' echo 'neon-mcp' echo 'nesy-mcp' @@ -127,8 +143,10 @@ jobs: echo 'prometheus-mcp' echo 'proof-mcp' echo 'pypi-mcp' + echo 'queues-mcp' echo 'railway-mcp' echo 'render-mcp' + echo 'research-mcp' echo 'rokur-mcp' echo 'secrets-mcp' echo 'sentry-mcp' @@ -138,6 +156,7 @@ jobs: echo 'telegram-mcp' echo 'todoist-mcp' echo 'turso-mcp' + echo 'vordr-mcp' echo 'zotero-mcp' echo 'EOF' } >> "$GITHUB_OUTPUT" From e36b54d65a406824a500f04033cb4c6d64909cad Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Wed, 20 May 2026 11:23:49 +0100 Subject: [PATCH 2/2] fix(browser-mcp): rename BrowserAction.Type -> TypeText `BrowserAction.Type` was a poor name on two counts: 1. **It shadows Idris2's universe `Type`**, which appears literally 2 lines above the data declaration (`data ValidTransition : BrowserState -> BrowserState -> Type where`). Constructor name collisions with kind-level identifiers are legal but confusing. 2. **It drifts from the Zig FFI**, which spells the variant `type_text` (the descriptive name). iseriser produces snake-form candidate `type` for `Type`, which does not match `type_text`, so `abi-verify` flagged this cartridge as drift in the 2026-05-20 re-survey. Renaming `Type -> TypeText` gives Idris2 the same descriptive name the Zig file already uses, and the snake-form candidate `type_text` now matches the Zig variant exactly. End-to-end verified locally with the current iseriser binary: $ iseriser abi-emit-manifest \ --idris cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr \ --cartridge browser-mcp --out /tmp/v.json abi-emit-manifest: wrote /tmp/v.json (2 enums, 0 transitions) $ iseriser abi-verify --manifest /tmp/v.json --zig-ffi ... abi-verify: OK exit: 0 The adapter / FFI `"browser_type"` string (the MCP tool name) is a distinct identifier and not touched by this change. Once this lands + the allowlist re-expansion in #133 lands, a follow-up 1-line PR can re-add `browser-mcp` to the allowlist (allowlist 66 -> 67). Refs hyperpolymath/standards#92 (Phase 2 allowlist expansion). Refs hyperpolymath/boj-server#133 (allowlist 56 -> 66; browser-mcp was removed as newly-drifting; this PR fixes the drift at source). Co-Authored-By: Claude Opus 4.7 (1M context) --- cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr b/cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr index a9e58a3..a5aa4c2 100644 --- a/cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr +++ b/cartridges/browser-mcp/abi/BrowserMcp/SafeBrowser.idr @@ -56,7 +56,7 @@ public export data BrowserAction = Navigate -- ^ Load a URL in the current tab. | Click -- ^ Click an element matching a CSS selector. - | Type -- ^ Type text into an element matching a CSS selector. + | TypeText -- ^ Type text into an element matching a CSS selector. | Screenshot -- ^ Capture a screenshot of the current viewport. | ReadPage -- ^ Read the DOM text content of the current page. | FillForm -- ^ Fill multiple form fields in one operation. @@ -123,7 +123,7 @@ export browserActionToInt : BrowserAction -> Int browserActionToInt Navigate = 0 browserActionToInt Click = 1 -browserActionToInt Type = 2 +browserActionToInt TypeText = 2 browserActionToInt Screenshot = 3 browserActionToInt ReadPage = 4 browserActionToInt FillForm = 5 @@ -137,7 +137,7 @@ export intToBrowserAction : Int -> Maybe BrowserAction intToBrowserAction 0 = Just Navigate intToBrowserAction 1 = Just Click -intToBrowserAction 2 = Just Type +intToBrowserAction 2 = Just TypeText intToBrowserAction 3 = Just Screenshot intToBrowserAction 4 = Just ReadPage intToBrowserAction 5 = Just FillForm