feat: add field-bootstrap-test-port-readiness milestone and archive ollama-field-validation-follow-up

- Add new milestone for field bootstrap test port readiness
- Archive completed ollama field validation follow-up milestone
- Update PHASE.md, current.md, project rules, and deploy docs
This commit is contained in:
toki 2026-05-26 20:16:44 +09:00
parent 6a4c141e97
commit 183c3d12a6
7 changed files with 317 additions and 19 deletions

View file

@ -12,7 +12,7 @@
## 상태
[진행중]
[완료]
## 승격 조건
@ -37,20 +37,22 @@
사용자 실테스트 결과를 현재 활성 Ollama 연동 작업으로 받아 후속 안정화 범위를 정한다.
- [ ] [split-host-env] code-server 컨테이너를 Edge로, 컨테이너 호스트를 Node/Ollama host로 두는 split-host field smoke 환경이 구성되어 있다. 검증: host Node가 컨테이너 Edge 주소로 등록되고 Edge에서 node registration을 확인할 수 있다.
- [ ] [field-test] split-host 환경에서 실제 Ollama 연동 실테스트 결과와 재현 로그가 기록되어 있다. 검증: 실제 모델 조회와 non-streaming/streaming chat 결과 또는 실패 로그가 남아 있다.
- [ ] [issue-triage] 실테스트에서 나온 후속 작업이 API compatibility, option passthrough, reasoning stream, config/docs, routing/fallback 후보로 분류되어 있다.
- [ ] [follow-up-scope] 코드 수정이 필요한 항목은 이 Milestone의 추가 Task 또는 같은 Milestone task group의 후속 plan으로 정리되어 있다.
- [x] [split-host-env] code-server 컨테이너를 Edge로, 컨테이너 호스트를 Node/Ollama host로 두는 split-host field smoke 환경이 구성되어 있다. 검증: host Node가 컨테이너 Edge 주소로 등록되고 Edge에서 node registration을 확인할 수 있다.
- [x] [field-test] split-host 환경에서 실제 Ollama 연동 실테스트 결과와 재현 로그가 기록되어 있다. 검증: 실제 모델 조회와 non-streaming/streaming chat 결과 또는 실패 로그가 남아 있다.
- [x] [issue-triage] 실테스트에서 나온 후속 작업이 API compatibility, option passthrough, reasoning stream, config/docs, routing/fallback 후보로 분류되어 있다.
- [x] [follow-up-scope] 코드 수정이 필요한 항목은 이 Milestone의 추가 Task 또는 같은 Milestone task group의 후속 plan으로 정리되어 있다.
## 완료 리뷰
- 상태: 없음
- 요청일: 없음
- 완료 근거: 사용자 실테스트와 후속 작업 분류가 아직 충족되지 않았다.
- 상태: 승인됨
- 요청일: 2026-05-26
- 완료 근거: Apple Silicon용 Node 바이너리를 Edge에서 다운로드 가능한 형태로 빌드하고, reverse SSH tunnel 기반 split-host field 환경에서 `node-silicon-ollama` registration을 확인했다.
- 완료 근거: Edge OpenAI-compatible API에서 `/v1/models`, non-streaming `/v1/chat/completions`, streaming SSE, reasoning/content 분리, `/api/tags` API passthrough, `think:false`와 Ollama options passthrough가 실제 Ollama endpoint 기준으로 통과했다.
- 완료 근거: 후속 후보는 OpenAI/Ollama compatibility 본선 문제가 아니라 field harness/runtime lifecycle 보완으로 분류했다.
- 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다
- 리뷰 코멘트: 없음
- [x] 사용자가 완료 결과를 확인했다
- [x] archive 이동을 승인했다
- 리뷰 코멘트: 사용자 승인으로 완료 처리하고 archive 이동한다. `edge serve`로 실행했을 때 node/openai listener가 내려가고 metrics만 남는 상태가 관찰되어, 필드 테스트는 `edge console`로 재기동해 통과했다. 이 항목은 후속 `Field Bootstrap UX와 테스트 포트 정비` Milestone에서 다룬다.
## 범위 제외
@ -67,5 +69,7 @@
- 표준선(선택): 초기 필드 smoke는 code-server 컨테이너 내부 Edge와 컨테이너 호스트 Node/Ollama를 분리해 실제 네트워크 경계를 통과하도록 구성한다.
- 결정됨: split-host 실테스트 뒤 생긴 Ollama 경로 후속 안정화 작업은 이 Milestone에서 계속 처리한다.
- 선행 작업: Ollama E2E 서빙 안정화
- 후속 작업: split-host 실테스트에서 확인된 Ollama 경로 안정화 보완
- 확인 필요: split-host 실테스트 결과, cloud fallback/Responses API/품질 평가로 넘길 항목
- 실테스트 결과: Apple Silicon `darwin/arm64` Node가 reverse SSH tunnel을 통해 Edge에 등록되었고, Edge에서 `gemma4:26b` 모델 조회, non-streaming chat, streaming SSE, reasoning/content 분리, option/API passthrough를 확인했다.
- 분류 결과: API compatibility, reasoning stream, option passthrough, Ollama API passthrough는 통과했다. routing/fallback, cloud fallback, Responses API, 품질 평가는 이번 범위 밖 후속 Phase 후보로 유지한다.
- 후속 plan 후보: `edge serve` 실행 시 startup context/lifecycle 때문에 node/openai listener가 유지되지 않는 현상을 조사하고, field runbook에는 SSH tunnel 또는 reverse tunnel 기준 다운로드/연결 절차를 보강한다.
- 확인 필요: 사용자의 완료 확인과 archive 이동 승인

