docs(roadmap): 현 마일스톤 작업 상태를 동기화한다

idle-full 완료 이벤트를 마일스톤에 반영하고, 해소된 active USER_REVIEW 상태를 archive 완료 로그 기준으로 정리한다.
This commit is contained in:
toki 2026-06-05 20:57:03 +09:00
parent d79e6cf2d7
commit 55d7cfbfc6
2 changed files with 9 additions and 69 deletions

View file

@ -35,7 +35,7 @@
idle 상태에서 성능 기준점을 다시 찍고, 개선 전후 비교 기준으로 사용할 baseline record를 고른다.
- [ ] [idle-full] idle host에서 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full`을 실행해 개선 전 full baseline을 남긴다. 검증: 결과 파일이 `overall_result: PASS`이고 same-language, cross-language, TypeScript gateway 구성요소가 포함된다.
- [x] [idle-full] idle host에서 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full`을 실행해 개선 전 full baseline을 남긴다. 검증: 결과 파일이 same-language, cross-language, TypeScript gateway 구성요소`regression_result: SKIPPED`를 기록하고, TypeScript transient 및 Kotlin TCP parallel>=128 deferred(INCOMPLETE) 수용 결정이 완료 로그에 남는다.
- [ ] [compare-rule] baseline 비교는 같은 host/runtime/profile의 `proto-socket-performance-*` 기록끼리만 수행한다. 검증: `run_performance.sh --full --baseline <baseline>` 실행 결과가 compared rows와 regression WARN rows를 기록한다.
### Epic: [hotspot] 병목 리포트
@ -134,8 +134,9 @@ Kotlin TCP는 현재 same-language 기준에서 안정적인 유지 대상이다
- 2026-06-03 기준 지원 5개 언어 분석은 완료했다. Go/Python은 reference 기준점 보강, Kotlin은 WS latency/slow-mix 검증 모델, Dart는 TCP fixed latency/large payload/isolate receive path, TypeScript는 gateway worker hop과 WS 1MB가 핵심 작업이다.
- `고성능 병렬 운용 기준선과 최적화` Milestone의 기준선/매트릭스 결과를 선행 근거로 사용한다.
- 현재 활성 `agent-task/` 작업 디렉터리는 없다. 새 구현 작업을 시작할 때는 위 작업 순서에 맞춰 작은 작업 단위로 plan을 만든다.
- 사용자 확인 전에는 host 부하가 큰 상태에서 full performance baseline을 새 기준값으로 확정하지 않는다.
- 2026-06-05 기준 `03_idle_full_baseline`은 USER_REVIEW 해소로 PASS/RESOLVED 완료했고, `agent-task/archive/2026/06/m-performance-hotspot-optimization/03_idle_full_baseline/complete.log`가 Roadmap Completion `idle-full`을 남겼다.
- 현재 활성 `agent-task/` 작업 디렉터리는 `agent-task/m-performance-hotspot-optimization/04+03_compare_rule_full_baseline/`이다. 선행 `03_idle_full_baseline` archive complete.log가 충족됐으므로 다음 실행 대상은 [compare-rule] full baseline comparison이다.
- 사용자 확인으로 Kotlin TCP parallel>=128 deferred(INCOMPLETE)는 이번 `idle-full` 완료 기준에서 수용됐으며, 해당 deadlock은 별도 최적화 대상으로 유지한다.
## 완료 리뷰
@ -167,13 +168,13 @@ Kotlin TCP는 현재 same-language 기준에서 안정적인 유지 대상이다
- 병목 리포트:
> [!WARNING]
> **Full Idle Baseline 후보 — 미확정 (2026-06-05)**: idle host에서 `run_performance.sh --full` 결과를 수집했다. 측정 host는 code-server 컨테이너이며 load ~6/10코어 상태를 이 환경의 idle 기준으로 인정한다(컨테이너 상시 부하를 차단/감점 사유로 보지 않는다). 후보 record: [`agent-test/runs/20260605-025842-proto-socket-performance-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-025842-proto-socket-performance-full.md). 구성요소 record는 same-language [`...025842-...stress-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-025842-proto-socket-stress-full.md), cross-language [`...091449-...stress-full-cross.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-091449-proto-socket-stress-full-cross.md), typescript-gateway [`...092037-...stress-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-092037-proto-socket-stress-full.md)이다.
> - 이 record는 아직 `idle-full` 완료 baseline으로 **확정하지 않는다**. record에 기록된 최상위 `overall_result`**FAIL**, `regression_result``--baseline` 미지정으로 SKIPPED다. 구성요소는 same-language **FAIL**, cross-language PASS, typescript-gateway PASS이며, same-language 내부는 dart/go/python PASS, kotlin INCOMPLETE, typescript FAIL이다.
> **Full Idle Baseline evidence — 수용된 INCOMPLETE (2026-06-05)**: idle host에서 `run_performance.sh --full` 결과를 수집했다. 측정 host는 code-server 컨테이너이며 load ~6/10코어 상태를 이 환경의 idle 기준으로 인정한다(컨테이너 상시 부하를 차단/감점 사유로 보지 않는다). baseline evidence record: [`agent-test/runs/20260605-025842-proto-socket-performance-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-025842-proto-socket-performance-full.md). 구성요소 record는 same-language [`...025842-...stress-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-025842-proto-socket-stress-full.md), cross-language [`...091449-...stress-full-cross.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-091449-proto-socket-stress-full-cross.md), typescript-gateway [`...092037-...stress-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-092037-proto-socket-stress-full.md)이다.
> - 사용자 결정으로 이 record를 `idle-full` 완료 baseline evidence로 수용한다. record에 기록된 최상위 `overall_result`**FAIL**, `regression_result``--baseline` 미지정으로 SKIPPED다. 구성요소는 same-language **FAIL**, cross-language PASS, typescript-gateway PASS이며, same-language 내부는 dart/go/python PASS, kotlin INCOMPLETE, typescript FAIL이다.
> - 구성요소 same-language / cross-language / typescript-gateway 모두 포함. sustained 30초/5분/30분은 5개 언어 TCP/WS 전부 stability violation 0 PASS.
> - 기록된 FAIL의 단일 원인은 `parallel clients=1024 / TypeScript / tcp` 행의 timeout 72건(512,000 요청 중 0.014%, 그 외 nonce/FIFO/leak violation 0)이다. 2026-06-05 동일 조건 재측정([`agent-test/runs/20260605-100551-proto-socket-stress-full.md`](file:///config/workspace/proto-socket/agent-test/runs/20260605-100551-proto-socket-stress-full.md), `overall_result: PASS`)에서 16/128/512/1024 전부 timeout 0 PASS로 재현되지 않아 일시적 컨테이너 부하 transient로 판정한다. TypeScript TCP 구현의 회귀/병목이 아니다. 다만 이 재측정은 TypeScript focused rerun이므로 full aggregate PASS를 대체하는 근거로 쓰지 않는다.
> - TypeScript transient를 제외해도 이 record는 PASS가 될 수 없다. Kotlin TcpClient가 연결당 timeout 없는 blocking read-thread-per-connection 구조라 TCP parallel clients>=128에서 thread starvation으로 deadlock하며, 해당 축을 harness에서 deferred(required SKIP)로 처리했다. harness가 required SKIP을 INCOMPLETE로 분류하는 것은 의도된 설계이고 optional 우회로 PASS를 만들지 않는다. 따라서 transient를 걷어낸 본질 상태는 Kotlin deferred로 인한 **INCOMPLETE**다. 이 Kotlin TCP parallel>=128 deadlock은 별도 최적화 대상(Epic)으로 남긴다.
> - `idle-full`완료 기준은 `overall_result: PASS`이지만 위 Kotlin deadlock(required SKIP→INCOMPLETE, 의도된 설계) 때문에 구조적으로 충족 불가하다. 이 완료 기준 완화(INCOMPLETE 수용) 여부는 사용자 결정 사항이며 [`03_idle_full_baseline/CODE_REVIEW-cloud-G07.md`](file:///config/workspace/proto-socket/agent-task/m-performance-hotspot-optimization/03_idle_full_baseline/CODE_REVIEW-cloud-G07.md)의 `사용자 리뷰 요청`에 기록했다. 결정 전까지 `idle-full` 완료를 암시하는 문구를 쓰지 않는다.
> - 서로 다른 host/runtime/profile의 절대 수치는 고정 합격선으로 삼지 않는다. 이 record는 개선 전후를 같은 환경에서 비교하기 위한 후보 record로만 사용한다.
> - `idle-full`원래 완료 기준은 `overall_result: PASS`였지만 Kotlin deadlock(required SKIP→INCOMPLETE, 의도된 설계) 때문에 구조적으로 충족 불가하다. 사용자 결정으로 Kotlin deferred INCOMPLETE를 이번 `idle-full` 완료 기준에서 수용했고, `03_idle_full_baseline``complete.log`의 Roadmap Completion에 따라 PASS/RESOLVED 완료 처리됐다.
> - 서로 다른 host/runtime/profile의 절대 수치는 고정 합격선으로 삼지 않는다. 이 record는 개선 전후를 같은 환경에서 비교하기 위한 baseline evidence record로만 사용한다.
### 1. 언어별 병목 후보 및 개선 목표
@ -227,4 +228,4 @@ Kotlin TCP는 현재 same-language 기준에서 안정적인 유지 대상이다
- [hotspot-report] 병목 리포트 정리는 `agent-task/archive/2026/06/m-performance-hotspot-optimization/01_hotspot_report/complete.log`의 PASS 완료 이벤트와 `Roadmap Completion` 근거로 완료 처리했다.
- [ts-gateway-single-path] TypeScript default receive gateway 단일 경로 정리는 `agent-task/archive/2026/06/m-performance-hotspot-optimization/01_ts_gateway_single_path/complete.log`의 PASS 완료 이벤트와 TypeScript check/test 결과를 근거로 완료 처리했다.
- [ts-worker-hop-removal], [gateway-overhead] TypeScript gateway 성능 row 분리와 worker_threads/control overhead 정량화는 `agent-task/archive/2026/06/m-performance-hotspot-optimization/02+01_ts_gateway_perf_rows/complete.log`의 PASS 완료 이벤트, `agent-test/runs/20260604-103828-proto-socket-stress-quick.md`, `agent-test/runs/20260604-102233-proto-socket-performance-quick.md`, `agent-test/runs/20260604-104812-proto-socket-full-matrix.md`를 근거로 완료 처리했다.
- 확인 필요: idle full baseline record(`20260605-025842-proto-socket-performance-full.md`)는 아직 확정하지 않은 후보다. 기록 결과는 `overall_result: FAIL`(TypeScript transient 단일 원인)이고 transient 제외 시 Kotlin deferred로 인한 INCOMPLETE라, `overall_result: PASS` 완료 기준 완화 여부에 대한 사용자 결정이 선행돼야 `idle-full`을 완료 처리할 수 있다(`03_idle_full_baseline/CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 참조). 그 결정 후 위 병목 표의 개선 전 기준값을 quick/이전 stress 수치에서 이 full baseline의 same-language full rows로 교체할지 판단한다(`[compare-rule]`로 같은 환경 비교 시 반영). Kotlin TCP parallel>=128은 deadlock으로 deferred 상태라 해당 축은 별도 최적화 후 측정한다.
- 확인 필요: 사용자 결정 항목 없음. 다음 active task는 `agent-task/m-performance-hotspot-optimization/04+03_compare_rule_full_baseline/`이며, [compare-rule]에서 같은 host/runtime/profile 기준 full baseline comparison record를 생성하고 위 병목 표의 개선 전 기준값을 이 full baseline rows로 교체할지 판단한다. Kotlin TCP parallel>=128은 deadlock으로 deferred 상태라 해당 축은 별도 최적화 후 측정한다.

View file

@ -1,61 +0,0 @@
# User Review Resolved - m-performance-hotspot-optimization/03_idle_full_baseline
## 요청 일시
2026-06-05
## 상태
RESOLVED
## 사유
- 유형: implementation-blocked
- 현재 리뷰 회차: 2
- 최종 판정: PASS/RESOLVED
- 요약: 사용자가 Kotlin TCP parallel>=128 deferred로 인한 INCOMPLETE를 이번 `idle-full` 완료 기준으로 수용하기로 결정했다. 이에 따라 `20260605-025842` full record를 개선 전 baseline evidence로 받아들이고 task를 완료 처리한다.
## 루프 이력
| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_cloud_G07_1.log` | `code_review_cloud_G07_1.log` | FAIL | 실패한 full aggregate record를 “확정” baseline처럼 기록했고 실제 `overall_result: FAIL`과 Milestone 문구가 불일치했다. |
| `plan_cloud_G07_2.log` | `code_review_cloud_G07_2.log` | WARN | Milestone 문구를 “후보 — 미확정”으로 바로잡았고, 남은 차단은 `overall_result: PASS` 기준 완화 여부에 대한 사용자 결정이다. |
## 차단 근거
- 문제: `agent-test/runs/20260605-025842-proto-socket-performance-full.md``overall_result: FAIL`, `regression_result: SKIPPED`, same-language FAIL, cross-language PASS, typescript-gateway PASS다. TypeScript TCP parallel 1024 timeout 72건은 focused rerun `agent-test/runs/20260605-100551-proto-socket-stress-full.md`에서 재현되지 않아 transient로 보이지만, Kotlin TCP parallel>=128은 required SKIP으로 남아 full aggregate PASS를 만들 수 없다.
- 현재 archive plan: `plan_cloud_G07_2.log`
- 현재 archive review: `code_review_cloud_G07_2.log`
- 검증 명령: `rg --sort path -n "overall_result|regression_result|same-language|cross-language|typescript-gateway|전체 결과값|DONE typescript|kotlin \\| INCOMPLETE|typescript \\| FAIL" agent-test/runs/20260605-025842-proto-socket-performance-full.md agent-test/runs/20260605-100551-proto-socket-stress-full.md`
- 실제 출력: `20260605-025842``overall_result: FAIL`, same-language FAIL, cross-language PASS, typescript-gateway PASS, Kotlin INCOMPLETE, TypeScript FAIL이다. `20260605-100551`은 TypeScript TCP parallel focused rerun `overall_result: PASS`다.
- 차단 판단 근거: `overall_result: PASS`를 요구하는 원래 완료 기준을 완화할지, Kotlin TCP deadlock을 먼저 고쳐 full PASS aggregate를 다시 만들지는 제품/검증 범위 결정이다. 후속 에이전트가 같은 full 명령을 재실행해도 Kotlin required SKIP 때문에 구조적으로 PASS completion evidence를 만들 수 없다.
## 사용자 결정 필요
- [x] Kotlin deferred로 인한 INCOMPLETE를 이번 `idle-full` 완료 기준으로 수용하고, `20260605-025842` record를 baseline 후보에서 확정 baseline으로 전환한다.
- [ ] Kotlin TCP parallel>=128 deadlock을 먼저 별도 구현 작업으로 해결한 뒤 `run_performance.sh --full`을 재실행해 `overall_result: PASS` aggregate를 만든다.
- [ ] `idle-full` 완료 기준을 재작성한다.
- [ ] 작업 범위를 줄이거나 보류/폐기한다.
## 해소 내용
- 사용자 결정: “1번 방향으로 해” — Kotlin deferred INCOMPLETE를 `idle-full` 완료 기준으로 수용한다.
- 해소 판정: PASS/RESOLVED.
- 완료 근거: `agent-test/runs/20260605-025842-proto-socket-performance-full.md`는 same-language/cross-language/typescript-gateway 구성요소를 포함하고 `regression_result: SKIPPED`를 기록했다. TypeScript FAIL은 focused rerun `agent-test/runs/20260605-100551-proto-socket-stress-full.md`에서 재현되지 않은 transient로 분리했고, 남은 non-PASS 본질은 별도 최적화 대상으로 분리된 Kotlin TCP parallel>=128 required SKIP이다.
'
## 재개 조건
- 사용자가 INCOMPLETE 수용을 승인하면, `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성해 이 task를 archive한다. 이후 runtime completion event가 `idle-full` 완료 처리를 맡는다.
- 사용자가 Kotlin TCP 수정 우선을 선택하면, `plan` 스킬이 이 `USER_REVIEW.md``user_review_N.log`로 아카이브하고 새 구현 plan/review를 작성한다.
- 사용자가 기준 재작성/보류를 선택하면, 선택한 기준에 따라 새 plan 또는 보류 기록을 만든다.
## 다음 실행 힌트
- 사용자 결정 문구 예: “Kotlin deferred INCOMPLETE를 `idle-full` 완료로 수용해” 또는 “Kotlin TCP parallel deadlock 먼저 고치자”.
- 현재 task path: `agent-task/m-performance-hotspot-optimization/03_idle_full_baseline/`
## 종료 규칙
- 사용자가 이 stop state를 완료/PASS로 해소하면 `USER_REVIEW.md`를 해소 상태로 갱신하고, `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
- 새 구현이 필요하면 `plan` 스킬이 `USER_REVIEW.md``user_review_N.log`로 아카이브한 뒤 새 `PLAN-*-G??.md` / `CODE_REVIEW-*-G??.md`를 작성한다.