xoonya 3.0.1 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env.example CHANGED
@@ -1,2 +1,10 @@
1
1
  XOONYA_HOST=127.0.0.1
2
2
  XOONYA_PORT=4310
3
+ # Set to 1 to make every proof-bundle verification strict: only cryptographically verified
4
+ # (native signed / native hybrid) results are valid; digest and structural results are rejected.
5
+ # XOONYA_STRICT_VERIFY=1
6
+ # Whether POST /v1/receipts/emit, /v1/proof-bundles/build, and the proof-center run routes may
7
+ # receive private key material (private_key_pem, classical_private_key_pem, pq_private_key_pem).
8
+ # Unset = accepted locally, rejected when RENDER is set. Set to false on any shared deployment
9
+ # and sign locally with the xoonya SDK or CLI instead.
10
+ # XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL=false
package/README.md CHANGED
@@ -14,6 +14,29 @@ This repo is the proof-side half of the final two-repo public stack. It focuses
14
14
 
15
15
  The 10-phase public program is now complete. `xoonya` is in terminal closeout posture rather than active milestone build posture.
16
16
 
17
+ ## Public Discovery
18
+
19
+ The broader stack now has a canonical human front door and a canonical machine doorway:
20
+
21
+ - https://www.naxytra.com/agents
22
+ - https://www.naxytra.com/v1/agent-discovery-index
23
+ - https://www.naxytra.com/v1/agent-discovery-index/summary
24
+ - https://www.naxytra.com/.well-known/agent.json
25
+
26
+ Use the human page when you want the shortest adoption landing page, and use the machine endpoints when a registry, crawler, or agent needs a stable public discovery surface.
27
+
28
+ The shared control-plane contract documents are:
29
+
30
+ - [OPERATIONAL_RECEIPT_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OPERATIONAL_RECEIPT_CONTRACT.md)
31
+ - [MACHINE_IDENTITY_REGISTRY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/MACHINE_IDENTITY_REGISTRY_CONTRACT.md)
32
+ - [CRYPTO_AGILITY_MATRIX.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/CRYPTO_AGILITY_MATRIX.md)
33
+ - [AUTHORITY_BINDING_LIFECYCLE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/AUTHORITY_BINDING_LIFECYCLE_CONTRACT.md)
34
+ - [PUBLIC_SURFACE_POLICY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/PUBLIC_SURFACE_POLICY_CONTRACT.md)
35
+ - [OFFLINE_VERIFIABILITY_AND_RECOVERY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OFFLINE_VERIFIABILITY_AND_RECOVERY_CONTRACT.md)
36
+ - [ADAPTER_CERTIFICATION_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/ADAPTER_CERTIFICATION_CONTRACT.md)
37
+ - [TRUST_PORTABILITY_BOUNDARY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/TRUST_PORTABILITY_BOUNDARY_CONTRACT.md)
38
+ - [SIGNED_AUDIT_PROVENANCE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/SIGNED_AUDIT_PROVENANCE_CONTRACT.md)
39
+
17
40
  ## Public Boundary
18
41
 
19
42
  The public adoption story is intentionally narrow:
@@ -46,6 +69,7 @@ The shortest public proof loop is:
46
69
  The frozen proof-side fact model for `3.0.0` closeout is documented in:
47
70
 
48
71
  - [XOONYA_PROOF_TRUTH_MODEL.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/XOONYA_PROOF_TRUTH_MODEL.md)
72
+ - [OPERATIONAL_RECEIPT_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OPERATIONAL_RECEIPT_CONTRACT.md)
49
73
 
50
74
  Machine-readable proof-truth surfaces:
51
75
 
@@ -97,6 +121,9 @@ If you want the broadest machine-readable census for these already-core proof la
97
121
  - `GET /v1/artifact-distribution`
98
122
  - `GET /v1/shared-signals`
99
123
  - `GET /v1/feature-control`
124
+ - `GET /v1/adapter-certification`
125
+ - `GET /v1/trust-portability-boundary`
126
+ - `GET /v1/signed-audit-provenance`
100
127
 
101
128
  ## One-Line After Install
102
129
 
@@ -116,6 +143,54 @@ If you want the shortest machine-readable discovery path, inspect:
116
143
  - `GET /v1/proof-bridge`
117
144
  - `GET /v1/telemetry`
118
145
  - `GET /v1/provenance`