View file

@ -7,9 +7,9 @@
## 활성 Milestone
- [진행중] Ollama 실테스트와 후속 안정화
- [진행중] Field Bootstrap UX와 테스트 포트 정비
- Phase: `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md`
- 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md`
- 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`
## 선택 규칙

View file

@ -19,9 +19,13 @@ Edge OpenAI-compatible API에서 Node의 Ollama adapter까지 이어지는 단
- 경로: `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/model-serving-load-routing.md`
- 요약: Edge OpenAI-compatible API를 통해 Node에서 serving 중인 Ollama를 일반 OpenAI/Ollama client 경험에 가깝게 조회, 선택, 호출하는 E2E 한 사이클과 Ollama option/API passthrough를 완료했다. 자동 라우팅, cloud fallback, 품질 평가는 후속으로 미룬다.
- [진행중] Ollama 실테스트와 후속 안정화
- 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md`
- 요약: 완료 처리된 Ollama E2E baseline을 사용자 실테스트로 다시 확인하고, 실제 사용 중 발견되는 후속 안정화 작업을 정리한다.
- [완료] Ollama 실테스트와 후속 안정화
- 경로: `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md`
- 요약: Apple Silicon Node와 실제 Ollama endpoint를 split-host 환경에서 검증했고, 모델 조회, non-streaming/streaming chat, reasoning/content 분리, option/API passthrough를 확인했다. `edge serve` lifecycle 보완은 후속 Milestone으로 분리했다.
- [진행중] Field Bootstrap UX와 테스트 포트 정비
- 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`
- 요약: code-server field 테스트 포트와 Node artifact/bootstrap 경로를 정리해, 사용자가 Jenkins agent처럼 한 줄 명령으로 Node 다운로드와 Edge 접속을 끝낼 수 있게 만든다.
## Phase 경계

View file

