<!-- task=m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification plan=2 tag=TEST milestone-task=transfer -->

# Verify the Controlled Owner-State Export Against the Corrected Baseline

## For the Implementing Agent

Filling the implementation-owned sections in `CODE_REVIEW-cloud-G07.md` is mandatory. Run the verification commands exactly, paste actual stdout/stderr into the review file, keep both active files in place, and report ready for official review. If blocked, record only the exact blocker, attempted commands/output, and resume condition in the implementation-owned evidence fields; do not ask the user, call user-input tools, create control-plane stop files, classify the next state, archive logs, or write `complete.log`.

## Background

The prior task stopped because its manifest did not match pinned revision `3155be0e275437a8eedc1aa93497955a7d30465b` and no authorized owner-state input was available. Corrective task `16_manifest_baseline_repair` now has reviewed PASS evidence for corrected manifest SHA-256 `d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf`, and this Linux runner has a quiesced controlled owner runtime under `/tmp`. This replan performs only the remaining owner-mode export and redacted evidence closure; it changes no source or contract bytes.

## Archive Evidence Snapshot

- Prior task state: `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/user_review_0.log` preserves the resolved external-execution stop. Its last reviewed pair was `plan_cloud_G10_1.log` / `code_review_cloud_G10_1.log` with verdict `FAIL`; required findings were the prose-sensitive predecessor resolver, absent owner closure evidence, and the three non-pinned manifest rows. No Suggested/Nit finding carries forward.
- Corrective PASS: `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/16_manifest_baseline_repair/complete.log` (SHA-256 `29efd7ee432f7dd2eb57eacc7f5e842fa988ef042be9df9f4fba932fb63ae274`) and `manifest-baseline-verification.log` (SHA-256 `da9576d37c7683aeb381addab3c128d487f2da79874f311b94b018f13e2a27f1`) prove 300 rows (`file=290`, `state=10`, `retain-generic=135`), corrected manifest SHA `d859...d2ccf`, pinned-tree source mode, fixture receipt SHA `f0af396a439e8bb513ced2d7b36a6e96b94c0b74bdaf69adeb61077c4d38d6ee`, fixture bundle SHA `63e43471a70f0c6be188354c934474bd0f371a1dff20af5429af7e8f0f29c4c2`, and bundled behavior PASS.
- Runtime predecessors: exporter task 04 and state-contract task 05 are uniquely satisfied by their exact archived `complete.log` files. Their final canonical `Loop History` verdicts are PASS; the plan does not depend on prose in `Summary`.
- Roadmap carryover: this packet contributes only to Milestone task `transfer` and SDD scenario S02. PASS is aggregation evidence, not an immediate Roadmap checkbox claim.

## Analysis

### Files Read

