- Refactor plan, code-review, finalize-task-routing, refine-local-plans, router skills - Add agent-workflow-loop-orchestration skill and plan agent configs - Update roadmap: knowledge-tool-optimization milestones, stream-evidence-gate-core SDD - Add stream-evidence-gate-core task, archive, and Go streamgate package - Update dev-test inventory (edge/node smoke), agent-contract, edge-local-dev-guide - Deprecate USER_REVIEW for output-validation-filters SDD
12 KiB
| test_env | test_profile | domain | verification_type | last_rule_updated_at |
|---|---|---|---|---|
| dev | node-smoke | node | smoke | 2026-07-23 |
node-smoke dev 테스트
읽기 조건
apps/node/**변경 또는 node 실행, adapter, transport, router, store dev 검증 판단이 필요한 경우
적용 범위
apps/node/cmd/node/**apps/node/internal/bootstrap/**apps/node/internal/node/**apps/node/internal/runtime/**apps/node/internal/router/**apps/node/internal/transport/**apps/node/internal/adapters/**apps/node/internal/store/**
분류
- domain: node
- verification_type: smoke
- scope: node 실행 파이프라인과 edge 연결 baseline
환경
- host: local checkout. dev host, external CLI profile, shared Edge runtime evidence가 필요하면 원격 runner를 사용한다.
- port: dev Edge-Node TCP transport
19003 - runtime: Go
1.24 - package manager: Go modules / Makefile
- docker: unit/smoke quick check는 Docker를 요구하지 않는다. compose dev 검증은
docker compose --env-file .env.dev.example ...로 수행한다. - external service: dev Edge runtime 주소 후보
toki-labs.com:19003 - model endpoint: dev OpenAI-compatible base URL 후보
http://toki-labs.com:18083/v1 - credential: token/secret 원문은 문서에 기록하지 않는다.
dev-runtime Node 접속 기준
dev-runtime의 실제 4-node 연결을 점검할 때는 원격 runner ssh toki@toki-labs.com의 /Users/toki/agent-work/iop-dev checkout과 build/dev-runtime/edge.yaml을 기준으로 한다. Node는 dev-runtime provider pool 기준에서 Edge-Node TCP toki-labs.com:18084로 붙는다.
- mac CLI + MLX provider node:
mac-codex-node/mac-codex- SSH/user:
ssh toki@toki-labs.com - 목적:
cliadapter,codex app-server+mac-mlx-vllmprovider resource - workspace:
/Users/toki/agent-work/iop-workspace/nomadcode - MLX vLLM provider:
mac-mlx-vllm- provider endpoint:
http://127.0.0.1:8002/v1 - served model:
mlx-community/Qwen3.6-35B-A3B-4bit - capacity baseline:
2 - priority baseline:
2 - workdir:
/Users/toki/agent-work/iop-mlx-vllm - runtime baseline:
vllm-mlx,--max-num-seqs 2,--max-kv-size 262144,--max-request-tokens 262144,--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096,--enable-auto-tool-choice --tool-call-parser qwen --reasoning-parser qwen3,--default-chat-template-kwargs {"enable_thinking": true} - KV policy: per-call window bound
262144, one full context-size setting - long-context admission baseline:
total_context_tokens=262144,long_context_capacity=1(KV budget262144fits one full 262144-window request; long slot count is not the normal capacity2)
- provider endpoint:
- SSH/user:
- GX10 vLLM node:
gx10-vllm-node/gx10-vllm- SSH/user:
ssh toki@192.168.0.91 - provider endpoint:
http://192.168.0.91:8001/v1 - served model:
ornith:35b - capacity baseline:
4 - priority baseline:
1 - runtime baseline:
vllm, modeldeepreinforce-ai/Ornith-1.0-35B-FP8,--served-model-name ornith:35b,--dtype bfloat16,--max-model-len 262144,--max-num-seqs 4,--gpu-memory-utilization 0.50,--enable-prefix-caching,--enable-auto-tool-choice --tool-call-parser qwen3_xml,--reasoning-parser qwen3,--trust-remote-code,--language-model-only,--override-generation-config '{"temperature":0.6,"top_p":0.95,"top_k":20}' - long-context admission baseline:
total_context_tokens=1048576,long_context_capacity=4(vLLM log: GPU KV cache1060912tokens, max concurrency4.05xfor 262144-token requests) - workspace:
/home/toki/iop-gx10-vllm
- SSH/user:
- OneXPlayer Lemonade node:
onexplayer-lemonade-node/onexplayer-lemonade- SSH/user:
ssh r0bin@192.168.0.59 - 접속 기준: 현재 작업 호스트에서 직접 SSH
- provider endpoint:
http://192.168.0.59:13305/v1 - served model:
Ornith-1.0-35B-GGUF-llamacpp-tp1-Q5_K_M - capacity baseline:
3 - priority baseline:
2 - load baseline: checkpoint
LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q5_K_M, backendvulkan, ctx size524288,llamacpp_args="--spec-type none -cb -fa on -b 4096 -ub 1024 --kv-unified --temp 0.6 --top-p 0.95 --top-k 20",save_options=true - long-context admission baseline:
total_context_tokens=524288,long_context_capacity=2(-np고정 분할을 제거하고--kv-unified를 사용한다./slots는 auto slots 4개와 slotn_ctx=262144를 보고한다) - workspace:
C:/Users/r0bin/iop-field
- SSH/user:
- RTX5090 Lemonade node:
rtx5090-lemonade-node/rtx5090-lemonade- SSH/user:
ssh iop-dev-rtx5090 - 접속 기준: 현재 작업 호스트의 local SSH config alias와 public-key batch 인증. host identity와 공개키 지문은
agent-test/dev/inventory.yaml의ssh_access를 따른다. - provider endpoint:
http://192.168.0.111:13305/v1 - served model:
Ornith-1.0-35B-GGUF-llamacpp-tp1-Q5_K_M - capacity baseline:
1 - priority baseline:
0 - load baseline: checkpoint
LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q5_K_M, backendcuda, ctx size262144,llamacpp_args="--spec-type none -np 1 -cb -fa on -b 512 -ub 256 --kv-unified -ctk q8_0 -ctv q8_0 --temp 0.6 --top-p 0.95 --top-k 20" - network baseline: Lemonade
host=0.0.0.0; localhost-only bind는 Node의 provider endpoint 접속 실패를 유발한다. - long-context admission baseline:
total_context_tokens=262144,long_context_capacity=1 - process baseline: 2026-07-23 기준 실제 IOP Node 부팅 owner는 user Startup의
IOP Node.lnk이며,cmd.exe -> C:/Users/r0bin/iop-field/run-iop-node.cmd -> iop-node.exe serve --config node.yaml으로 실행한다. Task SchedulerIOP Dev Node RTX5090 Lemonade는 제거되어 있으며 IOP dev 배포는 이를 생성·재생성하지 않는다. - sampling rollout: 2026-07-23 saved recipe와 실제 llama-server process에서
--temp 0.6 --top-p 0.95 --top-k 20적용을 확인했다. - workspace:
C:/Users/r0bin/iop-field
- SSH/user:
OneXPlayer와 RTX5090 Lemonade는 현재 Ornith Q5 GGUF를 사용하고 runtime speculative decoding은 --spec-type none으로 끈다. Qwen을 다시 올릴 때도 fixed -np 3 분할은 쓰지 말고 현재 검증된 --kv-unified 방식으로 resource를 공유한다.
GX10은 Linux/ARM64 bootstrap, OneXPlayer와 RTX5090은 Windows native PowerShell bootstrap을 기본으로 한다. 두 Windows node는 현재 작업 호스트에서 직접 접속해 세팅하며, 원격 runner나 Edge host에서 proxy 실행하지 않는다.
mac-mlx-vllm provider는 mac-codex-node 소속 resource로, Edge host와 같은 macOS host에서 vllm-mlx process로 실행한다. vllm-mlx API는 외부에 직접 노출하지 않고 127.0.0.1:8002에 bind하며, Edge의 OpenAI-compatible adapter가 local bearer header로 호출한다. 운영 확인은 /Users/toki/agent-work/iop-mlx-vllm/vllm-mlx.pid, logs/vllm-mlx.stdout.log, logs/vllm-mlx.stderr.log를 기준으로 한다. Docker와 macOS 여유 메모리를 고려해 capacity는 2를 기본선으로 유지한다.
OneXPlayer에서 SSH 세션 안의 Start-Process로 iop-node.exe를 띄우면 SSH 세션 종료와 함께 process가 정리될 수 있다. dev 반복 배포에서는 Win32_Process.Create 또는 동등한 세션 독립 실행 방식으로 C:/Users/r0bin/iop-field에서 iop-node.exe --config node.yaml serve를 시작하고, WMI/process query와 iop-node.log의 connected to edge 로그로 유지 여부를 확인한다.
RTX5090은 ssh iop-dev-rtx5090으로 batch 접속을 먼저 확인하고 Node process, iop-node.log, Edge의 connected node 상태를 함께 확인한다. 별도 user Startup startup.lnk -> startup.bat -> oto startup.yaml -> AHK <mode>_mode.ahk 체인은 호스트 자동화용이며 IOP Node owner가 아니다. 이 체인의 RemoteLLM_mode.ahk는 제거된 IOP Dev Node RTX5090 Lemonade Task Scheduler 항목을 호출하므로, Node 부팅 또는 배포 성공의 근거로 사용하지 않는다. 배포 직후 즉시 재시작이 필요하면 C:/Users/r0bin/iop-field/run-iop-node.cmd를 Win32_Process.Create 또는 동등한 세션 독립 방식으로 실행하고 process와 connected to edge 로그를 확인한다. Lemonade 복구 시에는 lemonade config의 host=0.0.0.0과 0.0.0.0:13305 listener를 확인한 뒤 Node를 재시작한다. 비밀번호나 개인키 경로는 문서와 실행 로그에 기록하지 않는다.
Ornith 공식 sampling baseline은 temperature=0.6, top_p=0.95, top_k=20이다. 출처는 https://huggingface.co/deepreinforce-ai/Ornith-1.0-35B의 Quickstart/API 예제이며, 공식 예제에 없는 repeat_penalty는 임의로 추가하지 않는다. GX10은 vLLM generation override, Lemonade는 저장된 recipe llamacpp_args로 적용한다. caller의 명시값이 우선하며 이 설정 자체는 reasoning 언어를 강제하지 않는다.
ornith:35b 동시 긴 한국어 streaming 시도에서 llama-server의 pre-release HTTP 500 Failed to parse input at pos가 관측됐다. 이는 provider parser 오류이며 repetition loop, output guard hit, 또는 반복 출력 발생을 증명하지 않는다. 원문 요청·출력은 ignored run에만 두고, tracked 문서에는 sanitised error signature만 남긴다.
Qwen provider를 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming delta.tool_calls, multi-turn tool result 후 최종 답변을 확인한다. raw native marker나 reasoning text가 assistant content로 새면 해당 model/runtime의 parser/template profile 미확정으로 보고한다.
Qwen runtime에는 Qwen 전용 parser/template 검증값만 사용한다. dev-corp Gemma 계열의 tool_call_parser=gemma4, reasoning_parser=gemma4, Gemma4 chat template/profile을 Qwen provider에 복사하지 않는다.
명령
- setup:
- lint:
- unit:
go test ./apps/node/... - smoke:
./scripts/e2e-smoke.sh는 기본 포트 임시 설정을 쓰는 보조 smoke이므로 dev 포트 override 필요 여부를 먼저 확인한다. - e2e:
make test-e2e - model:
- full-cycle: repo 내부 edge-node 진단과 사용자 실행 cycle 수동 검증
필수 검증
- 변경한 node 패키지 또는
go test ./apps/node/...를 실행한다. - 실행 요청, stream, cancel, status, session, adapter registry 경로를 바꾼 경우 repo 내부 edge-node 진단과 full-cycle 실제 구동 기준을 함께 적용한다.
- CLI profile 변경 시
/capabilities,/transport,/sessions, persistent profile이면/terminate-session을 확인한다. - dev Edge runtime으로 연결하는 경우 Node가
19003을 사용하고 local/test19090field baseline으로 붙지 않는지 확인한다.
보조 검증
./scripts/e2e-smoke.sh는 mock adapter 기반 보조 smoke로 사용한다.make test-e2e는 보조 smoke이며 full-cycle 실제 구동을 대체하지 않는다.
판정 기준
- node 등록 후 edge console에서 node가 조회된다.
- 같은 session에서 메시지 2회가 start, 기대 payload를 포함한
[node-*-message], 같은 run의 complete 순서로 edge 화면에 도착한다. - node 로컬
[node-message]payload 라인 목록과 edge[node-*-message]payload 라인 목록이 run별로 내용/순서까지 동일해야 한다. - edge complete는 같은 run의 마지막
[node-*-message]이후에만 정상이다. - command 결과가
[node-*-<command>]또는 명확한 성공/unsupported/error 출력으로 edge 화면에 표시된다.
기준 출력 예시
edge> /nodes
edge> Convert token iop_manual_one and reply only with converted token
[node-*-event] start
[node-*-message] IOP_MANUAL_ONE_OK
[node-*-event] complete
차단 기준
- dev host 또는 Edge-Node TCP port 접근이 불가능하다.
- 외부 CLI profile 검증에 필요한 CLI 설치, 계정, provider 상태가 없다.
보고 항목
- 실행한 명령:
- 성공한 검증:
- 실패/차단된 검증:
- 생략 사유:
- 남은 위험:
금지 사항
- 사용자 실행 파이프라인 변경을 unit test만으로 완료 처리하지 않는다.
proto/gen/iop/*.pb.go생성 파일을 직접 수정하지 않는다.- secret, token, 개인 endpoint 원문은 tracked 파일에 기록하지 않는다.