146
+ - `GET /v1/adapter-certification`
147
+ - `GET /v1/trust-portability-boundary`
148
+ - `GET /v1/signed-audit-provenance`
149
+
150
+ If you are working on shared evidence, inspect the operational receipt contract pack:
151
+
152
+ - `buildOperationalReceiptContractPack()`
153
+ - `summarizeOperationalReceiptContractPack()`
154
+
155
+ If you are working on machine identity, inspect the registry contract pack:
156
+
157
+ - `buildMachineIdentityRegistryContractPack()`
158
+ - `summarizeMachineIdentityRegistryContractPack()`
159
+
160
+ If you are working on crypto agility, inspect the matrix pack:
161
+
162
+ - `buildCryptoAgilityMatrixPack()`
163
+ - `summarizeCryptoAgilityMatrixPack()`
164
+
165
+ If you are working on binding lifecycle, inspect the lifecycle pack:
166
+
167
+ - `buildAuthorityBindingLifecycleContractPack()`
168
+ - `summarizeAuthorityBindingLifecycleContractPack()`
169
+
170
+ If you are working on public route policy, inspect the surface policy pack:
171
+
172
+ - `buildPublicSurfacePolicyContractPack()`
173
+ - `summarizePublicSurfacePolicyContractPack()`
174
+
175
+ If you are working on offline recovery, inspect the recovery pack:
176
+
177
+ - `buildOfflineVerifiabilityRecoveryContractPack()`
178
+ - `summarizeOfflineVerifiabilityRecoveryContractPack()`
179
+
180
+ If you are working on adapter certification, inspect the certification pack:
181
+
182
+ - `buildAdapterCertificationContractPack()`
183
+ - `summarizeAdapterCertificationContractPack()`
184
+
185
+ If you are working on trust portability boundaries, inspect the boundary pack:
186
+
187
+ - `buildTrustPortabilityBoundaryContractPack()`
188
+ - `summarizeTrustPortabilityBoundaryContractPack()`
189
+
190
+ If you are working on signed audit and provenance, inspect the audit/provenance pack:
191
+
192
+ - `buildSignedAuditProvenanceContractPack()`
193
+ - `summarizeSignedAuditProvenanceContractPack()`
119
194
 
120
195
  ## Start Here
121
196
 
@@ -302,6 +377,8 @@ Current built-in methods:
302
377
 
303
378
  `algorithm: "none"` is not a registered verification method and does not verify. External proof methods are first-class registry entries, but xoonya does not pretend to replace their own cryptographic verifier stacks. The proof core checks the canonical receipt, method registration, and method boundary; issuer-specific validation stays with the relevant JWT, DID/VC, SD-JWT VC, signed-envelope, or partner verifier.
304
379
 
380
+ Every verify result now says which of these happened through `verification_class` and `cryptographically_verified` (see "Verification Classes" below). Native signed and hybrid proofs bind `public_key_ref` to the key carried in the proof, not to the identity string; pass `trusted_public_key_refs` or `expected_public_key_ref` to bind an identity to its keys, and `strict: true` to refuse anything that was not cryptographically verified.
381
+
305
382
  ### xoonya Native Proof Format
306
383
 
307
384
  xoonya Native is the optional native proof/result/attestation format direction for machine proof. It is not a replacement for JWT, OAuth, OIDC, DID/VC, or SD-JWT VC. Those remain interoperability lanes.
@@ -390,6 +467,14 @@ Environment example:
390
467
 
391
468
  - [`.env.example`](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/.env.example)
392
469
 
470
+ Service environment variables:
471
+
472
+ - `XOONYA_HOST`, `XOONYA_PORT` (or `PORT`): bind address and port.
473
+ - `XOONYA_STRICT_VERIFY=1`: make every proof-bundle verification strict (only `cryptographic` results are `valid`).
474
+ - `XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL`: `true` or `false`. When `false`, or when it is unset and `RENDER` is set (hosted deployments), `POST /v1/receipts/emit`, `POST /v1/proof-bundles/build`, and the proof-center run routes reject any body containing a field matching `/private_key/i` with `400 private_key_material_not_accepted`. Sign locally with the SDK (`emitReceipt`, `buildProofBundle`) or the `xoonya` CLI and submit the signed receipt or bundle instead. Local runs without `RENDER` keep accepting private key material so the existing verifiers pass.
475
+
476
+ Request bodies are capped at 1 MiB by byte count (a larger declared `content-length` is rejected before the body is read). `OPTIONS` returns `204` with an `allow` header, `HEAD` mirrors `GET` without a body, malformed percent-encoding in a path returns `400 invalid_path_encoding`, and unexpected handler failures return a generic `500 internal_error` with the stack logged server-side only.
477
+
393
478
  ## Service Routes
