<!-- task=m-iop-agent-chronos-extraction-decoupling/01_inventory plan=0 tag=TEST -->

# IOP Agent 전체 자산 ownership manifest 작성

## For the Implementing Agent

`CODE_REVIEW-cloud-G06.md`의 implementation-owned 섹션 작성은 필수다. 검증을 실행하고 실제 출력과 구현 메모를 채운 뒤 활성 파일을 그대로 두고 review 준비 완료를 보고한다. 최종 판정·로그명 변경·`complete.log` 작성·archive 이동은 code-review agent만 수행한다. 차단되면 질문하거나 상태를 분류하지 말고 정확한 blocker, 시도한 명령/출력, 재개 조건만 implementation-owned evidence 필드에 기록한다.

## Background

승인된 SDD는 모든 활성 `iop-agent` 관련 자산을 `transfer | retain-generic | remove | reference` 중 하나로 분류한 파일별 manifest를 S01의 선행 gate로 요구한다. 현재 범위는 Go source뿐 아니라 config, proto, Flutter UI, build/test entrypoint, contract/spec/rule/document reference까지 걸쳐 있으므로 삭제 전에 재현 가능한 asset universe와 처분 짝을 고정해야 한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/iop-agent-chronos-extraction-decoupling.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/automation-runtime-bridge/milestones/iop-agent-chronos-extraction-decoupling.md)
- Task ids:
  - `inventory`: source revision과 모든 관련 활성 자산의 ownership/disposition manifest 확정
- Completion mode: check-on-pass

## Analysis

### Files Read

- `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/agent-runtime.md`
- `agent-contract/inner/iop-agent-cli-runtime.md`
- `agent-spec/index.md`
- `agent-spec/runtime/iop-agent-cli-runtime.md`
- `agent-spec/runtime/edge-node-execution.md`
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/project/domain/agent/rules.md`
- `agent-ops/rules/project/domain/node/rules.md`
- `agent-ops/rules/project/domain/platform-common/rules.md`
- `agent-ops/rules/project/domain/client/rules.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `Makefile`
- `packages/go/agentruntime/types.go`
- `packages/go/agentprovider/cli/cli.go`
- `apps/node/internal/node/runtime_bridge.go`
- `apps/node/internal/bootstrap/module.go`
- `apps/client/lib/client_home_page.dart`
- `packages/flutter/iop_console/lib/src/iop_console_shell.dart`

### SDD Criteria

- SDD: `agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md`, 상태 `[승인됨]`, 잠금 `해제`.
- Target: S01 / Milestone Task `inventory`.
- Evidence Map: source revision, import graph, disposition audit로 미분류 자산과 `transfer`/IOP 후속 조치가 없는 행을 0건으로 만든다.
- 이 기준 때문에 manifest는 경로별 한 행, 고정 revision, disposition, bundle path, IOP action, generic successor, evidence를 모두 포함하고 machine-checkable TSV로 작성한다.

### Verification Context

- Handoff: 별도 handoff 없음. 현재 Milestone/SDD, 계약·spec 색인과 매칭 문서, domain rule, local test rules를 직접 확인했다.
- Source inventory: `git ls-files`로 `apps/agent/**`, `packages/go/agent*/**`, `proto/iop/agent.proto`, 생성물, config, smoke fixture, Flutter console을 열거했고 `rg --sort path -l`로 활성 참조 파일을 교차 확인했다. archive 본문은 inventory source로 사용하지 않는다.
- Preconditions: SDD 기준 revision `3155be0e275437a8eedc1aa93497955a7d30465b` commit이 존재하고 code/config/proto/test asset path가 그 revision과 동일해야 한다. Plan/roadmap 문서 commit으로 `HEAD`가 전진한 상태는 허용한다.
- Test context: `agent-test/local/rules.md`는 usable이다. agent 전용 profile은 없어 gap으로 기록하고, inventory는 repository-native `git`, `rg`, `awk` 검증을 사용한다. 외부 서비스·credential·runtime은 필요 없다.
- Confidence: high. tracked tree와 활성 참조 scan으로 대상 universe를 재생성할 수 있다.

### Test Coverage Gaps

- 파일 분류는 기존 unit test 대상이 아니므로 새 product test를 만들지 않는다.
- 대신 manifest schema, 중복 경로, asset-universe 양방향 차집합, disposition별 필수 필드를 deterministic audit로 검증한다.

### Symbol References

