<!-- task=m-iop-agent-chronos-extraction-decoupling/01_asset_universe plan=3 tag=REVIEW_REVIEW_TEST -->

# Correct the Dart Test Kind in the Asset Universe

## For the Implementing Agent

Filling the implementation-owned sections of `CODE_REVIEW-cloud-G03.md` is mandatory. Run every verification command, record actual notes and output, keep the active pair in place, and report ready for review. Finalization belongs only to the code-review agent. If blocked, record the exact blocker, attempted commands/output, and resume condition in 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 293-path union, provenance, schema, ordering, duplicate, and semantic-drift checks now pass, but the manifest classifies the Flutter test `packages/flutter/iop_console/test/iop_console_shell_test.dart` as `source`. The prior follow-up explicitly requires Go and Dart tests to use `kind=test`, and its audits do not validate that semantic field. This follow-up fixes the one row and adds a deterministic kind-classification regression audit without changing product source or downstream disposition fields.

## Archive Evidence Snapshot

- Current loop evidence after finalization: `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/plan_cloud_G06_2.log` and `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/code_review_cloud_G06_2.log`.
- Verdict: FAIL. Findings: Required=1, Suggested=0, Nit=0.
- Required fix: classify `packages/flutter/iop_console/test/iop_console_shell_test.dart` as `test` and add a deterministic audit for Go and Dart test-kind semantics.
- Fresh review evidence: schema reported 293 valid sorted unique rows; the union reported `missing=0 orphan=0 duplicate=0`; semantic drift reported `uncovered_drift=0`; the added reviewer audit reported `NON_TEST_KIND 149 packages/flutter/iop_console/test/iop_console_shell_test.dart ... kind=source`.
- Roadmap carryover: this child remains a prerequisite input for S01/`inventory`; it must not claim Roadmap Task completion or classify dispositions owned by children 02–03.

## Analysis

### Files Read

- `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/PLAN-cloud-G06.md`
- `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/CODE_REVIEW-cloud-G06.md`
- `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/plan_local_G03_1.log`
- `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/code_review_cloud_G03_1.log`
- `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv`
- `packages/flutter/iop_console/test/iop_console_shell_test.dart`
- `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-spec/index.md`
- `agent-spec/runtime/iop-agent-cli-runtime.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`

### SDD Criteria

- SDD: `agent-roadmap/sdd/automation-runtime-bridge/iop-agent-chronos-extraction-decoupling/SDD.md`; status `[승인됨]`; lock released.
- Targeted scenario/task: S01 / `inventory`.
- Evidence Map input: source revision, import graph, disposition audit, and a manifest with no unclassified or duplicated active assets.
- This follow-up preserves S01's deterministic asset-universe input and makes its `kind` semantics auditable. It intentionally omits `Roadmap Targets` because disposition classification and final S01 closure remain owned by children 02–03.

### Verification Context

- No external handoff was supplied. Repository-native fallback used the approved revision `3155be0e275437a8eedc1aa93497955a7d30465b`, the active manifest, the classified Dart test file, and fresh `awk`, `git`, `rg`, `sort`, and `comm` evidence.
- Local preflight found `/config/workspace/iop-s1/go.mod`; the installed Go toolchain is `go1.26.2` while project metadata declares Go 1.24, but no Go build or product test is needed for this TSV-only correction.
- Fresh reviewer execution reproduced all three recorded outputs: 293 schema-valid sorted unique rows, an exact 293-path union with zero missing/orphan/duplicate paths, and `uncovered_drift=0` with the semantic `ProviderTunnelRequest.Operation` addition shown.
- A deterministic reviewer audit found exactly one test-kind mismatch: the Flutter file under `packages/flutter/iop_console/test/` is `source`; all Go `_test.go` rows are already `test` and no other non-test row is classified as `test`.
- No external service, credential, daemon, `iop-agent`, repo-internal Edge/Node diagnostic, E2E smoke, or full-cycle runtime is required. Confidence: high.