394
479
 
395
480
  Primary proof-model routes:
@@ -645,6 +730,7 @@ Local verification commands:
645
730
  - `npm run verify:examples`
646
731
  - `npm run verify:service`
647
732
  - `npm run verify:tooling`
733
+ - `npm run verify:forgery-resistance`
648
734
  - `npm run verify:all`
649
735
 
650
736
  The current verification covers:
@@ -659,6 +745,26 @@ The current verification covers:
659
745
  - published adversarial vectors
660
746
  - package quickstart flow
661
747
  - service routes for both the primary proof model and the legacy compatibility layer
748
+ - forgery resistance: key substitution with and without a trust root, strict-mode rejection of digest and structural results, hybrid PQ tampering and wrong-pin rejection, and result determinism
749
+
750
+ ### Verification Classes
751
+
752
+ `verifyProofBundle(bundle, options)` and `POST /v1/proof-bundles/verify` (`{ "bundle": ..., "options": ... }`) return `verification_class`, `cryptographically_verified`, `strict`, and `trust_root_applied` next to `valid`:
753
+
754
+ | `verification_class` | Methods | `cryptographically_verified` | Strict mode |
755
+ | --- | --- | --- | --- |
756
+ | `cryptographic` | `xoonya-native-signed-v1`, `xoonya-native-hybrid-v1` | `true` when valid | accepted |
757
+ | `digest` | `xoonya-native-sha256-v1`, `legacy-opreturn-v1` | `false` | rejected: `digest_only_not_cryptographically_verified` |
758
+ | `anchored_binding` | `xoonya-native-anchored-v1` | `false` | rejected: `digest_only_not_cryptographically_verified` |
759
+ | `structural` | `detached-assertion-v1`, `jwt-assertion-v1`, `did-vc-v1`, `sd-jwt-vc-v1`, `signed-envelope-v1`, `partner-proof-envelope-v1` | `false` | rejected: `external_verification_required` |
760
+
761
+ Default `valid` semantics are unchanged. Options:
762
+
763
+ - `strict: true` (or env `XOONYA_STRICT_VERIFY=1`): only `cryptographic` results are `valid`.
764
+ - `expected_public_key_ref`, `expected_classical_public_key_ref`, `expected_pq_public_key_ref`, `expected_hybrid_public_key_ref`: pin the exact key refs a native proof must carry.
765
+ - `trusted_public_key_refs`: `{ "<identity_ref>": "<ref>" | ["<ref>", ...] | { "classical": ..., "pq": ..., "hybrid": ... } }`. Native signed proofs fail with `native_public_key_not_trusted` and native hybrid proofs with `native_hybrid_public_key_not_trusted` when the signing key is not pinned for that identity. Any trust-root option sets `trust_root_applied: true` and fails closed for identities that are not listed.
766
+
767
+ Without a trust root, a native signed proof only proves that the carried key signed the receipt; `identity_ref` and `agent_identity` are not bound to that key by xoonya. `npm run verify:forgery-resistance` pins this behavior.
662
768
 
663
769
  Public conformance command:
664
770
 
@@ -730,4 +836,4 @@ The proof-side readiness layer now also makes promotion posture explicit without
730
836
  - production-default-ready means certification, maturity, bundled posture, and selection posture all line up
731
837
  - blockers are returned as data instead of being left implicit
732
838
  - promotion workflow summaries now show the next proof-side transition and the current recommendation without introducing approval state
733
-
839
+
package/RELEASE_NOTES.md CHANGED
@@ -1,15 +1,18 @@
1
- `xoonya` 3.0.1 is the synchronized stability patch for the live proof, verification, continuity, governance, replay, and public first-contact line.
1
+ ## 3.1.1
2
2
 
3
- This release keeps the public proof line synchronized after the major cut by preserving the same frozen proof truth models, widened finish-line scope, and naxytra public contract, proof, release, and gate surfaces while tightening the installable package experience for outside agents and builders.
3
+ `xoonya` 3.1.1 is the verification-honesty and service-hardening patch on the synchronized control-plane and evidence-line release for the live proof, verification, continuity, governance, replay, and public first-contact line.
4
+
5
+ This release keeps every frozen proof truth model, public contract, proof, release, and gate surface intact while making verify results say exactly what was checked, letting verifiers pin identities to keys, and hardening the HTTP service against oversized bodies, malformed paths, leaked error details, and private key material submitted over the wire.
4
6
 
