Add review_followup_alignment task
This commit is contained in:
parent
86b10a6c54
commit
18b2880738
8 changed files with 590 additions and 0 deletions
|
|
@ -0,0 +1,74 @@
|
|||
<!-- task=review_followup_alignment/01_openai_log_preview_guard plan=0 tag=REVIEW_LOG -->
|
||||
# CODE_REVIEW-local-G04: OpenAI 호환 로그 preview 안전장치
|
||||
date=2026-07-06
|
||||
|
||||
## 상태
|
||||
구현 대기
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 이 파일의 구현 에이전트 소유 섹션을 실제 변경 내용, 계획 대비 변경, 검증 출력으로 채운다. active `PLAN-*.md`와 `CODE_REVIEW-*.md`는 남겨두고 review 준비 상태를 보고한다. 직접 사용자에게 질문하거나 `USER_REVIEW.md`를 만들거나 archive/complete 처리를 하지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_LOG-1의 로그 preview 제거, 메타데이터 대체, 회귀 테스트를 구현한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 실패 시 원인과 수정 내용을 `CODE_REVIEW-local-G04.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] 판정과 Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] `.gitignore`의 Agent-Ops 관리 block을 확인한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS split 작업이면 이동 후 빈 active parent 정리 여부를 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 연결 대상: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
- OpenAI-compatible 로그에 prompt/content/reasoning 원문 preview 필드가 남지 않는가.
|
||||
- 운영 관측에 필요한 비내용 메타데이터는 남아 있는가.
|
||||
- 테스트가 실제 zap field 회귀를 잡는가.
|
||||
|
||||
## 검증 결과
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
|
||||
### REVIEW_LOG-1 중간 검증
|
||||
```bash
|
||||
go test -count=1 ./apps/edge/internal/openai
|
||||
rg --sort path -n 'zap\.(String|Any)\("(prompt|content|reasoning|source|delta)_preview"' apps/edge/internal/openai
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
go test -count=1 ./apps/edge/internal/openai
|
||||
rg --sort path -n 'zap\.(String|Any)\("(prompt|content|reasoning|source|delta)_preview"' apps/edge/internal/openai
|
||||
```
|
||||
|
||||
## 코드리뷰 결과
|
||||
_리뷰 에이전트가 append한다._
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
<!-- task=review_followup_alignment/01_openai_log_preview_guard plan=0 tag=REVIEW_LOG -->
|
||||
# PLAN-local-G04: OpenAI 호환 로그 preview 안전장치
|
||||
date=2026-07-06
|
||||
|
||||
## 목적
|
||||
OpenAI-compatible 입력/출력 로그가 prompt, content, reasoning 일부를 preview 필드로 남기지 않도록 정리한다. 운영 관측은 유지하되, 내용 원문은 redaction/retention 정책이 확정되기 전까지 로그 표면에 올리지 않는다.
|
||||
|
||||
## 분석 결과
|
||||
- 읽은 파일: `agent-ops/rules/project/rules.md`, `agent-ops/rules/private/rules.md`, `agent-ops/rules/common/rules-roadmap.md`, `agent-ops/skills/common/router.md`, `agent-ops/skills/common/plan/SKILL.md`, `agent-test/local/rules.md`, `agent-test/local/edge-smoke.md`, `agent-ops/rules/project/domain/edge/rules.md`, `agent-ops/rules/project/domain/testing/rules.md`, `apps/edge/internal/openai/chat_handler.go`, `apps/edge/internal/openai/responses_handler.go`, `apps/edge/internal/openai/stream.go`.
|
||||
- SDD 기준: 기존 리뷰 follow-up이며 새 기능 SDD가 필요한 범위가 아니다. 현재 로드맵 active Milestone은 `[스케치]` 및 구현 잠금 상태이므로 이 plan은 로드맵 완료 항목을 선언하지 않는다.
|
||||
- 테스트 환경 규칙: local 기준. OpenAI-compatible Edge package 단위 Go 테스트와 정적 검색으로 검증한다.
|
||||
- 테스트 커버리지 공백: 현재 로그에 민감 preview 필드가 남지 않는지 확인하는 전용 테스트가 없다.
|
||||
- 심볼 참조: `logOpenAICompatStreamOutput`, `openAICompatTraceEnabled`, `previewString`.
|
||||
- 분할 판단: 리뷰 follow-up은 `review_followup_alignment` task group의 split 작업이다. 이 plan은 OpenAI 로그 표면만 다루며 문서, Client/Nexo, mock 활성화와 독립적으로 완료 가능하다.
|
||||
- 범위 결정 근거: 로그 필드 제거/대체와 테스트 추가로 닫을 수 있는 Edge-local 변경이다. usage ledger, redaction policy, export policy 설계는 현재 locked Milestone 영역이므로 건드리지 않는다.
|
||||
- 빌드 등급: `local-G04`. HTTP handler/stream 로그 경로와 테스트가 포함되지만 외부 서비스는 필요 없다.
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 `CODE_REVIEW-local-G04.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다. 구현 중 직접 사용자에게 질문하거나 선택지를 제시하지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실제 구현을 차단할 때만 review stub의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다.
|
||||
|
||||
## 작업 항목
|
||||
|
||||
### REVIEW_LOG-1. OpenAI-compatible 로그 preview 비노출
|
||||
- 문제:
|
||||
- `apps/edge/internal/openai/chat_handler.go:62`와 `apps/edge/internal/openai/chat_handler.go:330` 계열 로그가 입력 prompt와 출력 content preview를 남긴다.
|
||||
- `apps/edge/internal/openai/responses_handler.go:87`와 `apps/edge/internal/openai/responses_handler.go:179` 계열 로그가 입력/출력 preview를 남긴다.
|
||||
- `apps/edge/internal/openai/stream.go:55`, `apps/edge/internal/openai/stream.go:105`, `apps/edge/internal/openai/stream.go:136`, `apps/edge/internal/openai/stream.go:499`, `apps/edge/internal/openai/stream.go:594` 계열 로그가 stream source, content, reasoning, delta preview를 남긴다.
|
||||
- 결과적으로 사용자 prompt, 모델 응답, reasoning 조각이 운영 로그에 섞일 수 있다.
|
||||
- 해결 방법:
|
||||
- 기본 로그에서 `*_preview` 필드를 제거한다.
|
||||
- 필요한 관측값은 `*_len`, message count, model, request id, route, finish reason 같은 비내용 메타데이터로 대체한다.
|
||||
- trace/debug 경로도 정책 확정 전에는 원문 preview를 남기지 않는다. 명시 trace 여부는 유지하되 내용 대신 길이와 타입만 기록한다.
|
||||
- 변경 전 예:
|
||||
```go
|
||||
zap.String("content_preview", previewString(content, 160))
|
||||
```
|
||||
- 변경 후 예:
|
||||
```go
|
||||
zap.Int("content_len", len(content))
|
||||
```
|
||||
- 수정 파일 및 체크리스트:
|
||||
- [ ] `apps/edge/internal/openai/chat_handler.go`: 입력/출력 preview 로그 제거 및 메타데이터 대체.
|
||||
- [ ] `apps/edge/internal/openai/responses_handler.go`: 입력/출력 preview 로그 제거 및 메타데이터 대체.
|
||||
- [ ] `apps/edge/internal/openai/stream.go`: stream trace/output preview 로그 제거 및 메타데이터 대체.
|
||||
- [ ] `apps/edge/internal/openai/log_safety_test.go` 또는 기존 OpenAI 테스트 파일: preview 필드 회귀 테스트 추가.
|
||||
- 테스트 작성:
|
||||
- [ ] secret-like prompt/content/reasoning 문자열을 포함한 로그 케이스에서 `prompt_preview`, `content_preview`, `reasoning_preview`, `source_preview`, `delta_preview` 필드가 기록되지 않음을 검증한다.
|
||||
- [ ] 내용 길이/count 같은 비내용 필드는 남아 운영 관측이 완전히 사라지지 않음을 검증한다.
|
||||
- 중간 검증:
|
||||
- [ ] `go test -count=1 ./apps/edge/internal/openai`
|
||||
- [ ] `rg --sort path -n 'zap\\.(String|Any)\\("(prompt|content|reasoning|source|delta)_preview"' apps/edge/internal/openai` 결과가 비어 있는지 확인한다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_LOG-1의 로그 preview 제거, 메타데이터 대체, 회귀 테스트를 구현한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 실패 시 원인과 수정 내용을 `CODE_REVIEW-local-G04.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 최종 검증
|
||||
```bash
|
||||
go test -count=1 ./apps/edge/internal/openai
|
||||
rg --sort path -n 'zap\.(String|Any)\("(prompt|content|reasoning|source|delta)_preview"' apps/edge/internal/openai
|
||||
```
|
||||
예상 결과: Go 테스트가 PASS하고, `rg` 명령은 런타임 로그에 남은 preview zap field를 출력하지 않는다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
<!-- task=review_followup_alignment/02_docs_runtime_context_split plan=0 tag=REVIEW_DOCS -->
|
||||
# CODE_REVIEW-local-G02: 공개 문서와 로컬 검증 문맥 분리
|
||||
date=2026-07-06
|
||||
|
||||
## 상태
|
||||
구현 대기
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 이 파일의 구현 에이전트 소유 섹션을 실제 변경 내용, 계획 대비 변경, 검증 출력으로 채운다. active `PLAN-*.md`와 `CODE_REVIEW-*.md`는 남겨두고 review 준비 상태를 보고한다. 직접 사용자에게 질문하거나 `USER_REVIEW.md`를 만들거나 archive/complete 처리를 하지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_DOCS-1의 공개 문서 축소와 local test 문맥 이동을 수행한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 결과를 `CODE_REVIEW-local-G02.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] 판정과 Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] `.gitignore`의 Agent-Ops 관리 block을 확인한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS split 작업이면 이동 후 빈 active parent 정리 여부를 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 연결 대상: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
- tracked `docs/`가 공개 가이드 성격으로 정리되었는가.
|
||||
- private/local-only 검증 문맥이 local test 문서로 이동했는가.
|
||||
- 공개 문서에 secret 원문, private IP, machine-specific host가 남지 않는가.
|
||||
|
||||
## 검증 결과
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
|
||||
### REVIEW_DOCS-1 중간 검증
|
||||
```bash
|
||||
rg --sort path -n '192\.168\.|dev-runtime|edge-toki-labs|Windows SSH|toki-labs\.com' docs/edge-local-dev-guide.md
|
||||
rg --sort path -n 'mattermost_credentials|Bearer [A-Za-z0-9._-]+' docs/edge-local-dev-guide.md
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
rg --sort path -n '192\.168\.|dev-runtime|edge-toki-labs|Windows SSH|toki-labs\.com' docs/edge-local-dev-guide.md
|
||||
rg --sort path -n 'mattermost_credentials|Bearer [A-Za-z0-9._-]+' docs/edge-local-dev-guide.md
|
||||
```
|
||||
|
||||
## 코드리뷰 결과
|
||||
_리뷰 에이전트가 append한다._
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<!-- task=review_followup_alignment/02_docs_runtime_context_split plan=0 tag=REVIEW_DOCS -->
|
||||
# PLAN-local-G02: 공개 문서와 로컬 검증 문맥 분리
|
||||
date=2026-07-06
|
||||
|
||||
## 목적
|
||||
tracked `docs/`에는 사람용 최신 공개 가이드만 남기고, 개인/로컬/검증 런북 성격의 runtime 세부사항은 local test 문맥으로 옮긴다.
|
||||
|
||||
## 분석 결과
|
||||
- 읽은 파일: `agent-ops/rules/project/rules.md`, `agent-ops/rules/private/rules.md`, `agent-ops/rules/common/rules-roadmap.md`, `agent-ops/skills/common/router.md`, `agent-ops/skills/common/plan/SKILL.md`, `agent-test/local/rules.md`, `agent-test/local/edge-smoke.md`, `agent-ops/rules/project/domain/testing/rules.md`, `docs/edge-local-dev-guide.md`.
|
||||
- SDD 기준: 문서 정리 follow-up이며 새 SDD가 필요한 기능 구현이 아니다. 현재 로드맵 active Milestone은 `[스케치]` 및 구현 잠금 상태이므로 로드맵 완료 항목을 선언하지 않는다.
|
||||
- 테스트 환경 규칙: local 기준. Markdown 문서 변경과 deterministic `rg` 검증으로 충분하다.
|
||||
- 테스트 커버리지 공백: 공개 문서에 private/local endpoint가 섞이는 것을 막는 자동 검증은 없다.
|
||||
- 심볼 참조: 없음.
|
||||
- 분할 판단: 이 plan은 문서 경계만 다룬다. 로그, Client/Nexo, mock 활성화 작업과 독립적이다.
|
||||
- 범위 결정 근거: 사용자도 이 문제 정리에 동의했으며, 기존 `docs/` 정책과 `agent-test/local` 정책을 맞추는 문서 hygiene 작업이다.
|
||||
- 빌드 등급: `local-G02`. 코드 실행 없이 문서와 검색 검증으로 닫는다.
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 `CODE_REVIEW-local-G02.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다. 구현 중 직접 사용자에게 질문하거나 선택지를 제시하지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실제 구현을 차단할 때만 review stub의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다.
|
||||
|
||||
## 작업 항목
|
||||
|
||||
### REVIEW_DOCS-1. Edge local guide 공개/로컬 문맥 분리
|
||||
- 문제:
|
||||
- `docs/edge-local-dev-guide.md:39`부터의 예시 config가 특정 원격/host context를 공개 quickstart처럼 포함한다.
|
||||
- `docs/edge-local-dev-guide.md:124`부터의 dev-runtime provider pool, private host, Windows SSH, 내부 IP 검증 내용이 tracked `docs/`에 섞여 있다.
|
||||
- `docs/edge-local-dev-guide.md:250` 이후의 token 처리, curl evidence, 운영 검증 순서가 공개 문서와 로컬 검증 런북 성격을 동시에 가진다.
|
||||
- 결과적으로 `docs/`가 사람용 최신 공개 가이드와 개인/local verification 기록을 동시에 담는다.
|
||||
- 해결 방법:
|
||||
- `docs/edge-local-dev-guide.md`는 공개적으로 재사용 가능한 Edge local quickstart, config shape, 일반 smoke 흐름만 남긴다.
|
||||
- 특정 domain, private IP, machine 이름, evidence 저장 위치, 개인 runtime 절차는 `agent-test/local/edge-local-dev-guide.md` 같은 local test 문서로 이동하거나 이미 있는 local test profile에 합친다.
|
||||
- 이동한 local 문서는 secret 원문을 포함하지 않고 placeholder와 환경변수 이름만 남긴다.
|
||||
- 변경 전 예:
|
||||
```md
|
||||
# 공개 docs 안에 특정 private host와 검증 evidence 절차가 같이 존재
|
||||
```
|
||||
- 변경 후 예:
|
||||
```md
|
||||
# docs: 일반 절차
|
||||
# agent-test/local: 로컬 환경별 검증 런북
|
||||
```
|
||||
- 수정 파일 및 체크리스트:
|
||||
- [ ] `docs/edge-local-dev-guide.md`: 공개 가이드로 축소하고 private/local runtime 세부사항 제거.
|
||||
- [ ] `agent-test/local/edge-local-dev-guide.md` 또는 기존 local test profile: 필요한 로컬 검증 런북을 이동.
|
||||
- 테스트 작성:
|
||||
- [ ] 별도 테스트 파일은 만들지 않는다.
|
||||
- [ ] `rg` 검증으로 공개 docs에 private/local-only marker가 남지 않음을 확인한다.
|
||||
- 중간 검증:
|
||||
- [ ] `rg --sort path -n '192\\.168\\.|dev-runtime|edge-toki-labs|Windows SSH|toki-labs\\.com' docs/edge-local-dev-guide.md` 결과가 비어 있는지 확인한다.
|
||||
- [ ] `rg --sort path -n 'mattermost_credentials|Bearer [A-Za-z0-9._-]+' docs/edge-local-dev-guide.md` 결과가 비어 있는지 확인한다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_DOCS-1의 공개 문서 축소와 local test 문맥 이동을 수행한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 결과를 `CODE_REVIEW-local-G02.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 최종 검증
|
||||
```bash
|
||||
rg --sort path -n '192\.168\.|dev-runtime|edge-toki-labs|Windows SSH|toki-labs\.com' docs/edge-local-dev-guide.md
|
||||
rg --sort path -n 'mattermost_credentials|Bearer [A-Za-z0-9._-]+' docs/edge-local-dev-guide.md
|
||||
```
|
||||
예상 결과: 두 명령 모두 출력이 없다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
<!-- task=review_followup_alignment/03_nexo_notification_boundary plan=0 tag=REVIEW_NEXO -->
|
||||
# CODE_REVIEW-local-G05: Nexo 알림 경계 정리
|
||||
date=2026-07-06
|
||||
|
||||
## 상태
|
||||
구현 대기
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 이 파일의 구현 에이전트 소유 섹션을 실제 변경 내용, 계획 대비 변경, 검증 출력으로 채운다. active `PLAN-*.md`와 `CODE_REVIEW-*.md`는 남겨두고 review 준비 상태를 보고한다. 직접 사용자에게 질문하거나 `USER_REVIEW.md`를 만들거나 archive/complete 처리를 하지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_NEXO-1의 Client notification 경계 refactor와 테스트 갱신을 수행한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 Flutter 실행 불가 시 환경 사유와 대체 확인 결과를 `CODE_REVIEW-local-G05.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] 판정과 Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] `.gitignore`의 Agent-Ops 관리 block을 확인한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS split 작업이면 이동 후 빈 active parent 정리 여부를 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 연결 대상: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
- IOP Client가 Mattermost auth/register owner처럼 동작하지 않는가.
|
||||
- Nexo notification plugin 소비 경계만 남았는가.
|
||||
- credential asset과 Mattermost auto-login 참조가 제거되었는가.
|
||||
- Flutter test 또는 실행 불가 사유가 충분히 기록되었는가.
|
||||
|
||||
## 검증 결과
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
|
||||
### REVIEW_NEXO-1 중간 검증
|
||||
```bash
|
||||
cd apps/client && flutter test
|
||||
rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml
|
||||
rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
cd apps/client && flutter test
|
||||
rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml
|
||||
rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test
|
||||
```
|
||||
|
||||
## 코드리뷰 결과
|
||||
_리뷰 에이전트가 append한다._
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
<!-- task=review_followup_alignment/03_nexo_notification_boundary plan=0 tag=REVIEW_NEXO -->
|
||||
# PLAN-local-G05: Nexo 알림 경계 정리
|
||||
date=2026-07-06
|
||||
|
||||
## 목적
|
||||
IOP Client가 Mattermost 통합의 소유자처럼 동작하지 않도록 정리한다. IOP는 상위 폴더의 `../nexo`가 제공하는 notification 기능만 사용하고, Mattermost-compatible 인증/등록/서버 통합 책임은 Nexo 쪽 경계로 둔다.
|
||||
|
||||
## 분석 결과
|
||||
- 읽은 파일: `agent-ops/rules/project/rules.md`, `agent-ops/rules/private/rules.md`, `agent-ops/rules/common/rules-roadmap.md`, `agent-ops/skills/common/router.md`, `agent-ops/skills/common/plan/SKILL.md`, `agent-test/local/rules.md`, `agent-test/local/client-smoke.md`, `agent-ops/rules/project/domain/client/rules.md`, `apps/client/lib/client_bootstrap.dart`, `apps/client/lib/client_home_page.dart`, `apps/client/lib/main.dart`, `apps/client/lib/src/integrations/mattermost/mattermost_auth_service.dart`, `apps/client/lib/src/integrations/mattermost/mattermost_push_client.dart`, `apps/client/lib/src/integrations/mattermost/mattermost_push_host_integration.dart`, `apps/client/lib/src/integrations/mattermost/mattermost_push_plugin_client.dart`, `apps/client/test/client_bootstrap_test.dart`, `apps/client/test/integrations/mattermost_push_host_integration_test.dart`, `apps/client/pubspec.yaml`, `apps/client/Dockerfile`, `apps/client/README.md`, `../nexo/AGENTS.md`, `../nexo/packages/messaging_flutter/lib/nexo_messaging.dart`, `../nexo/packages/messaging_flutter/lib/src/nexo_messaging_plugin.dart`, `../nexo/packages/messaging_flutter/lib/src/nexo_messaging_options.dart`.
|
||||
- SDD 기준: Client integration 경계 정리 follow-up이다. 현재 로드맵 active Milestone은 `[스케치]` 및 구현 잠금 상태이므로 로드맵 완료 항목을 선언하지 않는다.
|
||||
- 테스트 환경 규칙: local 기준으로 작성하되 Flutter 실행 가능 여부는 환경에 의존한다. 실행 불가 시 구현 에이전트는 원인과 대체 분석을 `CODE_REVIEW-local-G05.md`에 기록한다.
|
||||
- 테스트 커버리지 공백: 현재 테스트는 Mattermost host integration 자체를 검증하고 있어, IOP가 notification consumer 역할만 한다는 경계 검증이 부족하다.
|
||||
- 심볼 참조: `bootstrapClientApp`, `MattermostPushHostIntegration`, `MattermostAuthService`, `MattermostPushPluginClient`, `NexoMessagingPlugin`.
|
||||
- 분할 판단: 이 plan은 Flutter Client와 sibling Nexo API 경계만 다룬다. Edge 로그, docs, mock resource 작업과 독립적이다.
|
||||
- 범위 결정 근거: 사용자 결정이 이미 확정됐다. IOP는 Mattermost role을 직접 가져가지 않고 알림 기능만 사용한다.
|
||||
- 빌드 등급: `local-G05`. Client integration naming/API/test 경계를 건드리며, Flutter test 실행이 필요하다.
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다. 구현 중 직접 사용자에게 질문하거나 선택지를 제시하지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실제 구현을 차단할 때만 review stub의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다. `../nexo`는 읽기/참조 경계로 보고, 이 plan에서는 sibling repo를 수정하지 않는다.
|
||||
|
||||
## 작업 항목
|
||||
|
||||
### REVIEW_NEXO-1. IOP Client의 Mattermost 소유 책임 제거
|
||||
- 문제:
|
||||
- `apps/client/lib/client_bootstrap.dart:8` 계열 bootstrap option이 Mattermost 초기화를 기본값처럼 다룬다.
|
||||
- `apps/client/lib/src/integrations/mattermost/mattermost_auth_service.dart:8` 계열 코드가 IOP 안에서 Mattermost 자동 로그인, credential asset 로드, device token 등록을 수행한다.
|
||||
- `apps/client/lib/src/integrations/mattermost/mattermost_push_host_integration.dart:6` 계열 comment/API가 IOP Client가 Mattermost host boundary를 소유하는 듯한 구조를 만든다.
|
||||
- `apps/client/pubspec.yaml:41` 계열 Nexo messaging dependency와 `assets/` 설정이 섞이면서 notification consumer와 Mattermost integration owner 책임이 분리되지 않는다.
|
||||
- 해결 방법:
|
||||
- IOP Client의 public naming을 Mattermost 중심에서 Nexo notification 중심으로 바꾼다. 예: `initializeMattermost` -> `initializeNotifications`, `MattermostPushHostIntegration` -> `NexoNotificationHostIntegration`.
|
||||
- IOP에서 Mattermost 자동 로그인, credential asset 로드, Mattermost REST device registration 책임을 제거한다.
|
||||
- IOP는 `nexo_messaging` plugin 초기화, notification stream 구독, notification-open navigation callback 연결만 수행한다.
|
||||
- 인증 토큰/signing key/server registration이 필요하면 IOP의 hard-coded asset이 아니라 Nexo/상위 앱 세션 경계에서 주입된 값만 사용한다.
|
||||
- 변경 전 예:
|
||||
```dart
|
||||
const ClientBootstrapOptions({this.initializeMattermost = true});
|
||||
```
|
||||
- 변경 후 예:
|
||||
```dart
|
||||
const ClientBootstrapOptions({this.initializeNotifications = true});
|
||||
```
|
||||
- 수정 파일 및 체크리스트:
|
||||
- [ ] `apps/client/lib/client_bootstrap.dart`: Mattermost 명명과 default host wiring을 notification 중심으로 정리.
|
||||
- [ ] `apps/client/lib/client_home_page.dart`: prop/import/snack text를 Nexo notification 경계에 맞게 정리.
|
||||
- [ ] `apps/client/lib/main.dart`: 앱 prop과 wiring에서 Mattermost 소유 표현 제거.
|
||||
- [ ] `apps/client/lib/src/integrations/mattermost/*`: notification integration 경로로 rename/refactor하거나 제거. 특히 `MattermostAuthService`의 asset login/registration 책임은 제거.
|
||||
- [ ] `apps/client/test/client_bootstrap_test.dart`: bootstrap skip/initialize 테스트를 notification naming으로 갱신.
|
||||
- [ ] `apps/client/test/integrations/*`: Nexo notification host consumer 테스트로 갱신.
|
||||
- [ ] `apps/client/pubspec.yaml`: 불필요해진 `http` dependency와 Mattermost credential asset 의존성 제거 여부 확인.
|
||||
- [ ] `apps/client/README.md`: 필요 시 IOP가 Nexo notification consumer라는 짧은 설명만 추가.
|
||||
- 테스트 작성:
|
||||
- [ ] bootstrap이 notification host를 주입받아 초기화하되 Mattermost login/credential asset을 요구하지 않음을 검증한다.
|
||||
- [ ] notification stream과 notification opened callback이 UI 상태/route로 연결되는지 fake client로 검증한다.
|
||||
- [ ] `assets/mattermost_credentials.json` 참조가 코드와 pubspec에서 제거되었음을 검색 검증한다.
|
||||
- 중간 검증:
|
||||
- [ ] `cd apps/client && flutter test`
|
||||
- [ ] `rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml` 결과가 비어 있는지 확인한다.
|
||||
- [ ] `rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test` 결과가 IOP Client의 직접 integration owner 표현을 남기지 않는지 확인한다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_NEXO-1의 Client notification 경계 refactor와 테스트 갱신을 수행한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 Flutter 실행 불가 시 환경 사유와 대체 확인 결과를 `CODE_REVIEW-local-G05.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 최종 검증
|
||||
```bash
|
||||
cd apps/client && flutter test
|
||||
rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml
|
||||
rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test
|
||||
```
|
||||
예상 결과: Flutter test가 PASS한다. 첫 번째 `rg`는 출력이 없다. 두 번째 `rg`는 IOP Client가 Mattermost integration owner로 보이는 lib/test 잔여 표현을 출력하지 않는다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
<!-- task=review_followup_alignment/04_explicit_mock_resource_activation plan=0 tag=REVIEW_MOCK -->
|
||||
# CODE_REVIEW-local-G06: mock resource 명시 활성화
|
||||
date=2026-07-06
|
||||
|
||||
## 상태
|
||||
구현 대기
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 이 파일의 구현 에이전트 소유 섹션을 실제 변경 내용, 계획 대비 변경, 검증 출력으로 채운다. active `PLAN-*.md`와 `CODE_REVIEW-*.md`는 남겨두고 review 준비 상태를 보고한다. 직접 사용자에게 질문하거나 `USER_REVIEW.md`를 만들거나 archive/complete 처리를 하지 않는다.
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_MOCK-1의 config schema, Edge payload, validation, tests, scripts를 explicit mock 기준으로 갱신한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 e2e 실행 불가 시 환경 사유와 package test 결과를 `CODE_REVIEW-local-G06.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] 판정과 Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [ ] active `CODE_REVIEW-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] active `PLAN-*-G??.md`를 archive 로그로 이동한다.
|
||||
- [ ] `.gitignore`의 Agent-Ops 관리 block을 확인한다.
|
||||
- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [ ] PASS split 작업이면 이동 후 빈 active parent 정리 여부를 확인한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 연결 대상: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
- Edge mapper가 mock을 implicit로 넣지 않는가.
|
||||
- explicit `adapters.mock.enabled: true`가 있을 때만 typed mock config가 payload에 들어가는가.
|
||||
- validation과 scripts가 mock route를 명시 config와 함께 사용하도록 맞춰졌는가.
|
||||
- Node factory의 empty payload no-mock 계약이 유지되는가.
|
||||
|
||||
## 검증 결과
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
|
||||
### REVIEW_MOCK-1 중간 검증
|
||||
```bash
|
||||
go test -count=1 ./packages/go/config ./apps/edge/internal/node ./apps/edge/internal/edgevalidate ./apps/edge/internal/transport ./apps/node/internal/adapters
|
||||
rg --sort path -n 'adapter: mock|mock-echo' scripts configs apps -g '!*.pb.go'
|
||||
bash scripts/e2e-smoke.sh
|
||||
bash scripts/e2e-openai-ollama.sh
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
go test -count=1 ./packages/go/config ./apps/edge/internal/node ./apps/edge/internal/edgevalidate ./apps/edge/internal/transport ./apps/node/internal/adapters
|
||||
rg --sort path -n 'adapter: mock|mock-echo' scripts configs apps -g '!*.pb.go'
|
||||
bash scripts/e2e-smoke.sh
|
||||
bash scripts/e2e-openai-ollama.sh
|
||||
```
|
||||
|
||||
## 코드리뷰 결과
|
||||
_리뷰 에이전트가 append한다._
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
<!-- task=review_followup_alignment/04_explicit_mock_resource_activation plan=0 tag=REVIEW_MOCK -->
|
||||
# PLAN-local-G06: mock resource 명시 활성화
|
||||
date=2026-07-06
|
||||
|
||||
## 목적
|
||||
Node payload에 mock adapter를 항상 넣는 구조를 없애고, 필요한 리소스만 config에서 명시적으로 활성화되도록 정리한다.
|
||||
|
||||
## 분석 결과
|
||||
- 읽은 파일: `agent-ops/rules/project/rules.md`, `agent-ops/rules/private/rules.md`, `agent-ops/rules/common/rules-roadmap.md`, `agent-ops/skills/common/router.md`, `agent-ops/skills/common/plan/SKILL.md`, `agent-test/local/rules.md`, `agent-test/local/edge-smoke.md`, `agent-test/local/node-smoke.md`, `agent-ops/rules/project/domain/edge/rules.md`, `agent-ops/rules/project/domain/node/rules.md`, `agent-ops/rules/project/domain/testing/rules.md`, `packages/go/config/config.go`, `packages/go/config/config_test.go`, `apps/edge/internal/node/mapper.go`, `apps/edge/internal/node/mapper_test.go`, `apps/edge/internal/node/store.go`, `apps/edge/internal/node/store_test.go`, `apps/edge/internal/edgevalidate/validate.go`, `apps/edge/internal/edgevalidate/validate_test.go`, `apps/edge/internal/transport/integration_test.go`, `apps/edge/internal/transport/server_test.go`, `apps/node/internal/adapters/factory.go`, `apps/node/internal/adapters/config_set.go`, `apps/node/internal/adapters/adapters_blackbox_test.go`, `apps/node/internal/adapters/factory_internal_test.go`, `proto/iop/runtime.proto`, `scripts/e2e-smoke.sh`, `scripts/e2e-openai-cli-workspace.sh`, `scripts/e2e-openai-ollama.sh`, `scripts/e2e-openai-lemonade.sh`, `scripts/e2e-openai-vllm.sh`.
|
||||
- SDD 기준: runtime resource activation 정합성 follow-up이며 현재 active Milestone과 연결하지 않는다. 현재 로드맵 active Milestone은 `[스케치]` 및 구현 잠금 상태이므로 로드맵 완료 항목을 선언하지 않는다.
|
||||
- 테스트 환경 규칙: local 기준. Go package tests와 fake-provider e2e smoke를 함께 사용한다.
|
||||
- 테스트 커버리지 공백: Node 쪽은 empty payload에서 mock이 implicit 등록되지 않는 검증이 있으나, Edge mapper가 항상 mock을 넣는 회귀를 허용하는 테스트가 남아 있다.
|
||||
- 심볼 참조: `BuildConfigPayload`, `AdaptersConf`, `NormalizeAdapters`, `ValidateConfig`, `buildAdapterIndex`.
|
||||
- 분할 판단: 이 plan은 config schema, Edge mapper/validate, Node adapter contract, scripts를 함께 맞추는 cross-boundary 작업이다. 다른 세 plan과 독립적이지만 내부 난도가 있어 `G06`으로 분리한다.
|
||||
- 범위 결정 근거: 사용자 결정이 확정됐다. mock은 항상 주입하지 않고 필요한 리소스에 대해서만 정확하게 활성화한다.
|
||||
- 빌드 등급: `local-G06`. config schema와 Edge/Node contract, integration tests, scripts를 함께 바꾼다.
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
구현 후 `CODE_REVIEW-local-G06.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다. 구현 중 직접 사용자에게 질문하거나 선택지를 제시하지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실제 구현을 차단할 때만 review stub의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다.
|
||||
|
||||
## 작업 항목
|
||||
|
||||
### REVIEW_MOCK-1. Edge payload의 implicit mock 제거와 explicit config 추가
|
||||
- 문제:
|
||||
- `apps/edge/internal/node/mapper.go:31` 계열 `BuildConfigPayload`가 모든 node payload에 mock adapter를 먼저 추가한다.
|
||||
- `packages/go/config/config.go:460` 계열 `AdaptersConf`에는 `mock` config field가 없어 YAML에서 mock 활성화를 명시하는 공식 schema가 부족하다.
|
||||
- `apps/edge/internal/edgevalidate/validate.go:31` 계열 validation은 enabled adapter/provider 존재를 확인하지만 mock을 명시 adapter로 다루지 않는다.
|
||||
- `apps/edge/internal/node/mapper_test.go:225` 계열 테스트와 `apps/edge/internal/transport/server_test.go:416` 계열 테스트는 implicit mock 존재를 기대한다.
|
||||
- 일부 e2e script는 실제 provider를 테스트하면서 `console.adapter: mock`을 사용하지만 node adapters에는 mock을 명시하지 않는다.
|
||||
- 해결 방법:
|
||||
- `config.AdaptersConf`에 `Mock MockConf`를 추가하고 YAML/mapstructure key를 `mock`으로 둔다.
|
||||
- `BuildConfigPayload`는 `rec.Adapters.Mock.Enabled`가 true일 때만 typed `MockAdapterConfig`를 추가한다.
|
||||
- `edgevalidate`는 명시 mock adapter를 enabled adapter index에 포함하고, mock-only test node도 의도된 경우 통과시킨다.
|
||||
- Node adapter factory 계약은 유지한다. Node는 이미 payload에 explicit mock이 있을 때만 등록하고 empty payload에서는 등록하지 않는다.
|
||||
- script/generated configs에서 `console.adapter: mock`을 쓰는 경우 해당 node에 `adapters.mock.enabled: true`를 추가한다. mock이 필요하지 않은 script는 console adapter를 실제 테스트 adapter로 바꾼다.
|
||||
- 변경 전 예:
|
||||
```go
|
||||
adapters := []*iop.AdapterConfig{{Type: "mock", Config: &iop.AdapterConfig_Mock{Mock: &iop.MockAdapterConfig{}}}}
|
||||
```
|
||||
- 변경 후 예:
|
||||
```go
|
||||
if rec.Adapters.Mock.Enabled {
|
||||
adapters = append(adapters, mockAdapterConfig())
|
||||
}
|
||||
```
|
||||
- 수정 파일 및 체크리스트:
|
||||
- [ ] `packages/go/config/config.go`: `MockConf`와 `AdaptersConf.Mock` 추가. normalization/validation 영향 확인.
|
||||
- [ ] `packages/go/config/config_test.go`: mock field load, omitted default false, explicit enabled true 테스트 추가.
|
||||
- [ ] `apps/edge/internal/node/mapper.go`: implicit mock 제거, explicit mock 조건부 추가.
|
||||
- [ ] `apps/edge/internal/node/mapper_test.go`: implicit mock 기대 제거, explicit mock 테스트 유지/갱신.
|
||||
- [ ] `apps/edge/internal/edgevalidate/validate.go`: explicit mock adapter를 config validation index에 반영.
|
||||
- [ ] `apps/edge/internal/edgevalidate/validate_test.go`: mock-only 또는 console mock route가 explicit mock 없으면 실패/있으면 통과하는 케이스 추가.
|
||||
- [ ] `apps/edge/internal/transport/integration_test.go`: adapter count/expectation을 explicit mock 기준으로 갱신.
|
||||
- [ ] `apps/edge/internal/transport/server_test.go`: payload tests를 implicit 없음/explicit 있음으로 분리.
|
||||
- [ ] `apps/node/internal/adapters/*`: 기존 explicit payload 계약이 깨지지 않는지 테스트만 보강한다.
|
||||
- [ ] `scripts/e2e-smoke.sh`: mock profile의 explicit mock 유지 확인.
|
||||
- [ ] `scripts/e2e-openai-cli-workspace.sh`, `scripts/e2e-openai-ollama.sh`, `scripts/e2e-openai-lemonade.sh`, `scripts/e2e-openai-vllm.sh`: `console.adapter: mock` 사용 시 explicit mock config를 추가하거나 console adapter를 실제 adapter로 변경.
|
||||
- 테스트 작성:
|
||||
- [ ] config load: `adapters.mock.enabled: true`가 `AdaptersConf.Mock.Enabled`로 로드된다.
|
||||
- [ ] Edge mapper: omitted mock config는 payload에 mock을 넣지 않는다.
|
||||
- [ ] Edge mapper: explicit mock config는 typed `MockAdapterConfig`를 넣고 legacy `Settings`를 채우지 않는다.
|
||||
- [ ] Edge validate: route/console이 mock을 참조할 때 explicit mock 없이는 실패하고 있으면 통과한다.
|
||||
- [ ] Node factory: empty payload는 여전히 mock을 등록하지 않고 explicit payload만 등록한다.
|
||||
- 중간 검증:
|
||||
- [ ] `go test -count=1 ./packages/go/config ./apps/edge/internal/node ./apps/edge/internal/edgevalidate ./apps/edge/internal/transport ./apps/node/internal/adapters`
|
||||
- [ ] `rg --sort path -n 'adapter: mock|mock-echo' scripts configs apps -g '!*.pb.go'`로 mock route/config 잔여를 점검하고, 각 잔여가 explicit mock config와 짝을 이루는지 확인한다.
|
||||
- [ ] `bash scripts/e2e-smoke.sh`
|
||||
- [ ] `bash scripts/e2e-openai-ollama.sh`
|
||||
|
||||
## 구현 체크리스트
|
||||
- [ ] REVIEW_MOCK-1의 config schema, Edge payload, validation, tests, scripts를 explicit mock 기준으로 갱신한다.
|
||||
- [ ] 중간 검증 명령을 실행하고 e2e 실행 불가 시 환경 사유와 package test 결과를 `CODE_REVIEW-local-G06.md`에 기록한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 최종 검증
|
||||
```bash
|
||||
go test -count=1 ./packages/go/config ./apps/edge/internal/node ./apps/edge/internal/edgevalidate ./apps/edge/internal/transport ./apps/node/internal/adapters
|
||||
rg --sort path -n 'adapter: mock|mock-echo' scripts configs apps -g '!*.pb.go'
|
||||
bash scripts/e2e-smoke.sh
|
||||
bash scripts/e2e-openai-ollama.sh
|
||||
```
|
||||
예상 결과: Go 테스트와 두 e2e가 PASS한다. `rg` 출력은 mock을 의도적으로 쓰는 위치만 보여야 하며, 해당 위치에는 같은 generated/static config 안에 explicit `mock.enabled: true`가 있어야 한다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
Loading…
Reference in a new issue