### Test Coverage Gaps

- No runtime behavior changes, so Go and Flutter product tests are not required.
- The existing inventory audits do not validate `kind`. This follow-up adds a deterministic bidirectional test-kind audit covering Go `_test.go`, Dart `_test.dart`, and Dart files under a `/test/` directory.

### Symbol References

- None. No symbol is renamed or removed.

### Split Judgment

- Keep one compact plan. The one-row correction and its semantic regression audit form one independently verifiable manifest invariant; splitting them would not produce a useful intermediate state.

### Scope Rationale

- Included: the one `kind` field in `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` and implementation evidence in the next review stub.
- Excluded: product source, manifest path membership, provenance, bundle paths, dispositions, IOP actions, neutral successors, Chronos writes, and Roadmap Task completion. Existing unrelated dirty worktree changes remain untouched.

### Final Routing

- `evaluation_mode=isolated-reassessment`; finalizer=`finalize-task-policy.sh`; mode=`pair`.
- Build closures are all true. Scores=`1,0,0,1,1`, grade=`G03`, base=`local-fit`, route=`recovery-boundary`, lane=`cloud`.
- Review closures are all true. Scores=`1,0,0,1,1`, grade=`G03`, route=`official-review`, lane=`cloud`.
- `large_indivisible_context=false`; positive loop risks=`boundary_contract,structured_interpretation` (2); `review_rework_count=2`; `evidence_integrity_failure=false`; recovery boundary matched; no capability gap.
- Canonical files: `PLAN-cloud-G03.md`, `CODE_REVIEW-cloud-G03.md`.

## Implementation Checklist

- [ ] Change the Flutter test manifest row from `kind=source` to `kind=test`, preserve every other row and field, and run the deterministic kind, schema, union, and semantic-drift audits.
- [ ] Fill implementation-owned sections in CODE_REVIEW-*-G??.md with actual implementation notes and verification output.

### [REVIEW_REVIEW_TEST-1] Correct and verify test-kind semantics

**Problem**

The manifest's only Dart test is classified as source even though the prior plan requires both Go and Dart tests to use `kind=test`.

```text
# scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv:149
packages/flutter/iop_console/test/iop_console_shell_test.dart\tsource\tpending\tpackages\tnone\tnone\trev:3155be0e275437a8eedc1aa93497955a7d30465b
```

The existing audits validate the seven-column schema and path set but do not validate `kind`, so all three commands can pass with this semantic error.

**Solution**

Change only the second field of the Dart test row and add a deterministic verification command that checks test paths and `kind=test` in both directions.

```text
# after
packages/flutter/iop_console/test/iop_console_shell_test.dart\ttest\tpending\tpackages\tnone\tnone\trev:3155be0e275437a8eedc1aa93497955a7d30465b
```

**Modified Files and Checklist**

- [ ] `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` — change the Dart test row's kind and preserve all other fields and rows.
- [ ] `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/CODE_REVIEW-cloud-G03.md` — record the exact fix and fresh verification output.

**Test Strategy**

- Do not add product tests because runtime behavior is unchanged.
- Use a deterministic regression audit over every manifest row. It must fail when a Go `_test.go`, Dart `_test.dart`, or Dart file under `/test/` is not `kind=test`, and when a path outside those patterns is incorrectly `kind=test`.

**Verification**

- Run the kind-classification command from Final Verification; expect `test_paths=104 kind_classification=ok` and exit 0.
- Rerun the schema, exact-union, and semantic-drift commands; expect the prior 293-path evidence to remain unchanged and every command to exit 0.

## Modified Files Summary

| File | Item |
|------|------|
| `scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv` | REVIEW_REVIEW_TEST-1 |
| `agent-task/m-iop-agent-chronos-extraction-decoupling/01_asset_universe/CODE_REVIEW-cloud-G03.md` | REVIEW_REVIEW_TEST-1 |

