iop/apps/edge
toki 6f141b9121 fix(single_request): 템플릿 경로 생략과 명시 빈 값을 구분한다
`plan_file`/`review_file`이 평범한 문자열이라 decode 직후 trim-empty가 곧
생략으로 취급되었고, 그 결과 loader의 빈 경로 거부가 설정값에 대해 도달할 수
없었다. 명시적으로 설정한 빈 값과 공백 값이 조용히 built-in default로
떨어지는 승인 경계 결함이므로 optional 표현으로 바꿔 생략만 fallback 신호가
되게 한다. 설정된 값은 파일 접근 전에 trim 후 빈 경로 거부까지 도달한다.

pointer cell이 snapshot 사이에서 aliasing되지 않도록 Templates 전용 deep
clone을 두고, 네 가지 명시 빈/공백 경계와 clone 독립성, 그리고 refresh가
경로나 본문을 노출하지 않는다는 기존 근거를 함께 회귀로 고정한다.

Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 10:04:01 +09:00
..
cmd/edge chore: 테스트 임시 산출물을 정리한다 2026-08-06 20:01:57 +09:00
internal fix(single_request): 템플릿 경로 생략과 명시 빈 값을 구분한다 2026-08-09 10:04:01 +09:00
Dockerfile feat(edge): envsubst 템플릿 기반으로 설정을 전환한다 2026-06-02 18:06:44 +09:00
README.md fix(transport): 터널 지연에 맞춰 heartbeat 경계를 보강한다 2026-08-02 22:30:25 +09:00

IOP Edge

IOP Edge owns Node registration, dispatch readiness, provider-pool routing, queue admission, leases, reconnect fencing, external inference surfaces, and Control Plane operations.

Provider boundary

  • Public model ids resolve to provider adapter/target routes.
  • Normalized inference uses ordered run events; OpenAI-compatible passthrough uses provider tunnel frames.
  • session_id is correlation only and never resumes local execution state.
  • Cancellation targets an active run id.
  • Edge operations are health.check, node.status, and provider.command.
  • Provider commands are limited to capabilities, transport status, and the Ollama API tunnel.
  • Caller metadata remains an ordinary bounded string map.
  • Edge and Node use a shared tunnel-tolerant liveness profile: a 30-second heartbeat interval and a 45-second response wait. Long provider prefill or streamed-response backpressure does not prematurely fence a healthy connection; a real timeout still closes only the current generation and triggers Node reconnect.

Edge and Node preserve standard OpenAI/Anthropic-compatible inference, streaming, tools, usage, provider lifecycle, capacity, queues, and reconnect behavior. They do not own interactive host programs, persistent conversations, terminal emulation, arbitrary host commands, or local filesystem execution context.

Development

go test -count=1 ./apps/edge/...
go test -race -count=1 ./apps/edge/internal/service ./apps/edge/internal/openai
make test-e2e

Canonical contracts:

  • agent-contract/outer/openai-compatible-api.md
  • agent-contract/outer/anthropic-compatible-api.md
  • agent-contract/inner/edge-node-runtime-wire.md
  • agent-contract/inner/control-plane-edge-wire.md