            "duplicate_rejected": duplicate is None,
            "capability_issue_path": "dualcoach-controller-protected-v2",
            "capability_issue_receipt_schema": capability_issue.payload["schema"],
            "background_races": background_races,
            "live_revocation_disconnect": "PASS",
            "live_revocation_network_surface": "local_http_telegram_api_v1",
            "socket_transcript_path": socket_transcript_path.relative_to(
                profile
            ).as_posix(),
            "socket_transcript_sha256": socket_transcript_sha256,
            "actual_socket": socket_transcript["actual_socket"],
            "mock_network": socket_transcript["mock_network"],
            "socket_connection_count": socket_transcript["connection_count"],
            "socket_request_count": socket_transcript["request_count"],
            "socket_request_methods": socket_transcript["methods"],
            "socket_disconnect": socket_transcript["disconnect"],
            "post_revoke_updates": socket_transcript["post_revoke_updates"],
            "server_delivered_post_revoke_updates": socket_transcript[
                "server_delivered_post_revoke_updates"
            ],
            "handler_entries": socket_transcript["handler_entries"],
            "mutations": socket_transcript["mutations"],
            "watcher_failure_deferred": socket_transcript[
                "watcher_failure_deferred"
            ],
            "server_cleanup": socket_transcript["server_cleanup"],
            "socket_cleanup": socket_transcript["socket_cleanup"],
            "server_socket_closed": socket_transcript[
                "server_socket_closed"
            ],
            "active_connections": socket_transcript["active_connections"],
            "external_traffic": socket_transcript["external_traffic"],
            "authority_watch_backend": socket_transcript["watch_backend"],
            "authority_watch_directory_resource_count": socket_transcript[
                "watch_directory_resource_count"
            ],
            "authority_watch_inotify_count": socket_transcript[
                "watch_inotify_count"
            ],
            "authority_watcher_cleanup": socket_transcript[
                "watcher_cleanup"
            ],
            "live_advisory_store": advisory_requests[0]["store"],
            "capability_identity": {
                field: successful_bindings[field]
                for field in (
                    "candidate_digest",
                    "candidate_product_binding_sha256",
                    "hermes_wheel_sha256",
                    "profile_wheel_sha256",
                    "wheel_digest",
                )
            },
            "runtime_authority_snapshot": successful_bindings[
                "runtime_authority_snapshot"
            ],
            "delivery_ledger_sha256": hashlib.sha256(
                coordinator._delivery_ledger_path().read_bytes()
            ).hexdigest(),
        },
    )

    paused = coordinator.handle_text(address, "코칭 일시중지")
    if not paused.reply.accepted:
        raise RuntimeError("pause did not commit")
    withdrawn = coordinator.withdraw_customer(address)
    if not withdrawn.reply.accepted:
        raise RuntimeError("withdraw did not commit")

    fault_seen = False
    def fault(phase: str) -> None:
        nonlocal fault_seen
        if phase == "copied_verified" and not fault_seen:
            fault_seen = True
            raise RuntimeError("source-golden-cleanup-fault")
    try:
        archive_customer_cleanup(
            profile,
            CUSTOMER,
            shared_ledger_projections=(SharedLedgerProjection.DRAFT_GENERATIONS,),
            fault_injector=fault,
        )
    except RuntimeError as exc:
        if str(exc) != "source-golden-cleanup-fault":
            raise
    receipt = resume_customer_cleanup(profile, CUSTOMER)
    inventory = post_cleanup_authority_inventory(profile, CUSTOMER)
    if receipt.phase != "committed" or not inventory.terminal:
        raise RuntimeError(f"cleanup terminal inventory unavailable: {asdict(inventory)}")
    cleanup_journal = profile / f"data/customer-cleanup/{CUSTOMER}.journal.jsonl"
    evidence_contract.record(
        "cleanup_resume_terminal",
        {
            "fault_phase": "copied_verified",
            "fault_seen": fault_seen,
            "operation_id": receipt.operation_id,
            "terminal_phase": receipt.phase,
            "journal_sha256": hashlib.sha256(cleanup_journal.read_bytes()).hexdigest(),
            "terminal": inventory.terminal,
            "active_count": inventory.active_count,
            "pending_count": inventory.pending_count,
            "unknown_count": inventory.unknown_count,
            "orphan_count": inventory.orphan_count,
        },
    )
    task26_chain_head = evidence_contract.finish()
    authority = append_candidate_authority(
        profile,
        candidate_digest=candidate_digest,
        action="qualify",
        historical_pass_digest=task26_chain_head,
        reason="same-invocation Task26 successor qualification",
    )
    for runtime_path in runtime_authority_root.rglob("*"):
        if not runtime_path.is_symlink():
            runtime_path.chmod(0o700 if runtime_path.is_dir() else 0o600)
    shutil.rmtree(runtime_authority_root)
    authority_pin_path.unlink()
    return {
        "profile": str(profile),
        "operation_id": receipt.operation_id,
        "tree_digest": provenance["tree_digest"],
        "source_tree_digest": provenance["tree_digest"],
        "candidate_digest": candidate_digest,
        "candidate_product_binding_sha256": candidate_binding["binding_sha256"],
        "hermes_wheel_sha256": cast(dict[str, object], candidate_binding["derivation_inputs"])["hermes_wheel_sha256"],
        "profile_wheel_sha256": cast(dict[str, object], candidate_binding["derivation_inputs"])["profile_wheel_sha256"],
        "runtime_mode": "source" if installed_runtime is None else "installed",
        "task26_chain_head": task26_chain_head,
        "authority_registry_head": authority["registry_head_sha256"],
        "authority_ledger_head": authority["ledger_head_sha256"],
    }

def secure_root(requested: Path | None) -> Path:
    if requested is None:
        path = Path(tempfile.mkdtemp(prefix="source-golden-path-"))
    else:
        path = requested.absolute()
        path.mkdir(mode=0o700)
    path.chmod(0o700)
    return path