@ -0,0 +1,73 @@
# Milestone: Field Bootstrap UX와 테스트 포트 정비
## 위치
- Roadmap: `agent-ops/roadmap/ROADMAP.md`
- Phase: `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md`
## 목표
field 테스트 환경을 Jenkins agent 연결처럼 매끄럽게 만든다.
code-server 컨테이너는 외부 테스트용 web/bootstrap, Node transport, OTO/specialized agent 포트를 안정적으로 노출하고, Edge는 Node 빌드 산출물을 정해진 위치에 준비해 사용자가 한 줄 bootstrap 명령만 실행하면 다운로드, 설정 생성, Edge 접속까지 이어지게 한다.
## 상태
[진행중]
## 승격 조건
- 없음
## 구현 잠금
- 상태: 해제
- 결정 필요: 없음
## 범위
- `ssh toki@toki-labs.com``~/docker/services/code-server/compose/docker-compose.yml`에서 code-server 컨테이너 외부 테스트 포트 노출을 정리한다.
- IOP field 테스트용 포트를 web/bootstrap HTTP, Node Edge transport, OTO/specialized agent transport 용도로 분리해 재부팅 후 바로 사용할 수 있게 한다.
- Edge 쪽 build artifact 위치와 URL 규칙을 정하고, Apple Silicon Node를 우선 대상으로 한 one-line bootstrap UX를 만든다.
- bootstrap 명령은 바이너리 다운로드, checksum 또는 버전 확인, 임시 config 생성, `iop-node serve` 실행까지 한 줄 수준으로 이어지는 것을 목표로 한다.
- 이번 Milestone은 테스트 환경과 bootstrap UX를 다루며, Control Plane 기반 장기 enrollment/credential 관리와 OTO agent 본격 구현은 후속 Phase/Milestone에서 다룬다.
## 기능
### Epic: [field-bootstrap] Field Bootstrap and Port Readiness
field 테스트를 매번 수동 터널과 임시 명령 조합으로 만들지 않고, 재현 가능한 외부 포트와 한 줄 bootstrap 명령으로 수렴시킨다.
- [x] [compose-ports] code-server compose가 field 테스트용 web/bootstrap, Node transport, OTO/specialized agent 포트를 외부에 노출한다. 검증: `docker compose config`에서 `18080`, `18081`, `19090`, `19190` 계열 포트 매핑이 확인된다.
- [ ] [artifact-layout] Node field build 산출물의 고정 위치와 URL 규칙이 정리되어 있다. 검증: Apple Silicon용 `iop-node`를 정해진 URL에서 다운로드할 수 있다.
- [ ] [one-line-node] 사용자가 한 줄 명령으로 Apple Silicon Node를 다운로드하고 Edge에 접속할 수 있다. 검증: Mac 테스트 환경에서 command 한 줄 실행 후 Edge에서 node registration을 확인한다.
- [ ] [serve-lifecycle] `edge serve`가 field bootstrap에 사용할 node/openai listener를 안정적으로 유지한다. 검증: `edge serve --config <field-config>` 실행 후 Node registration과 `/v1/models` 호출이 통과한다.
- [x] [runbook] field bootstrap runbook에 직접 포트 방식과 터널 fallback 방식이 구분되어 있다.
## 완료 리뷰
- 상태: 없음
- 요청일: 없음
- 완료 근거: 테스트 환경 포트 개방과 one-line bootstrap UX가 아직 충족되지 않았다.
- 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다
- 리뷰 코멘트: 없음
## 범위 제외
- Control Plane 기반 장기 agent enrollment/credential 구현
- OTO agent 본격 구현
- cloud fallback, 자동 부하 라우팅, 품질 평가 feedback 구현
- 외부 공개 도메인/인증 정책의 장기 확정
## 작업 컨텍스트
- 관련 경로: `docs/deploy-dev.md`, `bin/build/field-binaries.sh`, `bin/edge.sh`, `apps/edge/cmd/edge`, `apps/edge/internal/bootstrap`, `apps/edge/internal/input`, `apps/edge/internal/transport`, 원격 `~/docker/services/code-server/compose/docker-compose.yml`
- 표준선(선택): Edge-Node transport는 TCP proto-socket을 유지하고, HTTP는 artifact/bootstrap과 OpenAI-compatible 입력 표면에만 사용한다.
- 표준선(선택): 외부 테스트 포트는 기존 code-server compose의 안전 remap 관례를 따라 host 충돌 포트를 피하고, 재부팅 타이밍은 사용자가 결정한다.
- 표준선(선택): bootstrap UX는 Jenkins agent처럼 Edge가 command를 제시하고 대상 host가 실행하는 흐름을 목표로 하되, 초기 field 단계에서는 static artifact URL과 one-time-ish token/config로 시작한다.
- 선행 작업: Ollama 실테스트와 후속 안정화
- 진행 기록: 원격 `~/docker/services/code-server/compose/docker-compose.yml``18080:18080`, `18081:8080`, `19190:9190`을 추가하고 기존 `19090:9090`, `19092:9092`를 역할 주석으로 정리했다. `/usr/local/bin/docker compose config --quiet` 검증은 통과했으며, 실제 포트 적용은 사용자가 정한 code-server compose 재기동 시점 이후 확인한다.
- 진행 기록: `agent-ops/rules/project/rules.md`에서 field 테스트 환경 작업을 `docs/deploy-dev.md`와 이 Milestone으로 라우팅하도록 보강했고, `docs/deploy-dev.md`에 code-server compose 원본, 기준 포트, 직접 포트/터널 fallback, Apple Silicon `darwin/arm64` 기준을 기록했다.
- 후속 작업: Agent Bootstrap과 OTO 등록, Control Plane 기반 enrollment
- 확인 필요: 재부팅 후 code-server compose 포트 적용 확인, one-line bootstrap 명령의 최종 URL/토큰 수명 정책