5
7
  Highlights:
6
8
 
7
- - keeps `/v1/proof-truth` and `/v1/proof-truth/summary` as the named proof object boundary
8
- - keeps `/v1/default-path` and `/v1/default-path/summary` as the named proof-side multi-surface entry boundary
9
- - keeps `/v1/followthrough-truth` and `/v1/followthrough-truth/summary` as the named bridge, governance, portability, and verification claim boundary
10
- - keeps verification services, trust-portability surfaces, governance/dispute visibility, and reference-implementation posture aligned with the same synchronized public release line
11
- - promotes bounded native hybrid live verification for registered runtime-supported vector-covered suites instead of leaving PQ/hybrid as a design-only posture
12
- - preserves XNYA-compatible conformance, native reference implementation boundaries, external proof import boundaries, deterministic replay posture, and proof-side governance as one discoverable proof stack inside the final major line
9
+ - adds `verification_class` (`cryptographic`, `digest`, `anchored_binding`, `structural`), `cryptographically_verified`, `strict`, and `trust_root_applied` to every `verifyProofBundle` and `POST /v1/proof-bundles/verify` result without changing default `valid` semantics
10
+ - adds strict verification (`options.strict`, `XOONYA_STRICT_VERIFY=1`) with the deterministic rejection codes `digest_only_not_cryptographically_verified` and `external_verification_required`
11
+ - adds verifier-supplied trust roots (`trusted_public_key_refs`, `expected_public_key_ref`, `expected_pq_public_key_ref`, and related lane pins) with the deterministic rejection codes `native_public_key_not_trusted` and `native_hybrid_public_key_not_trusted`, and documents that native `public_key_ref` is self-bound to the carried key while identity binding requires a trust root
12
+ - caches the native hybrid runtime-support probe per suite pair so sign and verify no longer regenerate classical and PQ key pairs on every call
13
+ - hardens `server.js`: byte-counted 1 MiB body limit with a `content-length` precheck, `OPTIONS` and `HEAD` handling, `400 invalid_path_encoding` for malformed percent-encoding, generic `500 internal_error` with server-side stack logging, request and header timeouts, `x-content-type-options: nosniff`, `cache-control: no-store` on non-GET responses, and `uncaughtException` / `unhandledRejection` handlers
14
+ - adds `XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL`; when `false`, or unset on Render, emit, build, and proof-center run routes reject bodies carrying `/private_key/i` fields with `400 private_key_material_not_accepted` and point to local SDK/CLI signing
15
+ - adds `npm run verify:forgery-resistance` (key substitution with and without a trust root, strict-mode rejection of digest and structural results, hybrid PQ tampering and wrong-pin rejection, result determinism) to `verify:all`, plus strict-mode, hardening, and private-key-policy checks in `verify:service`
16
+ - marks the `dilithium`, `falcon`, and `sphincs-plus` registry entries as `deprecated_placeholder` aliases pointing at the implemented `ml-dsa-65` and `slh-dsa-sha2-128f` suites, and labels native identity prefixes `05`-`07` as legacy placeholders
13
17
  - keeps `RELEASE_NOTES.md` scoped to the current release so npm and GitHub release notes stay clean
14
18
  - keeps the canonical `https://naxytra.com/xoonya` public product URL and single naxytra website positioning intact
15
- - verifies the release candidate, full package verifier, umbrella pre-deploy gates, and clean-consumer release smoke before the synchronized stability patch
@@ -50,6 +50,15 @@ Primary proof-model routes:
50
50
  - `GET /v1/shared-signals/summary`
51
51
  - `GET /v1/feature-control`
52
52
  - `GET /v1/feature-control/summary`
53
+ - `GET /v1/adapter-certification`
54
+ - `GET /v1/adapter-certification/summary`
55
+ - `GET /v1/adapter-certification/:front_id`
56
+ - `GET /v1/trust-portability-boundary`
57
+ - `GET /v1/trust-portability-boundary/summary`
58
+ - `GET /v1/trust-portability-boundary/:axis_id`
59
+ - `GET /v1/signed-audit-provenance`
60
+ - `GET /v1/signed-audit-provenance/summary`
61
+ - `GET /v1/signed-audit-provenance/:surface_id`
53
62
  - `GET /v1/integrations`
