<!-- task=m-stream-evidence-gate-core/19+18_core_runtime_loop plan=10 tag=REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_CORE_RUNTIME_LOOP -->

# Plan - Runtime replacement와 deterministic lifecycle evidence closure

## 이 파일을 읽는 구현 에이전트에게

구현·테스트·검증을 완료한 뒤 active `CODE_REVIEW-cloud-G09.md`의 구현 에이전트 소유 섹션에 실제 변경 내용과 명령 stdout/stderr를 채우고, active 파일을 그대로 둔 채 review 준비 완료를 보고한다. 차단되면 정확한 blocker, 시도한 명령/출력, 재개 조건만 구현 evidence 필드에 기록한다. 사용자에게 질문하거나 선택지를 제시하거나 user-input 도구/control-plane stop 파일을 만들거나 다음 상태를 분류하지 않는다. verdict, log rename, `complete.log`, archive 이동은 code-review 전용이다.

## 배경

현재 runtime은 Arbiter가 선택한 replacement proposal을 무시하고 원본 event를 방출하며, replace-attempt handoff 뒤 runtime-owned response-start가 이전 attempt 값으로 남을 수 있다. 기존 lifecycle matrix는 S16의 ingress backpressure와 S13의 deterministic winner identity를 실행하지 않아 package/race PASS만으로 이 계약 위반을 탐지하지 못했다. 이 후속은 동일한 runtime owner loop에서 세 결함과 결정적 regression evidence를 함께 닫는다.

## Archive Evidence Snapshot

- 이전 Plan: `agent-task/m-stream-evidence-gate-core/19+18_core_runtime_loop/plan_cloud_G09_9.log`
- 이전 Review: `agent-task/m-stream-evidence-gate-core/19+18_core_runtime_loop/code_review_cloud_G09_9.log`
- 판정: `FAIL`
- 문제 수: Required 3, Suggested 0, Nit 0
- 문제 요약:
  - `runtime.go:785`가 `ArbitrationActionReplacement`를 release와 합쳐 proposal을 읽지 않고 원본 event를 방출한다.
  - `runtime.go:585-601`의 replace-attempt install이 boundary/tail/binding만 교체하고 runtime의 `stagedStart`를 지우지 않는다.
  - `runtime_test.go:1688-1840` lifecycle matrix에 runtime backpressure 행이 없고 simultaneous violation은 winner identity와 full trace를 확인하지 않는다.
- 영향 파일: `packages/go/streamgate/runtime.go`, `packages/go/streamgate/runtime_test.go`; ordered replacement를 serializer 안에서 원자적으로 방출하기 위해 `packages/go/streamgate/stream_release.go`를 같은 ownership 범위에 포함한다.
- 실제 검증 evidence:
  - `/config/.local/bin/go` → `/config/opt/go/bin/go`, Go `1.26.2`, `GOROOT=/config/opt/go`였다.
  - `make proto`, `go build ./packages/go/streamgate`, focused/package unit, focused/package race, gofmt, guard, import boundary, `git diff --check`는 fresh 실행에서 통과했다.
  - focused replacement reproducer는 proposal text `replacement` 대신 sink text `original`을 관찰해 실패했고 임시 probe 파일은 제거됐다.
  - `rg` 확인상 `TestRequestRuntimeLifecycleMatrix`에는 cap 0/1/3, evaluation error, cancellation, simultaneous violation만 있고 backpressure fixture가 없었다.
- 필요한 경우 위 두 archive log만 좁게 읽는다. `agent-task/archive/**`를 탐색하지 않는다.
- Roadmap carryover: 없음. 이 split subtask PASS만으로 Milestone 기능 Task 완료를 주장하지 않으므로 `Roadmap Targets`를 두지 않는다.

## 분석 결과

### 읽은 파일

- `packages/go/streamgate/runtime.go`
- `packages/go/streamgate/runtime_test.go`
- `packages/go/streamgate/stream_release.go`
- `packages/go/streamgate/commit_boundary.go`
- `packages/go/streamgate/decision_arbiter.go`
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/rules/common/rules-agent-spec.md`
- `agent-ops/rules/project/platform-common/rules.md`
- `agent-ops/rules/project/testing/rules.md`
- `agent-roadmap/current.md`
- `agent-roadmap/phase/knowledge-tool-optimization-extension/PHASE.md`
- `agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md`
- `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`
- `agent-spec/index.md`
- `agent-contract/index.md`
- `agent-test/local/rules.md`
- `agent-test/local/platform-common-smoke.md`
- `agent-test/local/testing-smoke.md`

### SDD 기준

- SDD: `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`, 상태 `[승인됨]`, SDD 잠금 `해제`.
- S13 → Milestone Task `decision-arbiter`: replacement가 원본 대신 단일 action으로 방출되고 priority/stable filter id winner가 하나여야 한다. Evidence Map의 single-action assertion을 replacement payload와 winner contributor assertion으로 반영한다.
- S16 → Milestone Task `vertical-slice`: request-to-recovery-to-release 실제 cycle에서 backpressure와 simultaneous violation single retry를 검증한다. Evidence Map의 one-cycle assertion을 channel barrier, `NextEvent` call count, dispatch/terminal/full trace로 반영한다.
- S17 → Milestone Task `commit-boundary`: original response-start를 숨기고 retry 성공 attempt의 start/output만 한 번 노출한다. Evidence Map의 original start hidden/final start once assertion을 replace opening 격리 test에 반영한다.
- 위 행에서 구현 체크리스트의 replacement substitution, attempt-local start reset, backpressure/winner regression과 최종 focused/race 명령을 역산했다. 이 plan은 해당 Milestone Task 전체 완료를 주장하지 않는다.

### 테스트 환경 규칙

- `test_env=local`; `agent-test/local/rules.md`를 읽었다.
- 매칭 profile `agent-test/local/platform-common-smoke.md`와 `agent-test/local/testing-smoke.md`를 읽었다. 현재 변경은 `packages/go/**`에 해당하므로 host Go identity, `make proto`, 대상 package fresh unit/race, `git diff --check`를 적용한다.
- profile의 repo root 기록은 `/config/workspace/iop`이지만 실제 선택 checkout/workdir은 `/config/workspace/iop-s0`이다. 모든 명령은 현재 checkout root에서 실행하며 다른 checkout 또는 external runner로 나가지 않는다.
- Edge/Node 사용자 실행 경로, wire schema, script, external service를 바꾸지 않으므로 transport unit, mock/full-cycle, live provider preflight는 이 task의 필수 검증이 아니다.
- cached Go test 출력은 허용하지 않으며 모든 Go test에 `-count=1`을 쓴다. test-rule maintenance는 필요 없다.

### 테스트 커버리지 공백

- replacement proposal 선택: Arbiter 단위 테스트는 proposal 보존을 확인하지만 actual `RequestRuntime.Run` → sink payload 대체는 기존 테스트가 다루지 않는다. regression 필요.
- replace-attempt response-start 격리: boundary 자체는 staged start를 지우지만 runtime mirror의 stale 값이 새 `EvidenceBatch`와 sink에 노출되지 않는 test가 없다. regression 필요.
- evaluation backpressure: gate/evaluator 단위 동작과 cancellation은 있으나 runtime owner loop가 evaluation 중 다음 `NextEvent`를 호출하지 않는 assertion이 없다. regression 필요.
- simultaneous winner: 기존 runtime 행은 dispatch/terminal count만 확인한다. selected filter/rule/contributor와 abort→rebuild→dispatch→terminal 전체 순서 assertion이 필요하다.
- package unit/race와 기존 pass-through/recovery tests는 일반 회귀에는 유효하므로 유지한다.

### 심볼 참조

- rename/remove 없음.
- 새 helper는 package-private로 두고 `RequestRuntime.Run` replacement branch 한 곳에서만 호출한다. public API 또는 import chain 변경 없음.

### 분할 판단

- split decision policy를 파일 선택 전에 평가했다.
- 이미 dependency `18` 아래의 split subtask `19+18_core_runtime_loop`가 runtime owner loop를 소유한다. replacement release, replace-attempt state reset, ingress backpressure/winner evidence는 같은 `RequestRuntime.Run` switch와 같은 fixture/sink/trace를 공유하며 별도 public API나 외부 call-site rollout이 없다.
- production과 regression을 나누면 각 child가 독립 PASS 증거를 만들 수 없고 같은 상태기계 변경을 중복 조정해야 한다. 새 sibling 없이 현재 task 디렉터리의 단일 follow-up pair가 가장 작은 독립 검토 단위다.
- predecessor `18`의 완료 여부는 기존 subtask 생성 시 확정된 dependency이며 이번 follow-up은 task directory 이름을 변경하지 않는다.

### 범위 결정 근거

- `decision_arbiter.go`와 `filter_contract.go`의 proposal 선택/불변성 계약은 이미 정상이며 변경하지 않는다.
- `commit_boundary.go`의 attempt replacement와 staged-start clear는 정상이라 변경하지 않는다.
- `evidence_tail.go`의 일반 pending/look-behind state model, transport adapter, consumer adoption, observation, roadmap 상태는 변경하지 않는다.
- replacement serializer helper는 package-private로 제한하고 broader release API나 schema를 추가하지 않는다.

### 최종 라우팅

- evaluation_mode: `isolated-reassessment`
- finalizer: `finalize-task-policy.sh`; finalizer_mode: `pair`
- build closures: `scope_closed=true`, `context_closed=true`, `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`.
  - scope/context: 세 Required의 실패 경로와 `runtime.go`, `stream_release.go`, `runtime_test.go` 영향 경계가 source/probe/SDD로 닫혔다.
  - verification/evidence: exact payload/start/terminal, `NextEvent` count, contributor/full trace와 fresh unit/race 명령으로 판정 가능하다.
  - ownership/decision: package-local runtime owner loop 안에서 끝나며 사용자 결정·secret·외부 환경이 필요 없다.
- build route_basis: `grade-boundary`; capability_gap: `none`; grade scores: `scope_coupling=2`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=2`, `verification_complexity=2`; lane/grade/file: `cloud`, `G09`, `PLAN-cloud-G09.md`; floor: `none`.
- review closures: `scope_closed=true`, `context_closed=true`, `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`.
- review route_basis: `official-review`; capability_gap: `none`; grade scores: `scope_coupling=2`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=2`, `verification_complexity=2`; lane/grade/file: `cloud`, `G09`, `CODE_REVIEW-cloud-G09.md`; adapter/model/effort: `codex`, `gpt-5.6-sol`, `xhigh`; floor: `none`.
- build loop-risk observations:
  - ordered_transitions: state_count=6, adverse_paths=`replacement|replace-attempt|stale-start|partial-sink-failure|cancel`; evidence=`runtime.go:566-620,623-815`.
  - concurrent_consistency: actor_count=3 (`runtime owner loop`, `gate filter workers`, `sink callbacks`), constraints=`single-flight ingress, serializer ownership, exactly-once start/terminal`; evidence=`runtime.go:639-815`, `stream_release.go:76-164`.
  - boundary_contract: component_count=7 (`runtime`, `tail`, `gate`, `arbiter`, `releaser`, `boundary`, `sink`), consumer_count=1, constraints=`ordered substitution, attempt-local metadata, immutable proposal`; evidence=`decision_arbiter.go`, `commit_boundary.go`, `stream_release.go`.
  - structured_interpretation: mechanisms=0, hazards=[]; source에 parser/merge 변경이 없다.
  - variant_product: independent_axis_count=4 (`release/replacement`, `old/new start`, `priority/stable-id winner`, `evaluation blocked/released`), combination_verification_required=true.
  - matched signatures: `temporal_state`, `concurrent_consistency`, `boundary_contract`, `variant_product`; triggered=true.
- missing_evidence: `[]`; blocked_reason: `null`.

## 구현 체크리스트

- [ ] replacement action이 proposal의 ordered events만 serializer/boundary로 방출하고 원본 pending event를 폐기하도록 고치며 exact payload·start·terminal regression을 통과시킨다.
- [ ] replace-attempt install에서 runtime-owned staged response-start를 attempt-local하게 초기화하고 old start 은닉/new start 단일 노출 regression을 통과시킨다.
- [ ] lifecycle matrix에 deterministic runtime backpressure와 simultaneous winner identity/full trace assertion을 추가한다.
- [ ] environment/proto/build/focused/package/race/format/guard/import/diff 명령을 fresh 실행하고 실제 stdout/stderr를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_CORE_RUNTIME_LOOP-1] Ordered replacement substitution

#### 문제

`packages/go/streamgate/runtime.go:784-815`는 `ArbitrationActionReplacement`를 release와 같은 case로 묶고 `ReplacementProposal()`을 읽지 않는다. 따라서 Arbiter가 replacement를 선택해도 pass-through면 원본 `ev`, buffered면 원본 epoch가 sink로 전송된다.

#### 해결 방법

Before (`packages/go/streamgate/runtime.go:784-815`):

```go
switch arbResult.Action() {
case ArbitrationActionRelease, ArbitrationActionReplacement:
    useUnbuffered := passThrough || !r.tail.HasUnconfirmedEvents(epoch.ID())
    // ...
    if useUnbuffered {
        _, errRel := r.releaser.ReleasePassThroughEvent(ctx, binding.AttemptID(), ev)
        // ...
    }
}
```

After:

```go
switch arbResult.Action() {
case ArbitrationActionRelease:
    // existing original-event/epoch release path
case ArbitrationActionReplacement:
    proposal := arbResult.ReplacementProposal()
    if err := r.releaser.releaseReplacementEvents(ctx, binding.AttemptID(), proposal.Events()); err != nil {
        return err
    }
}
```

`stream_release.go`의 package-private helper는 모든 proposal event를 먼저 `ReleaseEvent`로 변환하고 하나의 serializer reservation 안에서 원본 pending epoch를 폐기한 뒤 `CommitBoundary.ReleaseSafe`에 ordered slice를 한 번 전달한다. 변환 실패 전에는 tail/sink를 변경하지 않고, sink partial failure는 boundary progress/error를 그대로 반환한다. terminal replacement는 별도 terminal action 계약이므로 releasable delta/tool fragment 외 kind를 fail-closed한다.

#### 수정 파일 및 체크리스트

- [ ] `packages/go/streamgate/runtime.go`: release와 replacement branch를 분리하고 nil/invalid proposal를 fail-closed한다.
- [ ] `packages/go/streamgate/stream_release.go`: package-private ordered replacement helper로 conversion→pending discard→single boundary release를 serializer 안에서 수행한다.
- [ ] `packages/go/streamgate/runtime_test.go`: 원본 suppression, replacement order/payload, start once, terminal once와 sink failure를 actual `Run` path에서 assertion한다.

#### 테스트 작성

- 작성: `packages/go/streamgate/runtime_test.go`의 `TestRequestRuntimeReplacementProposalRelease`.
- fixture: distinct original/replacement text, staged start, replacement filter, success terminal, recorder sink; failure subtest는 configured release error를 사용한다.
- assertion: sink event는 replacement 순서와 payload만 포함하고 original은 0회, start/terminal은 각각 정확히 1회이며 error 경로는 후속 event를 방출하지 않는다.

#### 중간 검증

- `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeReplacementProposalRelease$'`
- 기대 결과: 모든 subtest PASS, original payload 미노출, replacement/start/terminal exact count/order.

### [REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_CORE_RUNTIME_LOOP-2] Replace-attempt response-start isolation

#### 문제

`packages/go/streamgate/runtime.go:585-601`의 successful replace install은 binding/filter/tail/releaser를 바꾸지만 `r.stagedStart`를 유지한다. 새 attempt가 response-start 전에 평가 event를 보내면 `runtime.go:756-770`이 old attempt status/header를 새 `EvidenceBatch`에 전달할 수 있다.

#### 해결 방법

Before (`packages/go/streamgate/runtime.go:596-601`):

```go
r.mu.Lock()
r.currentBinding = candidate.binding
r.resolvedFilters = candidate.resolvedFilters
r.tail = candidate.tail
r.releaser = candidate.releaser
r.mu.Unlock()
```

After:

```go
r.mu.Lock()
r.currentBinding = candidate.binding
r.resolvedFilters = candidate.resolvedFilters
r.tail = candidate.tail
r.releaser = candidate.releaser
r.stagedStart = nil
r.mu.Unlock()
```

clear는 boundary handoff와 candidate preparation이 성공한 뒤 runtime state install과 같은 critical section에서 수행한다. prepare/commit 실패 시 기존 runtime mirror는 건드리지 않는다. 새 attempt response-start가 오면 기존 staging path가 새 값만 저장한다.

#### 수정 파일 및 체크리스트

- [ ] `packages/go/streamgate/runtime.go`: successful replace-attempt install에서 `stagedStart`를 같은 lock 아래 초기화한다.
- [ ] `packages/go/streamgate/runtime_test.go`: old start 뒤 exact-replay replace와 no-new-start/new-start 두 경로를 검증한다.

#### 테스트 작성

- 작성: `packages/go/streamgate/runtime_test.go`의 `TestRequestRuntimeReplaceAttemptStagedStartIsolation`.
- fixture: old attempt `418`/`X-Attempt: old`, new attempt는 start 없음 또는 `200`/`X-Attempt: new`, filter가 새 attempt batch의 `ResponseStart`를 기록한다.
- assertion: no-new-start batch는 nil이고 old header/status는 sink에 0회, new-start 경로는 new 값만 sink에 정확히 1회 노출한다.

#### 중간 검증

- `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeReplaceAttemptStagedStartIsolation$'`
- 기대 결과: old metadata 미관찰/미commit, new metadata exact once.

### [REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_REVIEW_CORE_RUNTIME_LOOP-3] Runtime backpressure와 deterministic winner evidence

#### 문제

`packages/go/streamgate/runtime_test.go:1688-1840`에는 cancellation barrier는 있지만 evaluation 중 다음 ingress가 멈춘다는 assertion이 없다. `runtime_test.go:1805-1838`의 simultaneous violation 행은 dispatch/terminal 수만 확인해 priority/stable-id로 선택된 filter/rule/plan과 전체 side-effect 순서를 증명하지 않는다.

#### 해결 방법

Before (`packages/go/streamgate/runtime_test.go:1833-1838`):

```go
if err := runtime.Run(context.Background()); err != nil {
    t.Fatalf("Run: %v", err)
}
if len(dispatcher.dispatched) != 1 || len(sink.terminals) != 1 {
    t.Fatalf("dispatch/terminal count = %d/%d, want 1/1", len(dispatcher.dispatched), len(sink.terminals))
}
```

After:

```go
// backpressure: filter barrier entered 이후 source call count는 그대로다.
// winner: dispatched request의 contributor filter/rule과 full trace를 비교한다.
```

channel-gated source는 mutex-protected `NextEvent` call count를 제공하고 첫 evaluation filter가 release channel 전까지 block한다. `entered` close의 happens-before 뒤 count를 즉시 확인해 sleep/timeout 기반 추측 없이 다음 ingress가 시작되지 않았음을 증명한다. simultaneous row는 rebuilder가 받은 `RecoveryPlan.Contributors()`의 filter/rule과 trace의 abort→rebuild→dispatch→terminal을 exact 비교한다.

#### 수정 파일 및 체크리스트

- [ ] `packages/go/streamgate/runtime_test.go`: channel-gated counted source와 filter barrier를 추가하고 evaluation 중 `NextEvent` count 불변을 assertion한다.
- [ ] `packages/go/streamgate/runtime_test.go`: rebuilder fixture가 selected plan contributor를 보존하도록 하고 simultaneous winner의 filter/rule/priority와 full trace를 assertion한다.
- [ ] `packages/go/streamgate/runtime_test.go`: goroutine completion/error를 channel로 회수하고 sleep, leaked goroutine, ignored error를 남기지 않는다.

#### 테스트 작성

- 작성: `TestRequestRuntimeLifecycleMatrix/backpressure_blocks_next_ingress`와 강화된 `simultaneous_violation_single_winner`.
- assertion: barrier 중 source call count 고정, release 뒤 정상 종료, winner contributor exact identity, dispatch/terminal exactly once, full trace 일치.

#### 중간 검증

- `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeLifecycleMatrix$'`
- `go test -race -count=1 ./packages/go/streamgate -run '^TestRequestRuntimeLifecycleMatrix$'`
- 기대 결과: lifecycle 모든 행 PASS, race 없음, backpressure/winner exact assertion 실행.

## 의존 관계 및 구현 순서

1. replacement serializer helper와 runtime branch를 구현해 원본 pending 처리 경계를 고정한다.
2. replace install의 attempt-local staged start를 초기화한다.
3. 두 동작의 regression과 backpressure/winner matrix를 완성한 뒤 전체 fresh 검증을 실행한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `packages/go/streamgate/runtime.go` | 1, 2 |
| `packages/go/streamgate/stream_release.go` | 1 |
| `packages/go/streamgate/runtime_test.go` | 1, 2, 3 |

## 최종 검증

- Environment: `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
- Proto: `make proto`
- Build: `go build ./packages/go/streamgate`
- Formatting: `gofmt -d packages/go/streamgate/runtime.go packages/go/streamgate/runtime_test.go packages/go/streamgate/stream_release.go`
- Replacement: `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeReplacementProposalRelease$'`
- Attempt start isolation: `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeReplaceAttemptStagedStartIsolation$'`
- Lifecycle matrix: `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeLifecycleMatrix$'`
- Focused behavior: `go test -count=1 -v ./packages/go/streamgate -run '^(TestRequestRuntimeReplacementProposalRelease|TestRequestRuntimeReplaceAttemptStagedStartIsolation|TestRequestRuntimePassThroughMatrix|TestRequestRuntimeContinuationLifecycle|TestRequestRuntimeAtomicInstallFailure|TestRequestRuntimeLifecycleMatrix|TestStreamReleaserPassThroughAndTerminal)$'`
- Snapshot contract: `go test -count=1 -v ./packages/go/streamgate -run '^TestRequestRuntimeSnapshotContract'`
- Focused race: `go test -race -count=1 ./packages/go/streamgate -run '^(TestRequestRuntimeReplacementProposalRelease|TestRequestRuntimeReplaceAttemptStagedStartIsolation|TestRequestRuntimeLifecycleMatrix)$'`
- Package unit: `go test -count=1 ./packages/go/streamgate`
- Package race: `go test -race -count=1 ./packages/go/streamgate`
- Ignored-error/debug guard: `! rg -n --sort path 'DEBUG|, _ := New|_ = New|desc, _ :=|cause, _ :=|causes, _ :=' packages/go/streamgate/runtime.go packages/go/streamgate/runtime_test.go packages/go/streamgate/stream_release.go`
- Import boundary: `! rg -n --sort path 'iop/apps/' packages/go/streamgate/runtime.go packages/go/streamgate/runtime_test.go packages/go/streamgate/stream_release.go`
- Diff: `git diff --check`
- 기대 결과: 모든 명령 exit 0, gofmt/guard/import/diff 출력 없음, exact payload/start/terminal/backpressure/winner assertion과 모든 test fresh PASS. cached Go test 출력은 허용하지 않는다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다.