View file

@ -27,7 +27,7 @@
- `bin/` — 사용자가 직접 실행하는 edge/node/web shell entrypoint와 field binary build entrypoint이다.
- `scripts/` — 보조 E2E smoke와 입력 표면 검증 스크립트이다.
- `Makefile` — 빌드와 테스트 진입점을 정의한다.
- `docs/` — 아키텍처 및 운영 방향 문서이다.
- `docs/` — 아키텍처 및 운영 방향 문서이다. field 테스트 환경, 외부 테스트 포트, one-line bootstrap 기준은 `docs/deploy-dev.md`를 우선 진입점으로 본다.
## 기술 스택
@ -53,6 +53,8 @@
- 앱 설정 구조 변경 시 `packages/config`의 struct/default와 `configs/*.yaml` 예시를 함께 확인한다.
- 테스트는 변경 범위에 맞춰 `go test ./...` 또는 대상 패키지 테스트를 실행한다.
- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 `agent-ops/rules/project/domain/testing/rules.md`의 검증 기준을 따른다.
- field 테스트 환경 또는 one-line bootstrap 작업은 `docs/deploy-dev.md`의 Field 테스트 환경 라우팅과 활성 Milestone `Field Bootstrap UX와 테스트 포트 정비`를 먼저 확인한다.
- code-server 기반 field 테스트 포트는 원격 `ssh toki@toki-labs.com``~/docker/services/code-server/compose/docker-compose.yml`에서 관리한다. 기준 host port는 web/dev `13000-13099`, artifact/bootstrap HTTP `18080`, OpenAI-compatible HTTP `18081`, Edge-Node transport `19090`, Edge metrics `19092`, OTO/specialized agent transport `19190`이다.
- 상세 DB schema, event schema, permission/policy/audit model, federation, mTLS 구현 세부, Portal UI 세부 기획은 각 작업에서 별도로 결정한다.
## 도메인 룰 로딩
@ -83,4 +85,5 @@
## 스킬 라우팅
- 사용자 실행 파이프라인 검증, bin shell 사용자 흐름, 메시지 2회 왕복, edge command 응답, 보조 E2E smoke, full-cycle 실제 구동, `bin/edge.sh`/`bin/node.sh` 통합 테스트: `agent-ops/skills/project/e2e-smoke/SKILL.md`
- field 테스트 포트, artifact/bootstrap HTTP, one-line Node bootstrap, code-server compose 기반 외부 테스트 환경: `docs/deploy-dev.md`와 활성 Milestone `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`
- 반복 작업이 확인되면 `agent-ops/skills/project/<skill-name>/SKILL.md`를 생성하고 이 표에 등록한다.

View file