54
63
  - `GET /v1/integrations/summary`
55
64
  - `GET /v1/integrations/snapshot`
@@ -161,6 +170,9 @@ Interop note:
161
170
  - `GET /v1/artifact-distribution` exposes OCI-style artifact distribution posture for proof bundles, handoff bundles, snapshots, and release artifacts
162
171
  - `GET /v1/shared-signals` exposes OpenID Shared Signals and CAEP-aligned review, bridge, import, and trust event exchange posture
163
172
  - `GET /v1/feature-control` exposes OpenFeature/OFREP-aligned rollout and review portability posture around role freeze, bridge, trust, and release gates
173
+ - `GET /v1/adapter-certification` exposes the front-specific adapter certification contract and its machine-readable compatibility states
174
+ - `GET /v1/trust-portability-boundary` exposes the bounded trust portability contract for identity, delegation, delivery, and settlement-linked followthrough
175
+ - `GET /v1/signed-audit-provenance` exposes the signed audit and provenance surface map for selected evidence-bearing proof and release lanes
164
176
 
165
177
  ## Final-Loop Verification
166
178
 
package/START_HERE.md CHANGED
@@ -6,6 +6,12 @@ The phase program is now complete, so this file is the right starting point for
6
6
 
7
7
  The product-side implementation, proof posture, and bounded hybrid verification work for the widened `3.0.0` finish line are now complete. The remaining step is the synchronized public `3.0.0` release cut, publish, deploy, and verification sequence documented in [NAXYTRA_3_0_0_RELEASE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/release/NAXYTRA_3_0_0_RELEASE_CONTRACT.md) and [PUBLISH_PLAN.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/PUBLISH_PLAN.md).
8
8
 
9
+ If you are arriving from the broader public discovery layer, the canonical entry points are:
10
+
11
+ - https://www.naxytra.com/agents
12
+ - https://www.naxytra.com/v1/agent-discovery-index
13
+ - https://www.naxytra.com/.well-known/agent.json
14
+
9
15
  ## 1. Understand The Role
10
16
 
11
17
  `xoonya` is the proof-side half of the public stack.
@@ -100,6 +106,9 @@ For long-term product understanding, read:
100
106
  - `GET /v1/artifact-distribution`
101
107
  - `GET /v1/shared-signals`
102
108
  - `GET /v1/feature-control`
109
+ - `GET /v1/adapter-certification`
110
+ - `GET /v1/trust-portability-boundary`
111
+ - `GET /v1/signed-audit-provenance`
103
112
  - `GET /v1/major-rails`
104
113
  - `GET /v1/treasury`
105
114
  - `GET /v1/erc8004`
@@ -204,7 +204,9 @@ It is not the final signed native standard by itself.
204
204
 
205
205
  Implemented.
206
206
 
207
- This adds a native signature envelope with explicit identity and key binding. The format declares its signature suite instead of hardcoding one global algorithm.
207
+ This adds a native signature envelope whose `public_key_ref` is self-bound to the public key material carried inside the proof (`public_key_ref == sha256(SPKI DER)` of that same key), and whose signature covers the receipt signing material, event commitment, `identity_ref`, and `public_key_ref`. The format declares its signature suite instead of hardcoding one global algorithm.
208
+
209
+ The verifier checks key self-binding and the signature, not identity ownership. `identity_ref` and `agent_identity` are free strings: any key can sign a proof that claims any identity, and that proof self-verifies. Identity binding therefore requires a trust root supplied by the verifier (`trusted_public_key_refs` or `expected_public_key_ref`, see "Verification Classes, Strict Mode, And Trust Roots" below). Without a trust root the result is `cryptographically_verified: true` with `trust_root_applied: false`, which means "this key signed this receipt", not "this identity signed this receipt".
208
210
 
209
211
  Required signed-native fields:
210
212
 
@@ -220,14 +222,19 @@ Implemented suites:
220
222
  - `secp256k1`
221
223
  - `p256`
222
224
 
223
- Declared suite registry entries:
225
+ Implemented PQ suites (usable only inside `xoonya-native-hybrid-v1`):
226
+
227
+ - `ml-dsa-65` (FIPS 204)
228
+ - `slh-dsa-sha2-128f` (FIPS 205)
224
229
 
225
- - `webauthn-cose`
226
- - `dilithium`
227
- - `falcon`
228
- - `sphincs-plus`
230
+ Declared suite registry entries that never verify:
229
231
 
