Follow-up to PR #85 (CI remediation), which ported the prior
`bindings/rescript/` (38 .res files) to `bindings/affinescript/` (.afs)
because ReScript was banned estate-wide on 2026-04-30. The architectural
transformations are sound — every wrapper now calls the Zig FFI directly
instead of going through a JavaScript FFI hop — but 76 `// PORT-CHECK:`
markers were left across 27 of the 29 newly-ported files for decisions
that need human verification.
Note (2026-05-27): the mechanical, link-blocking "missing Zig FFI exports"
half — including the two specific ABI sign-offs for `clamp` and
`Ipv4Result` / `PasswordValidationResult` repr(C) shapes — has been split
out to #88. This issue now tracks only the judgement-heavy
PORT-CHECK marker triage.
Outstanding categories
1. Closure marshalling for `SafeRetry.retry`
The ReScript API took a closure. The .afs wrapper currently takes an
opaque function-pointer + user-data pair pending a portable
function-pointer-across-C-ABI convention. Resolve once the estate
settles on a callback ABI.
2. Opaque handle representations
Several modules model handles as `own RawPtr[Byte]` with explicit
`free_*` consumers (safe_circuit_breaker, safe_graph, safe_lru, etc.).
Underlying `@repr(C)` shape is left to Zig — confirm during Zig export
work tracked on #88.
3. Surface-area gap deliberately left
`SafeBuffer`'s `RingBuffer` / `GrowableBuffer` and `SafeBloom`'s
`CountingBloomFilter` exist only in the deleted JS shim layer; libproven
itself exposes no Zig FFI symbols for them. Either build the Idris
implementations + Zig exports, or remove the JS-only types from the
binding's documented surface.
Search for PORT-CHECK
`grep -rn "PORT-CHECK" bindings/affinescript/src/`
Distribution: 76 markers across 27 files (the 29 newly-ported files
minus the 2 `safe_float` / `safe_email` which had no uncertain
decisions).
Acceptance
Issue closes when:
- All `// PORT-CHECK:` markers are either resolved (deleted with a
resolving comment) or migrated to permanent `// NOTE:` comments
documenting the verified decision.
- `bindings/affinescript/README.adoc`'s "ported 2026-05-27" annotations
can be removed (or upgraded to "verified") for each module that
passes the build check.
(The "all extern declarations correspond to Zig exports" acceptance moved
to #88.)
Follow-up to PR #85 (CI remediation), which ported the prior
`bindings/rescript/` (38 .res files) to `bindings/affinescript/` (.afs)
because ReScript was banned estate-wide on 2026-04-30. The architectural
transformations are sound — every wrapper now calls the Zig FFI directly
instead of going through a JavaScript FFI hop — but 76 `// PORT-CHECK:`
markers were left across 27 of the 29 newly-ported files for decisions
that need human verification.
Note (2026-05-27): the mechanical, link-blocking "missing Zig FFI exports"
half — including the two specific ABI sign-offs for `clamp` and
`Ipv4Result` / `PasswordValidationResult` repr(C) shapes — has been split
out to #88. This issue now tracks only the judgement-heavy
PORT-CHECK marker triage.
Outstanding categories
1. Closure marshalling for `SafeRetry.retry`
The ReScript API took a closure. The .afs wrapper currently takes an
opaque function-pointer + user-data pair pending a portable
function-pointer-across-C-ABI convention. Resolve once the estate
settles on a callback ABI.
2. Opaque handle representations
Several modules model handles as `own RawPtr[Byte]` with explicit
`free_*` consumers (safe_circuit_breaker, safe_graph, safe_lru, etc.).
Underlying `@repr(C)` shape is left to Zig — confirm during Zig export
work tracked on #88.
3. Surface-area gap deliberately left
`SafeBuffer`'s `RingBuffer` / `GrowableBuffer` and `SafeBloom`'s
`CountingBloomFilter` exist only in the deleted JS shim layer; libproven
itself exposes no Zig FFI symbols for them. Either build the Idris
implementations + Zig exports, or remove the JS-only types from the
binding's documented surface.
Search for PORT-CHECK
`grep -rn "PORT-CHECK" bindings/affinescript/src/`
Distribution: 76 markers across 27 files (the 29 newly-ported files
minus the 2 `safe_float` / `safe_email` which had no uncertain
decisions).
Acceptance
Issue closes when:
resolving comment) or migrated to permanent `// NOTE:` comments
documenting the verified decision.
can be removed (or upgraded to "verified") for each module that
passes the build check.
(The "all extern declarations correspond to Zig exports" acceptance moved
to #88.)