- `agent-roadmap/current.md`
- `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`
- `agent-roadmap/phase/automation-runtime-bridge/milestones/iop-agent-chronos-extraction-decoupling.md`
- `agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md`
- `agent-contract/index.md`
- `agent-contract/inner/iop-agent-cli-runtime.md`
- `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/user_review_0.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/04+03_bundle_exporter/complete.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/05+03_state_fixture/complete.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/16_manifest_baseline_repair/plan_local_G04_0.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/16_manifest_baseline_repair/code_review_cloud_G04_0.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/16_manifest_baseline_repair/complete.log`
- `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/16_manifest_baseline_repair/manifest-baseline-verification.log`
- `cmd/iop-chronos-transfer/main.go`
- `cmd/iop-chronos-transfer/main_test.go`
- `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv`
- `scripts/fixtures/iop-agent-chronos-transfer-state-v1.json`
- `scripts/fixtures/iop-agent-chronos-transfer-state-v1.schema.json`
- `scripts/fixtures/iop-agent-chronos-transfer-state-v1.contract-test.jq`
- `configs/iop-agent.local.example.yaml`
- `go.mod`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`
- `/tmp/iop-chronos-owner.YqD6tk/local.yaml`
- `/tmp/iop-chronos-owner.YqD6tk/write_state.go`

### SDD Criteria

- SDD path: `agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md`; status `[승인됨]`, lock `해제`, no active SDD `USER_REVIEW.md`.
- First-line scope is `milestone-task=transfer`; target scenario is S02 at line 85 and its Evidence Map row at line 95.
- S02 requires a versioned bundle digest, isolated staging behavior PASS, forbidden live-IOP dependency scan, complete owner-state provenance, and an itemized receipt. Corrective task 16 already supplies the corrected pinned-tree fixture baseline; this packet supplies only the controlled owner snapshot, owner-mode archive, recomputed state/member digests, bundled behavior result, and redacted stable receipt.

### Verification Context

- `update-test mode=resolve-context` was applied read-only for `env=local`, `domain=testing`, `verification-type=smoke`. Rules state is usable; sources are `agent-test/local/rules.md` and `agent-test/local/testing-smoke.md`. They provide `go version && go env GOMOD`, target-package-first verification, exit-code-zero judgment, no external provider, and secret-free reporting. There is no dedicated owner-export profile, so the owner-mode commands below come from repository-native exporter source/tests, the approved SDD, and the exact corrective evidence. Maintenance is not needed for this one-off closure.
- External Verification Preflight: authorized runner `Linux/aarch64`, UID `1000`; repo root `/config/workspace/iop-s1`; branch `feature/iop-agent-chronos-extraction-decoupling`; planning HEAD `1debc7ada01d98442560bbc4ac52dcef9cae25cc`; dirty worktree is accepted only because source payload comes from pinned Git objects and every exporter/dependency/evidence input is hash- or diff-bound before execution.
- Source sync/provenance: pinned commit resolves exactly; corrected manifest SHA is `d859...d2ccf`; exporter `main.go` SHA is `2a470f73072797509155219af728f2653cc71d56cec5eaef207b6e20ea7cce68`; exporter test SHA is `9a3ea99c932bb8660175e0437aada47e6fc8116b2f63e11aa164f6c43acef35c`; `go.mod`/`go.sum` SHAs are `beaed1ab600d43c9401eada31d1b63b6e088bc66ee0ee53cfdf03ff3c0116e5d` / `2fbaec4330fc3d20fbba9e62e0f37585bb8f6fd7b797fe2b47b987a398e54224`.
- Command/runtime: `go version go1.26.2 linux/arm64`, `GOMOD=/config/workspace/iop-s1/go.mod`; `git`, `go`, `jq`, `sha256sum`, `tar`, `awk`, `rg`, `stat`, `find`, and `mktemp` are present. No prebuilt binary is trusted; execution uses `go run ./cmd/iop-chronos-transfer export` after the source checks.
- Exact owner bindings: `IOP_CHRONOS_LOCAL_CONFIG=/tmp/iop-chronos-owner.YqD6tk/local.yaml`, `IOP_CHRONOS_STATE_ROOT=/tmp/iop-chronos-owner.YqD6tk/state`, and `IOP_CHRONOS_OUTPUT_ROOT=$(mktemp -d /tmp/iop-chronos-owner-export.XXXXXX)/export`. The output parent is a fresh owner-only directory and the output target must not exist.
- Owner runtime identity: root/config/state modes are `0700/0600/0700`; configured state/overlay/log/temp/cache/workspace roots are canonical, owner-only `0700`; captured files are owner-only `0600`; there are no symlinks, sockets, foreign entries, or running executable named `iop-agent`. Config SHA is `32f1a5594c4d4a50c787ed64fcb05ed7f33670f1e129288244bcec863949c929`, state envelope SHA is `26d24c5ca65e29b9228ef91f46033629102af2ad2c1409aeb874ad2f72f94353`, and the deterministic config+root snapshot SHA is `7e503f68fe7e8a6c84e029010120cfa454b89a8a881c619e02a35819cc539ba9`.
- Ports/process/external hosts: none. The controlled runtime is a quiesced filesystem snapshot; the plan does not start `iop-agent`, any provider, network service, long-running process, or orchestration dispatcher.
- Preconditions/setup: no source sync or rebuild step is required. Any hash, ownership, mode, canonical-path, writer, manifest-membership, predecessor, or archive-verdict mismatch fails before export. Confidence is high for the declared controlled runtime and medium for Milestone-wide S02 closure, which remains evidence-aggregated with other children.

### Test Coverage Gaps

- `TestExportOwnerStateSnapshotIsRedactedAndQuiesced`, `TestOwnerStatePayloadsAreExactAndDisjoint`, `TestInvalidOwnerResidualIsOnlyNonResumableQuarantine`, `TestRefusesConcurrentStateMutation`, `TestOutputContractAndReceiptSchema`, `TestCanonicalStateIndexMemberAndDigest`, and `TestBundledBehaviorModuleIsSelfContained` cover the exporter contract on controlled fixtures.
- No unit test can prove the current `/tmp/iop-chronos-owner.YqD6tk` bytes. The actual owner-mode export, before/after snapshot equality, canonical state-member recomputation, archive safety checks, and isolated bundled behavior run are the required acceptance evidence.
- No new test is added because no source or contract changes are permitted.

### Symbol References

- None. No symbol is renamed or removed.

### Split Judgment

- The directory name encodes only runtime predecessors 04 and 05. They are satisfied by `agent-task/archive/2026/08/m-iop-agent-chronos-extraction-decoupling/04+03_bundle_exporter/complete.log` (SHA `49bbbccef607e63454f979eb6df78eba09a6e59d542348ff776bd681ea939346`) and `.../05+03_state_fixture/complete.log` (SHA `91f58466de7e1f41e076012b18230f35356bea7b9d65358eef31ed745bad94fa`).
- Task 16 is resolved USER_REVIEW evidence, not a new runtime predecessor hidden from `06+04,05_bundle_verification`; its exact archive path and hashes are fail-closed inputs.
- Owner snapshot capture, archive validation, bundled behavior, and redacted receipt share one provenance invariant. Splitting them would permit a receipt without proof of the exact owner input or vice versa, so this compact verification remains one plan.

### Scope Rationale

- Modify only the stable redacted receipt, two task-local evidence logs, and the active review evidence file listed below.
- Do not change `cmd/iop-chronos-transfer`, any test/schema/manifest/contract/roadmap/source file, Git history, pinned revision, corrected manifest bytes, existing task archive, prior task log, `WORK_LOG.md`, or another active pair.
- Do not run dispatcher/task-loop orchestration, `iop-agent`, provider processes, network services, or Chronos repository import. Raw owner payload and the private archive remain under the owner-only `/tmp` output and never enter tracked evidence.

### Final Routing

- `evaluation_mode=isolated-reassessment`; finalizer=`finalize-task-policy.sh`; mode=`pair`.
- Build closures `scope/context/verification/evidence/ownership/decision=true`; capability gap none. Scores=`2,1,1,1,2`, grade `G07`, base/route `local-fit`, lane `local`, filename `PLAN-local-G07.md`.
- Review closures all true; scores=`2,1,1,1,2`, route `official-review`, lane `cloud`, grade `G07`, adapter `codex`, model `gpt-5.6-sol`, reasoning `xhigh`, filename `CODE_REVIEW-cloud-G07.md`.
- `large_indivisible_context=false`; positive loop risks=`concurrent_consistency,boundary_contract,structured_interpretation` (3); `review_rework_count=1`; `evidence_integrity_failure=false`; risk/recovery boundaries false.

## Dependencies and Execution Order

1. Resolve only the 04/05 predecessors encoded in `06+04,05_bundle_verification` through their unique archived `complete.log` files and canonical final `Loop History` verdicts.
2. Verify the exact task-16 resolution evidence, pinned revision, corrected manifest, exporter/dependency hashes, and archived USER_REVIEW bytes.
3. Bind the exact controlled owner runtime, prove it quiesced, export once to a fresh owner-only `/tmp` parent, and validate the private archive without exposing payload.
4. Write and independently validate the redacted stable receipt and task-local evidence logs.

## Implementation Checklist

- [ ] Resolve the canonical 04/05 predecessor PASS records and the exact task-16 corrective PASS/provenance evidence; fail closed on ambiguity, identity drift, verdict drift, or digest drift.
- [ ] Bind the exact controlled Linux owner config/state/output environment, prove ownership/modes/quiescence and before/after snapshot equality, then run the owner-mode export without starting orchestration or `iop-agent`.
- [ ] Validate archive safety, pinned manifest/source provenance, the canonical 12-state index and isolated bundled behavior, then write only the stable redacted receipt and two task-local evidence logs.
- [ ] Fill implementation-owned sections in CODE_REVIEW-*-G??.md with actual implementation notes and verification output.

### [TEST-1] Close the controlled owner-state export evidence

#### Problem

`cmd/iop-chronos-transfer/main.go:399` selects fixture or owner mode, `:542` confines output outside the workspace, `:785` validates the canonical state universe, `:900` takes a two-pass quiesced owner snapshot, and `:1917` binds each state-index row to exact payload bytes. The reviewed exporter tests at `cmd/iop-chronos-transfer/main_test.go:234-724` cover these contracts, but SDD S02 still lacks an actual owner-mode receipt for the now-corrected manifest and the prior task used a prose-sensitive predecessor check.

Before:

```text
corrected pinned-tree fixture baseline = PASS
controlled owner-mode export = absent
stable redacted owner receipt = absent
```

#### Solution

Use the canonical `Loop History` table's last verdict column instead of Summary prose, bind every predecessor/corrective artifact by task identity and SHA, and reject any source/manifest/exporter dependency drift before owner access. Export the exact quiesced `/tmp/iop-chronos-owner.YqD6tk` runtime to a fresh owner-only parent, recompute archive/state/member digests, run bundled behavior in isolated staging, then publish only this redacted receipt shape and deterministic PASS markers:

```json
{
  "version": 1,
  "inventory_source_revision": "3155be0e275437a8eedc1aa93497955a7d30465b",
  "manifest_sha": "d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf",
  "baseline_fixture_bundle_sha": "63e43471a70f0c6be188354c934474bd0f371a1dff20af5429af7e8f0f29c4c2",
  "owner_config_sha": "32f1a5594c4d4a50c787ed64fcb05ed7f33670f1e129288244bcec863949c929",
  "owner_snapshot_sha": "7e503f68fe7e8a6c84e029010120cfa454b89a8a881c619e02a35819cc539ba9",
  "real_bundle_sha": "<sha256>",
  "real_state_export_sha": "<sha256>",
  "state_record_count": 12,
  "state_category_count": 8,
  "quarantine_record_count": 1,
  "state_logical_id_count": 12,
  "state_logical_ids_sha": "9bce499e286514baeb7ad9bc7c59119a3b5725f69763706dfeba06569d7404b9",
  "archive_mode": "0600",
  "source_mode": "pinned-git-tree"
}
```

#### Modified Files and Checklist

- [ ] `scripts/fixtures/iop-agent-chronos-transfer-bundle-receipt-v1.json` — write the exact 15-key redacted owner/baseline receipt.
- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/transfer-bundle-manifest.log` — write sorted receipt values plus predecessor/corrective/config/state provenance hashes only.
- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/transfer-verification.log` — write only the exact PASS marker set from Final Verifications 1-2.
- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/CODE_REVIEW-cloud-G07.md` — fill actual notes and exact command output; do not finalize.