230
- The atom commits to proof material; it does not validate these suites directly. Only suites with implemented validators should be described as verified.
232
+ - `webauthn-cose` (`maturity: planned`)
233
+ - `dilithium` (`status: deprecated_placeholder`, `deprecated_alias_of: ml-dsa-65`)
234
+ - `falcon` (`status: deprecated_placeholder`, no registered successor yet)
235
+ - `sphincs-plus` (`status: deprecated_placeholder`, `deprecated_alias_of: slh-dsa-sha2-128f`)
236
+
237
+ The three `deprecated_placeholder` entries are legacy pre-standard names kept only so existing registry consumers keep resolving them; new material must use the ML-DSA/SLH-DSA identifiers. The atom commits to proof material; it does not validate these suites directly. Only suites with implemented validators should be described as verified.
231
238
 
232
239
  ### `xoonya-native-anchored-v1`
233
240
 
@@ -353,8 +360,44 @@ Current adversarial expectations include:
353
360
  - tampered PQ signature rejects as `native_hybrid_pq_signature_invalid`
354
361
  - key-binding mismatches reject as `native_hybrid_public_key_ref_mismatch`
355
362
  - downgrade attempts through external assertion methods reject as `signature_method_mismatch`
363
+ - a valid dual signature from keys the verifier has not pinned for that `identity_ref` rejects as `native_hybrid_public_key_not_trusted` when a trust root is supplied
364
+
365
+ This keeps the boundary honest: xoonya now verifies the hybrid lane where the runtime and vectors are real, and refuses to overclaim beyond that runtime-supported registry. The runtime-support probe for each suite pair runs once per process and is cached afterwards.
366
+
367
+ ## Verification Classes, Strict Mode, And Trust Roots
368
+
369
+ Every result from `verifyProofBundle(bundle, options)` and `POST /v1/proof-bundles/verify` carries four extra fields:
370
+
371
+ - `verification_class`: one of `cryptographic`, `digest`, `anchored_binding`, `structural`
372
+ - `cryptographically_verified`: `true` only when a native signature was actually checked and the result is valid
373
+ - `strict`: whether strict mode was active for that call
374
+ - `trust_root_applied`: whether a verifier-supplied trust root constrained the accepted keys
375
+
376
+ Classes by method:
377
+
378
+ | Class | Methods | What was checked |
379
+ | --- | --- | --- |
380
+ | `cryptographic` | `xoonya-native-signed-v1`, `xoonya-native-hybrid-v1` | key self-binding plus a real classical and/or PQ signature over the signing material |
381
+ | `digest` | `xoonya-native-sha256-v1`, `legacy-opreturn-v1` | an unkeyed deterministic digest; anyone can reproduce it, so it proves integrity and replayability, not authorship |
382
+ | `anchored_binding` | `xoonya-native-anchored-v1` | an unkeyed digest binding to declared anchor refs; anchor truth and authorship stay external |
383
+ | `structural` | `detached-assertion-v1`, `jwt-assertion-v1`, `did-vc-v1`, `sd-jwt-vc-v1`, `signed-envelope-v1`, `partner-proof-envelope-v1` | envelope shape, method registration, and canonical receipt binding only; the external signature must be verified by the external stack |
384
+
385
+ `valid` keeps its historical meaning by default: a well-formed digest, anchored, or structural bundle is still `valid: true`, it just also says `cryptographically_verified: false`.
386
+
387
+ Strict mode (`options.strict === true`, or `XOONYA_STRICT_VERIFY=1` in the environment) only accepts the `cryptographic` class. Deterministic rejection codes:
388
+
389
+ - `digest_only_not_cryptographically_verified` for `digest` and `anchored_binding` results
390
+ - `external_verification_required` for `structural` results
391
+
392
+ Trust roots pin which keys may speak for an identity. Options:
393
+
394
+ - `expected_public_key_ref`: the proof's `public_key_ref` (native signed) or classical/hybrid ref (native hybrid) must equal this value
395
+ - `expected_classical_public_key_ref`, `expected_pq_public_key_ref`, `expected_hybrid_public_key_ref`: lane-specific pins for hybrid proofs
396
+ - `trusted_public_key_refs`: object keyed by `identity_ref` (falling back to `agent_identity`). Values are a ref string, an array of ref strings, or `{ classical, pq, hybrid }` where each lane is a string or array. A string or array pins the classical lane; use the object form to pin the PQ lane of a hybrid proof.
397
+
398
+ When any trust-root option is present, `trust_root_applied` is `true` and native verification fails closed: an identity missing from the map, a lane that cannot be satisfied by the proof (for example a PQ pin against a classical-only proof), or any ref outside the pinned set rejects with `native_public_key_not_trusted` (native signed) or `native_hybrid_public_key_not_trusted` (native hybrid). These checks run after the signature check, so a trust-root rejection always means "valid signature, untrusted key". Digest, anchored, and structural methods carry no key and are unaffected by trust roots; use strict mode to reject them.
356
399
 