@ -0,0 +1,187 @@
# Reboot Handoff: Field Bootstrap UX와 테스트 포트 정비
## 주입용 요약
다음 세션은 `/config/workspace/iop`에서 `AGENTS.md`의 필수 규칙을 먼저 읽고, 이어서 이 파일을 읽은 뒤 작업을 계속한다.
현재 활성 Milestone은 `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`다.
목표는 code-server field 테스트 환경을 Jenkins agent 연결처럼 만들고, 사용자가 Apple Silicon Mac에서 한 줄 bootstrap 명령으로 Node 다운로드, config 생성, Edge 접속까지 끝내게 하는 것이다.
## 현재 상태
- 이전 Milestone `Ollama 실테스트와 후속 안정화``[완료]` 처리 후 `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md`로 이동했다.
- `current.md`는 새 활성 Milestone `Field Bootstrap UX와 테스트 포트 정비`를 가리킨다.
- `agent-ops/rules/project/rules.md`는 field 테스트 환경과 one-line bootstrap 작업을 `docs/deploy-dev.md`와 활성 Milestone으로 라우팅하도록 갱신됐다.
- `docs/deploy-dev.md`에는 `Field 테스트 환경 라우팅` 섹션이 추가됐다.
- 원격 `ssh toki@toki-labs.com``~/docker/services/code-server/compose/docker-compose.yml`에는 field 테스트 포트 매핑이 반영됐다.
- 재부팅/재생성 타이밍은 사용자가 잡기로 했고, 작업자는 사용자가 명시하기 전 code-server 컨테이너를 재시작하지 않는다.
## 원격 code-server 포트 의도
원격 compose 원본:
```text
ssh toki@toki-labs.com
~/docker/services/code-server/compose/docker-compose.yml
```
기준 포트:
```text
13000-13099 -> 3000-3099 web/dev app preview range
18080 -> 18080 IOP field artifact/bootstrap HTTP
18081 -> 8080 Edge OpenAI-compatible HTTP
19080 -> 19080 Portal/Control Plane wire test endpoint
19090 -> 9090 Edge-Node TCP transport
19092 -> 9092 Edge metrics
19190 -> 9190 OTO/specialized agent field transport reserve
```
검증 완료:
```bash
ssh toki@toki-labs.com 'cd ~/docker/services/code-server/compose && /usr/local/bin/docker compose config --quiet'
```
주의: Docker port mapping은 단순 프로세스 재시작이 아니라 컨테이너 recreate가 필요할 수 있다. 재부팅 뒤에도 `docker ps`에 새 포트가 보이지 않으면 사용자가 정한 타이밍에 compose recreate가 필요하다.
## 재부팅 후 첫 확인
원격에서 code-server 컨테이너 포트가 실제 적용됐는지 확인한다.
```bash
ssh toki@toki-labs.com '/usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep "^code-server "'
```
기대: `18080`, `18081`, `19090`, `19092`, `19190``code-server` 포트 목록에 보인다.
컨테이너 내부에서 포트가 열리는지는 서비스 기동 후 확인한다.
```bash
curl -fsS http://127.0.0.1:18080/healthz
curl -fsS http://127.0.0.1:18081/healthz
```
`18080`은 아직 artifact/bootstrap HTTP 서버를 직접 띄워야 응답한다.
## 바로 이어갈 작업 순서
1. `edge serve` lifecycle 문제를 먼저 확인/수정한다.
- 관찰된 현상: `edge serve`로 실행하면 node/openai listener가 내려가고 metrics만 남았다.
- 추정 원인: Fx `OnStart` startup context를 long-running server lifetime context로 넘겨, `OnStart` 반환 뒤 context cancellation이 listener shutdown으로 이어지는 구조.
- 후보 수정: `apps/edge/internal/bootstrap.Runtime`이 자체 runtime context/cancel을 소유하고 `Stop()`에서 cancel하도록 한다. `Start(ctx)``ctx`는 startup timeout 용도로만 사용한다.
- 검증: `edge serve --config <field-config>` 실행 후 `9090`, `8080`, `9092` listener가 유지되고 Node registration과 `/v1/models`가 통과한다.
2. field Edge config를 준비한다.
- Edge listen은 컨테이너 내부 포트 기준으로 둔다.
- Node는 Mac에서 실행되므로 Ollama base URL은 Node 관점의 `http://127.0.0.1:11434`가 맞다.
```yaml
edge:
id: "edge-field-bootstrap"
name: "Field Bootstrap Edge"
server:
listen: "0.0.0.0:9090"
openai:
enabled: true
listen: "0.0.0.0:8080"
node: "node-silicon-ollama"
adapter: "ollama"
target: ""
models:
- "gemma4:26b"
session_id: "openai-field"
timeout_sec: 300
metrics:
port: 9092
nodes:
- id: "node-silicon-ollama"
alias: "silicon-ollama"
token: "CHANGE_ME_FIELD_TOKEN"
adapters:
ollama:
enabled: true
base_url: "http://127.0.0.1:11434"
context_size: 262144
```
3. Apple Silicon Node artifact layout를 고정한다.
- Apple Silicon은 `darwin/arm64`다.
- `linux/arm64`는 Mac 실행 대상이 아니다.
- 기존 build entrypoint:
```bash
VERSION=<field-version> APPS=node TARGETS="darwin/arm64" DIST_DIR=dist/field ./bin/build/field-binaries.sh
```
4. artifact/bootstrap HTTP를 `18080`에 띄우고 URL 규칙을 정한다.
- 임시 시작점 후보:
```bash
python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/<field-version>
```
- 외부 URL 후보:
```text
http://toki-labs.com:18080/darwin-arm64/iop-node
http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh
```
5. one-line Node bootstrap을 만든다.
- 목표 UX:
```bash
curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash
```
- 스크립트 책임:
- `~/iop-field` 생성
- `darwin-arm64/iop-node` 다운로드
- 가능하면 checksum 확인
- `chmod +x`
- macOS quarantine xattr 제거
- `node.yaml` 생성
- `./iop-node serve --config ./node.yaml` 실행
6. Edge에서 테스트한다.
- Node registration 확인
- `/v1/models`
- non-streaming `/v1/chat/completions`
- streaming SSE와 `data: [DONE]`
- `/api/tags` passthrough
- `think:false``options` passthrough
## Milestone 체크 상태
현재 완료:
- `[compose-ports]`
- `[runbook]`
남은 항목:
- `[artifact-layout]`
- `[one-line-node]`
- `[serve-lifecycle]`
## 관련 파일
- `agent-ops/rules/project/rules.md`
- `docs/deploy-dev.md`
- `agent-ops/roadmap/current.md`
- `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md`
- `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`
- `apps/edge/cmd/edge/main.go`
- `apps/edge/internal/bootstrap/runtime.go`
- `bin/build/field-binaries.sh`
- 원격: `ssh toki@toki-labs.com:~/docker/services/code-server/compose/docker-compose.yml`
## 다음 세션에 붙여넣을 한 줄
```text
/config/workspace/iop의 AGENTS.md 필수 규칙을 읽고, agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md를 읽은 뒤 Field Bootstrap UX와 테스트 포트 정비 작업을 이어가. 우선 재부팅 후 code-server 포트 적용 여부를 확인하고, edge serve lifecycle 문제를 수정한 다음 Apple Silicon one-line Node bootstrap 테스트로 들어가.
```

