Part of #170 (Epic D, Phase 2). This is the remaining cold-verification lineage gap documented by ADR-018. It is separate from #295 / PR #298, which rejects holder-authored authority widening.
Goal
Make a Biscuit-derived A→B→C delegation chain independently verifiable across proxy process boundaries using one cryptographically verified ancestor hash domain. A holder-authored hash declaration must never become trusted ancestry merely because it is signed by the holder-controlled append key.
Verified current gap
Biscuit's official format is an append-only signature chain and carries the last private key for offline attenuation. Therefore a fact added by the holder cannot be accepted as proof of its own parent bytes without verifier recomputation.
What to build
- Select and document one canonical ancestor hash domain that a cold verifier can recompute from the received credential and trusted state.
- Prefer whole-credential/verified-accumulator bytes. If the current Biscuit library cannot expose an authenticated prefix serialization, document the limitation and use a fail-closed sidecar/index design rather than trusting a declared fact.
- Bind each immediate parent edge and every ancestor used for revocation/cascade checks.
- Define legacy-token behavior explicitly. Unsupported legacy cold verification must fail closed with a stable reason, not silently fall back to live-session assumptions.
- Accept ADR-018 and synchronize the decision index/source-backed documentation.
Acceptance criteria
Dependencies and non-goals
Primary sources
Part of #170 (Epic D, Phase 2). This is the remaining cold-verification lineage gap documented by ADR-018. It is separate from #295 / PR #298, which rejects holder-authored authority widening.
Goal
Make a Biscuit-derived A→B→C delegation chain independently verifiable across proxy process boundaries using one cryptographically verified ancestor hash domain. A holder-authored hash declaration must never become trusted ancestry merely because it is signed by the holder-controlled append key.
Verified current gap
python/vibap/biscuit_passport.py::_context_from_blocks()synthesizes lineage entries withsha256(block_source_text).sha256(whole_credential_bytes).Biscuit's official format is an append-only signature chain and carries the last private key for offline attenuation. Therefore a fact added by the holder cannot be accepted as proof of its own parent bytes without verifier recomputation.
What to build
Acceptance criteria
devfrom an isolated EXTENDED worktree with signed DCO commits and green CI.Dependencies and non-goals
devonly after that PR lands, or explicitly stack without rewriting its history.Primary sources