357
- This keeps the boundary honest: xoonya now verifies the hybrid lane where the runtime and vectors are real, and refuses to overclaim beyond that runtime-supported registry.
400
+ The `scripts/verify_forgery_resistance.js` verifier (`npm run verify:forgery-resistance`) pins this behavior, including the documented key-substitution limitation without a trust root.
358
401
 
359
402
  ## Crypto And Identity Support Boundary
360
403
 
@@ -368,7 +411,7 @@ Cleanly supported above the atom:
368
411
  - DID and DIDComm identity references
369
412
  - JWT/JWS and signed envelope assertions
370
413
  - DID/VC and SD-JWT VC evidence references
371
- - Dilithium, Falcon, SPHINCS+, and future PQ signature public-key material
414
+ - ML-DSA (FIPS 204), SLH-DSA (FIPS 205), and future PQ signature public-key material; the legacy `dilithium`, `falcon`, and `sphincs-plus` registry names are deprecated placeholders that never verify
372
415
  - HPKE, TLS, AES-GCM, or encrypted payload commitments
373
416
  - ZK proof, circuit, verifier-key, and public-input commitments
374
417
 
package/index.js CHANGED
@@ -5,9 +5,18 @@ module.exports = {
5
5
  ...require("./integrations/registry"),
6
6
  ...require("./lib/verification_service_pack"),
7
7
  ...require("./lib/trust_portability_pack"),
8
- ...require("./lib/proof_truth_contract"),
9
- ...require("./lib/default_path_contract"),
10
- ...require("./lib/followthrough_truth_contract"),
8
+ ...require("./lib/proof_truth_contract"),
9
+ ...require("./lib/operational_receipt_contract"),
10
+ ...require("./lib/machine_identity_registry_contract"),
11
+ ...require("./lib/crypto_agility_matrix"),
12
+ ...require("./lib/authority_binding_lifecycle_contract"),
13
+ ...require("./lib/public_surface_policy_contract"),
14
+ ...require("./lib/offline_verifiability_recovery_contract"),
15
+ ...require("./lib/adapter_certification_contract"),
16
+ ...require("./lib/trust_portability_boundary_contract"),
17
+ ...require("./lib/signed_audit_provenance_contract"),
18
+ ...require("./lib/default_path_contract"),
19
+ ...require("./lib/followthrough_truth_contract"),
11
20
  ...require("./lib/governance_disputes_summary"),
12
21
  ...require("./lib/release_pack"),
13
22
  ...require("./lib/release_manifest"),
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ const packageJson = require("../package.json");
4
+
5
+ function buildAdapterCertificationContractPack() {
6
+ return {
7
+ ok: true,
8
+ product: packageJson.name,
9
+ category: "naxytra-adapter-certification-contract",
10
+ pack_version: "naxytra-adapter-certification-contract-v1",
11
+ doctrine: "xoonya_certifies_adapter_compatibility_for_proof_and_review_surfaces_without_leaking_proof_core_semantics",
12
+ model_state: "core_now",
13
+ core_claim: "adapter certification is the machine-readable gate for manifest, capability, health, idempotency, failure, proof, and front-specific compatibility claims",
14
+ certification_states: [
15
+ { state: "pass", description: "the adapter satisfies the declared front contract without material constraints" },
16
+ { state: "pass_with_constraints", description: "the adapter is usable but only within declared constraints" },
17
+ { state: "needs_retest", description: "the adapter needs a fresh run against updated vectors or interface versions" },
18
+ { state: "blocked", description: "the adapter cannot be certified until a required dependency or vector exists" },
19
+ { state: "fail", description: "the adapter does not satisfy the declared front contract" }
20
+ ],
21
+ certification_fronts: [
22
+ { front_id: "protocol_front", required_tests: ["protocol negotiation", "surface discovery", "normalized request translation"], required_evidence: ["manifest", "protocol compatibility result", "failure mapping result"], claim_boundary: "only_claim_listed_protocol_front_compatibility" },
23
+ { front_id: "execution_front", required_tests: ["task dispatch", "idempotency", "execution result normalization"], required_evidence: ["manifest", "task vector results", "proof-compatible output facts"], claim_boundary: "only_claim_listed_execution_front_compatibility" },
24
+ { front_id: "payment_front", required_tests: ["quote to pay compatibility", "payment admission", "reversal or refund posture"], required_evidence: ["payment state result", "receipt compatibility result", "failure mapping result"], claim_boundary: "only_claim_listed_payment_front_compatibility" },
25
+ { front_id: "settlement_front", required_tests: ["settlement target translation", "finality reference capture", "batch or direct settlement posture"], required_evidence: ["settlement reference", "finality state", "reconciliation evidence"], claim_boundary: "only_claim_listed_settlement_front_compatibility" },
26
+ { front_id: "identity_trust_front", required_tests: ["identity schema compatibility", "registry linkage", "attestation or trust-state roundtrip"], required_evidence: ["identity record", "registry proof", "trust-state result"], claim_boundary: "only_claim_listed_identity_trust_front_compatibility" },
27
+ { front_id: "proof_front", required_tests: ["receipt compatibility", "proof import or export compatibility", "verification hook compatibility"], required_evidence: ["proof contract result", "receipt result", "verification evidence"], claim_boundary: "only_claim_listed_proof_front_compatibility" },
28
+ { front_id: "treasury_front", required_tests: ["destination routing", "balance model compatibility", "payout landing compatibility"], required_evidence: ["treasury route result", "account abstraction result", "operator review note"], claim_boundary: "only_claim_listed_treasury_front_compatibility" },
29
+ { front_id: "operator_front", required_tests: ["review surface visibility", "promotion posture", "reporting export compatibility"], required_evidence: ["review summary", "promotion readiness result", "operator export"], claim_boundary: "only_claim_listed_operator_front_compatibility" }
30
+ ],
31
+ harness_requirements: {
32
+ test_categories: [
33
+ "manifest_validity",
34
+ "interface_conformance",
35
+ "capability_declaration",
36
+ "health_reporting",
37
+ "failure_mapping",
38
+ "idempotency_behavior",
39
+ "proof_compatibility",
40
+ "front_specific_lifecycle_compatibility"
41
+ ],
42
+ required_result_fields: [
43
+ "certification_state",
44
+ "interface_version",
45
+ "tested_fronts",
46
+ "tested_capabilities",
47
+ "failed_cases",
48
+ "warnings",
49
+ "evidence_refs"
50
+ ]
51
+ },
52
+ linked_surfaces: {
53
+ proof_bridge_ref: "/v1/proof-bridge",
54
+ verification_services_ref: "/v1/proof-center/verification-services",
55
+ submission_bundle_review_ref: "/v1/proof-center/result-package-handoff/review/summary",
56
+ trust_portability_ref: "/v1/proof-center/trust-portability/summary",
57
+ integration_matrix_ref: "/v1/integration-matrix",
58
+ provenance_ref: "/v1/provenance"
59
+ },
60
+ claim_boundary: "claim_adapter_certification_as_front_specific_compatibility_and_review_gate_without_claiming_vendor_default_or_proof_core_truth"
61
+ };
62
+ }
63
+
64
+ function summarizeAdapterCertificationContractPack() {
65
+ const pack = buildAdapterCertificationContractPack();
66
+ return {
67
+ ok: true,
68
+ product: pack.product,
69
+ category: pack.category,
70
+ summary_version: "naxytra-adapter-certification-contract-summary-v1",
71
+ pack_version: pack.pack_version,
72
+ model_state: pack.model_state,
73
+ certification_state_count: pack.certification_states.length,
74
+ certification_front_count: pack.certification_fronts.length,
75
+ required_test_category_count: pack.harness_requirements.test_categories.length,
76
+ linked_surfaces: pack.linked_surfaces
77
+ };
78
+ }
79
+
80
+ function getAdapterCertificationFrontDetail(frontId) {
81
+ const normalized = String(frontId || "").trim().toLowerCase();
82
+ return (buildAdapterCertificationContractPack().certification_fronts || []).find((entry) => entry.front_id === normalized) || null;
83
+ }
84
+
85
+ module.exports = {
86
+ buildAdapterCertificationContractPack,
87
+ summarizeAdapterCertificationContractPack,
88
+ getAdapterCertificationFrontDetail
89
+ };
90
+