Proofs¶
Every headline claim on this site is backed by a runnable proof. The assertions below are representative; the suite grows with the standard, so the command output is the source for the current count. Reproduce it yourself — the whole thing is zero-dependency and runs on Node ≥ 22.5.0.
Reproduce it
1 · Conformance test suite¶
Every MUST the reference implementation supports is exercised. A representative slice:
✔ §12.1 header bytes: application_id at offset 68, user_version at offset 60
✔ §12.3 DSSE/in-toto sign+verify round-trip; keyid form; subject.digest = manifest_hash
✔ §12.6 trust: unsigned -> legacy | valid+unknown -> portable | namespace-proven active key -> trusted | own key -> local | mutated ROM -> tampered
✔ §12.8 scrub blocks an AWS access key / a PEM private key / a GitHub token; passes clean input
✔ §3.4 strip-to-ROM: manifest hash equal when only SAVE rows are removed
✔ §12.7 sqlar skills are extractable byte-for-byte and index content_sha256 matches
✔ C1: rewriting signed sqlar content with a stale objects.oid is detected as tampered
✔ C1: rewriting a capability proficiency to verified with a stale oid is tampered
✔ §7.4 mergeRecords never collapses across the tier boundary
✔ §10.1 verifyLevelCredential rejects self-issuance / ROM digest mismatch / revocation / tampered body
✔ §7.2 codebaseFingerprint never contains the repo name/label
✔ cyclic workflows fail closed unless limits.maxSteps bounds the loop
✔ workflow signing binds the canonical document and verifies as portable
✔ workflow verification rejects content tampering and publisher-binding tampering
✔ workflow verification rejects a valid signature with incomplete in-toto bindings
✔ workflow lint separates portable structure checks from roster readiness
✔ acx.agent-graph/1 accepts fuzzy prose with hard reference invariants
✔ information cycles are valid because routes do not execute task loops
✔ mandatory direction for the same knowledge has one acyclic source
✔ verification rejects a correctly signed graph with an invalid publication structure
✔ share refuses symlinked registry destinations before any outside write
✔ share agent prepares only the verified artifact and generated discovery card
✔ share agent dry-run is non-mutating and refuses unsafe identity changes
✔ share workflow preserves signed bytes and renders a reviewable PR body
✔ share preparation is idempotent and requires force for changed bytes
✔ package spec rejects unknown fields, duplicate roles, and missing normative roles
✔ loading refuses signed package paths that could escape the skill directory
ℹ fail 0
2 · Signed team workflow — lint → verify → readiness¶
The repository includes two signed, publishable workflows: ship-a-feature (a bounded
design/build/review loop) and research-council (parallel research and challenge followed by an
approval-gated synthesis).
$ acx workflow lint registry/cals/io.github.lboel/ship-a-feature/1.0.0.cal.json --publish
verdict: VALID ✓ — structure and publish profile pass
$ acx workflow verify registry/cals/io.github.lboel/ship-a-feature/1.0.0.cal.json
status: verified
trust: portable
publisher: io.github.lboel
structure: publishable ✓
- signer keyid not in trust registry
$ acx workflow ready registry/cals/io.github.lboel/ship-a-feature/1.0.0.cal.json --cartridges ./my-roster
The tests additionally mutate graph content and publisher identity, revoke a signer for key compromise,
feed unknown executable-looking fields, remove cycle bounds, and separate portable validity from local
staffing. The last command's verdict intentionally depends on ./my-roster. A self-declared or unresolved
level never satisfies minLevel; credential signature, issuer, revocation, evidence, and ROM binding must
resolve. Every unsafe case fails closed at the expected boundary.
3 · Signed Agent Graph — lint → verify → inspect¶
The signed Product Delivery graph keeps task order in its two pinned CALs while making context ownership, direction, reporting returns, and their bounded convergence independently reviewable.
$ acx graph lint registry/graphs/io.github.lboel/product-delivery/1.0.0.agent-graph.json --publish
ACX Agent Graph: Product delivery team graph @ 1.0.0
actors=3 knowledge=5 routes=4 loops=2 convergence=1
verdict: VALID ✓ — information architecture is reference-safe
$ acx graph verify registry/graphs/io.github.lboel/product-delivery/1.0.0.agent-graph.json
status: verified
trust: portable
publisher: io.github.lboel
architecture: publishable ✓
- signer keyid not in trust registry
$ acx graph inspect registry/graphs/io.github.lboel/product-delivery/1.0.0.agent-graph.json
actors: 3
knowledge: 5
routes: 4 (advise, direct, report, request)
loops: 2
convergence: 1
The adversarial suite also checks dangling actors and knowledge, malformed collections, duplicate triggers, ambiguous participant bindings, conflicting or cyclic mandatory direction, unreachable or unbounded convergence, embedded/private metadata, correctly signed but structurally invalid graphs, symlink path escapes, and publisher tampering. Reporting cycles remain valid; every unsafe case fails closed.
4 · Round-trip: export → verify → strip → tamper¶
This proof starts from the checked-in examples/sample-agent-package fixture. The fixture mirrors the
Agentibus package-directory shape and exercises the explicit ACX CLI conversion boundary; the test does
not call a running Agentibus server or prove that Agentibus itself emits .acx files.
exported cartridge: io.github.agentibus/scenario-research-designer@22f2ae29-…
rom_manifest_hash: sha256:1726cf1e6025c166e06dc839a5cbae6c900f0ffa3e0b1235be8b78e88ee09943
ROM objects: 21
skills: [ 'expertise-designer' ]
capabilities: [
'implement-feature[pkg:generic/benchmarking+pkg:generic/research+pkg:generic/ux]',
'build-dag[pkg:generic/snowflake+pkg:pypi/apache-airflow+pkg:pypi/dbt-core]'
]
verify (empty registry): warning / portable - Signature valid but signer not in trust registry.
verify (trusted registry, local): verified / local - Signed by this instance.
strip-to-ROM equal: true (before==after: true)
verify (objects.oid tamper): invalid / tampered - ROM content diverges from signed manifest.
verify (SKILL.md content tamper): invalid / tampered - ROM content diverges from signed manifest.
SMOKE OK
What this proves
- The bundled Agentibus-shaped package fixture can be converted by the ACX reference CLI into one
signed
.acx. - The trust taxonomy behaves:
portablefor an unknown signer,localfor our own key. - strip-to-ROM equality is the machine-checkable proof that field learning never mutated the ROM.
- Both a metadata tamper and a content-body tamper (the critical C1 attack — rewrite a signed
SKILL.mdwhile leaving the object hash stale) are caught astampered.
5 · Provable level — earned, verified, unfakeable¶
cartridge ROM digest: sha256:1726cf1e6025c166e06dc839a5cbae6c900f0ffa3e0b1235be8b78e88ee09943
benchmark acx-bench-dag-de@2026.07.1: 160 tasks, held-out slice digest sha256:d16bf83a37c399775…
weak agent (competence 14): NOT ISSUED — gating failed: sigma=2.230 (<1.5?), games=50 | R=5.80 tier=junior
strong agent (competence 33): ISSUED ✅ mu=33.03 sigma=1.232 games=90 passRate=60% R=29.34 => acxLevel=29 tier=principal
credential verification: VALID ✅
capability build-dag effective proficiency (resolved from attestation): VERIFIED tier=principal
ROM signature after attaching attestation: warning / portable (intact ✅)
anti-gaming — self-issued credential: REJECTED ✅ (issuer == subject)
anti-transplant — VC on mutated ROM: REJECTED ✅ (ROM digest binding mismatch)
revocation — status bit set: REVOKED ✅
PROVABLE LEVEL OK — level earned from re-run, cryptographically verified, unfakeable
What this proves
A weak agent is refused a level; a strong agent earns one only after an independent held-out re-run passes the TrueSkill σ-gate. The resulting credential is cryptographically valid, and every forgery route — self-issuance, transplanting the level onto a mutated cartridge, and a revoked credential — is rejected. See how agents level up.
6 · The CLI, end to end¶
$ acx export <agent-package> demo.acx --publisher io.github.agentibus
cartridge id: io.github.agentibus/scenario-research-designer@025edd67-…
rom hash: sha256:f479be021b8ea2e55cc6e3e33b95df9d151196548dfc854dedbe578be7120642
keyid: ed25519:17bb8c9290fd2a3d0c3a434ad0e99544d809dbff1540d64be0bab2274df14f66
signing key: demo.acx.key.pem (private — kept OUTSIDE the cartridge)
field-learned: quarantined (default)
$ acx verify demo.acx
status: warning trust: portable Signature valid but signer not in trust registry. (exit 0)
$ acx strip demo.acx demo.rom.acx
rom hash before strip: sha256:f479be0… rom hash after strip: sha256:f479be0…
hash-equality proof: EQUAL (ROM intact; SAVE removed) (exit 0)
$ acx level demo.acx
level: ISSUED acxLevel: 29 tier: principal rating: mu=32.85 sigma=1.191 games=90 pass@1=60%
credential verify: VALID
See the full CLI reference.
7 · Interoperability & file identity¶
The cartridge is a plain SQLite file — the stock tools recognize and open it:
$ file demo.acx
demo.acx: SQLite 3.x database, application id 1094932529, user version 16777472, …
$ sqlite3 demo.acx ".ar --list" | grep skills
rom/skills/expertise-designer/SKILL.md
Honest scope
The benchmark's reference solver is deterministic and pluggable — a production verifier plugs
in a real sandboxed agent run; the cryptographic gating, evidence, and credential machinery shown
above are fully real. OCI push, live namespace-proof verification, and the host handshake runtime
are specified normatively but are host-side, not part of this reference implementation. The
Agentibus runtime currently exports and imports its own package-directory format; automatic .acx
export, import, or re-hiring would require a separate adapter that is not shipped today.