{
  "schema_version": 1,
  "review": "Task26 provenance/context",
  "verdict": "FAIL",
  "verdict_scope": "Local, read-only provenance audit. No release, activation, delivery, commit, push, or profile mutation was performed by this reviewer.",
  "candidate": {
    "manifest_path": ".omo/evidence/dualcoach-candidate-manifest.json",
    "manifest_sha256": "e9bc7dff8060425aa001f6a4501107bb9685be9248a7753f0969f89c2cf5d5c8",
    "declared_digest": "c160085a64454c23f789464170b299543324c743a489bac68ed5430fab42d291",
    "base_head": "0dc0f228dcec8fa54430882daf72e901d6a89f79",
    "declared_leaf_count": 167,
    "current_leaf_mismatch_count": 25,
    "declared_status": {
      "entries": 986,
      "bytes": 45705,
      "sha256": "d665852c4110f3d63d240fa015428a404f30ec0f62c8e5a392373e7197f9329a"
    },
    "observed_status": {
      "entries": 186,
      "bytes": 9516,
      "sha256": "805aea6f8129c8826e8bf0dc4c70befcfdd112b2d381ba5a78d1030b89df4f87"
    },
    "independent_verifier": ".omo/evidence/verify-dualcoach-candidate.py",
    "independent_verifier_result": "FAIL: candidate leaf mismatch at gateway/platforms/nutrition_coaching.py"
  },
  "findings": [
    {
      "severity": "critical",
      "code": "CURRENT_CANDIDATE_NOT_MANIFEST_BOUND",
      "evidence": [
        ".omo/evidence/dualcoach-candidate-manifest.json",
        ".omo/evidence/verify-dualcoach-candidate.py",
        "/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py",
        "/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram.py",
        "/home/cube/projects/richard/hermes-agent/gateway/platforms/rehearsal_reset.py"
      ],
      "detail": "The declared c160 candidate cannot be recomputed from the current local worktree. Twenty-five of 167 declared leaves differ and the exact NUL-delimited Git status snapshot differs."
    },
    {
      "severity": "high",
      "code": "TASK24_TASK25_NOT_BOUND_TO_CURRENT_CANDIDATE",
      "evidence": [
        ".omo/evidence/dualcoach-task-24-evidence.json",
        ".omo/evidence/dualcoach-task-24-live-terminal-evidence.json",
        ".omo/evidence/dualcoach-task-25-evidence.json",
        ".omo/evidence/dualcoach-task-25-live-terminal-evidence.json"
      ],
      "detail": "Task24 contains no aggregate candidate digest and two of its three declared source hashes differ from current files; Task25 contains no candidate digest. These receipts therefore cannot establish the plan-required exact-candidate binding."
    },
    {
      "severity": "high",
      "code": "HANDOFF_TODO_STALE",
      "evidence": [
        ".omo/start-work/dualcoach-production-readiness-handoff.md:8-11",
        ".omo/plans/dualcoach-production-readiness.md:1027-1059",
        ".omo/start-work/ledger.jsonl:85",
        ".omo/boulder.json"
      ],
      "detail": "The handoff says Task23 is next and 22/32 are complete, while the plan marks Tasks23-25 complete and the ledger names Task26 next. Boulder points at the active plan but does not repair the stale handoff."
    }
  ],
  "verified_subchains": {
    "ledger_jsonl": "PASS: 85 lines parsed as JSON objects",
    "task_evidence_indexes": "PASS: 14 referenced Task22-25 artifacts exist with matching raw SHA-256 and declared modes",
    "task24_terminal_preservation": "PASS: Task25 archive contains the Task24 delivery ledger; its digest matches Task24 terminal evidence",
    "task25_archive": "PASS: local verify_rehearsal_archive returned valid for archive 2009ac177177839cefddb98f285e27fa, digest 644d74b05bc8115f9e3aeeba035188da195a7de18f1bc737648931d64bf43bcf, scope count 23",
    "task25_current_cleanup": "PASS: disabled config, empty registry and jobs, no live delivery ledger or lock, inactive/dead service, and no profile-bound process",
    "other_profile_drift": "PASS: current tree digest matches Task25 seal 6bb3710ada54b6b859f2069ab1efc093b82da6ed5592d7a0d8f8e92beff52f42",
    "migration_session_receipt": "PASS as historical chain: archived owner-v1 journal seal and pre-approval pins validate; current freeze seal binds c160 manifest",
    "local_non_actions": "PASS for observable local state: HEAD equals declared base and has zero commits after it; Task23-25 receipts record zero commits, pushes, releases, and real-customer impact"
  },
  "provenance_graph": {
    "declared_candidate": "manifest(c160) -> freeze receipt(c160)",
    "historical_migration": "archived owner-v1 journal -> pre-approval freeze(old historical candidate) -> current freeze(c160)",
    "task24": "Task24 evidence index -> terminal evidence -> Task25 archive delivery record",
    "task25": "Task25 evidence index -> terminal cleanup evidence -> verified archive and current disabled baseline",
    "break": "current worktree and Task24/Task25 receipts are not bound to manifest(c160)"
  },
  "required_remediation": "After the worktree is intentionally frozen, regenerate a canonical manifest and digest, bind every Task23-25 and Task26 reviewer receipt to it, rerun affected gates, and reconcile the handoff with plan, Boulder, and ledger before another release review.",
  "redaction": "No customer text, model output, credentials, identifiers, or raw profile payloads are included.",
  "mode_required": "0600"
}
