Task — engineering-spec@1

"OBS chain-of-custody manifest: Ed25519 sign + verify CLI"

doneTASK-OBS-009
module obs · class product · priority p0 · created 2026-05-15 · shipped null
depends on TASK-OBS-008 · blocks none

TASK-OBS-009: Chain-of-custody manifest — Ed25519 sign + offline verifier

Summary

Every compliance export MUST carry a chain-of-custody Manifest signed with Ed25519 over deterministic signable_bytes, plus a SHA-256 of the canonical row bytes. As-built code lives in manifest.rs, manifest_signing.rs, and the standalone bin/verify_manifest.rs CLI. This batch adds services/obs-compliance-view/docs/manifest-format.md as the auditor-facing field reference.

Problem

The prior engineering-spec claimed manifest_pdf.rs, per-view export hooks under views/{eu_ai_act,...}.rs, CDN auto-fetch in the verifier, zip sidecars, and standalone tests/manifest_* files. The live crate ships pure manifest types + signing + a hex-pubkey CLI with inline tests in manifest_signing.rs. docs/manifest-format.md was never authored. FM-004 blocked re-entry (task@1 + ## §N).

Proposed Solution

Adopt the as-built manifest stack:

Alternatives Considered

Success Metrics

Scope

In scope (as-built + this batch doc):

Out of scope / Non-Goals

Dependencies

depends_on: [TASK-OBS-008] (compliance view crate and row shape). Soft: TASK-AUTH-006 infra signing-key rotation; manifest-format doc references DEC-180 field list.

1. Description (normative)

Acceptance criteria

Verification

cd services && cargo test -p cyberos-obs-compliance-view manifest_signing::
cd services && cargo test -p cyberos-obs-compliance-view manifest::
cargo build -p cyberos-obs-compliance-view --bin verify_manifest
PathCovers
src/manifest.rs testsSignable bytes + row hash determinism
src/manifest_signing.rs testsDEC-180 sign/verify + DEC-182 incomplete
src/bin/verify_manifest.rsDEC-183 offline CLI
docs/manifest-format.mdAuditor-facing field reference

AI Authorship Disclosure


batch/9b-obs adopt — TASK-OBS-009 re-spec against as-built manifest stack.