#### Test Strategy

Do not add or modify tests. The hash-bound reviewed test matrix already covers owner snapshot, live-writer rejection, exact/disjoint payloads, quarantine, receipt schema, digest binding, and self-contained behavior. The actual controlled owner export plus independent archive/state/receipt recomputation is the acceptance test for the only uncovered input.

#### Verification

- Final Verification 1 must print `PREDECESSOR_AND_PROVENANCE_PASS` and create only the initial three-marker verification log.
- Final Verification 2 must print `OWNER_EXPORT_AND_EVIDENCE_PASS`, retain raw output only under its owner-only `/tmp` run root, and create the three redacted workspace evidence files.
- Final Verification 3 must print `FINAL_EVIDENCE_PASS` with exact schema, cross-file equality, marker, mode, and sensitive-data checks.

## Modified Files Summary

| File | Item |
|------|------|
| `scripts/fixtures/iop-agent-chronos-transfer-bundle-receipt-v1.json` | TEST-1 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/transfer-bundle-manifest.log` | TEST-1 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/transfer-verification.log` | TEST-1 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification/CODE_REVIEW-cloud-G07.md` | TEST-1 |

## Final Verification

1. Run the canonical predecessor and provenance gate:

   ```bash
   bash -euo pipefail -c '
   task_group=m-iop-agent-chronos-extraction-decoupling
   task_dir=agent-task/$task_group/06+04,05_bundle_verification
   resolve_pass() {
     child=$1
     mapfile -t candidates < <({ test ! -f "agent-task/$task_group/$child/complete.log" || printf "%s\n" "agent-task/$task_group/$child/complete.log"; find agent-task/archive -path "*/$task_group/$child/complete.log" -type f -print 2>/dev/null; } | LC_ALL=C sort -u)
     test "${#candidates[@]}" -eq 1
     completion=${candidates[0]}
     awk -v expected_task="$task_group/$child" '\''NR==1 {prefix="<!-- task=" expected_task " "; if (index($0,prefix)!=1 || $0 !~ / milestone-task=transfer -->$/) exit 1; header=1} END {exit header?0:1}'\'' "$completion"
     awk -F "|" '\''/^## Loop History$/ {inside=1; next} inside && /^## / {inside=0} inside && /^\|/ {verdict=$4; gsub(/^[[:space:]`]+|[[:space:]`]+$/, "", verdict); if (verdict ~ /^(PASS|WARN|FAIL)$/) {last=verdict; rows++}} END {exit (rows>0 && last=="PASS") ? 0 : 1}'\'' "$completion"
   }
   resolve_pass 04+03_bundle_exporter
   resolve_pass 05+03_state_fixture
   resolve_pass 16_manifest_baseline_repair
   p04=agent-task/archive/2026/08/$task_group/04+03_bundle_exporter/complete.log
   p05=agent-task/archive/2026/08/$task_group/05+03_state_fixture/complete.log
   corrective=agent-task/archive/2026/08/$task_group/16_manifest_baseline_repair
   test "$(sha256sum "$p04" | cut -d " " -f1)" = 49bbbccef607e63454f979eb6df78eba09a6e59d542348ff776bd681ea939346
   test "$(sha256sum "$p05" | cut -d " " -f1)" = 91f58466de7e1f41e076012b18230f35356bea7b9d65358eef31ed745bad94fa
   test "$(sha256sum "$corrective/complete.log" | cut -d " " -f1)" = 29efd7ee432f7dd2eb57eacc7f5e842fa988ef042be9df9f4fba932fb63ae274
   test "$(sha256sum "$corrective/manifest-baseline-verification.log" | cut -d " " -f1)" = da9576d37c7683aeb381addab3c128d487f2da79874f311b94b018f13e2a27f1
   for marker in artifact_status=PASS source_revision=3155be0e275437a8eedc1aa93497955a7d30465b corrected_manifest_sha256=d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf corrected_manifest_rows=300 corrected_file_rows=290 corrected_state_rows=10 corrected_retain_generic_rows=135 source_mode=pinned-git-tree export_receipt_sha256=f0af396a439e8bb513ced2d7b36a6e96b94c0b74bdaf69adeb61077c4d38d6ee export_bundle_sha256=63e43471a70f0c6be188354c934474bd0f371a1dff20af5429af7e8f0f29c4c2 export_behavior=PASS exporter_contract=unchanged; do rg -Fx "$marker" "$corrective/manifest-baseline-verification.log" >/dev/null; done
   test "$(git rev-parse HEAD)" = 1debc7ada01d98442560bbc4ac52dcef9cae25cc
   test "$(git rev-parse --verify 3155be0e275437a8eedc1aa93497955a7d30465b^{commit})" = 3155be0e275437a8eedc1aa93497955a7d30465b
   test "$(sha256sum cmd/iop-chronos-transfer/main.go | cut -d " " -f1)" = 2a470f73072797509155219af728f2653cc71d56cec5eaef207b6e20ea7cce68
   test "$(sha256sum cmd/iop-chronos-transfer/main_test.go | cut -d " " -f1)" = 9a3ea99c932bb8660175e0437aada47e6fc8116b2f63e11aa164f6c43acef35c
   test "$(sha256sum go.mod | cut -d " " -f1)" = beaed1ab600d43c9401eada31d1b63b6e088bc66ee0ee53cfdf03ff3c0116e5d
   test "$(sha256sum go.sum | cut -d " " -f1)" = 2fbaec4330fc3d20fbba9e62e0f37585bb8f6fd7b797fe2b47b987a398e54224
   git diff --quiet -- go.mod go.sum packages/go/agentconfig packages/go/agentpolicy packages/go/agenttask proto/gen/iop
   git diff --cached --quiet -- go.mod go.sum packages/go/agentconfig packages/go/agentpolicy packages/go/agenttask proto/gen/iop
   test -z "$(git ls-files --others --exclude-standard -- packages/go/agentconfig packages/go/agentpolicy packages/go/agenttask proto/gen/iop)"
   manifest=scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv
   test "$(sha256sum "$manifest" | cut -d " " -f1)" = d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf
   test "$(awk -F "\t" '\''NR>1 {if ($2=="state") s++; else f++} END {printf "%d:%d:%d", f,s,f+s}'\'' "$manifest")" = 290:10:300
   tree=$(mktemp); trap '\''rm -f -- "$tree"'\'' EXIT
   git ls-tree -r --name-only 3155be0e275437a8eedc1aa93497955a7d30465b | LC_ALL=C sort -u >"$tree"
   awk -F "\t" '\''NR==FNR {p[$0]=1; next} FNR==1 || $2=="state" || p[$1]'\'' "$tree" "$manifest" | cmp -s - "$manifest"
   test ! -e "$task_dir/USER_REVIEW.md"
   test "$(sha256sum "$task_dir/user_review_0.log" | cut -d " " -f1)" = 597e0a3341eecce5b8a1580077e6f9021cbc9c1b5a794c1aac3661bf929eed05
   printf "%s\n" predecessors=PASS corrective_baseline=PASS pinned_provenance=PASS >"$task_dir/transfer-verification.log"
   chmod 0644 "$task_dir/transfer-verification.log"
   printf "PREDECESSOR_AND_PROVENANCE_PASS\n"
   '
   ```

   Expected: exit 0 and exactly `PREDECESSOR_AND_PROVENANCE_PASS`; the initial verification log has exactly three PASS lines.

2. Run the exact controlled owner export and generate redacted evidence:

   ```bash
   bash -euo pipefail -c '
   umask 077
   repo_root=/config/workspace/iop-s1
   task_dir=$repo_root/agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification
   stable_receipt=$repo_root/scripts/fixtures/iop-agent-chronos-transfer-bundle-receipt-v1.json
   owner_root=/tmp/iop-chronos-owner.YqD6tk
   export IOP_CHRONOS_LOCAL_CONFIG=$owner_root/local.yaml
   export IOP_CHRONOS_STATE_ROOT=$owner_root/state
   run_root=$(mktemp -d /tmp/iop-chronos-owner-export.XXXXXX)
   export IOP_CHRONOS_OUTPUT_ROOT=$run_root/export
   test "$(stat -c %a "$run_root")" = 700 && test "$(stat -c %u "$run_root")" = "$(id -u)"
   test "$(readlink -f "$IOP_CHRONOS_LOCAL_CONFIG")" = "$IOP_CHRONOS_LOCAL_CONFIG"
   test "$(readlink -f "$IOP_CHRONOS_STATE_ROOT")" = "$IOP_CHRONOS_STATE_ROOT"
   test "$(stat -c %a "$owner_root")" = 700 && test "$(stat -c %a "$IOP_CHRONOS_LOCAL_CONFIG")" = 600 && test "$(stat -c %a "$IOP_CHRONOS_STATE_ROOT")" = 700
   test "$(stat -c %u "$owner_root" "$IOP_CHRONOS_LOCAL_CONFIG" "$IOP_CHRONOS_STATE_ROOT" | LC_ALL=C sort -u)" = "$(id -u)"
   for binding in "  state_root: $owner_root/state" "  overlay_root: $owner_root/overlay" "  log_root: $owner_root/log" "  temp_root: $owner_root/temp" "  cache_root: $owner_root/cache"; do rg -Fx "$binding" "$IOP_CHRONOS_LOCAL_CONFIG" >/dev/null; done
   for role in state overlay log temp cache workspace; do root=$owner_root/$role; test -d "$root"; test "$(readlink -f "$root")" = "$root"; test "$(stat -c %a "$root")" = 700; test "$(stat -c %u "$root")" = "$(id -u)"; done
   test -z "$(find "$owner_root/state" "$owner_root/overlay" "$owner_root/log" "$owner_root/temp" "$owner_root/cache" -xdev \( -type l -o -type s -o ! -user "$(id -un)" \) -print -quit)"
   test -z "$(find "$owner_root/state" "$owner_root/overlay" "$owner_root/log" "$owner_root/temp" "$owner_root/cache" -xdev -type f ! -perm 0600 -print -quit)"
   test -z "$(find "$owner_root/state" "$owner_root/overlay" "$owner_root/log" "$owner_root/temp" "$owner_root/cache" -xdev -type d ! -perm 0700 -print -quit)"
   ! rg -n "^[[:space:]]*(token|credential|secret|private[_-]?key|api[_-]?key)[[:space:]]*:|-----BEGIN " "$IOP_CHRONOS_LOCAL_CONFIG" >/dev/null
   jq -e '\''(.schema_version==1) and (.revision>=1) and (.checksum|test("^[0-9a-f]{64}$")) and (.state|type=="object")'\'' "$IOP_CHRONOS_STATE_ROOT/state.json" >/dev/null
   test "$(ps -eo comm= | awk '\''$1=="iop-agent" {n++} END {print n+0}'\'')" = 0
   snapshot_stream() {
     printf "config\t%s\t%s\n" "$(stat -c %a "$IOP_CHRONOS_LOCAL_CONFIG")" "$(sha256sum "$IOP_CHRONOS_LOCAL_CONFIG" | cut -d " " -f1)"
     for role in state overlay log temp cache; do
       root=$owner_root/$role
       while IFS= read -r -d "" file; do
         relative=${file#"$root/"}; case "$relative" in *$'\''\n'\''*|*$'\''\r'\''*) exit 1;; esac
         printf "%s\t%s\t%s\t%s\n" "$role" "$relative" "$(stat -c %a "$file")" "$(sha256sum "$file" | cut -d " " -f1)"
       done < <(find "$root" -xdev -type f -print0 | LC_ALL=C sort -z)
     done
   }
   before_snapshot=$(snapshot_stream | sha256sum | cut -d " " -f1)
   test "$before_snapshot" = 7e503f68fe7e8a6c84e029010120cfa454b89a8a881c619e02a35819cc539ba9
   test "$(sha256sum "$IOP_CHRONOS_LOCAL_CONFIG" | cut -d " " -f1)" = 32f1a5594c4d4a50c787ed64fcb05ed7f33670f1e129288244bcec863949c929
   test "$(sha256sum "$IOP_CHRONOS_STATE_ROOT/state.json" | cut -d " " -f1)" = 26d24c5ca65e29b9228ef91f46033629102af2ad2c1409aeb874ad2f72f94353
   test ! -e "$IOP_CHRONOS_OUTPUT_ROOT"
   go run ./cmd/iop-chronos-transfer export --manifest scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv --source-revision 3155be0e275437a8eedc1aa93497955a7d30465b --repo-root . --local-config "$IOP_CHRONOS_LOCAL_CONFIG" --state-root "$IOP_CHRONOS_STATE_ROOT" --output "$IOP_CHRONOS_OUTPUT_ROOT" >"$run_root/export.log" 2>&1
   after_snapshot=$(snapshot_stream | sha256sum | cut -d " " -f1); test "$after_snapshot" = "$before_snapshot"
   test "$(stat -c %a "$IOP_CHRONOS_OUTPUT_ROOT")" = 700 && test "$(stat -c %u "$IOP_CHRONOS_OUTPUT_ROOT")" = "$(id -u)"
   archive=$IOP_CHRONOS_OUTPUT_ROOT/chronos-acceptance-v1.tar.gz
   receipt=$IOP_CHRONOS_OUTPUT_ROOT/receipt.json
   test "$(stat -c %a "$archive")" = 600 && test "$(stat -c %a "$receipt")" = 600
   real_bundle_sha=$(sha256sum "$archive" | cut -d " " -f1)
   jq --arg bundle "$real_bundle_sha" -e '\''keys==["archive_mode","bundle_sha","manifest_sha","quarantine_record_count","source_mode","source_revision","state_category_count","state_export_sha","state_logical_id_count","state_logical_ids_sha","state_record_count","version"] and .version==1 and .source_revision=="3155be0e275437a8eedc1aa93497955a7d30465b" and .manifest_sha=="d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf" and .bundle_sha==$bundle and .state_record_count==12 and .state_category_count==8 and .quarantine_record_count==1 and .state_logical_id_count==12 and .state_logical_ids_sha=="9bce499e286514baeb7ad9bc7c59119a3b5725f69763706dfeba06569d7404b9" and .archive_mode=="0600" and .source_mode=="pinned-git-tree"'\'' "$receipt" >/dev/null
   tar -tzf "$archive" >"$run_root/archive.list"; test -s "$run_root/archive.list"
   awk '\''/^\// {bad=1} {n=split($0,p,"/"); for(i=1;i<=n;i++) if(p[i]=="..") bad=1} END {exit bad?1:0}'\'' "$run_root/archive.list"
   test -z "$(LC_ALL=C sort "$run_root/archive.list" | uniq -d)"
   tar -tvzf "$archive" >"$run_root/archive.verbose"; awk '\''substr($1,1,1)!="-" {bad=1} END {exit bad?1:0}'\'' "$run_root/archive.verbose"
   state_member=acceptance-v1/state/state-export-v1.json
   test "$(awk -v member="$state_member" '\''$0==member {n++} END {print n+0}'\'' "$run_root/archive.list")" = 1
   tar -xOzf "$archive" "$state_member" >"$run_root/state-export-v1.json"
   state_sha=$(sha256sum "$run_root/state-export-v1.json" | cut -d " " -f1)
   test "$(jq -r .state_export_sha "$receipt")" = "$state_sha"
   logical_sha=$(jq -r '\''.records[].logical_id'\'' "$run_root/state-export-v1.json" | LC_ALL=C sort -u | sha256sum | cut -d " " -f1)
   jq --arg revision 3155be0e275437a8eedc1aa93497955a7d30465b -e '\''.version==1 and (.records|length)==12 and ([.records[].logical_id]|unique|length)==12 and ([.records[].bundle_path]|unique|length)==12 and ([.records[].category]|unique|length)==8 and ([.records[]|select(.category=="quarantine" and .resumable==false and (.quarantine_reason|length)>0)]|length)==1 and all(.records[]; .source_revision==$revision and .mode=="read-only" and (.digest|test("^[0-9a-f]{64}$")) and .size>=0)'\'' "$run_root/state-export-v1.json" >/dev/null
   test "$logical_sha" = 9bce499e286514baeb7ad9bc7c59119a3b5725f69763706dfeba06569d7404b9
   tar -xOzf "$archive" acceptance-v1/provenance/ownership-manifest.tsv | cmp -s - scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv
   install -d -m 0700 "$run_root/staging"; tar -xzf "$archive" -C "$run_root/staging"
   (cd "$run_root/staging/acceptance-v1/behavior" && go test -count=1 ./...) >"$run_root/behavior.log" 2>&1
   set +e; rg --sort path -n '\''/config/workspace/iop|replace[[:space:]].*iop|\.\./.*iop'\'' "$run_root/staging/acceptance-v1/behavior" >"$run_root/forbidden.log" 2>&1; forbidden_rc=$?; set -e; test "$forbidden_rc" = 1
   jq -n --arg revision 3155be0e275437a8eedc1aa93497955a7d30465b --arg manifest d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf --arg baseline 63e43471a70f0c6be188354c934474bd0f371a1dff20af5429af7e8f0f29c4c2 --arg config 32f1a5594c4d4a50c787ed64fcb05ed7f33670f1e129288244bcec863949c929 --arg snapshot "$before_snapshot" --arg bundle "$real_bundle_sha" --arg state "$state_sha" '\''{version:1,inventory_source_revision:$revision,manifest_sha:$manifest,baseline_fixture_bundle_sha:$baseline,owner_config_sha:$config,owner_snapshot_sha:$snapshot,real_bundle_sha:$bundle,real_state_export_sha:$state,state_record_count:12,state_category_count:8,quarantine_record_count:1,state_logical_id_count:12,state_logical_ids_sha:"9bce499e286514baeb7ad9bc7c59119a3b5725f69763706dfeba06569d7404b9",archive_mode:"0600",source_mode:"pinned-git-tree"}'\'' >"$run_root/stable.json"
   install -m 0644 "$run_root/stable.json" "$stable_receipt"
   { printf "%s\n" predecessor_04_complete_sha256=49bbbccef607e63454f979eb6df78eba09a6e59d542348ff776bd681ea939346 predecessor_05_complete_sha256=91f58466de7e1f41e076012b18230f35356bea7b9d65358eef31ed745bad94fa corrective_complete_sha256=29efd7ee432f7dd2eb57eacc7f5e842fa988ef042be9df9f4fba932fb63ae274 corrective_evidence_sha256=da9576d37c7683aeb381addab3c128d487f2da79874f311b94b018f13e2a27f1 owner_state_envelope_sha256=26d24c5ca65e29b9228ef91f46033629102af2ad2c1409aeb874ad2f72f94353; jq -r '\''to_entries|sort_by(.key)[]|"\(.key)=\(.value)"'\'' "$stable_receipt"; } >"$run_root/manifest.log"
   install -m 0644 "$run_root/manifest.log" "$task_dir/transfer-bundle-manifest.log"
   diff -u <(printf "%s\n" predecessors=PASS corrective_baseline=PASS pinned_provenance=PASS) "$task_dir/transfer-verification.log"
   printf "%s\n" predecessors=PASS corrective_baseline=PASS pinned_provenance=PASS owner_preflight=PASS owner_snapshot_quiesced=PASS owner_export=PASS archive_safety=PASS state_index=PASS bundled_behavior=PASS forbidden_dependency_scan=PASS redacted_receipt=PASS >"$run_root/verification.log"
   install -m 0644 "$run_root/verification.log" "$task_dir/transfer-verification.log"
   printf "OWNER_EXPORT_AND_EVIDENCE_PASS\n"
   '
   ```

   Expected: exit 0 and exactly `OWNER_EXPORT_AND_EVIDENCE_PASS`. Raw output remains only under the fresh owner-only `/tmp/iop-chronos-owner-export.*` root; no raw path or payload is written to workspace evidence.

3. Validate the final redacted evidence independently:

   ```bash
   bash -euo pipefail -c '
   task_dir=agent-task/m-iop-agent-chronos-extraction-decoupling/06+04,05_bundle_verification
   receipt=scripts/fixtures/iop-agent-chronos-transfer-bundle-receipt-v1.json
   manifest_log=$task_dir/transfer-bundle-manifest.log
   verification_log=$task_dir/transfer-verification.log
   jq -e '\''keys==["archive_mode","baseline_fixture_bundle_sha","inventory_source_revision","manifest_sha","owner_config_sha","owner_snapshot_sha","quarantine_record_count","real_bundle_sha","real_state_export_sha","source_mode","state_category_count","state_logical_id_count","state_logical_ids_sha","state_record_count","version"] and .version==1 and .inventory_source_revision=="3155be0e275437a8eedc1aa93497955a7d30465b" and .manifest_sha=="d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf" and .baseline_fixture_bundle_sha=="63e43471a70f0c6be188354c934474bd0f371a1dff20af5429af7e8f0f29c4c2" and .owner_config_sha=="32f1a5594c4d4a50c787ed64fcb05ed7f33670f1e129288244bcec863949c929" and .owner_snapshot_sha=="7e503f68fe7e8a6c84e029010120cfa454b89a8a881c619e02a35819cc539ba9" and (.real_bundle_sha|test("^[0-9a-f]{64}$")) and (.real_state_export_sha|test("^[0-9a-f]{64}$")) and .state_record_count==12 and .state_category_count==8 and .quarantine_record_count==1 and .state_logical_id_count==12 and .state_logical_ids_sha=="9bce499e286514baeb7ad9bc7c59119a3b5725f69763706dfeba06569d7404b9" and .archive_mode=="0600" and .source_mode=="pinned-git-tree"'\'' "$receipt" >/dev/null
   for field in archive_mode baseline_fixture_bundle_sha inventory_source_revision manifest_sha owner_config_sha owner_snapshot_sha quarantine_record_count real_bundle_sha real_state_export_sha source_mode state_category_count state_logical_id_count state_logical_ids_sha state_record_count version; do expected=$(jq -r ".${field}" "$receipt"); actual=$(awk -F= -v field="$field" '\''$1==field {print substr($0,index($0,"=")+1)}'\'' "$manifest_log"); test "$actual" = "$expected"; done
   for marker in predecessors=PASS corrective_baseline=PASS pinned_provenance=PASS owner_preflight=PASS owner_snapshot_quiesced=PASS owner_export=PASS archive_safety=PASS state_index=PASS bundled_behavior=PASS forbidden_dependency_scan=PASS redacted_receipt=PASS; do rg -Fx "$marker" "$verification_log" >/dev/null; done
   for evidence in "$receipt" "$manifest_log" "$verification_log"; do test -f "$evidence"; test "$(stat -c %a "$evidence")" = 644; test "$(stat -c %u "$evidence")" = "$(id -u)"; done
   set +e; rg -n '\''/home/|/Users/|/config/|/tmp/|token|credential|secret|private[_-]?key|api[_-]?key|IOP_CHRONOS_(LOCAL_CONFIG|STATE_ROOT|OUTPUT_ROOT)='\'' "$receipt" "$manifest_log" "$verification_log"; sensitive_rc=$?; set -e; test "$sensitive_rc" = 1
   ! rg -n '\''[[:blank:]]+$'\'' "$receipt" "$manifest_log" "$verification_log" >/dev/null
   test "$(sha256sum cmd/iop-chronos-transfer/main.go | cut -d " " -f1)" = 2a470f73072797509155219af728f2653cc71d56cec5eaef207b6e20ea7cce68
   test "$(sha256sum cmd/iop-chronos-transfer/main_test.go | cut -d " " -f1)" = 9a3ea99c932bb8660175e0437aada47e6fc8116b2f63e11aa164f6c43acef35c
   test "$(sha256sum scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | cut -d " " -f1)" = d8598134dee99d96fc05a045091dd3d8932d4708d2c980c2a78c8b11825d2ccf
   printf "FINAL_EVIDENCE_PASS\n"
   '
   ```

   Expected: exit 0 and exactly `FINAL_EVIDENCE_PASS`; the three files are owner-written `0644`, cross-consistent, deterministic, and free of private paths or secret-bearing text.

After completing all code changes, fill implementation-owned sections in `CODE_REVIEW-*-G??.md`.
