archive: move completed subtask files to archive for m-oto-registration-online-smoke
This commit is contained in:
parent
60a7919f3a
commit
2fc95dbba8
13 changed files with 1040 additions and 243 deletions
11
Makefile
11
Makefile
|
|
@ -1,4 +1,4 @@
|
|||
.PHONY: all build build-local build-edge build-edge-host build-node build-node-target build-node-targets pack-node-target pack-edge archive-edge tidy test test-e2e test-control-plane-edge-wire test-openai-ollama proto proto-dart client-test client-build-web clean
|
||||
.PHONY: all build build-local build-edge build-edge-host build-node build-node-target build-node-targets pack-node-target pack-edge archive-edge tidy test test-e2e test-control-plane-edge-wire test-openai-ollama test-oto-registration-online-smoke proto proto-dart client-test client-build-web clean
|
||||
|
||||
GOFLAGS ?= -trimpath
|
||||
BUILD_DIR ?= build
|
||||
|
|
@ -86,6 +86,15 @@ test-control-plane-edge-wire:
|
|||
test-openai-ollama:
|
||||
./scripts/e2e-openai-ollama.sh
|
||||
|
||||
# OTO oto-agent registration online smoke. Runs the OTO Dart proto-socket
|
||||
# client against this iop checkout, asserting registration accepted plus the
|
||||
# first-heartbeat/online transition. Used as OTO unlock handoff evidence.
|
||||
OTO_REPO ?= ../oto
|
||||
test-oto-registration-online-smoke:
|
||||
@echo "==> OTO registration online smoke"
|
||||
@echo "command: cd $(OTO_REPO) && IOP_REPO_ROOT=$(CURDIR) dart test test/oto_iop_connection_smoke_test.dart"
|
||||
cd $(OTO_REPO) && IOP_REPO_ROOT=$(CURDIR) dart test test/oto_iop_connection_smoke_test.dart
|
||||
|
||||
# Requires: protoc + protoc-gen-go (go install google.golang.org/protobuf/cmd/protoc-gen-go@latest)
|
||||
proto:
|
||||
protoc \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,212 @@
|
|||
<!-- task=m-oto-registration-online-smoke/02+01_oto_agent_session plan=0 tag=API -->
|
||||
|
||||
# Code Review Reference - API
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-03
|
||||
task=m-oto-registration-online-smoke/02+01_oto_agent_session, plan=0, tag=API
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/02+01_oto_agent_session/`로 이동합니다. roadmap 수정은 런타임 책임입니다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
| -------------------------------------| -----------|
|
||||
| [API-1] Dependency Alignment | [x] |
|
||||
| [API-2] Persistent Edge Session API | [x] |
|
||||
| [API-3] Runner Keeps Agent Alive | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] `../oto/pubspec.yaml`의 protobuf constraint를 path dependency `proto_socket`과 맞춰 tests가 resolve되게 한다. (`^3.1.0` → `^6.0.0`)
|
||||
- [x] 기존 `register()` 호환을 유지하면서 close하지 않는 OTO registration session API를 추가한다. (`EdgeAgentSession` + `EdgeRegistrationClient.openSession()`, 기존 `register()`는 wrapper로 보존)
|
||||
- [x] `DefaultAgentRunner.run()`이 registration 성공 후 agent connection을 유지하고 종료 신호 또는 cancellation에서 닫도록 조정한다. (SIGINT/SIGTERM 대기, `finally`에서 session close)
|
||||
- [x] OTO agent unit tests가 persistent session API와 rejected registration behavior를 검증하게 한다.
|
||||
- [x] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다. (12 tests passed, exit 0)
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G06_M.log`로 아카이브한다.
|
||||
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS이면 active task 디렉터리 `agent-task/m-oto-registration-online-smoke/02+01_oto_agent_session/`를 archive로 이동한다.
|
||||
- [ ] PASS split 작업이면 이동 후 parent에 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
- **generated protobuf 코드 재생성 (계획 범위 밖에서 추가 발생).** 계획 API-1은 `pubspec.yaml`의 `protobuf` constraint 상향과 `dart pub get`만 예상했으나, constraint를 `^6.0.0`으로 올리자 기존 generated `*.pb.dart`가 protobuf 3.x 시절 API(`$pb.PbList()` unnamed ctor, `toProto3Json`/`fromProto3Json` named param)를 사용해 `dart analyze`에서 49개 error가 발생했다. agent/framework domain rule이 "generated protobuf 파일은 직접 수정하지 않고 원본 proto와 생성 절차를 확인해 재생성한다"를 명시하므로, 손으로 고치지 않고 원본 proto(`../iop/proto/iop/runtime.proto`)에서 `protoc` + `protoc-gen-dart`(protoc_plugin 25.0.0, protobuf 6.x 호환)로 재생성했다. 이는 "tests가 resolve되게 한다"는 API-1 목표를 충족하기 위한 dependency-solving 작업이며, 사용자 결정이 필요한 blocker가 아니다.
|
||||
- 재생성된 코드 차이:
|
||||
- well-known type `google/protobuf/struct`를 로컬 사본이 아니라 `package:protobuf/well_known_types/...`에서 import하도록 바뀌어, 로컬 `google/protobuf/struct.*` 사본이 더 이상 generated set에 포함되지 않는다.
|
||||
- 새 plugin은 `*.pbserver.dart`를 생성하지 않는다.
|
||||
- 위 두 가지로 orphan이 된 파일(로컬 `google/protobuf/*` 4개, `iop/runtime.pbserver.dart`)을 `lib/oto/agent/`와 `test/support/` 양쪽에서 삭제했다. 삭제 전 `grep`으로 외부 참조가 `edge_registration_client.dart`(lib runtime.pb.dart 하나)뿐이고 삭제 대상은 어디에서도 import되지 않음을 확인했다.
|
||||
- `test/oto_iop_connection_smoke_test.dart`는 변경하지 않았다. `EdgeRegistrationClient().register()`(one-shot wrapper)를 그대로 사용하므로 기존 호환이 유지된다.
|
||||
- `command_agent.dart`는 변경하지 않았다. runner 호출 시그니처(`runner.run(config)`)가 그대로이고 daemon wait는 runner 내부에 캡슐화되어 call-site 조정이 불필요했다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
- **`EdgeAgentSession` 추상 타입 도입.** persistent 연결을 표현하는 인터페이스(`result` getter + `close()`)를 두고, 실 구현 `_OtoEdgeAgentSession`은 `_OtoIopClient`(이미 heartbeat mixin 보유)를 감싼다. abstract로 둔 이유는 runner 단위 테스트가 `FakeEdgeAgentSession`으로 close 호출 여부를 hang 없이 검증할 수 있게 하기 위함이다.
|
||||
- **`register()`는 `openSession()` 위의 one-shot wrapper로 보존.** `openSession()`이 connect+register 후 연결을 유지하고, `register()`는 그 위에서 `finally`로 `session.close()`를 호출한다. 기존 unit test/smoke test API와 runner injection 호환을 깨지 않는다.
|
||||
- **failure leak 방지.** 연결/등록 단계 예외는 `openSession()`의 `catch`에서 `client.close()` 후 rethrow한다. registration rejected는 session을 정상 반환하되 runner의 `finally`가 항상 `session.close()`를 호출하므로, accepted/rejected/예외 모든 경로에서 socket leak이 없다. `close()`는 `BaseClient._closeCalled` 가드로 idempotent하다.
|
||||
- **runner의 test-injectable wait hook.** `DefaultAgentRunner`에 `Future<void> Function()? waitForShutdown`을 추가했다. 주입 없으면 production 기본값으로 `SIGINT`/`SIGTERM`을 감시하다 신호 수신 시 종료하고 구독을 정리한다(daemon 동작). 테스트는 즉시 완료 함수나 `Completer`를 주입해 "유지 중 미close → 신호 후 close"를 검증한다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- 기존 one-shot `register()` API와 tests가 유지되는가?
|
||||
- persistent session이 registration failure에서는 leak 없이 닫히는가?
|
||||
- runner가 test-injectable wait/stop 경계를 가져서 unit test가 hang하지 않는가?
|
||||
- `pubspec.yaml` dependency update가 generated protobuf를 수동 편집하지 않고 해결되는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
> 참고: 변경된 generated protobuf 파일은 `protoc --plugin=protoc-gen-dart=/config/.local/bin/protoc-gen-dart --dart_out=<target> --proto_path=../iop/proto --proto_path=/config/.local/include iop/runtime.proto`로 재생성했다(target = `lib/oto/agent`, `test/support`). 손으로 편집한 generated 파일은 없다.
|
||||
|
||||
### API-1 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && dart pub get
|
||||
Resolving dependencies...
|
||||
Downloading packages...
|
||||
...(생략: 21개 패키지 newer-version 안내)...
|
||||
Got dependencies!
|
||||
21 packages have newer versions incompatible with dependency constraints.
|
||||
Try `dart pub outdated` for more information.
|
||||
# exit 0
|
||||
```
|
||||
|
||||
### API-2 / API-3 중간 검증 (대상 테스트)
|
||||
```bash
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart
|
||||
00:02 +5: All tests passed!
|
||||
# exit 0
|
||||
# 통과 테스트:
|
||||
# - EdgeEndpoint parses host and port from config edge url
|
||||
# - EdgeRegistrationClient.register one-shot returns session result and closes the session
|
||||
# - AgentRunner maps config token to register request
|
||||
# - AgentRunner keeps session open until shutdown then closes
|
||||
# - AgentRunner reports rejected registration and closes session
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd ../oto && dart pub get
|
||||
Got dependencies!
|
||||
21 packages have newer versions incompatible with dependency constraints.
|
||||
# pubget_exit=0
|
||||
|
||||
$ cd ../oto && dart analyze
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
# analyze_exit=0
|
||||
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
00:00 +12: All tests passed!
|
||||
# test_exit=0
|
||||
# 12 tests = 5 (oto_agent_registration_test.dart) + 7 (oto_agent_config_test.dart)
|
||||
```
|
||||
|
||||
### 변경 파일 (git status)
|
||||
```
|
||||
M lib/oto/agent/agent_runner.dart # API-3
|
||||
M lib/oto/agent/edge_registration_client.dart # API-2
|
||||
M pubspec.yaml # API-1
|
||||
M test/oto_agent_registration_test.dart # API-2, API-3
|
||||
M lib/oto/agent/iop/runtime.pb{,enum,json}.dart # API-1 재생성
|
||||
M test/support/iop/runtime.pb{,enum,json}.dart # API-1 재생성
|
||||
D lib/oto/agent/iop/runtime.pbserver.dart # 재생성 set에서 제외
|
||||
D lib/oto/agent/google/protobuf/struct.* # well-known type을 package에서 import
|
||||
D test/support/iop/runtime.pbserver.dart
|
||||
D test/support/google/protobuf/struct.*
|
||||
# pubspec.lock 변경 없음(트래킹 변화 없음).
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
### 종합 판정
|
||||
|
||||
WARN
|
||||
|
||||
### 차원별 평가
|
||||
|
||||
| 차원 | 평가 | 근거 |
|
||||
|------|------|------|
|
||||
| Correctness | Pass | `openSession()`이 register 이후 연결을 유지하고, `register()` one-shot wrapper와 runner `finally` close 경계가 유지된다. |
|
||||
| Completeness | Pass | 계획된 dependency alignment, persistent session API, runner wait/close hook, targeted tests가 구현되었다. |
|
||||
| Test coverage | Pass | persistent session 유지/종료, rejected registration close, one-shot compatibility test가 추가되었고 targeted tests 12개가 통과했다. |
|
||||
| API contract | Pass | 기존 `EdgeRegistrationClient.register()`와 `DefaultAgentRunner.run(config)` call-site 계약이 유지된다. |
|
||||
| Code quality | Warn | 수동 변경 Dart 파일 2개가 `dart format --output=none --set-exit-if-changed`를 통과하지 못한다. |
|
||||
| Plan deviation | Pass | protobuf 6.x 대응 generated 재생성/삭제는 dependency 해결을 위한 범위 내 deviation으로 기록되어 있고 수동 generated 편집 정황은 없다. |
|
||||
| Verification trust | Pass | `dart pub get`, `dart analyze`, targeted `dart test`를 리뷰 중 재실행해 기록과 일치함을 확인했다. |
|
||||
|
||||
### 발견된 문제
|
||||
|
||||
- Suggested: `../oto/lib/oto/agent/edge_registration_client.dart:147`, `../oto/lib/oto/agent/agent_runner.dart:83` 수동 변경 파일이 Dart formatter 기준을 통과하지 못한다. `cd ../oto && dart format lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행한 뒤 `dart format --output=none --set-exit-if-changed ...`, `dart analyze`, targeted tests를 재실행해 기록한다.
|
||||
|
||||
### 리뷰 검증
|
||||
|
||||
```bash
|
||||
$ cd ../oto && dart pub get
|
||||
Got dependencies!
|
||||
21 packages have newer versions incompatible with dependency constraints.
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart analyze
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
00:00 +12: All tests passed!
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
Changed lib/oto/agent/edge_registration_client.dart
|
||||
Changed lib/oto/agent/agent_runner.dart
|
||||
Formatted 3 files (2 changed) in 0.04 seconds.
|
||||
# exit 1
|
||||
```
|
||||
|
||||
참고: `cd ../oto && dart test test/oto_iop_connection_smoke_test.dart`는 추가 확인으로 실행했으나, test가 생성한 iop Edge 프로세스가 20초 내 포트를 열지 못해 `timed out waiting for iop Edge`로 실패했다. OTO client register 호출 전 startup wait 단계의 실패이며, 이 subtask의 필수 검증이나 이번 Suggested 이슈 판정 근거로 사용하지 않는다.
|
||||
|
||||
### 다음 단계
|
||||
|
||||
WARN/FAIL follow-up: formatter mismatch만 좁게 수정하는 다음 active `PLAN-local-G01.md`와 `CODE_REVIEW-local-G01.md`를 작성한다.
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
<!-- task=m-oto-registration-online-smoke/02+01_oto_agent_session plan=1 tag=REVIEW_API -->
|
||||
|
||||
# Code Review Reference - REVIEW_API
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Evidence gaps that a follow-up agent can close by rerunning commands or collecting artifacts are normal follow-up issues, not user-review blockers by themselves.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||
> Follow the ownership table at the bottom of this file for which sections you own.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-04
|
||||
task=m-oto-registration-online-smoke/02+01_oto_agent_session, plan=1, tag=REVIEW_API
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||
|
||||
1. 판정을 append한다.
|
||||
2. `CODE_REVIEW-local-G01.md` -> `code_review_local_G01_N.log`, `PLAN-local-G01.md` -> `plan_local_G01_M.log`로 아카이브한다.
|
||||
3. PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/02+01_oto_agent_session/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
|
||||
4. PASS이고 task group이 `m-oto-registration-online-smoke`이면 완료 이벤트 메타데이터를 보고한다. roadmap 수정은 런타임 책임이다.
|
||||
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [REVIEW_API-1] Dart Formatter Cleanup | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] `cd ../oto && dart format lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 formatter mismatch를 해소한다.
|
||||
- [x] `cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 exit 0을 기록한다.
|
||||
- [x] `cd ../oto && dart analyze`를 실행한다.
|
||||
- [x] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_{review_lane}_GNN_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_{build_lane}_GNN_M.log`로 아카이브한다.
|
||||
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [x] PASS이면 active task 디렉터리 `agent-task/{task_name}/`를 `agent-task/archive/YYYY/MM/{task_name}/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/{task_group}/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
|
||||
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
없음. 계획에 명시된 formatter cleanup과 검증 명령만 수행했다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
없음. formatter only follow-up이므로 설계 결정이 없다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- formatter 적용 외의 동작 변경이 없는가?
|
||||
- format check가 exit 0으로 통과하는가?
|
||||
- `dart analyze`와 targeted agent tests가 계속 통과하는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
|
||||
|
||||
### REVIEW_API-1 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && dart format lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
Formatted lib/oto/agent/edge_registration_client.dart
|
||||
Formatted lib/oto/agent/agent_runner.dart
|
||||
Formatted 3 files (2 changed) in 0.07 seconds.
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
Formatted 3 files (0 changed) in 0.04 seconds.
|
||||
# exit 0
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd ../oto && dart analyze
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
00:00 +0: loading test/oto_agent_registration_test.dart
|
||||
00:01 +0: test/oto_agent_registration_test.dart: EdgeEndpoint EdgeEndpoint parses host and port from config edge url
|
||||
00:01 +1: test/oto_agent_config_test.dart: AgentConfig parses bootstrap config yaml
|
||||
00:01 +2: test/oto_agent_config_test.dart: AgentConfig parses bootstrap config yaml
|
||||
00:01 +3: test/oto_agent_config_test.dart: AgentConfig parses bootstrap config yaml
|
||||
00:01 +4: test/oto_agent_config_test.dart: AgentConfig parses bootstrap config yaml
|
||||
00:01 +4: test/oto_agent_registration_test.dart: AgentRunner AgentRunner keeps session open until shutdown then closes
|
||||
00:01 +5: test/oto_agent_registration_test.dart: AgentRunner AgentRunner keeps session open until shutdown then closes
|
||||
00:01 +6: test/oto_agent_config_test.dart: AgentConfig parses missing alias as null
|
||||
00:01 +7: test/oto_agent_registration_test.dart: AgentRunner AgentRunner reports rejected registration and closes session
|
||||
00:01 +8: test/oto_agent_config_test.dart: AgentConfig rejects missing required values
|
||||
00:01 +9: test/oto_agent_config_test.dart: AgentConfig rejects invalid field types
|
||||
00:01 +10: test/oto_agent_config_test.dart: AgentConfig rejects invalid field types
|
||||
00:01 +10: test/oto_agent_config_test.dart: AgentConfig fromFile reads file correctly
|
||||
00:01 +11: test/oto_agent_config_test.dart: AgentConfig fromFile reads file correctly
|
||||
00:01 +11: test/oto_agent_config_test.dart: AgentConfig fromFile throws when file not found
|
||||
00:01 +12: test/oto_agent_config_test.dart: AgentConfig fromFile throws when file not found
|
||||
00:01 +12: All tests passed!
|
||||
# exit 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
> If anything is blank, go back and fill it in before saving this file.
|
||||
> Leave review-agent-only sections unchanged.
|
||||
|
||||
## Ownership
|
||||
|
||||
| 섹션 | 소유자 | 설명 |
|
||||
|------|--------|------|
|
||||
| 헤더 주석, 개요(date/task/plan/tag), 리뷰 에이전트 지시 | 스텁 생성 시 고정 | 구현 에이전트가 수정하거나 실행하지 않음 |
|
||||
| 구현 항목별 완료 여부 (항목명) | 스텁 생성 시 고정 | `[ ]` -> `[x]` 체크만 구현 에이전트가 수행 |
|
||||
| 구현 체크리스트 (항목 텍스트/순서) | follow-up plan에서 복사해 스텁 생성 시 고정 | 구현 에이전트가 `[ ]` -> `[x]` 체크만 수행 |
|
||||
| 코드리뷰 전용 체크리스트 | Review agent only | 구현 에이전트가 수정하거나 체크하지 않음 |
|
||||
| 계획 대비 변경 사항, 주요 설계 결정 | 구현 에이전트가 채움 | placeholder 텍스트를 실제 내용으로 교체 |
|
||||
| 사용자 리뷰 요청 | 구현 에이전트가 채움 | 진행에 사용자 입력이 필요하지 않으면 `상태: 없음` 유지 |
|
||||
| 리뷰어를 위한 체크포인트 | 스텁 생성 시 고정 | 계획에서 추출한 리뷰 포인트 |
|
||||
| 검증 결과 (섹션 제목 + 명령) | 스텁 생성 시 고정 | 실행 출력만 구현 에이전트가 채움 |
|
||||
| 코드리뷰 결과 | 리뷰 에이전트가 append | 스텁에 포함하지 않음 |
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
### 종합 판정
|
||||
|
||||
PASS
|
||||
|
||||
### 차원별 평가
|
||||
|
||||
| 차원 | 평가 | 근거 |
|
||||
|------|------|------|
|
||||
| Correctness | Pass | follow-up은 formatter cleanup만 수행했고 persistent session 구현 동작을 변경하지 않았다. |
|
||||
| Completeness | Pass | plan의 formatter 적용, format check, analyzer, targeted tests, review artifact 작성이 모두 완료되었다. |
|
||||
| Test coverage | Pass | 기존 targeted agent tests 12개가 리뷰 중 재실행되어 통과했다. |
|
||||
| API contract | Pass | public API와 call-site 계약 변경이 없다. |
|
||||
| Code quality | Pass | `dart format --output=none --set-exit-if-changed`와 `git diff --check`가 통과했다. |
|
||||
| Plan deviation | Pass | 계획 대비 변경 사항 없음. |
|
||||
| Verification trust | Pass | 구현 기록의 format/analyze/test 결과를 리뷰 중 같은 명령으로 재검증했다. |
|
||||
|
||||
### 발견된 문제
|
||||
|
||||
없음
|
||||
|
||||
### 리뷰 검증
|
||||
|
||||
```bash
|
||||
$ cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
Formatted 3 files (0 changed) in 0.04 seconds.
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && dart analyze
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
# exit 0
|
||||
|
||||
$ cd ../oto && git diff --check
|
||||
# empty output, exit 0
|
||||
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
00:00 +12: All tests passed!
|
||||
# exit 0
|
||||
```
|
||||
|
||||
### 다음 단계
|
||||
|
||||
PASS: `complete.log` 작성 후 task directory를 `agent-task/archive/2026/06/m-oto-registration-online-smoke/02+01_oto_agent_session/`로 이동한다.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
# Complete - m-oto-registration-online-smoke/02+01_oto_agent_session
|
||||
|
||||
## 완료 일시
|
||||
|
||||
2026-06-04
|
||||
|
||||
## 요약
|
||||
|
||||
OTO agent persistent registration session subtask completed after 2 review loops; final verdict PASS.
|
||||
|
||||
## 루프 이력
|
||||
|
||||
| Plan | Review | Verdict | 메모 |
|
||||
|------|--------|---------|------|
|
||||
| `plan_cloud_G06_0.log` | `code_review_cloud_G06_0.log` | WARN | Persistent session implementation and targeted verification passed, but touched Dart files were not formatter-clean. |
|
||||
| `plan_local_G01_1.log` | `code_review_local_G01_1.log` | PASS | Formatter cleanup completed; format check, analyzer, whitespace check, and targeted Dart tests passed. |
|
||||
|
||||
## 구현/정리 내용
|
||||
|
||||
- Aligned OTO `protobuf` dependency with the `proto_socket` path dependency and regenerated protobuf Dart outputs for protobuf 6.x compatibility.
|
||||
- Added a persistent `EdgeAgentSession` API while preserving one-shot `EdgeRegistrationClient.register()`.
|
||||
- Updated `DefaultAgentRunner` to keep the registration session alive until shutdown and close it on accepted, rejected, and shutdown paths.
|
||||
- Added unit coverage for one-shot close behavior, runner persistent-session waiting, and rejected registration close behavior.
|
||||
- Applied Dart formatter cleanup for the touched manual Dart files.
|
||||
|
||||
## 최종 검증
|
||||
|
||||
- `cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart` - PASS; `Formatted 3 files (0 changed)`.
|
||||
- `cd ../oto && dart analyze` - PASS; `No issues found!`.
|
||||
- `cd ../oto && git diff --check` - PASS; empty output.
|
||||
- `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart` - PASS; `00:00 +12: All tests passed!`.
|
||||
|
||||
## 잔여 Nit
|
||||
|
||||
- 없음
|
||||
|
||||
## 후속 작업
|
||||
|
||||
- 없음
|
||||
|
|
@ -80,12 +80,12 @@ OTO `EdgeRegistrationClient.register()`는 registration response를 받은 뒤 c
|
|||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `../oto/pubspec.yaml`의 protobuf constraint를 path dependency `proto_socket`과 맞춰 tests가 resolve되게 한다.
|
||||
- [ ] 기존 `register()` 호환을 유지하면서 close하지 않는 OTO registration session API를 추가한다.
|
||||
- [ ] `DefaultAgentRunner.run()`이 registration 성공 후 agent connection을 유지하고 종료 신호 또는 cancellation에서 닫도록 조정한다.
|
||||
- [ ] OTO agent unit tests가 persistent session API와 rejected registration behavior를 검증하게 한다.
|
||||
- [ ] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
- [x] `../oto/pubspec.yaml`의 protobuf constraint를 path dependency `proto_socket`과 맞춰 tests가 resolve되게 한다.
|
||||
- [x] 기존 `register()` 호환을 유지하면서 close하지 않는 OTO registration session API를 추가한다.
|
||||
- [x] `DefaultAgentRunner.run()`이 registration 성공 후 agent connection을 유지하고 종료 신호 또는 cancellation에서 닫도록 조정한다.
|
||||
- [x] OTO agent unit tests가 persistent session API와 rejected registration behavior를 검증하게 한다.
|
||||
- [x] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [API-1] Dependency Alignment
|
||||
|
||||
|
|
@ -95,8 +95,9 @@ OTO `EdgeRegistrationClient.register()`는 registration response를 받은 뒤 c
|
|||
|
||||
수정 파일 및 체크리스트:
|
||||
|
||||
- [ ] `../oto/pubspec.yaml` protobuf constraint 업데이트.
|
||||
- [ ] `../oto/pubspec.lock`이 생성/변경되면 repo 정책에 맞춰 포함 여부 확인.
|
||||
- [x] `../oto/pubspec.yaml` protobuf constraint 업데이트. (`^3.1.0` → `^6.0.0`)
|
||||
- [x] `../oto/pubspec.lock`이 생성/변경되면 repo 정책에 맞춰 포함 여부 확인. (`dart pub get` 후 git 추적상 변경 없음)
|
||||
- [x] (추가) constraint 상향으로 protobuf 3.x style generated 코드가 6.x와 충돌 → 원본 proto에서 protoc-gen-dart로 재생성. CODE_REVIEW `계획 대비 변경 사항` 참고.
|
||||
|
||||
테스트 작성: SKIP. dependency alignment는 기존 agent tests 실행 가능 여부로 검증한다.
|
||||
|
||||
|
|
@ -137,9 +138,9 @@ Future<RegistrationResult> register(AgentConfig config) async {
|
|||
|
||||
수정 파일 및 체크리스트:
|
||||
|
||||
- [ ] `../oto/lib/oto/agent/edge_registration_client.dart` persistent session 타입 추가.
|
||||
- [ ] `../oto/lib/oto/agent/edge_registration_client.dart` one-shot `register()` 호환 보존.
|
||||
- [ ] `../oto/test/oto_agent_registration_test.dart` fake client 구조를 새 API와 호환되게 수정.
|
||||
- [x] `../oto/lib/oto/agent/edge_registration_client.dart` persistent session 타입 추가. (`EdgeAgentSession` + `openSession()`)
|
||||
- [x] `../oto/lib/oto/agent/edge_registration_client.dart` one-shot `register()` 호환 보존.
|
||||
- [x] `../oto/test/oto_agent_registration_test.dart` fake client 구조를 새 API와 호환되게 수정. (`FakeEdgeAgentSession` + `openSession()` override)
|
||||
|
||||
테스트 작성: `EdgeRegistrationClient` fake/session close test를 추가하거나 runner test에서 close 호출을 검증한다.
|
||||
|
||||
|
|
@ -159,10 +160,10 @@ cd ../oto && dart test test/oto_agent_registration_test.dart
|
|||
|
||||
수정 파일 및 체크리스트:
|
||||
|
||||
- [ ] `../oto/lib/oto/agent/agent_runner.dart` persistent session 사용.
|
||||
- [ ] `../oto/lib/oto/agent/agent_runner.dart` test injection 가능한 wait/stop hook 추가.
|
||||
- [ ] `../oto/test/oto_agent_registration_test.dart` success path가 session close까지 호출하는지 검증.
|
||||
- [ ] `../oto/lib/cli/commands/command_agent.dart` 변경이 필요하면 기존 `--config` parsing 유지.
|
||||
- [x] `../oto/lib/oto/agent/agent_runner.dart` persistent session 사용. (`openSession()` + `finally` close)
|
||||
- [x] `../oto/lib/oto/agent/agent_runner.dart` test injection 가능한 wait/stop hook 추가. (`waitForShutdown`, 기본값 SIGINT/SIGTERM 대기)
|
||||
- [x] `../oto/test/oto_agent_registration_test.dart` success path가 session close까지 호출하는지 검증.
|
||||
- [x] `../oto/lib/cli/commands/command_agent.dart` 변경이 필요하면 기존 `--config` parsing 유지. (call-site 조정 불필요로 미변경)
|
||||
|
||||
테스트 작성: fake client가 persistent session을 반환하고 runner wait future 완료 시 close되는지 확인한다.
|
||||
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
<!-- task=m-oto-registration-online-smoke/02+01_oto_agent_session plan=1 tag=REVIEW_API -->
|
||||
|
||||
# Follow-up Plan - REVIEW_API
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
이 plan은 `code_review_cloud_G06_0.log`의 WARN finding만 처리한다. 코드 동작, protobuf 생성물, runner/session 설계는 바꾸지 말고 formatter mismatch 해소와 검증 출력 기록에 집중한다.
|
||||
|
||||
구현 중 사용자-only blocker가 있으면 active review stub의 `사용자 리뷰 요청` 섹션에 정확한 결정, 근거, 재개 조건을 남기고 멈춘다. 명령 재실행이나 출력 수집으로 해소 가능한 증거 공백은 사용자 리뷰 요청이 아니다.
|
||||
|
||||
## 배경
|
||||
|
||||
첫 리뷰는 기능 구현과 targeted verification을 통과했지만, 수동 변경 Dart 파일 2개가 formatter 기준을 통과하지 못해 `WARN`으로 종료되었다.
|
||||
|
||||
## 이전 리뷰 요약
|
||||
|
||||
- Archived plan: `agent-task/m-oto-registration-online-smoke/02+01_oto_agent_session/plan_cloud_G06_0.log`
|
||||
- Archived review: `agent-task/m-oto-registration-online-smoke/02+01_oto_agent_session/code_review_cloud_G06_0.log`
|
||||
- Verdict: `WARN`
|
||||
- Issue: `../oto/lib/oto/agent/edge_registration_client.dart`와 `../oto/lib/oto/agent/agent_runner.dart`가 `dart format --output=none --set-exit-if-changed`를 통과하지 못함.
|
||||
|
||||
## 범위 결정 근거
|
||||
|
||||
- 이번 follow-up은 format-only 정리다.
|
||||
- `../oto/lib/oto/agent/**`의 동작, `../oto/pubspec.yaml`, generated protobuf 파일, iop Edge 구현, smoke evidence 수집은 수정하지 않는다.
|
||||
- `test/oto_iop_connection_smoke_test.dart`는 별도 active subtask `03+01,02_smoke_evidence`의 범위이므로 여기서 고치지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `cd ../oto && dart format lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 formatter mismatch를 해소한다.
|
||||
- [ ] `cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 exit 0을 기록한다.
|
||||
- [ ] `cd ../oto && dart analyze`를 실행한다.
|
||||
- [ ] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [REVIEW_API-1] Dart Formatter Cleanup
|
||||
|
||||
문제: `code_review_cloud_G06_0.log`에서 `dart format --output=none --set-exit-if-changed`가 `edge_registration_client.dart`와 `agent_runner.dart`를 변경 대상으로 보고했다.
|
||||
|
||||
해결 방법: formatter를 적용하고, 동일 format check가 exit 0이 되는지 확인한다.
|
||||
|
||||
Before:
|
||||
|
||||
```text
|
||||
Changed lib/oto/agent/edge_registration_client.dart
|
||||
Changed lib/oto/agent/agent_runner.dart
|
||||
Formatted 3 files (2 changed) in 0.04 seconds.
|
||||
# exit 1
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```text
|
||||
Formatted 3 files (0 changed) in ...
|
||||
# exit 0
|
||||
```
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
|
||||
- [ ] `../oto/lib/oto/agent/edge_registration_client.dart` formatter 적용.
|
||||
- [ ] `../oto/lib/oto/agent/agent_runner.dart` formatter 적용.
|
||||
- [ ] `../oto/test/oto_agent_registration_test.dart` formatter command 대상에 포함하되, 실제 변경 여부를 기록.
|
||||
|
||||
테스트 작성: SKIP. format-only follow-up이며 기존 targeted tests를 재실행한다.
|
||||
|
||||
중간 검증:
|
||||
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
```
|
||||
|
||||
예상 결과: exit code 0.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `../oto/lib/oto/agent/edge_registration_client.dart` | REVIEW_API-1 |
|
||||
| `../oto/lib/oto/agent/agent_runner.dart` | REVIEW_API-1 |
|
||||
| `../oto/test/oto_agent_registration_test.dart` | REVIEW_API-1, only if formatter changes it |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
cd ../oto && dart analyze
|
||||
cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
```
|
||||
|
||||
예상 결과: 모두 exit code 0. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다.
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
<!-- task=m-oto-registration-online-smoke/03+01,02_smoke_evidence plan=0 tag=TEST -->
|
||||
|
||||
# Code Review Reference - TEST
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-03
|
||||
task=m-oto-registration-online-smoke/03+01,02_smoke_evidence, plan=0, tag=TEST
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-online-smoke.md`
|
||||
- Task ids:
|
||||
- `heartbeat-online`: 최초 heartbeat 도착 후 online으로 전환된다. 검증: OTO Dart smoke 또는 통합 smoke에서 registration accepted 뒤 heartbeat 도착까지 확인한다.
|
||||
- `unlock-evidence`: OTO `oto-agent` 등록 흐름 잠금 해제에 사용할 smoke 결과와 실행 명령이 문서 또는 test log에 남는다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`로 이동합니다. roadmap 수정은 런타임 책임입니다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [TEST-1] Make OTO Smoke Repo Path Explicit | [x] |
|
||||
| [TEST-2] Assert Accepted Then Heartbeat Online | [x] |
|
||||
| [TEST-3] iop Makefile Target and Evidence Command | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] OTO smoke가 iop repo path를 env로 받을 수 있게 하거나 iop-side wrapper가 현재 repo를 명시하게 한다.
|
||||
- [x] OTO Dart smoke 또는 iop wrapper가 registration accepted 뒤 heartbeat/online event를 확인한다.
|
||||
- [x] `make test-oto-registration-online-smoke` 또는 동등한 iop Makefile target을 추가한다.
|
||||
- [x] smoke output에 unlock handoff용 실행 명령과 accepted/heartbeat/online evidence가 남게 한다.
|
||||
- [x] `go test -count=1 ./apps/edge/internal/transport ./apps/edge/internal/node ./apps/edge/internal/service ./packages/go/events`와 OTO smoke target을 실행한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G07_M.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS이면 active task 디렉터리 `agent-task/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`를 archive로 이동한다.
|
||||
- [ ] PASS split 작업이면 이동 후 parent에 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
- [x] WARN follow-up `PLAN-local-G01.md`와 `CODE_REVIEW-local-G01.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
- **online evidence 수집 경로 변경(TEST-2)**: 계획은 "Edge stdout/console log에 node.online marker를 기다린다"였으나, Edge serve는 application(zap) log를 stderr가 아니라 `<exe>/logs/edge.log`(미지정 시 기본 경로)에 쓴다(`apps/edge/cmd/edge/main.go:104` `resolveEdgeLogPath`). stderr에는 Fx 부트스트랩 로그만 나온다. 그래서 smoke edge config에 `logging.path`를 temp `edge.log`로 명시하고, test는 process stdout이 아니라 그 로그 파일을 tail해서 `node.online`을 확인한다(`_waitForLogMarker`). process stderr 버퍼는 실패 시 context로만 사용한다.
|
||||
- **online 대기 시간 60s, 전체 timeout 180s**: `node.online`(`reason=first_heartbeat`)은 등록 직후가 아니라 proto-socket heartbeat interval(~30s)의 첫 주기 heartbeat에서 발생한다(실측 등록 +30s). 계획의 가정보다 늦으므로 online 대기를 60s, test timeout을 45s→180s로 늘렸다.
|
||||
- **bootstrap.listen free 포트 지정**: Edge serve는 항상 bootstrap artifact server를 띄우고 기본 listen은 고정 `0.0.0.0:18080`이다(`packages/go/config/config.go:270`). 18080이 점유되면 Edge 기동이 실패하므로(OnStart 실패) smoke config에 free `bootstrap.listen` 포트를 할당했다. 계획에 없던 robustness 보완이다.
|
||||
- **GOCACHE override 변경 + `_waitForPort` 120s**: 기존 test는 매 실행 fresh temp `GOCACHE`로 cold build(실측 ~58s)를 강제해 20s port wait deadline을 넘길 위험이 있었다. 안정적 재현을 위해 stable shared cache(`${systemTemp}/oto-iop-smoke-gocache`)로 바꿔 후속 실행을 warm(빌드 캐시 재사용)하게 하고, 첫 cold build를 견디도록 `_waitForPort` deadline을 20s→120s로 늘렸다.
|
||||
- **wrapper script 미생성(TEST-3)**: 계획상 선택 사항이던 `scripts/e2e-oto-registration-online-smoke.sh`는 만들지 않았다. inline Makefile target이 더 단순하고 generic `scripts/e2e-smoke.sh`와 섞이지 않으므로 inline로 끝냈다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
- **persistent session 사용**: one-shot `register()` 대신 `EdgeRegistrationClient.openSession()`을 써 등록 이후 연결을 유지한다. heartbeat가 Edge에 도달해 online 전환이 일어나려면 연결이 살아 있어야 한다. test finally에서 `session.close()`로 정리한다.
|
||||
- **`agent_kind: "oto-agent"` 명시**: Edge의 first-heartbeat→online listener는 oto-agent kind에만 붙는다(`apps/edge/internal/transport/server.go:218`). temp config의 node에 `agent_kind`를 넣어 online lifecycle 경로를 활성화했다. 이 값이 없으면 generic-node로 처리되어 online 전환이 일어나지 않는다.
|
||||
- **IOP_REPO_ROOT env override**: hardcoded `workingDirectory: '../iop'`를 `Platform.environment['IOP_REPO_ROOT'] ?? '../iop'`로 바꿔 same-host 기본은 유지하면서 iop2oto 등 임의 checkout을 대상으로 실행 가능하게 했다. Makefile target은 `IOP_REPO_ROOT=$(CURDIR)`로 현재 repo를 명시한다.
|
||||
- **online marker로 heartbeat까지 증명**: `node.online` 이벤트의 `reason`이 `first_heartbeat`이므로 online 라인 하나로 "first heartbeat 도착 + online 전환"을 함께 증거로 남긴다. test는 이 라인을 stdout으로 print해 unlock handoff evidence로 노출한다.
|
||||
- **secret 미커밋**: token은 non-secret test 값(`oto-smoke-token`)이고 temp dir만 사용한다. tracked docs/log에 실제 secret을 남기지 않는다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- predecessor complete.log가 `01`과 `02` 모두 있었는가?
|
||||
- smoke가 same-host 기본 경로를 사용하고 split-host를 기본값으로 요구하지 않는가?
|
||||
- output에 registration accepted, first heartbeat, online evidence가 모두 남는가?
|
||||
- token/secret 원문이 tracked docs나 logs에 남지 않는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
### TEST-1 중간 검증
|
||||
```bash
|
||||
$ rg --sort path "../iop|IOP_REPO_ROOT|agent_kind" ../oto/test/oto_iop_connection_smoke_test.dart
|
||||
/// Defaults to the same-host sibling `../iop` checkout, but `IOP_REPO_ROOT`
|
||||
final override = Platform.environment['IOP_REPO_ROOT'];
|
||||
return '../iop';
|
||||
agent_kind: "oto-agent"
|
||||
```
|
||||
결과: `IOP_REPO_ROOT`와 `agent_kind`가 보이고, `../iop`는 default fallback일 뿐 hardcoded-only path가 없다. (기대 결과 충족)
|
||||
|
||||
### TEST-2 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
[oto-smoke] iop repo root: /config/workspace/iop2oto
|
||||
[oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke
|
||||
[oto-smoke] online evidence: {"level":"debug","ts":1780562158.140313,"caller":"transport/server.go:314","msg":"node event received","node_id":"oto-smoke-node","type":"node.online","reason":"first_heartbeat"}
|
||||
00:31 +1: All tests passed!
|
||||
```
|
||||
결과: exit 0. registration accepted, node.online(`reason=first_heartbeat`) evidence 모두 출력됨.
|
||||
|
||||
### TEST-3 중간 검증
|
||||
```bash
|
||||
$ make test-oto-registration-online-smoke
|
||||
==> OTO registration online smoke
|
||||
command: cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
[oto-smoke] iop repo root: /config/workspace/iop2oto
|
||||
[oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke
|
||||
[oto-smoke] online evidence: {"level":"debug",...,"type":"node.online","reason":"first_heartbeat"}
|
||||
00:32 +1: All tests passed!
|
||||
make exit: 0
|
||||
```
|
||||
결과: exit 0. unlock handoff용 실행 command가 target 출력에 echo됨.
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ go test -count=1 ./apps/edge/internal/transport ./apps/edge/internal/node ./apps/edge/internal/service ./packages/go/events
|
||||
ok iop/apps/edge/internal/transport 2.027s
|
||||
ok iop/apps/edge/internal/node 0.012s
|
||||
ok iop/apps/edge/internal/service 0.008s
|
||||
? iop/packages/go/events [no test files]
|
||||
go test exit: 0
|
||||
|
||||
$ cd ../oto && dart analyze
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
dart analyze (project) exit: 0
|
||||
|
||||
$ make test-oto-registration-online-smoke
|
||||
... [oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke
|
||||
... [oto-smoke] online evidence: {... "type":"node.online","reason":"first_heartbeat"}
|
||||
00:32 +1: All tests passed!
|
||||
make exit: 0
|
||||
```
|
||||
결과: 모두 exit 0. go test는 fresh(`-count=1`)로 캐시 출력 없이 통과(`packages/go/events`는 test 파일 없음). dart analyze 무이슈. OTO online smoke가 command·accepted·first-heartbeat/online evidence를 함께 남긴다.
|
||||
|
||||
## Unlock Handoff 명령 (evidence)
|
||||
|
||||
OTO `oto-agent` 등록 흐름 잠금 해제 evidence로 사용할 재현 명령:
|
||||
|
||||
```bash
|
||||
make test-oto-registration-online-smoke
|
||||
# 또는 직접:
|
||||
cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
```
|
||||
|
||||
기대 evidence:
|
||||
- `[oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke`
|
||||
- `node.online` 이벤트(`reason=first_heartbeat`) — registration accepted 뒤 첫 heartbeat 도착으로 online 전환
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
- 종합 판정: WARN
|
||||
- 차원별 평가:
|
||||
- correctness: Pass
|
||||
- completeness: Pass
|
||||
- test coverage: Pass
|
||||
- API contract: Pass
|
||||
- code quality: Warn
|
||||
- plan deviation: Pass
|
||||
- verification trust: Pass
|
||||
- 발견된 문제:
|
||||
- Suggested: `../oto/test/oto_iop_connection_smoke_test.dart:211`가 Dart formatter 기준을 만족하지 않는다. `dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`에서 `Changed test/oto_iop_connection_smoke_test.dart`로 실패했다. 해당 파일을 `dart format`으로 정리한 뒤 format check, `dart analyze`, `make test-oto-registration-online-smoke`를 재확인한다.
|
||||
- 다음 단계: WARN follow-up plan/review를 작성해 formatter cleanup과 재검증만 수행한다.
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
<!-- task=m-oto-registration-online-smoke/03+01,02_smoke_evidence plan=1 tag=REVIEW_TEST -->
|
||||
|
||||
# Code Review Reference - REVIEW_TEST
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Evidence gaps that a follow-up agent can close by rerunning commands or collecting artifacts are normal follow-up issues, not user-review blockers by themselves.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||
> Follow the ownership table at the bottom of this file for which sections you own.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-04
|
||||
task=m-oto-registration-online-smoke/03+01,02_smoke_evidence, plan=1, tag=REVIEW_TEST
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-online-smoke.md`
|
||||
- Task ids:
|
||||
- `heartbeat-online`: 최초 heartbeat 도착 후 online으로 전환된다. 검증: OTO Dart smoke 또는 통합 smoke에서 registration accepted 뒤 heartbeat 도착까지 확인한다.
|
||||
- `unlock-evidence`: OTO `oto-agent` 등록 흐름 잠금 해제에 사용할 smoke 결과와 실행 명령이 문서 또는 test log에 남는다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||
|
||||
1. 판정을 append한다.
|
||||
2. `CODE_REVIEW-{review_lane}-GNN.md` -> `code_review_{review_lane}_GNN_N.log`, `PLAN-{build_lane}-GNN.md` -> `plan_{build_lane}_GNN_M.log`로 아카이브한다.
|
||||
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
|
||||
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
|
||||
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [REVIEW_TEST-1] Format OTO Smoke Test | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] `../oto/test/oto_iop_connection_smoke_test.dart`를 Dart formatter 기준으로 정리한다.
|
||||
- [x] `cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 formatter-clean을 확인한다.
|
||||
- [x] `cd ../oto && dart analyze`와 `make test-oto-registration-online-smoke`를 실행해 기존 analyzer/smoke evidence가 유지되는지 확인한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_{review_lane}_GNN_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_{build_lane}_GNN_M.log`로 아카이브한다.
|
||||
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [x] PASS이면 active task 디렉터리 `agent-task/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`를 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-oto-registration-online-smoke/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
|
||||
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
- 계획 대비 변경 사항 없음. `PLAN-local-G01.md`에 명시된 대로 `../oto/test/oto_iop_connection_smoke_test.dart` 파일에 `dart format`을 적용하여 서식을 정리했습니다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
- 기능적인 로직 변경 사항은 없으며, Dart SDK 공식 포맷터 표준에 맞춰 긴 삼항 할당 및 들여쓰기 등을 정리했습니다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- formatter-clean 명령이 exit code 0인가?
|
||||
- formatter cleanup 외의 기능 변경이 들어가지 않았는가?
|
||||
- analyzer와 OTO online smoke evidence가 유지되는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
1. **Dart 포맷 검사 결과**
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
```
|
||||
```text
|
||||
Formatted 4 files (0 changed) in 0.06 seconds.
|
||||
```
|
||||
|
||||
2. **Dart analyze 실행 결과**
|
||||
```bash
|
||||
cd ../oto && dart analyze
|
||||
```
|
||||
```text
|
||||
Analyzing oto...
|
||||
No issues found!
|
||||
```
|
||||
|
||||
3. **E2E Smoke 테스트 실행 결과**
|
||||
```bash
|
||||
make test-oto-registration-online-smoke
|
||||
```
|
||||
```text
|
||||
==> OTO registration online smoke
|
||||
command: cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
00:00 +0: loading test/oto_iop_connection_smoke_test.dart
|
||||
00:01 +0: loading test/oto_iop_connection_smoke_test.dart
|
||||
00:01 +0: OTO Dart proto-socket client registers with iop Edge and goes online
|
||||
[oto-smoke] iop repo root: /config/workspace/iop2oto
|
||||
[oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke
|
||||
[oto-smoke] online evidence: {"level":"debug","ts":1780564855.8409436,"caller":"transport/server.go:314","msg":"node event received","node_id":"oto-smoke-node","type":"node.online","reason":"first_heartbeat"}
|
||||
00:34 +1: OTO Dart proto-socket client registers with iop Edge and goes online
|
||||
00:34 +1: All tests passed!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?** Yes.
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
- 종합 판정: PASS
|
||||
- 차원별 평가:
|
||||
- correctness: Pass
|
||||
- completeness: Pass
|
||||
- test coverage: Pass
|
||||
- API contract: Pass
|
||||
- code quality: Pass
|
||||
- plan deviation: Pass
|
||||
- verification trust: Pass
|
||||
- 발견된 문제: 없음
|
||||
- 다음 단계: PASS 종결 처리로 `complete.log` 작성 후 task directory를 archive로 이동한다.
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# Complete - m-oto-registration-online-smoke/03+01,02_smoke_evidence
|
||||
|
||||
## 완료 일시
|
||||
|
||||
2026-06-04
|
||||
|
||||
## 요약
|
||||
|
||||
OTO registration online smoke evidence subtask completed after 2 review loops; final verdict PASS.
|
||||
|
||||
## 루프 이력
|
||||
|
||||
| Plan | Review | Verdict | 메모 |
|
||||
|------|--------|---------|------|
|
||||
| `plan_cloud_G07_0.log` | `code_review_cloud_G07_0.log` | WARN | OTO online smoke implementation and evidence passed, but touched Dart smoke file was not formatter-clean. |
|
||||
| `plan_local_G01_1.log` | `code_review_local_G01_1.log` | PASS | Formatter cleanup completed; format check, analyzer, whitespace checks, and OTO online smoke passed. |
|
||||
|
||||
## 구현/정리 내용
|
||||
|
||||
- Added an iop Makefile entrypoint `test-oto-registration-online-smoke` that runs the sibling OTO Dart smoke with `IOP_REPO_ROOT=$(CURDIR)` and prints the unlock handoff command.
|
||||
- Extended the OTO smoke to keep the registration session alive, wait for `node.online` with `reason=first_heartbeat`, and print accepted plus online evidence.
|
||||
- Made the OTO smoke repo path explicit through `IOP_REPO_ROOT`, set `agent_kind: "oto-agent"` in the temp Edge config, and used temp ports/log paths for same-host reproducibility.
|
||||
- Applied Dart formatter cleanup for `test/oto_iop_connection_smoke_test.dart`.
|
||||
|
||||
## 최종 검증
|
||||
|
||||
- `cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart` - PASS; `Formatted 4 files (0 changed) in 0.13 seconds.`
|
||||
- `cd ../oto && dart analyze` - PASS; `No issues found!`.
|
||||
- `cd ../oto && git diff --check` - PASS; empty output.
|
||||
- `git diff --check` - PASS; empty output.
|
||||
- `make test-oto-registration-online-smoke` - PASS; output printed the handoff command, `[oto-smoke] registration accepted node=oto-smoke-node alias=oto-smoke`, and `node.online` evidence with `reason":"first_heartbeat"`.
|
||||
|
||||
## Roadmap Completion
|
||||
|
||||
- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-online-smoke.md`
|
||||
- Completed task ids:
|
||||
- `heartbeat-online`: PASS; evidence=`agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/plan_cloud_G07_0.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/code_review_cloud_G07_0.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/plan_local_G01_1.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/code_review_local_G01_1.log`; verification=`make test-oto-registration-online-smoke`
|
||||
- `unlock-evidence`: PASS; evidence=`agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/plan_cloud_G07_0.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/code_review_cloud_G07_0.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/plan_local_G01_1.log`, `agent-task/archive/2026/06/m-oto-registration-online-smoke/03+01,02_smoke_evidence/code_review_local_G01_1.log`; verification=`make test-oto-registration-online-smoke`
|
||||
- Not completed task ids: 없음
|
||||
|
||||
## 잔여 Nit
|
||||
|
||||
- 없음
|
||||
|
||||
## 후속 작업
|
||||
|
||||
- 없음
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
<!-- task=m-oto-registration-online-smoke/03+01,02_smoke_evidence plan=1 tag=REVIEW_TEST -->
|
||||
|
||||
# OTO Registration Online Smoke Formatter Follow-up
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
이 plan은 1차 리뷰 WARN에서 발견된 Dart formatter cleanup만 수행한다. 기능 변경, smoke 구조 변경, 추가 리팩터링은 범위 밖이다. 구현 후 active `CODE_REVIEW-*-G??.md`의 구현 소유 섹션에 실제 명령과 stdout/stderr를 남기고, code-review가 archive/complete 처리를 맡게 둔다.
|
||||
|
||||
## 배경
|
||||
|
||||
1차 `cloud-G07` 리뷰에서 OTO registration online smoke의 기능 검증은 통과했다. 다만 `dart format --output=none --set-exit-if-changed ...`가 `test/oto_iop_connection_smoke_test.dart` formatter 차이를 보고해 WARN으로 후속 루프가 필요하다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
사용자-owned 외부 host, credential, private endpoint가 꼭 필요해지면 review stub의 `사용자 리뷰 요청`에 근거를 남긴다. 이 follow-up은 기본적으로 local formatter cleanup이므로, formatter/test 재실행으로 확인 가능한 실패는 사용자 리뷰 요청이 아니라 후속 구현/검증 이슈다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-online-smoke.md`
|
||||
- Task ids:
|
||||
- `heartbeat-online`: 최초 heartbeat 도착 후 online으로 전환된다. 검증: OTO Dart smoke 또는 통합 smoke에서 registration accepted 뒤 heartbeat 도착까지 확인한다.
|
||||
- `unlock-evidence`: OTO `oto-agent` 등록 흐름 잠금 해제에 사용할 smoke 결과와 실행 명령이 문서 또는 test log에 남는다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 범위 결정 근거
|
||||
|
||||
- 이전 루프에서 `go test`, `dart analyze`, `make test-oto-registration-online-smoke`는 통과했다.
|
||||
- WARN 사유는 formatter-clean 하나이므로, 이번 루프는 Dart format 적용과 그에 따른 검증 재확인만 수행한다.
|
||||
- `Makefile`, Edge lifecycle code, OTO persistent session API, smoke assertion 로직은 변경하지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `../oto/test/oto_iop_connection_smoke_test.dart`를 Dart formatter 기준으로 정리한다.
|
||||
- [ ] `cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart`를 실행해 formatter-clean을 확인한다.
|
||||
- [ ] `cd ../oto && dart analyze`와 `make test-oto-registration-online-smoke`를 실행해 기존 analyzer/smoke evidence가 유지되는지 확인한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [REVIEW_TEST-1] Format OTO Smoke Test
|
||||
|
||||
문제: `../oto/test/oto_iop_connection_smoke_test.dart:211`의 긴 삼항 할당이 Dart formatter 기준을 만족하지 않는다. 1차 리뷰에서 아래 명령이 실패했다.
|
||||
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
```
|
||||
|
||||
출력 요약:
|
||||
|
||||
```text
|
||||
Changed test/oto_iop_connection_smoke_test.dart
|
||||
Formatted 4 files (1 changed) in 0.13 seconds.
|
||||
```
|
||||
|
||||
해결 방법: `../oto/test/oto_iop_connection_smoke_test.dart`에 `dart format`을 적용한다. formatter가 바꾸는 줄 외의 기능 변경은 하지 않는다.
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
|
||||
- [ ] `../oto/test/oto_iop_connection_smoke_test.dart` format 적용.
|
||||
- [ ] 기능 로직이나 smoke timeout/marker/command는 변경하지 않는다.
|
||||
|
||||
중간 검증:
|
||||
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
```
|
||||
|
||||
예상 결과: exit code 0, `Formatted 4 files (0 changed)`.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `../oto/test/oto_iop_connection_smoke_test.dart` | REVIEW_TEST-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd ../oto && dart format --output=none --set-exit-if-changed test/oto_iop_connection_smoke_test.dart lib/oto/agent/edge_registration_client.dart lib/oto/agent/agent_runner.dart test/oto_agent_registration_test.dart
|
||||
cd ../oto && dart analyze
|
||||
make test-oto-registration-online-smoke
|
||||
```
|
||||
|
||||
예상 결과: 모두 exit code 0. Smoke output은 command, registration accepted, `node.online`/`first_heartbeat` evidence를 유지해야 한다.
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
<!-- task=m-oto-registration-online-smoke/02+01_oto_agent_session plan=0 tag=API -->
|
||||
|
||||
# Code Review Reference - API
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-03
|
||||
task=m-oto-registration-online-smoke/02+01_oto_agent_session, plan=0, tag=API
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/02+01_oto_agent_session/`로 이동합니다. roadmap 수정은 런타임 책임입니다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [API-1] Dependency Alignment | [ ] |
|
||||
| [API-2] Persistent Edge Session API | [ ] |
|
||||
| [API-3] Runner Keeps Agent Alive | [ ] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `../oto/pubspec.yaml`의 protobuf constraint를 path dependency `proto_socket`과 맞춰 tests가 resolve되게 한다.
|
||||
- [ ] 기존 `register()` 호환을 유지하면서 close하지 않는 OTO registration session API를 추가한다.
|
||||
- [ ] `DefaultAgentRunner.run()`이 registration 성공 후 agent connection을 유지하고 종료 신호 또는 cancellation에서 닫도록 조정한다.
|
||||
- [ ] OTO agent unit tests가 persistent session API와 rejected registration behavior를 검증하게 한다.
|
||||
- [ ] `cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_N.log`로 아카이브한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G06_M.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS이면 active task 디렉터리 `agent-task/m-oto-registration-online-smoke/02+01_oto_agent_session/`를 archive로 이동한다.
|
||||
- [ ] PASS split 작업이면 이동 후 parent에 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- 기존 one-shot `register()` API와 tests가 유지되는가?
|
||||
- persistent session이 registration failure에서는 leak 없이 닫히는가?
|
||||
- runner가 test-injectable wait/stop 경계를 가져서 unit test가 hang하지 않는가?
|
||||
- `pubspec.yaml` dependency update가 generated protobuf를 수동 편집하지 않고 해결되는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
### API-1 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && dart pub get
|
||||
```
|
||||
|
||||
### API-2 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart
|
||||
```
|
||||
|
||||
### API-3 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd ../oto && dart pub get
|
||||
$ cd ../oto && dart analyze
|
||||
$ cd ../oto && dart test test/oto_agent_registration_test.dart test/oto_agent_config_test.dart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
<!-- task=m-oto-registration-online-smoke/03+01,02_smoke_evidence plan=0 tag=TEST -->
|
||||
|
||||
# Code Review Reference - TEST
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-03
|
||||
task=m-oto-registration-online-smoke/03+01,02_smoke_evidence, plan=0, tag=TEST
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/oto-registration-online-smoke.md`
|
||||
- Task ids:
|
||||
- `heartbeat-online`: 최초 heartbeat 도착 후 online으로 전환된다. 검증: OTO Dart smoke 또는 통합 smoke에서 registration accepted 뒤 heartbeat 도착까지 확인한다.
|
||||
- `unlock-evidence`: OTO `oto-agent` 등록 흐름 잠금 해제에 사용할 smoke 결과와 실행 명령이 문서 또는 test log에 남는다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`로 이동합니다. roadmap 수정은 런타임 책임입니다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [TEST-1] Make OTO Smoke Repo Path Explicit | [ ] |
|
||||
| [TEST-2] Assert Accepted Then Heartbeat Online | [ ] |
|
||||
| [TEST-3] iop Makefile Target and Evidence Command | [ ] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] OTO smoke가 iop repo path를 env로 받을 수 있게 하거나 iop-side wrapper가 현재 repo를 명시하게 한다.
|
||||
- [ ] OTO Dart smoke 또는 iop wrapper가 registration accepted 뒤 heartbeat/online event를 확인한다.
|
||||
- [ ] `make test-oto-registration-online-smoke` 또는 동등한 iop Makefile target을 추가한다.
|
||||
- [ ] smoke output에 unlock handoff용 실행 명령과 accepted/heartbeat/online evidence가 남게 한다.
|
||||
- [ ] `go test -count=1 ./apps/edge/internal/transport ./apps/edge/internal/node ./apps/edge/internal/service ./packages/go/events`와 OTO smoke target을 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_N.log`로 아카이브한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G07_M.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS이면 active task 디렉터리 `agent-task/m-oto-registration-online-smoke/03+01,02_smoke_evidence/`를 archive로 이동한다.
|
||||
- [ ] PASS split 작업이면 이동 후 parent에 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- predecessor complete.log가 `01`과 `02` 모두 있었는가?
|
||||
- smoke가 same-host 기본 경로를 사용하고 split-host를 기본값으로 요구하지 않는가?
|
||||
- output에 registration accepted, first heartbeat, online evidence가 모두 남는가?
|
||||
- token/secret 원문이 tracked docs나 logs에 남지 않는가?
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
### TEST-1 중간 검증
|
||||
```bash
|
||||
$ rg --sort path "../iop|IOP_REPO_ROOT|agent_kind" ../oto/test/oto_iop_connection_smoke_test.dart
|
||||
```
|
||||
|
||||
### TEST-2 중간 검증
|
||||
```bash
|
||||
$ cd ../oto && IOP_REPO_ROOT=/config/workspace/iop2oto dart test test/oto_iop_connection_smoke_test.dart
|
||||
```
|
||||
|
||||
### TEST-3 중간 검증
|
||||
```bash
|
||||
$ make test-oto-registration-online-smoke
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ go test -count=1 ./apps/edge/internal/transport ./apps/edge/internal/node ./apps/edge/internal/service ./packages/go/events
|
||||
$ cd ../oto && dart analyze
|
||||
$ make test-oto-registration-online-smoke
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
Loading…
Reference in a new issue