def main() -> int:
    parser = argparse.ArgumentParser()
    mode = parser.add_mutually_exclusive_group()
    mode.add_argument("--source", type=Path)
    mode.add_argument("--installed-venv", type=Path)
    parser.add_argument("--installed-site-packages", type=Path)
    parser.add_argument("--profile-wheel", type=Path)
    parser.add_argument("--hermes-wheel", type=Path)
    parser.add_argument("--product-binding", type=Path)
    parser.add_argument("--evidence-root", type=Path)
    args = parser.parse_args()
    source = (args.source or DEFAULT_SOURCE).absolute()
    if source.is_symlink() or not (source / "checkin_cli/customer_cleanup.py").is_file():
        print(json.dumps({"status": "SOURCE_GOLDEN_PATH_FAIL", "blocker": "profile_source_unavailable", "path": str(source)}, sort_keys=True), file=sys.stderr)
        return 2
    root: Path | None = None
    try:
        candidate_digest, candidate_binding = load_product_binding(
            args.product_binding
        )
        installed_values = (
            args.installed_site_packages,
            args.profile_wheel,
            args.hermes_wheel,
        )
        if args.installed_venv is None and any(value is not None for value in installed_values):
            parser.error("installed wheel inputs require --installed-venv")
        if args.installed_venv is not None and any(value is None for value in installed_values):
            parser.error("installed mode requires --installed-site-packages, --profile-wheel, and --hermes-wheel")
        installed_runtime = None
        if args.installed_venv is not None:
            installed_runtime = collect_installed_runtime(
                venv=args.installed_venv,
                site_packages=cast(Path, args.installed_site_packages),
                profile_wheel=cast(Path, args.profile_wheel),
                hermes_wheel=cast(Path, args.hermes_wheel),
            )
        root = secure_root(args.evidence_root)
        result = asyncio.run(
            drive(
                root,
                source,
                candidate_digest,
                candidate_binding,
                installed_runtime,
            )
        )
        print(json.dumps(result, sort_keys=True, separators=(",", ":")))
        return 0
    except Exception as exc:
        if root is not None:
            shutil.rmtree(root, ignore_errors=True)
        print(json.dumps({"status": "SOURCE_GOLDEN_PATH_FAIL", "blocker": f"{type(exc).__name__}: {exc}"}, ensure_ascii=False, sort_keys=True), file=sys.stderr)
        return 2

if __name__ == "__main__":
    raise SystemExit(main())


== runtime and available installed evidence ==
Python 3.12.9
== golden runtime inputs ==
3067 dualcoach/releases/v1.1.0/installed-golden-bundle/preexecution-product-binding.json
3067 dualcoach/releases/v1.1.0/preexecution-product-binding.json
3067 dualcoach/releases/v1.1.0/source-golden-bundle/preexecution-product-binding.json
314877 dualcoach/releases/v1.1.0/artifacts/physique_checkin_cli-0.1.0-py3-none-any.whl
8511601 dualcoach/releases/v1.1.0/artifacts/hermes_agent-0.17.0-py3-none-any.whl


== immutable v1 evidence candidates and hashes ==
6c0bf73c9be9ef90a4655f2144235dedc7e03ad064b70369868688661a323e2f  dualcoach/releases/v1.0.0/delivered/receipts/historical-provenance.json
74272d9dd7fe6dd092225ced00c72043090f784b79c5e6a8710442f28f632c6c  dualcoach/releases/v1.0.0/delivered/seals/historical.json
== v1 release integrity ==
257498e6aa2db7107ee24223a29b09f2e26c3d493869dc21206688be24b037b9  dualcoach/releases/v1.0.0/delivered/SEAL.json
c2ee2f49e43544bf2fe407aa6970245afb292f9dbc6580e39abc6e27b57bf3d4  dualcoach/releases/v1.0.0/delivered/candidate.json
54be54cf89720057486596a21941ec5d456a1c54148f66dbde0475503a752f67  dualcoach/releases/v1.0.0/delivered/delivered-bundle-seal.json