## Final Verification

1. Test-kind classification:

   ```bash
   awk -F '\t' 'NR == 1 { next } { is_test = ($1 ~ /_test\.go$/ || $1 ~ /_test\.dart$/ || $1 ~ /\/test\/.*\.dart$/); if (is_test) { test_paths++; if ($2 != "test") { print "TEST_KIND_MISMATCH:" $1 ":" $2; bad=1 } } else if ($2 == "test") { print "NON_TEST_KIND:" $1; bad=1 } } END { printf "test_paths=%d kind_classification=%s\n", test_paths, bad ? "mismatch" : "ok"; exit bad }' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv
   ```

2. Schema, fields, ordering, and duplicates:

   ```bash
   awk -F '\t' 'BEGIN { expected="path\tkind\tdisposition\tbundle_path\tiop_action\tneutral_successor\tevidence" } NR==1 { if ($0 != expected) { print "HEADER_MISMATCH"; bad=1 }; next } { rows++; if (NF != 7) { print "FIELD_COUNT:" NR; bad=1 }; if (seen[$1]++) { print "DUPLICATE:" $1; duplicates++; bad=1 }; if (previous != "" && $1 < previous) { print "OUT_OF_ORDER:" $1; bad=1 }; previous=$1 } END { printf "rows=%d schema=%s fields=%s order=%s duplicates=%d\n", rows, bad ? "check-output" : "ok", bad ? "check-output" : "ok", bad ? "check-output" : "ok", duplicates; if (rows < 1 || bad) exit 1 }' scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv
   ```

3. Exact fixed-revision plus active-reference union:

   ```bash
   set -euo pipefail
   ref=3155be0e275437a8eedc1aa93497955a7d30465b
   audit_root=$(mktemp -d)
   trap 'find "$audit_root" -type f -delete; rmdir "$audit_root"' EXIT
   git cat-file -e "$ref^{commit}"
   { git ls-tree -r --name-only "$ref" -- apps/agent cmd/iop-provider-smoke 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 cmd 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 > "$audit_root/expected"
   cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | LC_ALL=C sort -u > "$audit_root/actual"
   missing=$(comm -23 "$audit_root/expected" "$audit_root/actual" | wc -l)
   orphan=$(comm -13 "$audit_root/expected" "$audit_root/actual" | wc -l)
   duplicate=$(cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | LC_ALL=C sort | uniq -d | wc -l)
   printf 'expected=%s manifest=%s missing=%s orphan=%s duplicate=%s\n' "$(wc -l < "$audit_root/expected")" "$(wc -l < "$audit_root/actual")" "$missing" "$orphan" "$duplicate"
   test "$missing" -eq 0
   test "$orphan" -eq 0
   test "$duplicate" -eq 0
   ```

4. Current semantic-drift coverage:

   ```bash
   set -euo pipefail
   ref=3155be0e275437a8eedc1aa93497955a7d30465b
   audit_root=$(mktemp -d)
   trap 'find "$audit_root" -type f -delete; rmdir "$audit_root"' EXIT
   git diff --name-only "$ref" -- apps/agent cmd/iop-provider-smoke 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 | LC_ALL=C sort -u | tee "$audit_root/drift"
   git diff --unified=0 "$ref" -- packages/go/agentruntime/types.go | rg --sort path '^\+.*(Operation|protocol operation id|operation path)'
   cut -f1 scripts/fixtures/iop-agent-chronos-ownership-manifest.tsv | tail -n +2 | LC_ALL=C sort -u > "$audit_root/actual"
   uncovered=$(comm -23 "$audit_root/drift" "$audit_root/actual" | wc -l)
   printf 'uncovered_drift=%s\n' "$uncovered"
   test "$uncovered" -eq 0
   ```

All inventory commands must run fresh against the current checkout. No Go or Flutter test cache is used because no product test command is required.

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