- 변경 symbol 없음. `agentruntime`, `agentprovider`, `agenttask`, `IopAgentPanel`, `iop-agent`, `agent.proto` 참조 위치는 manifest 대상 발견 근거로만 사용한다.

### Split Judgment

- 전체 에픽은 5개 plan으로 분리한다. 이 child의 안정 계약은 “기준 revision의 모든 관련 활성 자산을 한 번씩 분류한 manifest”다.
- PASS evidence: asset universe와 manifest path 집합이 동일하고, 모든 `transfer` 행에 후속 IOP action이 있으며 `retain-generic` 행에 neutral successor가 있다.
- Dependency: 없음. 후속 `02+01_transfer_bundle`이 이 manifest와 `complete.log`를 요구한다.

### Scope Rationale

- archive 문서 본문과 과거 완료 task는 현재 asset universe가 아니므로 제외한다.
- Chronos repository 파일과 최종 source layout 결정은 외부 잠금 뒤 downstream 책임이므로 수정하지 않는다.
- 이 plan은 inventory 산출물만 만들며 source 이동·삭제·rename은 후속 plan으로 남긴다.

### Final Routing

- `evaluation_mode=first-pass`, `finalizer=finalize-task-policy.sh`, `finalizer_mode=pair`.
- Build closures: scope/context/verification/evidence/ownership/decision 모두 true. Scores=`2,0,1,2,1`, grade=`G06`, base/route=`local-fit`, lane=`local`.
- Review closures: 모두 true. Scores=`2,0,1,2,1`, route=`official-review`, lane=`cloud`, grade=`G06`.
- `large_indivisible_context=false`; positive loop risk=`boundary_contract` (1); `review_rework_count=0`; `evidence_integrity_failure=false`; capability gap 없음.
- Canonical files: `PLAN-local-G06.md`, `CODE_REVIEW-cloud-G06.md`.

## Implementation Checklist

- [ ] Freeze the SDD source revision and generate a deterministic TSV asset universe covering code, config, proto, state surfaces, build, tests, UI, contracts, specs, rules, and active documentation.
- [ ] Classify every path exactly once as `transfer`, `retain-generic`, `remove`, or `reference`, with bundle target, IOP action, neutral successor, and evidence fields required by its disposition.
- [ ] Write and run the bidirectional inventory audit; record exact commands/output and prove zero missing, duplicate, or orphan rows.
- [ ] Fill implementation-owned sections in CODE_REVIEW-*-G??.md with actual implementation notes and verification output.

### [TEST-1] 기준 revision 기반 asset universe 생성

**Problem**

`agent-roadmap/.../iop-agent-chronos-extraction-decoupling.md:50`은 모든 code/config/proto/state/build/test/docs를 분류하라고 하지만 현재 파일별 원본이 없다.

```text
# agent-roadmap/phase/automation-runtime-bridge/milestones/iop-agent-chronos-extraction-decoupling.md:50
- [ ] [inventory] ... ownership manifest를 만든다.
```

**Solution**

`git ls-tree -r --name-only 3155be0e...`의 명시 경로군과 active reference scan을 합쳐 정렬·중복 제거한 universe를 만든다. TSV 첫 행을 `path\tkind\tdisposition\tbundle_path\tiop_action\tneutral_successor\tevidence`로 고정한다.

```text
# after: scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv:1
path<TAB>kind<TAB>disposition<TAB>bundle_path<TAB>iop_action<TAB>neutral_successor<TAB>evidence
```

**Modified Files and Checklist**

- [ ] `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` — revision과 모든 관련 활성 경로를 deterministic order로 기록한다.

**Test Strategy**

- Product test는 생략한다. tracked tree와 active reference scan 자체가 source of truth이고 audit 명령으로 재생성 일치를 검증한다.

**Verification**

- `git cat-file -e 3155be0e275437a8eedc1aa93497955a7d30465b^{commit} && git diff --quiet 3155be0e275437a8eedc1aa93497955a7d30465b -- apps/agent packages/go/agentconfig packages/go/agentguard packages/go/agentpolicy packages/go/agentprovider packages/go/agentruntime packages/go/agentstate packages/go/agenttask packages/go/agentworkspace proto/iop/agent.proto proto/gen/iop/agent.pb.go configs/iop-agent.local.example.yaml configs/iop-agent.providers.yaml configs/iop-agent.runtime.yaml scripts/e2e-iop-agent-logged-smoke.sh scripts/fixtures/iop-agent-smoke-manifest.schema.json packages/flutter/iop_console` — 기준 code/config/proto/test asset drift 없음.
- `awk -F '\t' 'NR==1 {exit !($0=="path\tkind\tdisposition\tbundle_path\tiop_action\tneutral_successor\tevidence")} NR>1 {if (seen[$1]++) exit 2} END {if (NR<2) exit 3}' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` — schema, non-empty, unique path PASS.