View file

@ -117,6 +117,33 @@ repo root에서 수동으로 검증할 때는 기존 helper를 사용할 수 있
IOP_EDGE_ADDR=<edge-host>:9090 ./bin/node.sh
```
## Field 테스트 환경 라우팅
field 테스트의 1차 기준 환경은 `ssh toki@toki-labs.com`의 code-server 컨테이너다.
컨테이너 compose 원본은 원격 `~/docker/services/code-server/compose/docker-compose.yml`이며, 재기동 타이밍은 운영자가 정한다.
이 저장소의 작업자는 compose를 수정할 수 있지만, 사용자가 명시하지 않으면 code-server 컨테이너를 재시작하지 않는다.
| Host port | Container port | Purpose |
|---:|---:|---|
| `13000-13099` | `3000-3099` | web/dev app preview range |
| `18080` | `18080` | IOP field artifact/bootstrap HTTP |
| `18081` | `8080` | Edge OpenAI-compatible HTTP |
| `19080` | `19080` | Portal/Control Plane wire test endpoint |
| `19090` | `9090` | Edge-Node TCP transport |
| `19092` | `9092` | Edge metrics |
| `19190` | `9190` | OTO/specialized agent field transport reserve |
field bootstrap UX는 Jenkins agent 연결처럼 Edge가 command를 제시하고 대상 host가 실행하는 형태를 목표로 한다.
초기 field 단계의 Node bootstrap은 다음 요구를 만족해야 한다.
- Edge 또는 field artifact server가 `dist/field/<version>/<goos>-<goarch>/iop-node`를 정해진 URL로 노출한다.
- Apple Silicon Mac은 `darwin/arm64` 산출물을 사용한다. `linux/arm64`는 Mac 실행 대상이 아니다.
- 사용자가 실행하는 명령은 한 줄 수준으로 유지하고, 내부에서 다운로드, 실행 권한 부여, config 생성, `iop-node serve`까지 이어진다.
- 직접 포트가 아직 적용되지 않았거나 외부망에서 막히면 SSH tunnel 또는 reverse tunnel은 fallback으로만 사용한다.
현재 활성 작업 좌표는 `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`다.
이 Milestone이 끝나기 전까지 field bootstrap 관련 구현, 문서, 테스트 포트 변경은 해당 Milestone 범위로 판단한다.
## 공통 Ollama 필드 테스트 환경
OpenAI-compatible Ollama E2E 서빙 검증은 아래 필드 환경을 공통 기준으로 사용한다.