== candidate delta/artifact inventory ==
ec160d3d0e29bc747f463923d31bfe736aefb5840a3d32fcb04842aa5139ddb0  dualcoach/releases/v1.1.0/artifacts/hermes_agent-0.17.0-py3-none-any.whl
a56da2417df0912f3fe407c0b78befd7362207d1c8a35271000af46701ba79d2  dualcoach/releases/v1.1.0/artifacts/physique_checkin_cli-0.1.0-py3-none-any.whl
hermes_agent-0.17.0-py3-none-any.whl members= 992 record= ['hermes_agent-0.17.0.dist-info/RECORD']
bootstrap= 777e8ed7932d7834f39a67c8f8001742df99746ea4a990a5cedbc003fa51ab23
physique_checkin_cli-0.1.0-py3-none-any.whl members= 58 record= ['physique_checkin_cli-0.1.0.dist-info/RECORD']
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
  File "/home/cube/miniconda3/lib/python3.12/zipfile/__init__.py", line 1572, in read
    with self.open(name, "r", pwd) as fp:
         ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/cube/miniconda3/lib/python3.12/zipfile/__init__.py", line 1609, in open
    zinfo = self.getinfo(name)
            ^^^^^^^^^^^^^^^^^^
  File "/home/cube/miniconda3/lib/python3.12/zipfile/__init__.py", line 1537, in getinfo
    raise KeyError(
KeyError: "There is no item named 'gateway/platforms/telegram_customer_bootstrap.py' in the archive"

Command exited with code 1


**Planning file hash verification from original root**

**Analyzing source and virtual environment setup**

**Extracting venv package metadata for dependencies**

**Assessing Python environment setup**

**Planning isolated venv setup with dependencies**

**Verifying environment variables and repo status**

**Assessing Python environment setup**

**Drafting isolated virtual environment setup**

**Planning virtual environment isolation with local wheels**

**Enforcing secure preexecution file permissions**

**Planning golden path verification**

**Auditing tags and verifying evidence**

**Planning golden path verification**

bash

printf '%s\n' '== session model/environment ==' && env | grep '^PI_' || true
printf '%s\n' '== cached Golden source prerequisites ==' && for p in /home/cube/.cache/task26-strict-successor-1786976146/src-p /home/cube/.cache/task26-strict-successor-1786976146; do [ -e "$p" ] && stat -c '%F %a %n' "$p"; done
[ -f /home/cube/.cache/task26-strict-successor-1786976146/src-p/checkin_cli/customer_cleanup.py ] && echo 'source-profile=present' || echo 'source-profile=missing'
printf '%s\n' '== original-task evidence paths ==' && find '/home/cube/projects/richard/traning coach/.omo/evidence/task26' '/home/cube/projects/richard/traning coach/.omo/evidence/task27' -maxdepth 2 -type f -printf '%p\n' 2>/dev/null | sort | head -200

ROOT='/home/cube/projects/richard/traning coach'; printf '%s\n' '== claimed v1 byte-identities ==' ; for f in \
 "$ROOT/.omo/evidence/task26/task26-combined-v38-delivered-st_01a019d7/SEAL.json" \
 "$ROOT/.omo/evidence/task26/task26-combined-v38-delivered-st_01a019d7/candidate.json" \
 "$ROOT/.omo/evidence/task27/task27-v38-final-verification-f4.json" \
 "$ROOT/.omo/evidence/task27/task27-v38-final-verification-f4-supplemental.json"; do
  if [ -f "$f" ]; then sha256sum "$f"; else echo "MISSING $f"; fi
done
printf '%s\n' '== task27 real-surface declarations ==' ; rg -n --glob '*.json' 'real|Telegram|external|historical|successor|v1.1|delivery|send' "$ROOT/.omo/evidence/task27" 2>/dev/null | head -600

cd /home/cube/projects/richard/hermes-agent-dualcoach-v1.1 && python3 - <<'PY'
from pathlib import Path
import zipfile
for filename in ('hermes_agent-0.17.0-py3-none-any.whl','physique_checkin_cli-0.1.0-py3-none-any.whl'):
 p=Path('dualcoach/releases/v1.1.0/artifacts')/filename
 with zipfile.ZipFile(p) as z:
  met=next(n for n in z.namelist() if n.endswith('.dist-info/METADATA'))
  print('==',filename,'==')
  for line in z.read(met).decode().splitlines():
   if line.startswith(('Name:', 'Version:', 'Requires-Dist:')): print(line)
PY
printf '%s\n' '== v1 tagged object binding ==' && git cat-file -t e19f59ee50dbb8417bcf874dc6523598e50b2897 && git rev-parse e19f59ee50dbb8417bcf874dc6523598e50b2897^{} && git show -s --format='commit=%H%ntree=%T' d7425705ee403b543f203668eef751c060e2c89d && git diff --exit-code d7425705ee403b543f203668eef751c060e2c89d 062d2dadc3755df6de72efdfaeb8fd57d6c92568 -- >/dev/null 2>&1; echo "base_tree_ref_check=$?"

cd /home/cube/projects/richard/hermes-agent-dualcoach-v1.1 && printf '%s\n' '== relevant release command/provenance references ==' && rg -n --glob '*.json' --glob '*.log' --glob '*.stderr' --glob '*.stdout' 'source_golden_path|verify_source_golden_path|installed-venv|installed-site-packages|task26-local-http-telegram' dualcoach/releases/v1.1.0 | head -600

cd /home/cube/projects/richard/hermes-agent-dualcoach-v1.1 && printf '%s\n' '== fresh delta verifier ==' && python3 -I scripts/verify_dualcoach_v11_candidate.py dualcoach/releases/v1.0.0/delivered dualcoach/releases/v1.1.0 && printf '%s\n' '== source/wheel module exact byte parity ==' && python3 - <<'PY'
from pathlib import Path
import hashlib, zipfile
wheel=Path('dualcoach/releases/v1.1.0/artifacts/hermes_agent-0.17.0-py3-none-any.whl')
member='gateway/platforms/telegram_customer_bootstrap.py'
with zipfile.ZipFile(wheel) as z: data=z.read(member)
print({'wheel_member_sha256':hashlib.sha256(data).hexdigest(),'source_sha256':hashlib.sha256(Path(member).read_bytes()).hexdigest(),'byte_identical':data==Path(member).read_bytes()})
PY


#!/usr/bin/env python3
"""Strict, offline provenance primitives for installed Golden Path runtimes."""
from __future__ import annotations

import base64
import configparser
import csv
import hashlib
import io
import json
import os
import stat
import sys
import zipfile
from email.parser import BytesParser
from email.policy import compat32
from pathlib import Path
from typing import Any, Iterable, Mapping, Sequence, cast
from urllib.parse import unquote_to_bytes, urlsplit

def canonical(value: object) -> bytes:
    return json.dumps(
        value,
        ensure_ascii=False,
        sort_keys=True,
        separators=(",", ":"),
        allow_nan=False,
    ).encode()

def sha256_file(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as stream:
        for chunk in iter(lambda: stream.read(1024 * 1024), b""):
            digest.update(chunk)
    return digest.hexdigest()

def _normal(name: str) -> str:
    return "-".join(name.lower().replace("_", "-").split("-"))

def _within(path: Path, roots: Iterable[Path]) -> bool:
    resolved = path.resolve(strict=True)
    return any(resolved == root.resolve(strict=True) or resolved.is_relative_to(root.resolve(strict=True)) for root in roots)

def _regular(path: Path, label: str, *, private: bool = False) -> None:
    info = path.lstat()
    if stat.S_ISLNK(info.st_mode):
        raise ValueError(f"{label} is a symlink")
    if not stat.S_ISREG(info.st_mode) or info.st_nlink != 1 or info.st_uid != os.geteuid():
        raise ValueError(f"{label} is not an owned regular file")
    if private and stat.S_IMODE(info.st_mode) not in {0o600, 0o400}:
        raise ValueError(f"{label} permissions are not private")

def _private_directory(path: Path, label: str) -> None:
    info = path.lstat()
    if stat.S_ISLNK(info.st_mode):
        raise ValueError(f"{label} is a symlink")
    if not stat.S_ISDIR(info.st_mode) or info.st_uid != os.geteuid():
        raise ValueError(f"{label} is not an owned directory")
    if stat.S_IMODE(info.st_mode) not in {0o700, 0o500}:
        raise ValueError(f"{label} permissions are not private")

def read_private_json(path: Path) -> dict[str, Any]:
    _regular(path, "provenance", private=True)
    value = json.loads(path.read_text(encoding="utf-8"))
    if not isinstance(value, dict) or any(not isinstance(key, str) for key in value):
        raise ValueError("provenance is not an object")
    return cast(dict[str, Any], value)

def _decode_record_hash(value: str, label: str) -> str:
    algorithm, separator, encoded = value.partition("=")
    if algorithm != "sha256" or not separator or not encoded:
        raise ValueError(f"{label} RECORD hash is invalid")
    try:
        raw = base64.urlsafe_b64decode(encoded + "=" * (-len(encoded) % 4))
    except Exception as exc:
        raise ValueError(f"{label} RECORD hash is invalid") from exc
    if len(raw) != hashlib.sha256().digest_size:
        raise ValueError(f"{label} RECORD hash is invalid")
    return raw.hex()

def _record_rows(data: bytes, record_relative: str, label: str) -> list[tuple[str, str, int | None]]:
    try:
        decoded = data.decode("utf-8")
        parsed = list(csv.reader(io.StringIO(decoded, newline="")))
    except (UnicodeDecodeError, csv.Error) as exc:
        raise ValueError(f"{label} RECORD is invalid") from exc
    rows: list[tuple[str, str, int | None]] = []
    seen: set[str] = set()
    for row in parsed:
        if len(row) != 3:
            raise ValueError(f"{label} RECORD row is invalid")
        relative, encoded_hash, raw_size = row
        candidate = Path(relative)
        if not relative or candidate.is_absolute() or relative in seen:
            raise ValueError(f"{label} RECORD path is invalid")
        seen.add(relative)
        if relative == record_relative:
            if encoded_hash or raw_size:
                raise ValueError(f"{label} RECORD self-row is invalid")
            rows.append((relative, "", None))
            continue
        if not encoded_hash or not raw_size.isdecimal():
            raise ValueError(f"{label} RECORD hash or size is missing")
        rows.append((relative, _decode_record_hash(encoded_hash, label), int(raw_size)))
    if record_relative not in seen:
        raise ValueError(f"{label} RECORD self-row is missing")
    return rows

def _wheel_inventory(
    wheel: Path,
    dist_info_name: str,
    installed_rows: Sequence[tuple[str, str, int | None]],
    label: str,
    *,
    site_packages: Path,
    venv: Path,
) -> str:
    _regular(wheel, f"{label} wheel", private=True)
    try:
        with zipfile.ZipFile(wheel) as archive:
            names = archive.namelist()
            if len(names) != len(set(names)) or any(name.startswith("/") or ".." in Path(name).parts for name in names):
                raise ValueError(f"{label} wheel members are invalid")
            record_relative = f"{dist_info_name}/RECORD"
            wheel_record = archive.read(record_relative)
            rows = _record_rows(wheel_record, record_relative, label)
            installed_by_path = {row[0]: row for row in installed_rows}
            if set(names) != {row[0] for row in rows}:
                raise ValueError(f"{label} wheel inventory differs from wheel RECORD")
            data_prefix = f"{dist_info_name.removesuffix('.dist-info')}.data/"
            for relative, expected_hash, expected_size in rows:
                if relative == record_relative:
                    continue
                try:
                    payload = archive.read(relative)
                except KeyError as exc:
                    raise ValueError(f"{label} wheel RECORD member is missing: {relative}") from exc
                if len(payload) != expected_size:
                    raise ValueError(f"{label} wheel RECORD size mismatch: {relative}")
                if hashlib.sha256(payload).hexdigest() != expected_hash:
                    raise ValueError(f"{label} wheel RECORD hash mismatch: {relative}")
                installed_relative = relative
                if relative.startswith(data_prefix):
                    scheme, separator, suffix = relative[len(data_prefix):].partition("/")
                    if not separator or not suffix:
                        raise ValueError(f"{label} wheel data member is invalid: {relative}")
                    if scheme in {"purelib", "platlib"}:
                        installed_relative = suffix
                    elif scheme == "data":
                        installed_relative = Path(os.path.relpath(venv / suffix, site_packages)).as_posix()
                    else:
                        raise ValueError(f"{label} unsupported wheel data scheme: {scheme}")
                installed = installed_by_path.get(installed_relative)
                if installed != (installed_relative, expected_hash, expected_size):
                    raise ValueError(f"{label} installed RECORD differs for wheel member: {relative}")
            return hashlib.sha256(wheel_record).hexdigest()
    except zipfile.BadZipFile as exc:
        raise ValueError(f"{label} wheel is invalid") from exc

def _strict_json_object(data: bytes, label: str) -> dict[str, object]:
    def object_pairs(
        pairs: list[tuple[str, object]],
    ) -> dict[str, object]:
        result: dict[str, object] = {}
        for key, value in pairs:
            if key in result:
                raise ValueError(f"{label} contains a duplicate key")
            result[key] = value
        return result

    try:
        value = json.loads(
            data.decode("utf-8", errors="strict"), object_pairs_hook=object_pairs
        )
    except (UnicodeDecodeError, json.JSONDecodeError) as exc:
        raise ValueError(f"{label} is invalid") from exc
    if not isinstance(value, dict):
        raise ValueError(f"{label} is invalid")
    return cast(dict[str, object], value)

def _portable_direct_url_provenance(
    *,
    payload: bytes,
    record_hash: str,
    record_size: str,
    record_path: str,
    wheel: Path,
    distribution_name: str,
) -> tuple[dict[str, object], dict[str, object]]:
    value = _strict_json_object(payload, "generated direct URL metadata")
    archive_value = value.get("archive_info")
    if set(value) != {"archive_info", "url"} or not isinstance(
        archive_value, dict
    ):
        raise ValueError("generated direct URL metadata is not a wheel archive")
    archive = cast(dict[str, object], archive_value)
    hashes_value = archive.get("hashes")
    if set(archive) != {"hash", "hashes"} or not isinstance(hashes_value, dict):
        raise ValueError("generated direct URL archive hash is ambiguous")
    hashes = cast(dict[str, object], hashes_value)
    wheel_sha256 = sha256_file(wheel)
    if (
        set(hashes) != {"sha256"}
        or archive.get("hash") != f"sha256={wheel_sha256}"
        or hashes.get("sha256") != wheel_sha256
    ):
        raise ValueError("generated direct URL archive hash differs from sealed wheel")
    raw_url = value.get("url")
    if not isinstance(raw_url, str):
        raise ValueError("generated direct URL wheel provenance is invalid")
    parsed = urlsplit(raw_url)
    if (
        parsed.scheme != "file"
        or parsed.netloc
        or parsed.query
        or parsed.fragment
        or not parsed.path
    ):
        raise ValueError("generated direct URL is not an offline local wheel")
    try:
        decoded_path = unquote_to_bytes(parsed.path).decode("utf-8", errors="strict")
    except UnicodeDecodeError as exc:
        raise ValueError("generated direct URL wheel path is invalid") from exc
    archive_path = Path(decoded_path)
    if (
        not archive_path.is_absolute()
        or archive_path.suffix != ".whl"
        or archive_path.name != wheel.name
    ):
        raise ValueError("generated direct URL wheel provenance is invalid")
    try:
        same_archive = os.path.samefile(archive_path, wheel)
    except OSError:
        same_archive = False
    if not same_archive:
        raise ValueError("generated direct URL differs from sealed wheel provenance")
    payload_sha256 = hashlib.sha256(payload).hexdigest()
    if (
        not record_size.isdecimal()
        or int(record_size) != len(payload)
        or _decode_record_hash(record_hash, "direct URL") != payload_sha256
    ):
        raise ValueError("generated direct URL RECORD row differs")
    portable: dict[str, object] = {
        "schema": "task26-portable-direct-url-provenance-v1",
        "distribution": distribution_name,
        "dist_info_member_path": record_path,
        "sealed_wheel_basename": wheel.name,
        "sealed_wheel_sha256": wheel_sha256,
        "archive_sha256": wheel_sha256,
    }
    raw: dict[str, object] = {
        "dist_info_member_path": record_path,
        "byte_sha256": payload_sha256,
        "record_row_sha256": _decode_record_hash(record_hash, "direct URL"),
        "size": len(payload),
        "url_path_classification": "absolute_local_file_wheel_url",
        "raw_equality_required_or_claimed": False,
    }
    return portable, raw

def portable_record_projection(
    *,
    wheel: Path,
    site_packages: Path,
    dist_info: Path,
    venv: Path,
    distribution_name: str,
    require_direct_url: bool = False,
) -> dict[str, object]:
    """Project path-independent installed RECORD semantics without hiding raw drift."""
    record = dist_info / "RECORD"
    raw_record = record.read_bytes()
    try:
        installed_csv = list(
            csv.reader(io.StringIO(raw_record.decode("utf-8"), newline=""))
        )
        with zipfile.ZipFile(wheel) as archive:
            wheel_record_name = f"{dist_info.name}/RECORD"
            wheel_rows = _record_rows(
                archive.read(wheel_record_name),
                wheel_record_name,
                distribution_name,
            )
            entry_points_data = (
                archive.read(f"{dist_info.name}/entry_points.txt")
                if f"{dist_info.name}/entry_points.txt" in archive.namelist()
                else b""
            )
    except (UnicodeDecodeError, csv.Error, zipfile.BadZipFile) as exc:
        raise ValueError("portable RECORD input is invalid") from exc
    installed_rows: dict[str, tuple[str, str]] = {}
    for row in installed_csv:
        if len(row) != 3 or not row[0] or row[0] in installed_rows:
            raise ValueError("installed RECORD row is invalid")
        installed_rows[row[0]] = (row[1], row[2])
    wheel_owned: list[dict[str, object]] = []
    generated: list[dict[str, object]] = []
    consumed: set[str] = {record.relative_to(site_packages).as_posix()}
    data_prefix = f"{dist_info.name.removesuffix('.dist-info')}.data/"
    for relative, expected_hash, expected_size in wheel_rows:
        if relative == wheel_record_name:
            continue
        installed_relative = relative
        generated_launcher = False
        if relative.startswith(data_prefix):
            scheme, separator, suffix = relative[len(data_prefix):].partition("/")
            if not separator:
                raise ValueError("unsupported path-dependent wheel entry")
            if scheme == "data":
                suffix_path = Path(suffix)
                if (
                    not suffix
                    or suffix_path.is_absolute()
                    or ".." in suffix_path.parts
                ):
                    raise ValueError("unsupported path-dependent wheel entry")
                target = venv / suffix_path
                installed_relative = Path(
                    os.path.relpath(target, site_packages)
                ).as_posix()
                row = installed_rows.get(installed_relative)
                if (
                    row is None
                    or not row[0]
                    or not row[1].isdecimal()
                    or _decode_record_hash(
                        row[0], "relocated static data"
                    )
                    != expected_hash
                    or int(row[1]) != expected_size
                ):
                    raise ValueError(
                        "wheel-owned installed RECORD row differs for relocated static data"
                    )
                consumed.add(installed_relative)
                _regular(target, "relocated static data")
                payload = target.read_bytes()
                with zipfile.ZipFile(wheel) as archive:
                    wheel_payload = archive.read(relative)
                if (
                    len(wheel_payload) != expected_size
                    or hashlib.sha256(wheel_payload).hexdigest()
                    != expected_hash
                    or payload != wheel_payload
                ):
                    raise ValueError(

[676 more lines in file. Use offset=361 to continue.]


#!/usr/bin/env python3
"""Verify a source Golden Path from native production artifacts only."""
from __future__ import annotations

import argparse
import hashlib
import importlib
import importlib.util
import json
import os
import stat
import sys
from collections.abc import Mapping
from datetime import date
from pathlib import Path
from typing import Any, cast

from gateway.platforms.task26_runtime_authority import validate_snapshot

_PROVENANCE_SPEC = importlib.util.spec_from_file_location(
    "golden_verifier_installed_wheel_provenance",
    Path(__file__).with_name("installed_wheel_provenance.py"),
)
if _PROVENANCE_SPEC is None or _PROVENANCE_SPEC.loader is None:
    raise RuntimeError("installed provenance helper is unavailable")
_PROVENANCE_MODULE = importlib.util.module_from_spec(_PROVENANCE_SPEC)
_PROVENANCE_SPEC.loader.exec_module(_PROVENANCE_MODULE)
collect_installed_runtime = _PROVENANCE_MODULE.collect_installed_runtime
loaded_module_receipts = _PROVENANCE_MODULE.loaded_module_receipts
read_private_json = _PROVENANCE_MODULE.read_private_json
portable_installed_runtime = _PROVENANCE_MODULE.portable_installed_runtime
nonportable_installed_record_audit = (
    _PROVENANCE_MODULE.nonportable_installed_record_audit
)
validate_nonportable_installed_record_audit = (
    _PROVENANCE_MODULE.validate_nonportable_installed_record_audit
)

DEFAULT_SOURCE = Path("/home/cube/.cache/task26-strict-successor-1786976146/src-p")
TASK26_CLAUSES = (
    "onboarding_22_clear",
    "deterministic_ambiguity_revision",
    "preview_isolation",
    "approved_card_projection_gate",
    "unknown_delivery_no_retry",
    "successful_lifecycle",
    "cleanup_resume_terminal",
)
TASK26_ANSWERS = (
    "1990년 1월 15일입니다.", "남성입니다.", "키는 180cm입니다.",
    "현재 체중은 80kg입니다.", "보통 수준입니다.",
    "주 3회 60분 근력 운동을 하고 평일에는 하루 8천 보 정도 걷습니다.",
    "현재 체중을 유지하고 싶습니다.",
    "유지가 목표라 목표 체중은 정하지 않겠습니다.",
    "유지가 목표라 목표 날짜도 정하지 않겠습니다.",
    "음식 알레르기는 없습니다.", "음식 불내증은 없습니다.",
    "종교적 또는 윤리적으로 제외하는 음식은 없습니다.",
    "싫어해서 피하는 음식은 없습니다.", "특별한 식단 선호는 없습니다.",
    "진단받은 질환은 없습니다.", "복용 중인 약이나 보충제는 없습니다.",
    "임신 또는 수유에 해당하지 않습니다.",
    "섭식장애 위험이나 과거력은 없습니다.",
    "가스레인지, 전자레인지, 냉장고를 사용할 수 있고 기본 조리가 가능합니다.",
    "식비 예산은 보통입니다.", "하루 세 끼를 먹습니다.",
    "평일 점심은 12시, 저녁은 운동 후 8시쯤이며 그 외 제약은 없습니다.",
)
PHASES = (
    "OBSERVER_SUBSCRIBED", "INVITE_RECEIPTED", "CONSENT_COMMITTED",
    "ONBOARDING_22_COMMITTED", "RECONCILIATION_COMMITTED", "CUSTOMER_ATTESTED",
    "OWNER_REVIEW_PUBLISHED", "READY_DISABLED", "ACTIVATED", "CHECKIN_FINALIZED",
    "GENERATION_DRAFTED", "OWNER_APPROVED", "APPROVED_CARD_PROJECTED",
    "CAPABILITY_ISSUED", "CAPABILITY_CONSUMED", "SENT_AUDITED",
    "SURFACE_CAPTURED", "QUIESCED", "ARCHIVED", "CLEANUP_COMPLETE",
    "SOURCE_GOLDEN_PATH_PASS",
)
ZERO = "0" * 64
TERMINAL_CATEGORY_FIELDS = frozenset(
    {
        "registry",
        "bootstrap",
        "onboarding",
        "outbox",
        "key",
        "owner_action",
        "service_state",
        "event",
        "customer_data",
        "activation",
        "sent_event",
        "candidate",
    }
)
TERMINAL_INVENTORY_FIELDS = frozenset(
    {
        "customer_key",
        "disabled",
        "nonconsenting",
        "categories",
        "active_count",
        "pending_count",
        "unknown_count",
        "orphan_count",
        "archive_verified",
        "journal_committed",
        "terminal",
    }
)

def canonical(value: object, *, ascii_only: bool = False) -> bytes:
    return json.dumps(value, ensure_ascii=ascii_only, sort_keys=True, separators=(",", ":"), allow_nan=False).encode()

def sha(path: Path) -> str:
    return hashlib.sha256(path.read_bytes()).hexdigest()

def obj(value: object, label: str) -> dict[str, Any]:
    if not isinstance(value, dict) or any(not isinstance(key, str) for key in value):
        raise ValueError(f"{label} is not an object")
    return cast(dict[str, Any], value)

def read_json(path: Path, label: str) -> dict[str, Any]:
    return obj(json.loads(path.read_text(encoding="utf-8")), label)

def serialize_terminal_inventory(terminal: object) -> dict[str, object]:
    fields = getattr(type(terminal), "__dataclass_fields__", None)
    if not isinstance(fields, dict) or set(fields) != TERMINAL_INVENTORY_FIELDS:
        raise ValueError("terminal inventory schema is invalid")
    customer_key = getattr(terminal, "customer_key", None)
    disabled = getattr(terminal, "disabled", None)
    nonconsenting = getattr(terminal, "nonconsenting", None)
    raw_categories = getattr(terminal, "categories", None)
    if not isinstance(raw_categories, Mapping):
        raise ValueError("terminal inventory categories are invalid")
    categories = dict(raw_categories)
    counts = {
        name: getattr(terminal, name, None)
        for name in (
            "active_count",
            "pending_count",
            "unknown_count",
            "orphan_count",
        )
    }
    booleans = {
        name: getattr(terminal, name, None)
        for name in (
            "archive_verified",
            "journal_committed",
            "terminal",
        )
    }
    if (
        not isinstance(customer_key, str)
        or not customer_key
        or type(disabled) is not bool
        or type(nonconsenting) is not bool
        or set(categories) != TERMINAL_CATEGORY_FIELDS
        or any(not isinstance(key, str) for key in categories)
        or any(type(value) is not int or value < 0 for value in categories.values())
        or any(type(value) is not int or value < 0 for value in counts.values())
        or any(type(value) is not bool for value in booleans.values())
    ):
        raise ValueError("terminal inventory field types are invalid")
    expected_terminal = bool(
        disabled
        and nonconsenting
        and all(value == 0 for value in counts.values())
        and booleans["archive_verified"]
        and booleans["journal_committed"]
    )
    if booleans["terminal"] is not expected_terminal:
        raise ValueError("terminal inventory verdict is inconsistent")
    return {
        "customer_key": customer_key,
        "disabled": disabled,
        "nonconsenting": nonconsenting,
        "categories": dict(sorted(categories.items())),

[1420 more lines in file. Use offset=181 to continue.]


== session model/environment ==
PI_CODING_AGENT=true
PI_REASONING_LEVEL=xhigh
PI_SESSION_FILE=/home/cube/projects/richard/traning coach/.omo/senpi-task/children/st_01a01fa3/sessions/st_01a01fa3/2026-08-20T14-43-09-031Z_01a01fa0-3867-7c6a-a15f-582cbda2dffe.jsonl
PI_PROMPT_CACHE_SAFE_WAIT_SECONDS=270
PI_PROVIDER=openai-codex
PI_MODEL=gpt-5.6-terra
PI_SESSION_ID=01a01fa0-3867-7c6a-a15f-582cbda2dffe
== cached Golden source prerequisites ==
directory 700 /home/cube/.cache/task26-strict-successor-1786976146/src-p
directory 775 /home/cube/.cache/task26-strict-successor-1786976146
source-profile=present
== original-task evidence paths ==
/home/cube/projects/richard/traning coach/.omo/evidence/task26/__pycache__/test_archive_verifier.cpython-312-pytest-9.1.1.pyc
/home/cube/projects/richard/traning coach/.omo/evidence/task26/__pycache__/verify-task24-task25-final-candidate.cpython-312.pyc
/home/cube/projects/richard/traning coach/.omo/evidence/task26/__pycache__/verify_retained_archives.cpython-312.pyc
/home/cube/projects/richard/traning coach/.omo/evidence/task26/code-quality-oracle-fail.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-active-gate-receipt-v2.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-active-gate-receipt-v3.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-50685ac2c063c5b18fa895cc1991e3473368d177c7309bf54af0374ea67ba1d1/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-65beb5266c5eb9bfd4643740482f8b1675cd132eff63a979004de53546c8ef86/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-65beb5266c5eb9bfd4643740482f8b1675cd132eff63a979004de53546c8ef86/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-ca49f7561f22b870cc70aa135d15eef66129e3a39ffa3c4be284f0484a345706/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-ca49f7561f22b870cc70aa135d15eef66129e3a39ffa3c4be284f0484a345706/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-dc166c0c77275bb5e0468dd24e828fd2611c96e3f399aedec36395ec9e47d089/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-dc166c0c77275bb5e0468dd24e828fd2611c96e3f399aedec36395ec9e47d089/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-eefe28e328dc2ff89767500795df58c53457b8d2bc553c6e8c977c275b17b302/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-eefe28e328dc2ff89767500795df58c53457b8d2bc553c6e8c977c275b17b302/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-fd937a26281531bcc7cf2e7f8eb6f5e6a044921ae56192c96c2c4ab6d23922a8/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-candidate-fd937a26281531bcc7cf2e7f8eb6f5e6a044921ae56192c96c2c4ab6d23922a8/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-gate-receipt-v1.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/dualcoach-provider-auth-rebind-quality-gate-receipt-v3.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/gateway-registry-path-debug-journal.md
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-final-2a0cd32e520b092e.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-final-80700cc03e0e94ed.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-final-96e1a264fedca02b.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-final-c3b1ea6877bc1a2e.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-final-e880717efeb8c56b.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/hands-on-qa-review.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/objective-constraint-oracle.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-96e1-aborted.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-96e1-lane-action-audit.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-c3b1-superseded.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-deferred-plan-v2.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-deferred-plan-v3.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-reseal-deferred-plan.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provenance-review.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/provider-readiness-debug-journal.md
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/batch_permission_repair.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/clean-shutdown-permission-repair-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/delivery-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/exact-execute-command.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/fixture-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/independent-verification-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/independent_verify.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-dry-run-after-batch-permission-repair.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-dry-run-after-permission-repair-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-dry-run-after-permission-repair.stderr
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-dry-run.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-reset-readiness-after-batch-permission-repair.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-scope-batch-permission-repair-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/live-scope-permission-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/permission-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/reset_controller.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/schema-contract.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/test-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054d/test_reset_controller.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/retained-archive-schema-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/retained-archive-verification-receipt.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/retained-archive-verification-receipt.superseded-6fd1bb07777a65abf350be19af69a427.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/retained-archive-verifier-permission-seal.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/st_01a00cfa-checkin-repro/output.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/st_01a00cfa-checkin-repro/reproduce_checkin.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/st_01a00cfa-checkin-repro/stderr.log
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task22-canonical-permission-repair.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task24-task25-final-candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task24-terminal-replay-report.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task25-offline-revalidation.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-checklist-6aaef77d-task26-live-2e-r2/activation-checklist-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-checklist-6aaef77d-task26-live-2e-r2/checklist-validation-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-checklist-6aaef77d-task26-live-2e-r2/provider-terms-confirmation.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-checklist-6aaef77d-task26-live-2e-r2/token-rotation-waiver-approval.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-checklist-6aaef77d-task26-live-2e-r2/validate_activation_checklist.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/candidate-checkpoint.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/hash-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/verifier-input.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/verify_candidate.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-authoritative-controller-rearm-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-authority-pseudonymization.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/claim-transition-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/claim-watch-ready.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/claim-watch-start.stderr.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/claim-watch-start.stdout.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/listener-boundary-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/listener-boundary-receipt.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/listener-start-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/listener-start.stderr.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/listener-start.stdout.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/preparation-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/preparation-receipt.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-preparation-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/watch-prepared-claim.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/expiry-supersession-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/expiry-supersession-receipt.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-claim-transition-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-claim-watch-ready.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-listener-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-listener-receipt.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-preparation-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-preparation-receipt.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-watch-start.stderr.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/replacement-watch-start.stdout.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-canonical-invite-supersession-5e6f2f2a01321ac89c2950e511e7346d23070c51146c14c22c04db54034b28f1/watch-replacement-claim.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-fail-closed-st_01a01574-v14/FAIL-CLOSED.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-fail-closed-st_01a01574-v14/FAIL-SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v15/FAIL-CLOSED.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v15/FAIL-SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v15/outer-candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v15/preexecution-product-binding.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/FAIL-CLOSED.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/FAIL-SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/bare-bootstrap.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/bare-bootstrap.stderr
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/iv-install.log
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/rehydrated.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16-postfreeze-receipts/rehydrated.stderr
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/candidate.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/cross-mode-candidate-parity.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/ledger-ready-receipt.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/outer-candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/preexecution-product-binding.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/qualification-summary.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-capability-record-bootstrap-installed-st_01a01574-v16/sealed-expected-state.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cb-st_01a00b39/evidence-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cb-st_01a00b39/final-verification.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cb-st_01a00b39/run-deploy.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cb-st_01a00b39/run-gates.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a8627af8f9b931d537e17dbd3e357b7a0f2b2abffdbf28f6ad19a8d32893ec0-gate20-corrected-st_01a00b39/run-corrected-package.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a8627af8f9b931d537e17dbd3e357b7a0f2b2abffdbf28f6ad19a8d32893ec0-gate20-corrected-v2-st_01a00b39/run-corrected-package.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a8627af8f9b931d537e17dbd3e357b7a0f2b2abffdbf28f6ad19a8d32893ec0-st_01a00b39/run-certification.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a8627af8f9b931d537e17dbd3e357b7a0f2b2abffdbf28f6ad19a8d32893ec0-v2-st_01a00b39/run-certification.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-4a8627af8f9b931d537e17dbd3e357b7a0f2b2abffdbf28f6ad19a8d32893ec0-v3-st_01a00b39/run-certification.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/evidence-inventory.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/run-deploy-v2.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/run-deploy.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/run-gates.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/run-runtime-recovery.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-6aaef77de87489c3be493978645781b24b55ab07513ff1f880164741d0bd3c73-st_01a00b39/runtime-recovery-inventory.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-f38d0373a58877806ff64a9cac54ab01e6e6e47f7101e3dcfd5ffbf05f8bb101-st_01a00b39/evidence-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-f38d0373a58877806ff64a9cac54ab01e6e6e47f7101e3dcfd5ffbf05f8bb101-st_01a00b39/run-deploy-v2.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-f38d0373a58877806ff64a9cac54ab01e6e6e47f7101e3dcfd5ffbf05f8bb101-st_01a00b39/run-deploy.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-f38d0373a58877806ff64a9cac54ab01e6e6e47f7101e3dcfd5ffbf05f8bb101-st_01a00b39/run-finalize-v3.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-certification-deployment-f38d0373a58877806ff64a9cac54ab01e6e6e47f7101e3dcfd5ffbf05f8bb101-st_01a00b39/run-gates.sh
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/hash-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/status-post.nul
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/status-pre.nul
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/verifier-input.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b/verify_candidate.py
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/SEAL.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/candidate-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/evidence-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/product-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/REPORT.md
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/SEAL.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/candidate-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/cleanup-seal.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/commands-results.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/evidence-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-copula-installed-st_01a01574-v2/product-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/REPORT.md
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/SEAL.json.sha256
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/candidate-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/cleanup-seal.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/commands-results.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/evidence-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-closed-choice-installed-st_01a01574/product-digest.txt
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-final-5e6f2f2a.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-final-reaudit-96e1-fail.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-final-reaudit-e880-superseded.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-final-v5.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-readonly-reaudit-c3b1-superseded.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-code-quality-v4-superseded-hold.redacted.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/candidate.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/cross-mode-candidate-parity.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/outer-candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/phase2-command-inputs.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/preexecution-product-binding.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/prefreeze-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/prefreeze-modes.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v36/sealed-expected-state.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/candidate.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/cross-mode-candidate-parity.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/outer-candidate-manifest.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/phase2-command-inputs.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/preexecution-product-binding.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/prefreeze-inventory.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/prefreeze-modes.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-prefreeze-st_01a0198f-v38/sealed-expected-state.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-v36-postfreeze-receipts-st_01a019a8/PASS.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-v36-postfreeze-receipts-st_01a019a8/SEAL.json
/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-combined-v36-postfreeze-receipts-st_01a019a8/cleanup-proof.json
sort: write failed: 'standard output': Broken pipe