### [TEST-2] disposition과 후속 책임 닫기

**Problem**

`SDD.md:117-123`의 경로군 분류만으로는 개별 파일이 bundle과 IOP 삭제/유지 중 어디에 연결되는지 감사할 수 없다.

```text
# agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md:117-123
transfer 후 remove | retain-generic | reference
```

**Solution**

각 행에 정확히 하나의 disposition을 두고 `transfer`/`remove`는 bundle path와 IOP action, `retain-generic`은 bundle path와 non-Agent successor, `reference`는 보존 목적을 강제한다. Node의 generic dependency와 workflow ownership을 같은 successor로 중복 분류하지 않는다.

```text
# after examples
packages/go/agenttask/types.go<TAB>go<TAB>transfer<TAB>source/packages/go/agenttask/types.go<TAB>remove<TAB>-<TAB>S01
packages/go/agentruntime/types.go<TAB>go<TAB>retain-generic<TAB>source/packages/go/agentruntime/types.go<TAB>rename<TAB>packages/go/execution/types.go<TAB>S01
```

**Modified Files and Checklist**

- [ ] `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` — disposition별 필수 필드와 근거를 완성한다.

**Test Strategy**

- 정상/경계 검증을 audit에 포함한다: 유효 disposition만 허용하고, 빈 successor를 가진 `retain-generic`과 후속 action 없는 `transfer`를 실패시킨다.

**Verification**

- `awk -F '\t' 'NR==1 {next} !($3=="transfer" || $3=="retain-generic" || $3=="remove" || $3=="reference") {bad=1} $3=="retain-generic" && ($4=="" || $5=="" || $6=="" || $6=="-") {bad=1} ($3=="transfer" || $3=="remove") && ($4=="" || $5=="") {bad=1} END {exit bad}' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` — disposition invariants PASS.

### [TEST-3] 양방향 completeness audit

**Problem**

manifest 작성자의 수동 누락이나 과잉 포함은 후속 삭제 gate를 무효화한다.

```text
# agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md:86
S01 evidence = source revision, import graph와 disposition audit
```

**Solution**

asset universe 생성 명령, manifest path 집합, active reference 후보의 양방향 차집합과 row count를 `inventory-audit.log`에 실제 출력으로 저장한다. 문서·domain 의미상 false positive는 제거하지 말고 `reference` 행과 근거로 명시한다.

```text
# after: inventory-audit.log
source_revision=3155be0e...
missing=0
duplicates=0
orphans=0
```

**Modified Files and Checklist**

- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/01_inventory/inventory-audit.log` — 정확한 명령과 stdout/stderr, 집합 count를 기록한다.
- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/01_inventory/CODE_REVIEW-cloud-G06.md` — 실제 구현/검증 evidence를 채운다.

**Test Strategy**

- `comm` 기반 양방향 차집합을 fresh 실행한다. cache 개념은 적용되지 않는다.

**Verification**

- `cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | LC_ALL=C sort | uniq -d | awk 'NF {bad=1} END {exit bad}'` — duplicate 0.
- `{ git ls-tree -r --name-only 3155be0e275437a8eedc1aa93497955a7d30465b -- apps/agent packages/go/agentconfig packages/go/agentguard packages/go/agentpolicy packages/go/agentprovider packages/go/agentruntime packages/go/agentstate packages/go/agenttask packages/go/agentworkspace proto/iop/agent.proto proto/gen/iop/agent.pb.go configs/iop-agent.local.example.yaml configs/iop-agent.providers.yaml configs/iop-agent.runtime.yaml scripts/e2e-iop-agent-logged-smoke.sh scripts/fixtures/iop-agent-smoke-manifest.schema.json packages/flutter/iop_console; rg --sort path -l -i 'iop-agent|apps/agent|packages/go/agent|iop/agent|agent\.proto|IopAgentPanel|agentruntime|agentprovider|agentconfig|agentguard|agentpolicy|agentstate|agenttask|agentworkspace' README.md HANDOFF.md Makefile agent-contract agent-spec agent-ops/rules/project agent-roadmap agent-ui apps packages proto configs scripts --glob '!agent-roadmap/archive/**' --glob '!agent-ui/**/archive/**' --glob '!agent-spec/archive/**' --glob '!scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv'; } | sed 's#^\./##' | LC_ALL=C sort -u > /tmp/iop-agent-asset-universe.txt` — tracked asset/reference universe 생성.
- `cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | rg -v '^state:' | LC_ALL=C sort -u > /tmp/iop-agent-manifest-paths.txt && comm -23 /tmp/iop-agent-asset-universe.txt /tmp/iop-agent-manifest-paths.txt && comm -13 /tmp/iop-agent-asset-universe.txt /tmp/iop-agent-manifest-paths.txt` — 두 `comm` 출력 모두 비어 있어야 한다. `state:` logical rows는 실제 device path를 기록하지 않고 별도 schema audit한다.

