- Update roadmap milestones and phase docs across multiple phases - Update plan, code-review, create-roadmap, update-roadmap, finalize-task-routing skills - Update dev-corp-runtime-deploy, dev-runtime-deploy, orchestrate-agent-task-loop skills - Refactor agent-task-loop dispatch script - Add streamgate Go package (commit_boundary, evidence_tail, filter_registry, stream_release) - Add test inventory files (dev, dev-corp, unified) - Update test smoke tests and rules for dev/dev-corp - Update docs/edge-local-dev-guide and e2e scripts - Update inventory-query Go package - Remove deprecated templates and inventory.yaml files - Add orchestrate-agent-task-loop tests
13 KiB
| test_env | test_profile | domain | verification_type | last_rule_updated_at |
|---|---|---|---|---|
| dev | node-smoke | node | smoke | 2026-07-24 |
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:
laguna-s:2.1 - capacity baseline:
4 - priority baseline:
1 - runtime baseline: custom image
iop-vllm-laguna-s21:v0.25.1-cu130, modelpoolside/Laguna-S-2.1-NVFP4revision07614121b31898586430f189d27a25a0be310843,--served-model-name laguna-s:2.1,--max-model-len 262144,--max-num-seqs 4,--gpu-memory-utilization 0.70,--enable-prefix-caching,--enable-auto-tool-choice --tool-call-parser poolside_v1,--reasoning-parser poolside_v1,--chat-template /run/iop/laguna-s-2.1-thinking.jinja,--default-chat-template-kwargs '{"enable_thinking":true}',--override-generation-config '{"temperature":0.7,"top_p":0.95}' - thinking template baseline: host
/home/toki/iop-gx10-vllm/laguna-s-2.1-thinking.jinja를 container/run/iop/laguna-s-2.1-thinking.jinja에 read-only bind하고, generation prefix를<think>\n으로 둔다. stock<think>prefix는 첫 생성 토큰으로</think>를 내보내 reasoning이 비는 현상이 재현됐다. - speculative decoding baseline: quantization-matched
poolside/Laguna-S-2.1-DFlash-NVFP4revision723794750422b3efbf3a7b3af76dffb4ba035943,method=dflash,num_speculative_tokens=7 - long-context admission baseline: observed GPU KV cache
373711tokens,long_context_capacity=1(vLLM max concurrency1.43xfor a 262144-token request) - reasoning baseline: provider-native stream field is
reasoning; Piopenai-completionsacceptsreasoning_content,reasoning, andreasoning_text. Pi Laguna model compat sendschat_template_kwargs.enable_thinkingfrom the selected thinking level and keepspreserve_thinking=true. - 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/inventory-dev.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:
GX10은 Laguna S 2.1 NVFP4 + DFlash NVFP4를 사용한다. OneXPlayer와 RTX5090 Lemonade는 Ornith Q5 GGUF를 사용하고 runtime speculative decoding은 --spec-type none으로 끈다. provider family별 parser/template을 섞지 않는다.
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를 재시작한다. 비밀번호나 개인키 경로는 문서와 실행 로그에 기록하지 않는다.
GX10 Laguna 공식 vLLM baseline은 temperature=0.7, top_p=0.95, model generation_config의 top_k=20, tool_call_parser=poolside_v1, reasoning_parser=poolside_v1, enable_thinking=true다. 현재 dev는 stock generation prefix가 think block을 즉시 닫는 현상을 막기 위해 <think>\n 로컬 템플릿을 추가한다. Pi의 high thinking은 chat_template_kwargs.enable_thinking=true로 전달하고 이전 reasoning block은 preserve_thinking=true로 재사용한다. think smoke는 high에서 thinking_start/thinking_delta/thinking_end, off에서 thinking event 0개와 최종 text를 확인하고, agentic multi-turn에서는 tool-call 전후 reasoning과 최종 text까지 확인한다.
OneXPlayer/RTX5090 Ornith 공식 sampling baseline은 temperature=0.6, top_p=0.95, top_k=20이다. caller의 명시값이 provider 기본값보다 우선한다.
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 파일에 기록하지 않는다.