docs(agent-task): OpenAI 재구성 검토 근거를 기록한다

This commit is contained in:
toki 2026-07-26 21:07:37 +09:00
parent c1c1e19678
commit 071cd2427b

View file

@ -56,16 +56,16 @@ task=m-stream-evidence-gate-core/17+13,16_openai_request_rebuilder, plan=1, tag=
| 항목 | 완료 여부 |
|------|---------|
| REVIEW_OPENAI_REBUILDER-1 실제 backing과 ledger 일치 | [ ] |
| REVIEW_OPENAI_REBUILDER-2 bounded one-shot patch lifecycle | [ ] |
| REVIEW_OPENAI_REBUILDER-3 통합 검증 신뢰도 복구 | [ ] |
| REVIEW_OPENAI_REBUILDER-1 실제 backing과 ledger 일치 | [x] |
| REVIEW_OPENAI_REBUILDER-2 bounded one-shot patch lifecycle | [x] |
| REVIEW_OPENAI_REBUILDER-3 통합 검증 신뢰도 복구 | [x] |
## 구현 체크리스트
- [ ] REVIEW_OPENAI_REBUILDER-1 Core owned backing/commit과 OpenAI canonical/rebuilt dispatch lease를 추가해 실제 live backing과 retained/peak를 일치시킨다.
- [ ] REVIEW_OPENAI_REBUILDER-2 continuation/schema patch를 동일 상한에 one-shot 예약하고 duplicate/overflow/close/cancel에서 즉시 해제한다.
- [ ] REVIEW_OPENAI_REBUILDER-3 near-limit/release 회귀, fresh unit/race, OpenAI smoke와 실제 entrypoint full-cycle evidence를 완성한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.
- [x] REVIEW_OPENAI_REBUILDER-1 Core owned backing/commit과 OpenAI canonical/rebuilt dispatch lease를 추가해 실제 live backing과 retained/peak를 일치시킨다.
- [x] REVIEW_OPENAI_REBUILDER-2 continuation/schema patch를 동일 상한에 one-shot 예약하고 duplicate/overflow/close/cancel에서 즉시 해제한다.
- [x] REVIEW_OPENAI_REBUILDER-3 near-limit/release 회귀, fresh unit/race, OpenAI smoke와 실제 entrypoint full-cycle evidence를 완성한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.
## 코드리뷰 전용 체크리스트
@ -85,11 +85,18 @@ task=m-stream-evidence-gate-core/17+13,16_openai_request_rebuilder, plan=1, tag=
## 계획 대비 변경 사항
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
- 계획의 production/test 범위와 공개 계약은 그대로 구현했다.
- `json.RawMessage` semantic view가 canonical과 같은 backing일 때 `json.Marshal`로 동일 full-body를 잠시 복제하지 않도록, validated raw alias를 직접 ownership-transfer하는 최적화를 함께 적용했다. 이는 REVIEW_OPENAI_REBUILDER-1의 실제 backing 일치 조건을 만족하기 위한 범위 내 보강이다.
- 실제 entrypoint 검증은 기본 config를 수정하지 않고 `/tmp/iop-g10-full-cycle.C75Cpy`의 임시 config/FIFO/deterministic persistent `fake-cli` harness로 수행했다. 첫 harness 실행은 Node의 multiline payload 중 첫 줄만 `[node-message]` prefix를 갖는 출력 형식을 extractor가 잘못 해석해 validator만 실패했다. 실제 Edge/Node 원문은 정상 순서였으며, multiline-aware extractor로 전체 cycle을 새로 실행해 exit 0과 payload equality를 확인했다.
- 실행 중 병렬 선행 task가 `packages/go/streamgate/runtime.go`를 작성하던 순간 REVIEW_OPENAI_REBUILDER-2 명령이 compile 실패했으나, 해당 범위에 손대지 않고 선행 작업 종료 뒤 같은 명령을 fresh 재실행해 통과했다. 아래에는 최종 안정 상태의 원문 출력을 기록한다.
## 주요 설계 결정
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
- 기존 defensive-copy `IssueBackingHandle`/`CommitTyped`/accessor는 호환 유지하고, opt-in `IssueOwnedBackingHandle`/`CommitOwnedTyped`와 lifetime-bound read-only alias accessor만 추가했다.
- OpenAI canonical, exact replay, rebuilt output은 각각 하나의 owned backing만 보존한다. `openAIRebuiltLease`가 synchronous provider submission 동안 exact 또는 rebuilt body alias와 snapshot/guard를 붙잡고, submission 반환 직후 exactly-once release한다.
- byte token estimator는 `[]byte`에서 UTF-8 rune을 직접 세어 기존 string estimator와 invalid UTF-8까지 동일한 결과를 내면서 full-body string 변환을 제거한다.
- continuation/schema patch는 ingress의 같은 rebuild reservation ledger에 넣고 duplicate를 거부하며, directive take 시 map에서 제거하는 one-shot 소유권으로 처리한다. success/error/context cancel/Close에서 guard와 slice를 정확히 한 번 해제하고, output reservation은 살아 있는 patch reservation을 포함한 current peak를 검사한다.
- exact owned peak와 peak-1 overflow fixture가 canonical + patch + output 실제 backing 합계를 직접 검증하고, overflow에서는 patch/rebuilt lease/reservation이 모두 0으로 수렴하는지 확인한다.
## 리뷰어를 위한 체크포인트
@ -110,7 +117,10 @@ _구현 에이전트가 주요 설계 결정 사항을 기록한다._
_실제 출력:_
```text
미실행
/config/.local/bin/go
/config/opt/go/bin/go
go version go1.26.2 linux/arm64
/config/opt/go
```
### REVIEW_OPENAI_REBUILDER-1 중간 검증
@ -120,7 +130,8 @@ _실제 출력:_
_실제 출력:_
```text
미실행
ok iop/packages/go/streamgate 0.878s
ok iop/apps/edge/internal/openai 6.768s
```
### REVIEW_OPENAI_REBUILDER-2 중간 검증
@ -130,7 +141,9 @@ _실제 출력:_
_실제 출력:_
```text
미실행
ok iop/apps/edge/internal/openai 0.021s
ok iop/packages/go/streamgate 1.929s
ok iop/apps/edge/internal/openai 8.103s
```
### REVIEW_OPENAI_REBUILDER-3 중간 OpenAI smoke
@ -140,7 +153,8 @@ _실제 출력:_
_실제 출력:_
```text
미실행
./scripts/e2e-openai-ollama.sh
[openai-ollama] OpenAI-compatible Ollama serving test PASSED.
```
### 최종 format
@ -150,7 +164,7 @@ _실제 출력:_
_실제 출력:_
```text
미실행
(출력 없음, exit 0)
```
### 최종 fresh unit
@ -160,7 +174,10 @@ _실제 출력:_
_실제 출력:_
```text
미실행
ok iop/packages/go/streamgate 0.870s
ok iop/packages/go/config 0.058s
ok iop/apps/edge/internal/openai 6.755s
ok iop/apps/edge/internal/service 5.863s
```
### 최종 race
@ -170,7 +187,8 @@ _실제 출력:_
_실제 출력:_
```text
미실행
ok iop/packages/go/streamgate 2.918s
ok iop/apps/edge/internal/openai 8.002s
```
### 미계상 copy search
@ -180,7 +198,7 @@ _실제 출력:_
_실제 출력:_
```text
미실행
(출력 없음, exit 0)
```
### 최종 OpenAI smoke
@ -190,7 +208,8 @@ _실제 출력:_
_실제 출력:_
```text
미실행
./scripts/e2e-openai-ollama.sh
[openai-ollama] OpenAI-compatible Ollama serving test PASSED.
```
### 실제 entrypoint full-cycle
@ -200,7 +219,40 @@ _실제 출력:_
_실제 명령·stdout/stderr 또는 blocker와 재개 조건:_
```text
미실행
$ cycle_dir=$(mktemp -d /tmp/iop-g10-full-cycle.XXXXXX)
$ IOP_EDGE_CONFIG="$cycle_dir/edge.yaml" ./scripts/dev/edge.sh < "$cycle_dir/edge.fifo" > "$cycle_dir/edge.out" 2>&1 &
$ IOP_NODE_CONFIG="$cycle_dir/node.yaml" ./scripts/dev/node.sh > "$cycle_dir/node.out" 2>&1 &
$ printf '%s\n' '/nodes' 'Return token IOP_G10_ALPHA' 'Return token IOP_G10_BETA' '/capabilities' '/transport' '/sessions' '/exit' >&3
$ diff -u "$cycle_dir/node.payloads" "$cycle_dir/edge.payloads"
$ awk '< run에서 start MSG 2개, complete 1개, late MSG 없음 검증>' "$cycle_dir/edge.out"
FULL_CYCLE_LOG_DIR=/tmp/iop-g10-full-cycle.C75Cpy
=== EDGE TRANSCRIPT ===
[edge] config=/tmp/iop-g10-full-cycle.C75Cpy/edge.yaml
node0 = test-node (test-node)
[node0-evt] start run_id=manual-1785067395671455880
[node0-msg] IOP_G10_ALPHA
[node0-msg] IOP_G10_ALPHA_TAIL
[node0-evt] complete run_id=manual-1785067395671455880 detail="idle-timeout"
[node0-evt] start run_id=manual-1785067396892881339
[node0-msg] IOP_G10_BETA
[node0-msg] IOP_G10_BETA_TAIL
[node0-evt] complete run_id=manual-1785067396892881339 detail="idle-timeout"
adapter = cli
targets = fake-cli
adapter = cli
connected = true
node_id = test-node
session_id = default
state = connected
target = fake-cli
sessions: 1
[0] mode=persistent target=fake-cli session=default
=== NODE PAYLOADS ===
IOP_G10_ALPHA
IOP_G10_ALPHA_TAIL
IOP_G10_BETA
IOP_G10_BETA_TAIL
FULL_CYCLE_PASS node payloads equal edge payloads; each complete follows exactly two messages
```
### Diff
@ -210,7 +262,7 @@ _실제 명령·stdout/stderr 또는 blocker와 재개 조건:_
_실제 출력:_
```text
미실행
(출력 없음, exit 0)
```
---