Status: ESCALATED-WITH-FORK (orchestrator decision required).
Source finding: R6 R1 L2 lens finding L2-R6-MAJOR-2 —
"Compromise #30 claims 'v1-beta ships PQ-hybrid by default for
signature' but ZERO application-layer signing sites use the hybrid
SignatureSuite (operator-misleading disclosure)."
Author: R6 R1 fp-b implementer (this branch =
phase-4-meta-core/r6-r1-fp-b-crypto-security).
Date: 2026-05-24.
Compromise #30 narrative-vs-reality gap: PQ-hybrid SignatureSuite is
LANDED in benten-crypto-suite (G-CORE-2 commit ae69c339) +
conformance-tested, but 3 application-layer signing sites still
classical-only Ed25519 at HEAD:
crates/benten-drop/src/envelope_sig.rs::sign_envelope(DropBundle envelope-sig; viaKeypair::sign→ 64-byte Ed25519)crates/benten-platform-foundation/src/plugin_manifest.rs::verify_peer_signature(plugin manifest peer-signature; 64-byte Ed25519 viaed25519_dalek::Signature::from_bytes)crates/benten-platform-foundation/src/plugin_manifest.rs::InstallRecord::verify_user_signature(install-record user-signature; same shape)
(A fourth site — AuthorizationGrant.binding_sig — IS already
disclosed as classical-only at V1-FROZEN-INTERFACE-DEFERRED.md Row
D-15e.)
The brief's escalation criterion: "wire-format-changing OR new envelope versions OR signature size change cascade" ⇒ HARD-ESCALATE.
All three trigger:
- Signature size change.
ed25519_dalek::Signature= 64 bytes fixed.HybridSignature(Ed25519⊕ML-DSA-65, concatenated + commitment): roughly 64 + ~3293 + commitment = ~3357+ bytes. The on-wire envelope-sig / peer-signature / user-signature fields are currently sized + serialized asVec<u8>but every consumer parses them as 64-byte Ed25519 viatry_into::<[u8;32]>orSignature::from_bytes. Every type-conversion site rejects non-64-byte sigs at the validator boundary. - Wire-format change cascade. DropBundle + PluginManifest +
InstallRecord all carry these sig fields in their CBOR canonical
bytes — they have hex-pinned wire-format tests
(
tf3f_drop_*.rs,plugin_manifest_*.rs,tf7_install_record_*.rs). Updating signature shape MUTATES canonical bytes ⇒ canonical CIDs ⇒ every fixture-cited CID in the workspace becomes stale. - Envelope-version bump cascade. Each envelope (DropBundleVersion + PluginManifest serde-tag + InstallRecord) would need a v1 → v2 bump to discriminate classical-sig vs hybrid-sig at decode time; this couples to the freeze-discipline at G-CORE-9 + the V1-WIRE-FORMAT-INVENTORY.md / V1-FROZEN-INTERFACE.md narrative.
Per the L2 lens itself the recommended disposition is DEFER-NAMED-NOW + retense Compromise #30 disclosure narrative (option-a in the L2 JSON):
"(a) DEFER-NAMED-NOW (recommended; HARD RULE 12 clause-(b)) — add THREE sister-rows to V1-FROZEN-INTERFACE-DEFERRED.md Row D-15e (D-15e-1 DropBundle.envelope_sig + D-15e-2 PluginManifest.peer_signature
- D-15e-3 InstallRecord.user_signature) AND retense Compromise #30's lines 2215-2218..."
LOC budget for option (a): ~30-40 LOC of doc + 3 new deferred rows. LOC budget for option (b) wire-now-with-wire-change: realistic estimate
1500 LOC across crypto-suite + drop + platform-foundation + every serialization test + public-api baselines + V1-WIRE-FORMAT-INVENTORY + V1-FROZEN-INTERFACE + SECURITY-POSTURE + cross-language ErrorCode mirror potentially — and would block on resolving the envelope-version bump strategy on three independent envelopes which is itself a P-III Ben decision-point.
(a) PATH-A: wire-now-with-wire-change. Promote 3 app-layer sites
to use SignatureSuite + HybridSignature at v1-beta. Bump DropBundle
- PluginManifest + InstallRecord envelope versions to discriminate v1 (classical) vs v2 (hybrid) at decode. Regenerate every wire-format pin
- every fixture-cited CID. OUT-OF-SCOPE for R6 fix-pass per the brief's escalation criterion; this is a multi-wave initiative that couples to the V1-FROZEN-INTERFACE freeze contract (G-CORE-9 was intended to LOCK these envelopes at v1-beta, not mutate them post-freeze).
(b) PATH-B: doc-honesty-defer-to-G-COMP-1 (L2 lens recommendation).
3 new sister-rows under Row D-15e at
docs/V1-FROZEN-INTERFACE-DEFERRED.md:
- D-15e-1 — DropBundle.envelope_sig (classical-only at v1-beta)
- D-15e-2 — PluginManifest.peer_signature (classical-only at v1-beta)
- D-15e-3 — InstallRecord.user_signature (classical-only at v1-beta)
Plus retense Compromise #30 narrative at SECURITY-POSTURE.md lines ~2215-2218 to make the producer-side / app-layer split explicit:
- producer-side at the SUITE layer: hybrid IS the v1-beta default
- consumer-side at the APP LAYER: 4 named sites (the binding_sig + the 3 above) ride classical-only Ed25519 at v1-beta; promotion = G-COMP-1 destination
- HNDL impact: signatures only secure against the harvest-now decrypt-later quantum attacker via the encryption-half framing (#5); classical Ed25519 forgery requires breaking discrete log over the Edwards curve which is NOT PQ-vulnerable on its own; the v1-GM audit (NF-2 / C-GM-AUDIT) only certifies ml-dsa + ml-kem, so the app-layer sig path has NO PQ-audit certification at v1-beta — that is honest disclosure, not a regression.
LOC budget: ~30-40 LOC docs only; no code change; no test cascade.
- DECIDE (a) vs (b) at consolidation time. Recommended: (b).
- If (b): orchestrator-direct edits at consolidation. The 3 sister-rows + Compromise #30 retense are well below the §3.5n inline-fix threshold; bundling with this branch's other commits is trivial.
- If (a): open a new wave-brief for
phase-4-meta-core/g-comp-pq-hybrid-app-layer(or similar) outside the R6 fix-pass window; this is not R6 fix-pass shape.
- NO
SignatureSuiteintegration at any of the 3 sites. - NO wire-format change.
- NO new ErrorCode mints.
Per the FP-B brief:
- Bundle F3 — AAD
total_chunkscross-chunk-truncation defense ✅ (commitd9cdaf93). - Bundle L3-r1-1 — AuthorizationGrant scope in binding_message ✅ (commit
39dd52cf). - Bundle L2-R6-MAJOR-1 — T10-upgrade (a) wire-in to install_plugin ✅ (commit
b5a6e758). - Bundle L11 — wire-format inventory expansion (14 surfaces) — pending in this branch.
- Bundle L1 —
#[non_exhaustive]sweep — pending in this branch.
ESCALATED-WITH-FORK. Orchestrator MUST select (a) or (b) before R6 R2.