## Modified Files Summary

| File | Item |
|------|------|
| `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` | TEST-1, TEST-2 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/01_inventory/inventory-audit.log` | TEST-3 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/01_inventory/CODE_REVIEW-cloud-G06.md` | TEST-3 |

## Final Verification

1. `git cat-file -e 3155be0e275437a8eedc1aa93497955a7d30465b^{commit} && git diff --quiet 3155be0e275437a8eedc1aa93497955a7d30465b -- apps/agent packages/go/agentconfig packages/go/agentguard packages/go/agentpolicy packages/go/agentprovider packages/go/agentruntime packages/go/agentstate packages/go/agenttask packages/go/agentworkspace proto/iop/agent.proto proto/gen/iop/agent.pb.go configs/iop-agent.local.example.yaml configs/iop-agent.providers.yaml configs/iop-agent.runtime.yaml scripts/e2e-iop-agent-logged-smoke.sh scripts/fixtures/iop-agent-smoke-manifest.schema.json packages/flutter/iop_console`
2. `awk -F '\t' 'NR==1 {exit !($0=="path\tkind\tdisposition\tbundle_path\tiop_action\tneutral_successor\tevidence")} NR>1 {if (seen[$1]++) exit 2} END {if (NR<2) exit 3}' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv`
3. `awk -F '\t' 'NR==1 {next} !($3=="transfer" || $3=="retain-generic" || $3=="remove" || $3=="reference") {bad=1} $3=="retain-generic" && ($4=="" || $5=="" || $6=="" || $6=="-") {bad=1} ($3=="transfer" || $3=="remove") && ($4=="" || $5=="") {bad=1} END {exit bad}' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv`
4. `cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | LC_ALL=C sort | uniq -d | awk 'NF {bad=1} END {exit bad}'`
5. `{ git ls-tree -r --name-only 3155be0e275437a8eedc1aa93497955a7d30465b -- apps/agent packages/go/agentconfig packages/go/agentguard packages/go/agentpolicy packages/go/agentprovider packages/go/agentruntime packages/go/agentstate packages/go/agenttask packages/go/agentworkspace proto/iop/agent.proto proto/gen/iop/agent.pb.go configs/iop-agent.local.example.yaml configs/iop-agent.providers.yaml configs/iop-agent.runtime.yaml scripts/e2e-iop-agent-logged-smoke.sh scripts/fixtures/iop-agent-smoke-manifest.schema.json packages/flutter/iop_console; rg --sort path -l -i 'iop-agent|apps/agent|packages/go/agent|iop/agent|agent\.proto|IopAgentPanel|agentruntime|agentprovider|agentconfig|agentguard|agentpolicy|agentstate|agenttask|agentworkspace' README.md HANDOFF.md Makefile agent-contract agent-spec agent-ops/rules/project agent-roadmap agent-ui apps packages proto configs scripts --glob '!agent-roadmap/archive/**' --glob '!agent-ui/**/archive/**' --glob '!agent-spec/archive/**' --glob '!scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv'; } | sed 's#^\./##' | LC_ALL=C sort -u > /tmp/iop-agent-asset-universe.txt`
6. `cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | rg -v '^state:' | LC_ALL=C sort -u > /tmp/iop-agent-manifest-paths.txt && test -z "$(comm -23 /tmp/iop-agent-asset-universe.txt /tmp/iop-agent-manifest-paths.txt)" && test -z "$(comm -13 /tmp/iop-agent-asset-universe.txt /tmp/iop-agent-manifest-paths.txt)"`
7. `awk -F '\t' 'NR>1 && $2=="state" && $1 !~ /^state:/ {bad=1} END {exit bad}' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv`

All inventory commands are fresh; cached output is not acceptable.

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