Skip to content

feat(abi): Tier-2 Idris bindings + retire legacy Foreign + close L10 transitive cycle - #52

Merged
hyperpolymath merged 1 commit into
mainfrom
claude/abi-tier2-and-l10-trans-cycle
Jun 5, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
claude/abi-tier2-and-l10-trans-cycle

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Reconciles the parked claude/abi-tier2-and-l10-trans-cycle branch into main (branch-reconciliation pass, owner-approved). Unmerged since 2026-06-03.

Substantive proof/ABI work:

  • src/interface/abi/Tier2.idr (+209) — Tier-2 Idris bindings
  • src/core/Decide.idr (+79) — closes the L10 transitive cycle
  • retires legacy abi/Foreign.idr → legacy/Foreign.idr
  • verification/proofs/VERIFICATION-STANCE.adoc (+121)

Merge gate: the Idris2 proof corpus (proof-corpus.yml) must stay green — %default total, zero proof-escape — before this lands. Draft until CI confirms. Likely needs a rebase onto current main (post #48/#49/#50, incl. the licence normalisation).

https://claude.ai/code/session_01W9Voe3JceP66Bna9FT4jME


Generated by Claude Code

…L10 transitive cycle

Three closures from the standards#124 Phase-5 follow-up:

A. **VclTotal.ABI.Foreign → VclTotal.Legacy.Foreign.** The legacy
   `libvqlut` pipeline binding (Zig-side `achieved_level` assertion,
   no Idris certificate) is moved to `src/interface/legacy/` with a
   deprecation banner pointing at Tier-1 (recompute-PCC over wasm32)
   and Tier-2 (Ed25519 signed attestation). The stale corpus symlink
   `corpus/VclTotal/ABI/Foreign.idr` is removed (Foreign was never in
   the proof corpus). New consumers should target the honest paths.

B. **NEW `VclTotal.ABI.Tier2` at `src/interface/abi/Tier2.idr`.**
   Idris bindings to the honest C ABI `vclut_verify_wire`
   (`ffi/zig/src/lib.zig` → `src/interface/attest::vclut_rs_verify`).
   Exposes `verifyWire : List Bits8 → List Bits8 → List Bits8 → IO
   Tier2Verdict` with a `Verified SafetyLevel (List Bits8) | Rejected
   String` typed sum and fail-closed contract at every layer (seed
   width check, alloc failure → Rejected, negative `c_int` →
   Rejected, out-of-range level → defensive Rejected). The 65-byte
   attestation `[level:1][sig:64]` is returned on success.

C. **L10 transitive ENTAILS cycle decider** (`src/core/Decide.idr`).
   `hasCircularEntails` (direct A⊨B ∧ B⊨A only) is supplemented by
   `hasTransitiveCycle`, which computes the transitive closure of
   the ENTAILS edge list to a `length pairs` fuel bound (finite,
   total) and reports any (x,x). `epiNoCycle` now uses the
   transitive form. Closes the L10 hole that the direct check
   missed.

Verification:
- `idris2 --build verification/proofs/vclut-core.ipkg` -> 12/12
  modules build clean from a fresh `build/`. Only pre-existing
  benign `n`-shadowing warnings in `Layout.idr`.
- `VclTotal.ABI.Tier2` typechecks cleanly when wired through the
  corpus tree (not added to the manifest because it is FFI plumbing,
  not a proof; same policy as `ABI.Foreign` was).
- VERIFICATION-STANCE.adoc updated to record L10 closure
  (Phase 4b/5), Foreign retirement (no longer an OWED), and Tier2
  as the consumer-facing replacement.
- ABI-FFI-README.adoc directory diagrams updated.

Trust model deltas:
- Tier-1 (recompute) remains the strongest tier; Tier-2 is the
  honest C-ABI fallback; legacy is documented as deprecated.
- No new axioms; no proof-escape symbols
  (no believe_me/postulate/assert_/sorry/idris_crash) in any
  proof-corpus module.

Refs hyperpolymath/standards#124 (Phase 5 follow-up).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hyperpolymath
hyperpolymath marked this pull request as ready for review June 5, 2026 13:43
@hyperpolymath
hyperpolymath enabled auto-merge (squash) June 5, 2026 13:43
@hyperpolymath
hyperpolymath merged commit 50de1c5 into main Jun 5, 2026
145 of 264 checks passed
@hyperpolymath
hyperpolymath deleted the claude/abi-tier2-and-l10-trans-cycle branch June 5, 2026 14:13
hyperpolymath pushed a commit that referenced this pull request Jun 11, 2026
…ifications

bufferToList now recurses structurally on a remaining-byte Nat fuel
instead of asserting totality on an increasing Int index. Semantics
unchanged (n <= 0 yields [], bytes read [0, n) in order); the totality
checker accepts it directly, restoring the proof-corpus zero
proof-escape contract that #52's merge gate promised.

audits/assail-classifications.a2ml records the audited FFI residuals
from a fresh panic-attack 2.5.5 scan: the documented unsafe blocks in
recompute-wasm and attest (both files carry in-file UNSAFE POLICY
sections and deny(clippy::undocumented_unsafe_blocks)) and the Zig
C-ABI bridge cast. The assert_total finding is fixed, not classified.

vcl-ut also gains scan coverage for the first time: it had NO entry in
verisimdb-data/scans at all (coverage gap fixed estate-wide by
hypatia's new estate-rescan workflow).
hyperpolymath added a commit that referenced this pull request Oct 3, 2026
## Summary

Implements the repository-side work tracked by #53. This is a **draft**
pending explicit owner confirmation of the license policy and
branch-protection change.

- Records #51 and #52 as reconciled: both issues are closed; the monthly
CodeQL schedule and Tier-2/L10/proof-corpus work are present in the
current tree.
- Normalizes live license metadata to the policy already declared by
this repository: MPL-2.0 for software/configuration and CC-BY-SA-4.0 for
human documentation. GitHub Licensee currently recognizes the public
`main` license as MPL-2.0. Removed the unused AGPL license text; no
source file currently declares AGPL. Corrected invalid PMPL SPDX
headers, package/release metadata, and misleading legacy license
wording. The ethical-use exhibits now expressly state they are
non-binding guidance and do not modify MPL-2.0.
- Adds a closed license-policy contract and fail-closed checker: REUSE
6.2.0 lint, one inline SPDX declaration, path-specific
documentation/software rules, allowed-ID checks, Cargo metadata checks,
root license and Zenodo checks. Wires it into `just license-check`,
pre-commit, the K9/Must contract, and the CI check `license-policy`.
- Adds explicit CC-BY-SA headers to untagged human documentation and
missing MPL headers to code/configuration manifests; fixes REUSE
copyright gaps.
- Rewrites `.machine_readable/STATE.a2ml` to reflect the actual VCL-UT
implementation, proof corpus, limitations, and next actions; removes the
byte-identical `6a2/STATE.a2ml` mirror. Documents the distinct roles of
the four contractile locations and removes the remaining template-state
wording from the AI entry point.

## Validation

- REUSE 6.2.0 `reuse lint` — pass (0 missing, invalid, deprecated, or
unused licenses).
- `scripts/check-license-policy.sh` — pass; negative test confirmed the
documentation path rule rejects MPL-2.0.
- Strict `.githooks/validate-a2ml.sh` — pass (121 files, 0
errors/warnings).
- `pre-commit validate-config`, shell syntax, TOML/JSON/YAML parsing,
and `git diff --check` — pass.
- Full pre-commit execution is currently blocked by the existing
`https://github.com/hyperpolymath/a2ml-pre-commit` remote returning
“Repository not found”. Strict K9 validation also flags the existing
`container/deploy.k9.ncl` envelope-format mismatch. Cargo, Idris2, and
Nickel are not installed in this sandbox, so build/proof corpus
execution was not possible here.

## Owner actions before this can be merged/closed

1. Confirm that **MPL-2.0 code + CC-BY-SA-4.0 documentation** is the
intended ruling (rather than retaining an AGPL core). The current
repository headers, Cargo metadata, policy docs, and GitHub Licensee
result point to that choice; the orphan AGPL text was removed
accordingly.
2. After this check appears on a PR, make the `license-policy` status
check required in branch protection/rulesets. GitHub reports its exact
check context as `license-policy`; this session's integration cannot
read or change branch-protection settings (HTTP 403).
3. Optionally provide the correct A2ML pre-commit repository/ref so the
full pre-commit suite can be run locally; the new local license hook
itself is configured and independently passes.

This PR intentionally does not auto-close #53; owner confirmation and
the required-check setting are still needed for full conclusion.

## GitHub CI status (observed 2026-10-03)

The PR-head `license-policy` job passes in [REUSE compliance run
37153345024](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345024);
the A2ML validation job also passes here (the corresponding job failed
on `main` before this PR). Parse Gate, E2E/property tests, CodeQL,
OpenSSF, and the dedicated Hypatia scan passed.

Several other red checks are pre-existing on `main` and reproduce on
this PR: K9 contract validation
([PR](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345063),
[main](https://github.com/hyperpolymath/vcl-ut/actions/runs/36827801346))
rejects `container/deploy.k9.ncl` because its metadata envelope differs
from the validator's expected literal `K9!`/top-level pedigree format;
the Governance workflow linter
([PR](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345544),
[main](https://github.com/hyperpolymath/vcl-ut/actions/runs/36827802174))
fails at “Check SPDX headers + permissions”; Static Analysis Gate /
Hypatia critical findings
([PR](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345049),
[main](https://github.com/hyperpolymath/vcl-ut/actions/runs/36827801472));
Rust CI / Clippy
([PR](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345611),
[main](https://github.com/hyperpolymath/vcl-ut/actions/runs/36827802116));
and Cargo Audit
([PR](https://github.com/hyperpolymath/vcl-ut/actions/runs/37153345048),
[main](https://github.com/hyperpolymath/vcl-ut/actions/runs/36827801358)).
These are not attributed to this change; the Actions log archive
endpoint returned EOF when detailed failed-step logs were requested. The
K9 validator mismatch is documented rather than suppressed or “fixed” by
weakening the gate.

At the time checked, Proof Corpus remained in progress and the large
Backend Matrix remained queued, so this is not a claim that the full CI
suite completed. Maintainers should resolve or explicitly disposition
the pre-existing red checks as appropriate for branch protection, then
wait for the proof/matrix jobs.

## Additional maintainer follow-up

4. Resolve the pre-existing K9 envelope mismatch without a blanket
ignore (either teach the validator the deployed `component_pedigree` /
`metadata.magic_number` / `trust_level` representation with regression
coverage, or migrate the deployment config to the canonical format).
Also triage the baseline governance, Hypatia, Clippy, and Cargo Audit
failures if they are required checks.

---------

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant