# Complete - m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue

## 완료 일시

2026-06-14

## 요약

Provider FIFO admission queue foundation을 3개 리뷰 루프 끝에 PASS 종결했다. 최종 루프에서 parent request timeout과 provider queue timeout cause 분리를 확인했고, queue admission/release/reject 경로의 deterministic test, race, node 패키지 전체, smoke 검증을 통과했다.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_cloud_G06_0.log` | `code_review_cloud_G06_0.log` | FAIL | gate composition이 adapter 대기 요청에 global slot을 선점시킬 수 있었고, repo 내부 edge-node full-cycle 증거가 부족했다. |
| `plan_cloud_G06_1.log` | `code_review_cloud_G06_1.log` | FAIL | parent `RunRequest.timeout_sec` deadline이 provider `queue_timeout`으로 오분류될 수 있었다. |
| `plan_cloud_G06_2.log` | `code_review_cloud_G06_2.log` | PASS | queue timeout cause를 `context.WithTimeoutCause`로 분리했고, parent deadline 회귀 테스트와 전체 검증을 통과했다. |

## 구현/정리 내용

- `permitManager` 기반 reject-on-exceed를 provider별 FIFO `fifoGate`/`admissionManager`/`admissionTicket` 흐름으로 교체했다.
- `OnRunRequest`가 요청을 `queued`로 기록한 뒤 capacity가 있으면 `running`으로 승격하고, capacity가 차면 provider FIFO queue에서 대기하도록 변경했다.
- 실행 완료, 실패, cancel, timeout 경로에서 ticket release가 queue head를 승격하도록 정리했다.
- `queue_full`, `queue_timeout`, `concurrency_unavailable` admission reason을 store error와 RunEvent error에 남기도록 했다.
- 교차 adapter global head-of-line blocking을 막기 위해 adapter slot이 grant된 뒤에만 global gate를 reserve/wait하도록 수정했다.
- provider queue timeout 전용 cause를 `context.WithTimeoutCause`로 분리해 parent request timeout이 `queue_timeout`으로 오분류되지 않게 했다.
- FIFO ordering, queue overflow, queue timeout, global wait timeout, parent deadline 회귀, release-on-failure/cancel/completion 테스트를 추가/갱신했다.

## 최종 검증

- `go test -count=1 ./apps/node/internal/node -run 'TestAdmissionQueue_.*Timeout|TestAdmissionQueue_GlobalNoCrossAdapterHeadOfLine'` - PASS; `ok   iop/apps/node/internal/node  2.367s`
- `go test -count=1 ./apps/node/internal/node` - PASS; `ok   iop/apps/node/internal/node  2.676s`
- `go test -race -count=1 ./apps/node/internal/node` - PASS; `ok   iop/apps/node/internal/node  3.973s`
- `go test -count=1 ./apps/node/...` - PASS; node 하위 패키지 전체 통과
- `./scripts/e2e-smoke.sh` - PASS; `[e2e] Auxiliary smoke test PASSED.`
- `git diff --check` - PASS
- `code_review_cloud_G06_1.log`의 repo 내부 edge-node 진단/full-cycle 증거 - PASS; `scripts/dev/edge.sh` + `scripts/dev/node.sh` 로컬 두 프로세스, fake-cli foreground/background/session command 흐름 통과

## Roadmap Completion

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/provider-availability-capacity-queue-foundation.md`
- Completed task ids:
  - `admission-gate`: PASS; evidence=`agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/plan_cloud_G06_2.log`, `agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/code_review_cloud_G06_2.log`; verification=`go test -count=1 ./apps/node/internal/node`, `go test -race -count=1 ./apps/node/internal/node`, `go test -count=1 ./apps/node/...`, `./scripts/e2e-smoke.sh`
  - `queue-release`: PASS; evidence=`agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/plan_cloud_G06_2.log`, `agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/code_review_cloud_G06_2.log`; verification=`go test -count=1 ./apps/node/internal/node`, `go test -race -count=1 ./apps/node/internal/node`, `go test -count=1 ./apps/node/...`, `./scripts/e2e-smoke.sh`
  - `queue-reject`: PASS; evidence=`agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/plan_cloud_G06_2.log`, `agent-task/archive/2026/06/m-provider-availability-capacity-queue-foundation/04+03_fifo_admission_queue/code_review_cloud_G06_2.log`; verification=`go test -count=1 ./apps/node/internal/node -run 'TestAdmissionQueue_.*Timeout|TestAdmissionQueue_GlobalNoCrossAdapterHeadOfLine'`, `go test -count=1 ./apps/node/internal/node`, `go test -race -count=1 ./apps/node/internal/node`, `go test -count=1 ./apps/node/...`, `./scripts/e2e-smoke.sh`
- Not completed task ids: 없음

## 잔여 Nit

- `apps/node/internal/node/run_manager.go`의 `admissionTicket.globalCh`/`queued`는 현재 읽히지 않는 private bookkeeping 필드다. 동작 영향은 없으며 후속 snapshot/observability 작업과 함께 정리 가능하다.

## 후속 작업

- 없음
