docs(agent-ops): 도메인 룰을 현재 구조에 맞춘다
코드 구조와 도메인 소유권 문서의 불일치를 제거해 후속 작업이 올바른 규칙과 경계를 로드하도록 한다.
This commit is contained in:
parent
4695bcbc60
commit
fc33b18e79
8 changed files with 84 additions and 23 deletions
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
domain: agent
|
||||
last_rule_review_commit: 521fee23bb701ace0de1678485997f7ca9df1338
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
|
|
@ -8,11 +8,11 @@ last_rule_updated_at: 2026-07-30
|
|||
|
||||
## Purpose / Responsibility
|
||||
|
||||
Own the standalone, device-local `iop-agent` application boundary. This domain composes shared Agent Runtime capabilities into one daemon lifecycle for the current OS user while keeping provider execution and Agent Task workflow semantics in their shared packages.
|
||||
Reserve the standalone, device-local `iop-agent` application boundary. The current repository has no concrete `apps/agent/` implementation; shared Agent Runtime foundations remain in platform-common until a host application is added.
|
||||
|
||||
## Included Paths
|
||||
|
||||
- `apps/agent/` — standalone application lifecycle, dependency composition, commands, and host-local adapters
|
||||
- None — the current tree has no standalone agent application path
|
||||
|
||||
## Excluded Paths
|
||||
|
||||
|
|
@ -24,11 +24,11 @@ Own the standalone, device-local `iop-agent` application boundary. This domain c
|
|||
|
||||
## Major Components
|
||||
|
||||
- `apps/agent/` — application root for the standalone daemon; application components are added behind host-owned lifecycle interfaces
|
||||
- No concrete application component yet — implemented runtime configuration, state, policy, provider, task, and workspace foundations are shared packages owned by platform-common
|
||||
|
||||
## Patterns to Preserve
|
||||
|
||||
- Keep daemon lifecycle and dependency composition application-owned under `apps/agent/`.
|
||||
- When the standalone host is introduced, keep daemon lifecycle and dependency composition application-owned under `apps/agent/`.
|
||||
- Consume `packages/go/agenttask.AgentTaskManager` and other shared runtime contracts through narrow application ports.
|
||||
- Start application components in declared dependency order, roll back partial startup deterministically, and stop them in reverse order.
|
||||
- Keep construction side-effect free; process, socket, provider, and watcher activity begins only through explicit lifecycle methods.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
domain: client
|
||||
last_rule_review_commit: 7ca329ac9e03bf7cfebfac4517559fc1e2f0bca8
|
||||
last_rule_updated_at: 2026-07-14
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# client
|
||||
|
|
@ -51,7 +51,10 @@ IOP의 공식 Flutter client UI/UX 영역이다. Control Plane HTTP/WS endpoint
|
|||
- `clientParserMap` — Client-Control Plane proto message parser map
|
||||
- `ControlPlaneStatusController` / `ControlPlaneStatusRepository` — Control Plane HTTP status/operation view 로딩과 UI state 관리
|
||||
- `EdgeRegistryView` / `EdgeStatusResponseView` / `FleetStatusResponseView` / `EdgeOperationsResponseView` — Control Plane JSON view를 client-side DTO로 정규화
|
||||
- `ProviderSnapshotView` / `EdgeCapabilitySummaryView` / `EdgeDomainAgentSummaryView` — provider resource 상태와 Edge capability/domain-agent summary를 정규화하는 client DTO
|
||||
- `EdgesPanel` / `NodesPanel` / `RuntimePanel` / `ExecutionLogsPanel` — 운영 상태를 스캔 가능한 panel UI로 표시하는 widget
|
||||
- `NodesPanelContent` / `NodeStatusCard` / `ProviderSnapshotCard` — Node 목록 상태와 provider snapshot 표시를 분리한 section widget
|
||||
- `RuntimePanelDomainAgentsSection` / `RuntimePanelOperationsHistorySection` — Runtime panel의 domain-agent와 operation history 표시를 분리한 section widget
|
||||
- `apps/client/lib/gen/proto/iop/*.dart` — `make proto-dart`로 생성되는 Dart protobuf binding
|
||||
- `NexoNotificationHostIntegration` / `NexoNotificationPluginClient` / `NexoNotificationClient` — Nexo messaging notification stream integration host
|
||||
- `IopConsoleShell` — IOP 단독 앱과 외부 임베더가 공유할 수 있는 좌측 rail console shell
|
||||
|
|
@ -65,6 +68,7 @@ IOP의 공식 Flutter client UI/UX 영역이다. Control Plane HTTP/WS endpoint
|
|||
- Client-Control Plane native 경계는 `/client` WebSocket proto-socket과 `ClientHelloRequest`/`ClientHelloResponse` baseline을 따른다.
|
||||
- Client-Control Plane wire 상세는 `agent-contract/inner/client-control-plane-wire.md`를 기준으로 확인한다.
|
||||
- Control Plane HTTP 상태 조회는 repository/controller/DTO 경계에서 처리하고, panel widget이 raw JSON parsing이나 endpoint path 조립을 직접 소유하지 않도록 유지한다.
|
||||
- `NodesPanel`과 `RuntimePanel`은 로딩과 새로고침 orchestration에 집중하고, 반복되는 상태별 UI와 card rendering은 대응 section widget에 둔다.
|
||||
- Control Plane URL은 `IOP_CONTROL_PLANE_HTTP_URL`, `IOP_CONTROL_PLANE_WIRE_URL` `--dart-define`으로 주입한다. 실제 환경값이나 private endpoint를 tracked source에 고정하지 않는다.
|
||||
- Dart protobuf binding은 `proto/iop/*.proto`에서 생성한다. proto 계약 변경 시 `make proto-dart` 산출물과 Go 생성물 갱신 여부를 함께 확인한다.
|
||||
- `apps/client/lib/gen/proto/iop/*.dart` 생성물은 사람이 직접 수정하지 않는다.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
domain: control-plane
|
||||
last_rule_review_commit: 7ca329ac9e03bf7cfebfac4517559fc1e2f0bca8
|
||||
last_rule_updated_at: 2026-07-14
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# control-plane
|
||||
|
|
@ -37,6 +37,7 @@ last_rule_updated_at: 2026-07-14
|
|||
- `registerEdgeRegistryHandlers()` — `/edges`, `/edges/{edge_id}`, `/edges/{edge_id}/status`, `/edges/{edge_id}/events`, `/edges/{edge_id}/operations`, `/edges/{edge_id}/commands` JSON endpoint
|
||||
- `registerFleetHandlers()` / `fleetService` — `/fleet/status`와 `/fleet/commands` fan-out, bounded concurrency, short status cache
|
||||
- `edgeRegistryView` / `edgeStatusResponseView` / `fleetEdgeView` / `edgeCommandRecordView` — HTTP JSON 응답용 Control Plane view DTO
|
||||
- `providerSnapshotView` / `nodeConfigSummaryView` / `edgeCapabilitySummaryView` / `edgeDomainAgentSummaryView` — Edge가 보고한 provider resource, Node config summary, capability/domain-agent 상태를 투영하는 view DTO
|
||||
- `wire.Protocol` — Control Plane 통신 표준을 `protobuf-socket`으로 고정하는 상수
|
||||
- `wire.Endpoint` — reserved wire endpoint 설정 타입
|
||||
- `wire.ClientServer` — `/client` WebSocket proto-socket hello 요청을 처리하는 서버 구현
|
||||
|
|
@ -59,6 +60,7 @@ last_rule_updated_at: 2026-07-14
|
|||
- Control Plane-Edge wire 상세는 `agent-contract/inner/control-plane-edge-wire.md`, Client-Control Plane wire 상세는 `agent-contract/inner/client-control-plane-wire.md`를 기준으로 확인한다.
|
||||
- Edge registry는 현재 in-memory connection/control view이다. 최근 node event와 command record/event는 운영 화면용 bounded view이며, durable history, audit, 정책 저장소를 이 registry에 섞지 않는다.
|
||||
- Edge status 조회는 Edge가 보고한 `EdgeStatusResponse`를 관찰한다. Control Plane에서 Node address, token, transport internals, Edge 설정 원본을 직접 소유하지 않는다.
|
||||
- Provider snapshot, Node config summary, Edge capability와 domain-agent view는 Edge 응답을 안전한 JSON projection으로 변환할 뿐 Control Plane에서 다시 계산하거나 별도 원본으로 유지하지 않는다.
|
||||
- Edge command와 fleet command는 Control Plane이 Edge-owned operation을 wire로 요청하는 표면이다. command semantics는 Edge service/operation boundary에 두고, Control Plane은 fan-out, timeout, view rendering, 최소 record만 담당한다.
|
||||
- Fleet status fan-out은 bounded concurrency와 짧은 cache를 사용해 연결 Edge를 관찰한다. cache는 freshness 최적화일 뿐 source of truth가 아니며 disconnected view는 registry 상태를 즉시 반영한다.
|
||||
- `ScheduleRequest`/`ScheduleResponse`는 legacy placeholder로만 취급하고, 새 orchestration 계약은 Edge-owned runtime state를 우회하지 않도록 다시 설계한다.
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
---
|
||||
domain: edge
|
||||
last_rule_review_commit: 7ca329ac9e03bf7cfebfac4517559fc1e2f0bca8
|
||||
last_rule_updated_at: 2026-07-14
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# edge
|
||||
|
||||
## 목적 / 책임
|
||||
|
||||
여러 Node를 하나의 로컬 실행 그룹으로 묶는 백엔드 실행 그룹 컨트롤러 영역이다. node 연결을 수락하고 token 기반 등록을 검증한 뒤 adapter/runtime 설정을 내려주며, `iop-edge` command 중심의 local/field 운영 UX, ops console, OpenAI-compatible HTTP, A2A JSON-RPC, Control Plane outbound connector를 내부 Edge-owned operation으로 수렴시킨다. Edge는 자신의 설정, Node registry, runtime/automation 상태의 원본 소유자다.
|
||||
여러 Node를 하나의 로컬 실행 그룹으로 묶는 백엔드 실행 그룹 컨트롤러 영역이다. node 연결을 수락하고 token 기반 등록을 검증한 뒤 adapter/runtime 설정을 내려주며, `iop-edge` command 중심의 local/field 운영 UX, ops console, OpenAI-compatible HTTP, A2A JSON-RPC, Control Plane outbound connector를 내부 Edge-owned operation으로 수렴시킨다. OpenAI-compatible 경계에서는 선택적으로 request-local Stream Evidence Gate를 조립해 출력 검증과 bounded recovery를 수행한다. Edge는 자신의 설정, Node registry, runtime/automation 상태의 원본 소유자다.
|
||||
|
||||
## 포함 경로
|
||||
|
||||
|
|
@ -70,6 +70,8 @@ last_rule_updated_at: 2026-07-14
|
|||
- `service.NodeCommandView` / `UsageStatusView` — console/HTTP/RPC surface가 공유할 수 있는 node command 결과 DTO
|
||||
- `input.Manager` — OpenAI-compatible 서버와 A2A 서버 lifecycle 소유자
|
||||
- `openai.Server` — `/v1/models`, `/v1/chat/completions`, `/v1/responses`, SSE stream, strict output/tool validation, usage metering, principal token auth, provider pool/passthrough, Ollama API passthrough를 `service`로 연결하는 HTTP 표면
|
||||
- OpenAI Stream Evidence Gate adapter — `stream_gate_runtime.go`, dispatcher/policy/filter/ingress/release sink/tunnel codec와 endpoint request rebuilder를 통해 공통 `streamgate` runtime을 Chat/Responses/provider-tunnel 표면에 연결
|
||||
- `zapFilterObservationSink` — raw prompt/output/tool payload를 보존하지 않는 filter decision·recovery 관측 projection
|
||||
- `a2a.Server` / `a2a.TaskStore` — A2A `message/send`, `tasks/get`, `tasks/cancel`과 task 상태 보관
|
||||
- `opsconsole.Run` — edge-local console loop와 slash command 처리
|
||||
- `opsconsole.EventRouter` — run/node event를 edge console 출력으로 라우팅
|
||||
|
|
@ -98,6 +100,9 @@ last_rule_updated_at: 2026-07-14
|
|||
- OpenAI-compatible 경계의 `model`과 A2A 경계의 `Task`/JSON-RPC 표현은 입력 표면 안에서만 유지하고, edge 내부 실행은 `service.SubmitRun()`의 `adapter + target` 요청으로 변환한다.
|
||||
- provider pool에서는 top-level `models[]`의 id를 canonical model group key로 보고, `models[].providers`와 `nodes[].providers[]`를 통해 provider id별 served model로 rewrite한다. caller metadata나 request body의 임의 field가 provider 선택권을 갖지 않게 한다.
|
||||
- OpenAI-compatible raw passthrough는 `ProviderTunnelRequest`/`ProviderTunnelFrame` 경계와 `service.SubmitProviderTunnel()`을 통해서만 수행한다. HTTP handler가 node transport client에 직접 provider tunnel message를 쓰지 않는다.
|
||||
- Stream Evidence Gate가 활성화된 요청은 request-start config/filter snapshot에 고정하고, blocking filter의 safe release 전에는 response start나 opening event를 commit하지 않는다. release, terminal, bounded recovery는 공통 `streamgate` runtime을 통해 단일 수명주기로 수렴시킨다.
|
||||
- Stream Evidence Gate의 endpoint codec, provider-tunnel 변환, request rebuild와 OpenAI-compatible 오류 projection은 Edge가 소유하고, transport-neutral event/filter/commit/recovery 상태 머신은 `packages/go/streamgate`를 재사용한다.
|
||||
- Output filter 선택은 endpoint, environment, model group/model, 실제 provider와 execution path를 기준으로 하며 caller SDK나 제품명을 정책 selector로 사용하지 않는다.
|
||||
- OpenAI principal token auth는 raw token을 config에 저장하지 않고 `principal_tokens[].token_hash_sha256`과 resolved principal metadata만 사용한다. caller-supplied metadata의 `iop_principal_*` 값은 인증된 principal을 덮어쓸 수 없다.
|
||||
- OpenAI-compatible `/v1/models`는 `openai.models`를 우선하고, 없으면 `openai.target`을 advertised model로 사용한다. 내부 target override와 외부 model echo 정책을 혼동하지 않는다.
|
||||
- OpenAI/Ollama passthrough성 옵션은 입력 표면에서 명시적으로 변환하고, node adapter의 Ollama 실행 계약을 우회하지 않는다.
|
||||
|
|
@ -113,7 +118,7 @@ last_rule_updated_at: 2026-07-14
|
|||
## 다른 도메인과의 경계
|
||||
|
||||
- **node**: edge는 node 내부 adapter를 직접 실행하지 않는다. edge는 사전 등록 정보와 연결 registry를 기반으로 요청을 보낼 대상과 실행 설정을 관리하고, TCP/protobuf로 `RunRequest`/`CancelRequest`/`NodeCommandRequest`를 보낸다.
|
||||
- **platform-common**: edge 설정, metrics, protobuf 타입은 platform-common 계약을 따른다.
|
||||
- **platform-common**: edge 설정, metrics, protobuf 타입과 transport-neutral `streamgate` event/filter/commit/recovery runtime은 platform-common 계약을 따른다. Edge는 OpenAI endpoint adapter와 정책 조립만 소유한다.
|
||||
- **external input surfaces**: OpenAI-compatible HTTP와 A2A JSON-RPC는 edge inbound adapter이며, 내부 transport/protobuf 경계를 대체하지 않는다.
|
||||
- **control-plane**: control-plane은 Edge를 통해 시스템을 제어한다. Edge domain은 outbound connector와 Edge-owned status/event/command 응답을 소유하고, control-plane domain은 server endpoint와 Edge connection/control view를 소유한다. Control Plane 없는 bootstrap/local/field/진단 fallback은 `iop-edge` command 표면에 남긴다.
|
||||
|
||||
|
|
@ -127,6 +132,7 @@ last_rule_updated_at: 2026-07-14
|
|||
- Control Plane connector에서 Node token, Node address, transport client 내부 상태를 Control Plane status 계약으로 노출하지 않는다.
|
||||
- config refresh에서 `restart_required`로 분류된 변경을 runtime에 부분 적용하지 않는다.
|
||||
- OpenAI-compatible provider pool에서 authenticated principal, provider auth header, workspace 검증을 우회하거나 caller metadata로 대체하지 않는다.
|
||||
- Stream Evidence Gate를 우회해 blocking filter 판정 전에 응답을 commit하거나, caller/product identity로 filter 적용 여부를 바꾸거나, 공통 `streamgate` 상태 머신을 Edge 내부에 복제하지 않는다.
|
||||
- Control Plane 도입만을 이유로 `iop-edge config`, `env`, `node register`, `nodes list`, `smoke`, `setup` 같은 local/field fallback command 경로를 제거하거나 제품 기본 계약에서 제외하지 않는다. 축소는 별도 roadmap 결정과 대체 fallback 기준이 있을 때만 다룬다.
|
||||
- `node register`와 bootstrap UX에 named environment parameter 조합을 기본 사용자 경로로 노출하지 않는다.
|
||||
- bootstrap 안내를 `IOP_*=` 환경 변수 나열, shell wrapper, 원격 token 조회, 수동 `node.yaml` 작성, 수동 `iop-node serve --config ...` 흐름으로 길게 만들지 않는다. 이런 값은 디버그/고급 override 문서로만 분리한다.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
domain: node
|
||||
last_rule_review_commit: 432284820e36a7a3c6b35caaa8e4b9f903145b86
|
||||
last_rule_updated_at: 2026-07-28
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# node
|
||||
|
|
@ -42,6 +42,8 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
- `node.Node.OnProviderTunnelRequest()` — provider tunnel 요청을 지원 adapter에 전달하고 tunnel frame을 edge session으로 반환
|
||||
- `node.sessionSink` — adapter `RuntimeEvent`를 proto `RunEvent`로 변환해 edge session으로 보내는 sink
|
||||
- `transport.Session` — edge와 연결된 node 세션 및 메시지 처리
|
||||
- `bootstrap.runtimeSupervisor` — 초기 연결과 reconnect를 직렬화하고 단일 active Edge session, bounded retry, fatal shutdown을 소유하는 Node lifecycle supervisor
|
||||
- `quota-probe` — 공통 CLI status checker 결과를 content-addressed `QuotaSnapshot` JSON으로 내보내는 내부 진단 command
|
||||
- `agentruntime.Registry` / `agentruntime.LifecycleProvider` — provider 등록/조회와 start/stop lifecycle 관리
|
||||
- `adapters.ConfigSet` / `adapters.DiffConfigSets()` — Edge config payload에서 adapter registry/runtime snapshot을 만들고 refresh diff를 산출
|
||||
- `adapters.BuildFromPayload()` — edge에서 받은 `NodeConfigPayload`로 `Registry`를 초기화하는 factory
|
||||
|
|
@ -65,6 +67,8 @@ Edge에 연결되어 실제 adapter execution을 수행하는 IOP 노드 에이
|
|||
- `NodeCommandRequest`는 실행 요청과 분리해 `USAGE_STATUS`, `CAPABILITIES`, `SESSION_LIST`, `TRANSPORT_STATUS` 같은 조회/제어성 명령으로 처리한다.
|
||||
- `OLLAMA_API` command는 Ollama adapter 내부의 제한된 `/api/*` passthrough로 처리하고, Edge/OpenAI surface가 node HTTP client를 우회해 직접 Ollama에 붙는 구조로 확장하지 않는다.
|
||||
- `agentruntime.Registry`의 start/stop은 bootstrap lifecycle에서만 호출하고 개별 provider에서 직접 호출하지 않는다.
|
||||
- Edge 연결 lifecycle은 `runtimeSupervisor` 하나가 초기 dial, active session 종료 대기, reconnect와 shutdown을 직렬화해 동시에 둘 이상의 dial/session이 생기지 않도록 유지한다.
|
||||
- `quota-probe`는 provider 원문이나 credential을 내보내지 않고 공통 status package가 정규화·검증할 수 있는 quota evidence만 출력한다.
|
||||
- `response_idle_timeout_ms`, `startup_idle_timeout_ms`, `completion_marker`, `resume_args`, `mode` 같은 CLI profile 설정은 edge config/proto payload를 통해 주입하고 node 코드에 target별 상수를 늘리지 않는다.
|
||||
- config refresh는 `adapters.BuildConfigSet()`로 next registry를 만들고 start 성공 후 router registry를 live swap한다. 기존 in-flight run은 old adapter snapshot으로 마무리하고, old registry stop은 active run drain 뒤에 처리한다.
|
||||
- Node-wide runtime concurrency는 admission source로 되살리지 않는다. per-adapter `Capabilities().MaxConcurrency`가 adapter gate capacity의 기준이다.
|
||||
|
|
|
|||
|
|
@ -1,20 +1,27 @@
|
|||
---
|
||||
domain: platform-common
|
||||
last_rule_review_commit: 432284820e36a7a3c6b35caaa8e4b9f903145b86
|
||||
last_rule_updated_at: 2026-07-28
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# platform-common
|
||||
|
||||
## 목적 / 책임
|
||||
|
||||
여러 앱이 공유하는 Agent Runtime와 CLI provider, 설정, 인증, 감사 event envelope, 이벤트 helper, host setup, 정책, 메타데이터, 작업 상태, 관측성, 버전, protobuf 계약을 관리한다. 앱별 구현보다 안정적인 공통 계약과 작은 유틸리티를 제공하며, 내부 실행 계약은 `adapter + target` 방향을 우선한다.
|
||||
여러 앱이 공유하는 Agent Runtime와 CLI provider, provider catalog/readiness, Agent Task orchestration, standalone runtime config/state/workspace guardrail, Stream Evidence Gate, 설정, 인증, 감사 event envelope, 이벤트 helper, host setup, 정책, 메타데이터, 작업 상태, 관측성, 버전, protobuf 계약을 관리한다. 앱별 구현보다 안정적인 공통 계약과 작은 유틸리티를 제공하며, 내부 실행 계약은 `adapter + target` 방향을 우선한다.
|
||||
|
||||
## 포함 경로
|
||||
|
||||
- `packages/go/auth/` — mTLS 인증 설정 helper
|
||||
- `packages/go/agentconfig/` — secret-free Agent provider catalog와 repo-global/user-local runtime config composition·watcher
|
||||
- `packages/go/agentguard/` — unattended Agent Task의 canonical workspace/capability admission과 opaque permit
|
||||
- `packages/go/agentpolicy/` — deterministic target selection과 quota/failure retry·failover policy
|
||||
- `packages/go/agentruntime/` — host-neutral provider 실행, event/session/failure, registry lifecycle 계약
|
||||
- `packages/go/agentprovider/catalog/` — provider/model/profile discovery, readiness, redaction과 공통 provider factory
|
||||
- `packages/go/agentprovider/cli/` — Node와 독립 host가 공유하는 CLI provider, emitter, session, status/quota 구현
|
||||
- `packages/go/agentstate/` — shared AgentTask manager state의 crash-safe device-local CAS 저장소
|
||||
- `packages/go/agenttask/` — durable AgentTaskManager 상태 전이, dependency, dispatch, review와 serial integration orchestration
|
||||
- `packages/go/agentworkspace/` — task-owned workspace snapshot/overlay/confinement, change set와 integration backend
|
||||
- `packages/go/audit/` — 공통 audit event envelope, event type, policy decision baseline
|
||||
- `packages/go/config/` — 앱 설정 struct, 기본값, YAML 로딩
|
||||
- `packages/go/events/` — 공통 EdgeNodeEvent 생성 helper와 lifecycle 상수
|
||||
|
|
@ -23,6 +30,7 @@ last_rule_updated_at: 2026-07-28
|
|||
- `packages/go/metadata/` — 공통 metadata map helper
|
||||
- `packages/go/observability/` — zap logger와 Prometheus health/metrics 서버
|
||||
- `packages/go/policy/` — 정책 엔진 인터페이스와 passthrough 구현
|
||||
- `packages/go/streamgate/` — transport-neutral normalized stream event, filter/evidence, commit, release와 bounded recovery runtime
|
||||
- `packages/go/version/` — 앱 버전 상수
|
||||
- `proto/iop/` — protobuf 메시지 계약 원본
|
||||
- `proto/gen/iop/` — protobuf 생성물
|
||||
|
|
@ -42,6 +50,14 @@ last_rule_updated_at: 2026-07-28
|
|||
- `config.NodeConfig` / `config.EdgeConfig` — node/edge 앱 설정 계약
|
||||
- `agentruntime.Provider` / `agentruntime.Registry` — host-neutral provider 실행과 lifecycle registry 계약
|
||||
- `agentruntime.ExecutionSpec` / `agentruntime.RuntimeEvent` / `agentruntime.Failure` — 공통 실행, stream event, typed failure 계약
|
||||
- `agentconfig.Catalog` / `agentconfig.RuntimeSnapshot` / `agentconfig.RuntimeConfigWatcher` — Agent provider 선언과 immutable runtime config revision/composition
|
||||
- `agentprovider/catalog.Discoverer` / `catalog.ProfileProvider` — provider readiness 확인과 catalog identity를 보존하는 공통 provider factory
|
||||
- `agentguard.Admit()` / `agentguard.Permit` — unattended invocation 직전 workspace/profile/confinement evidence 검증
|
||||
- `agentpolicy.Evaluator` / `agentpolicy.DecideContinuation()` — deterministic route 선택과 quota/failure 기반 retry·failover 판단
|
||||
- `agenttask.Manager` / `agenttask.Scheduler` — manual start부터 dependency-ready dispatch, review, follow-up, ordinal integration까지의 단일 상태 전이 소유자
|
||||
- `agentstate.Store` — checksum, atomic rename, advisory lock과 revision CAS를 사용하는 device-local manager state 저장소
|
||||
- `agentworkspace.Backend` / `agentworkspace.SerialIntegrator` — immutable workspace snapshot, isolated overlay/confinement, change-set freeze와 serial apply backend
|
||||
- `streamgate.RequestRuntime` / `streamgate.GateCoordinator` / `streamgate.CommitBoundary` / `streamgate.RecoveryCoordinator` — request-local evidence 평가, safe release, terminal과 bounded recovery 상태 머신
|
||||
- `agentprovider/cli.CLI` — one-shot/persistent CLI 실행, session/resume/cancel, emitter와 status/quota 공통 구현
|
||||
- `config.EdgeInfo` / `config.EdgeControlPlaneConf` — Edge identity와 Control Plane outbound connector 설정 계약
|
||||
- `config.EdgeServerConf` / `config.EdgeBootstrapConf` — Edge listen/advertise host와 artifact bootstrap URL 설정 계약
|
||||
|
|
@ -74,6 +90,10 @@ last_rule_updated_at: 2026-07-28
|
|||
|
||||
- 공통 패키지는 특정 앱의 내부 패키지를 import하지 않는다.
|
||||
- Agent Runtime와 CLI provider는 protobuf/transport를 import하지 않고 host가 translation boundary를 소유한다.
|
||||
- Agent provider catalog/runtime config는 Edge provider pool의 `models[]`/`nodes[].providers[]`와 별도 schema·identity를 유지한다.
|
||||
- `agenttask.Manager`만 shared Agent Task 상태 전이와 dispatch/review/integration 순서를 소유하며 host가 같은 알고리즘을 복제하지 않는다.
|
||||
- `agentstate.Store`와 `agentworkspace`는 exact revision과 immutable identity를 보존하고 corruption, drift, unsupported confinement을 성공이나 빈 상태로 정규화하지 않는다.
|
||||
- `packages/go/streamgate`는 Go 표준 라이브러리만 사용하는 transport-neutral core로 유지하고 `apps/**`, protobuf, `packages/go/config`를 import하지 않는다.
|
||||
- 설정 struct 필드 변경 시 YAML tag, mapstructure tag, default, `configs/*.yaml` 예시를 함께 확인한다.
|
||||
- host setup 기본 템플릿을 바꿀 때는 `packages/go/hostsetup`의 `EdgeSpec`/`NodeSpec`, 기본 경로, systemd unit, 관련 CLI `setup` 옵션과 함께 확인한다.
|
||||
- protobuf 계약 변경은 `proto/iop/*.proto`에서 시작하고 `make proto`로 Go 생성물을 갱신한다.
|
||||
|
|
@ -93,7 +113,8 @@ last_rule_updated_at: 2026-07-28
|
|||
## 다른 도메인과의 경계
|
||||
|
||||
- **node**: 공통 provider/runtime 구현과 설정/타입/계약을 제공하지만 protobuf translation, Edge 연결, admission과 실행 파이프라인 조정은 node가 소유한다.
|
||||
- **edge**: edge가 필요로 하는 설정/관측성/protobuf 계약을 제공하지만 실행 그룹 제어와 node registry 동작의 소유자는 edge이다.
|
||||
- **edge**: edge가 필요로 하는 설정/관측성/protobuf와 `streamgate` core 계약을 제공하지만 실행 그룹 제어, node registry, OpenAI endpoint codec/filter policy 조립은 edge가 소유한다.
|
||||
- **agent**: shared config/state/policy/provider/task/workspace 계약을 제공하지만 standalone daemon lifecycle, local-control transport와 client process ownership은 concrete agent application이 소유한다.
|
||||
- **control-plane/client/worker**: 앱별 구현에 필요한 공통 타입만 이 영역으로 승격하고 앱 내부 책임은 각 도메인에 둔다.
|
||||
- **audit/ops**: audit event type과 envelope는 공통 계약이지만, 저장소/조회/retention 실행 정책은 control-plane 또는 별도 운영 도메인에서 결정한다.
|
||||
|
||||
|
|
@ -101,6 +122,9 @@ last_rule_updated_at: 2026-07-28
|
|||
|
||||
- `packages/go`에서 `apps/*/internal` 패키지를 import하지 않는다.
|
||||
- 앱 하나만을 위한 임시 타입을 충분한 근거 없이 공통 패키지로 승격하지 않는다.
|
||||
- Agent provider catalog를 Edge provider-pool config와 합치거나 ID 의미를 서로의 fallback으로 사용하지 않는다.
|
||||
- `agenttask.Manager` 상태 머신, permit 검증, retry/failover, review/integration 순서를 앱 내부에 복제하지 않는다.
|
||||
- `streamgate` core에 OpenAI HTTP/SSE codec, protobuf, Edge config 또는 caller/product 전용 selector를 넣지 않는다.
|
||||
- edge fanout bus, web UI state, control-plane session 관리처럼 특정 앱의 운영 상태를 공통 패키지로 끌어올리지 않는다.
|
||||
- 내부 실행 계약을 확장하면서 `model` 중심 명명을 되살리지 않는다. 외부 API 호환이 필요한 경우 경계와 변환 위치를 명시한다.
|
||||
- raw token, provider credential, private endpoint 값을 `packages/go/config`, `configs/`, proto 기본값에 넣지 않는다.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
domain: testing
|
||||
last_rule_review_commit: 5b56add0d898dc0080fdb3997f32881605b72ca3
|
||||
last_rule_updated_at: 2026-07-26
|
||||
last_rule_review_commit: 4695bcbc60322b567a6e76d872490e696df672ed
|
||||
last_rule_updated_at: 2026-07-30
|
||||
---
|
||||
|
||||
# testing
|
||||
|
|
@ -16,6 +16,7 @@ last_rule_updated_at: 2026-07-26
|
|||
- `scripts/dev/edge.sh` — repo 내부 edge console/server 개발 진단 helper이다.
|
||||
- `scripts/dev/node.sh` — repo 내부 node 연결 개발 진단 helper이다. field 사용자 기본 경로로 안내하지 않는다.
|
||||
- `scripts/dev/web.sh` — repo 내부 Flutter Web client 개발 진단 helper이다. field 배포 기본 경로로 안내하지 않는다.
|
||||
- `scripts/dev/edge-node-reconnect-diagnostic.sh` — repo 내부 Edge-Node disconnect/reconnect lifecycle 진단 helper이다.
|
||||
- `scripts/e2e-smoke.sh` — mock/real profile 기반 보조 edge-node smoke 검증이다.
|
||||
- `scripts/e2e-openai-cli-workspace.sh` — OpenAI-compatible `/v1/responses` CLI workspace isolation 보조 smoke 검증이다.
|
||||
- `scripts/e2e-openai-ollama.sh` — OpenAI-compatible Ollama 입력 표면 보조 smoke 검증이다.
|
||||
|
|
@ -23,9 +24,18 @@ last_rule_updated_at: 2026-07-26
|
|||
- `scripts/e2e-openai-lemonade.sh` — OpenAI-compatible Lemonade/provider API 입력 표면 보조 smoke 검증이다.
|
||||
- `scripts/e2e-long-context-admission-smoke.sh` — live provider pool long-context admission/capacity 보조 smoke 검증이다.
|
||||
- `scripts/e2e-control-plane-edge-wire.sh` — Control Plane-Edge wire hello/disconnect 보조 smoke 검증이다.
|
||||
- `scripts/e2e-provider-capacity-smoke.sh` — provider resource capacity와 queue 동작을 확인하는 보조 smoke 검증이다.
|
||||
- `scripts/fixtures/` — E2E smoke 입력 fixture 위치이다.
|
||||
- `scripts/inventory-query/` — `agent-test` 환경 inventory를 bounded projection 또는 exact selector 결과로 조회하는 helper와 테스트이다.
|
||||
- `scripts/readability_audit.py` — tracked/worktree의 파일·함수·task read-set 가독성 기준을 검사하는 deterministic audit이다.
|
||||
- `scripts/readability_audit_test.py` — readability audit parser/policy/ratchet 단위 테스트이다.
|
||||
- `scripts/readability_baseline.json` — readability violation ratchet 기준선이다.
|
||||
- `scripts/readability_read_sets.json` — task별 ordered read-set budget 정의이다.
|
||||
- `cmd/iop-provider-smoke/` — redacted provider catalog readiness와 status/run/resume/cancel lifecycle을 실제 CLI로 검증하는 smoke command이다.
|
||||
- `docker-compose.yml` — local dev용 Control Plane, datastore, Flutter Web client stack 조립 표면이다.
|
||||
- `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py` — task plan을 실제 CLI invocation으로 연결하는 dispatcher 경계이다.
|
||||
- `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md` — Agent Task 무인 실행과 provider 격리 검증 절차의 project entrypoint이다.
|
||||
- `agent-ops/skills/project/orchestrate-agent-task-loop/agents/` — orchestrator 실행에 사용하는 agent metadata이다.
|
||||
- `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/` — task plan을 CLI invocation으로 연결하는 dispatcher, execution-target policy/selector와 observation helper 경계이다.
|
||||
- `agent-ops/skills/project/orchestrate-agent-task-loop/tests/` — dispatcher/selector의 unit·integration simulation이며 provider process를 실행하지 않는 격리 검증 표면이다.
|
||||
|
||||
## 제외 경로
|
||||
|
|
@ -50,6 +60,10 @@ last_rule_updated_at: 2026-07-26
|
|||
- OpenAI-compatible provider smoke — `scripts/e2e-openai-vllm.sh`와 `scripts/e2e-openai-lemonade.sh`로 provider API route, request body, expected output을 확인하는 live-dependency 보조 검증이다.
|
||||
- Long-context admission smoke — `scripts/e2e-long-context-admission-smoke.sh`로 provider pool capacity, queue, long-context slot, Control Plane status snapshot 회복을 live dev provider pool에서 확인하는 보조 검증이다.
|
||||
- Control Plane-Edge wire smoke — `scripts/e2e-control-plane-edge-wire.sh`로 실제 Control Plane/Edge 프로세스의 Edge hello, 연결 성공, disconnect marker를 확인하는 보조 검증이다.
|
||||
- Provider capacity smoke — `scripts/e2e-provider-capacity-smoke.sh`로 provider resource 단위 admission, queue와 release 동작을 확인하는 보조 검증이다.
|
||||
- Inventory query — 전체 private inventory를 불필요하게 읽지 않고 환경 projection이나 exact model/node/provider selector 결과만 정렬된 JSON으로 조회하는 도구이다.
|
||||
- Readability audit — file/function LOC와 task-local read-set budget을 deterministic JSON과 baseline ratchet으로 검증하는 repository quality gate이다.
|
||||
- Agent provider smoke — `cmd/iop-provider-smoke`로 catalog readiness와 status/run/resume/cancel terminal을 redacted evidence로 확인하는 live external-CLI 검증이다.
|
||||
- compose local dev stack 검증 — `docker-compose.yml` 변경 시 Control Plane, datastore, Flutter Web service의 build/env/healthcheck wiring을 확인하는 검증이다.
|
||||
- full-cycle 실제 구동 — 비효율적이어도 관련 사용자 명령과 실행 cycle을 한 번씩 실제 entrypoint로 통과시키는 검증이다.
|
||||
- 실제 외부 CLI 검증 — `claude`, `antigravity`, `codex`, `opencode`처럼 외부 CLI 설치와 계정/환경이 필요한 기준 profile을 실제 호출하는 검증이다.
|
||||
|
|
@ -68,6 +82,9 @@ last_rule_updated_at: 2026-07-26
|
|||
- 보조 E2E smoke는 mock adapter와 임시 설정/포트를 사용해 외부 CLI 의존성 없이 수행한다.
|
||||
- 보조 E2E smoke에서는 최소한 node 등록, `/nodes` 확인, console 메시지 전송, delta/message 출력, complete event를 확인한다.
|
||||
- dispatcher/selector의 unit 또는 integration simulation은 실제 `pi`, `agy`, `claude`, `codex` provider process, provider session, 네트워크 호출을 실행하지 않는다. 실행 outcome이 필요한 경우 가장 높은 runner seam(`invoke`, `run_escalating`, `run_worker`)을 deterministic fake로 대체하고, guard가 실제 `build_command`/subprocess까지 도달하지 않았음을 assertion으로 남긴다.
|
||||
- Inventory query는 selector 없는 경우 bounded environment projection만 반환하고, model/node/provider selector는 exact match와 stable path ordering을 유지한다.
|
||||
- Readability audit는 공통 Agent-Ops rules/skills와 생성물을 제외한 project-owned tracked/worktree 입력을 deterministic하게 측정하고, `--check`에서는 새롭거나 증가한 violation만 실패시키는 ratchet을 유지한다.
|
||||
- `cmd/iop-provider-smoke`는 `-redact` 없이 실행 evidence를 만들지 않고 provider output, credential, token과 private endpoint를 출력하지 않는다. 이 live smoke를 dispatcher unit/integration simulation 경로로 호출하지 않는다.
|
||||
- `dispatch_with_store(..., dry_run=False)`를 호출하는 상태 전이 테스트는 scenario에 execution이 필요 없으면 `scan_tasks`를 빈 결과로 고정해 state transition만 검증한다. execution을 검증해야 하면 fake runner의 입력·반환 locator·호출 횟수를 명시하고, provider command가 호출되지 않았음을 함께 검증한다.
|
||||
- header만 가진 PLAN/CODE_REVIEW fixture 또는 action item이 없는 fixture는 provider prompt가 될 수 없다. 그런 fixture는 dry-run, empty task scan, 또는 fake runner 아래에서만 사용한다.
|
||||
- 새 dispatcher test class는 기본 provider-deny guard를 설치하고, 실제 invocation 결과를 의도적으로 검증하는 test만 해당 guard 위에 명시 fake runner를 덮어쓴다. 새 test가 guard 없이 runner 경로를 열면 실패해야 한다.
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@
|
|||
| 경로 패턴 | 도메인 | rules.md |
|
||||
|----------|--------|----------|
|
||||
| `apps/node/**` | node | `agent-ops/rules/project/domain/node/rules.md` |
|
||||
| `apps/agent/**` | agent | `agent-ops/rules/project/domain/agent/rules.md` |
|
||||
| `apps/edge/**` | edge | `agent-ops/rules/project/domain/edge/rules.md` |
|
||||
| `apps/control-plane/**` | control-plane | `agent-ops/rules/project/domain/control-plane/rules.md` |
|
||||
| `apps/client/**` | client | `agent-ops/rules/project/domain/client/rules.md` |
|
||||
|
|
@ -87,6 +86,11 @@
|
|||
| `docker-compose.yml` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `agent-ops/skills/project/orchestrate-agent-task-loop/scripts/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `agent-ops/skills/project/orchestrate-agent-task-loop/tests/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `agent-ops/skills/project/orchestrate-agent-task-loop/SKILL.md` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `agent-ops/skills/project/orchestrate-agent-task-loop/agents/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `cmd/iop-provider-smoke/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `scripts/inventory-query/**` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
| `scripts/readability_*` | testing | `agent-ops/rules/project/domain/testing/rules.md` |
|
||||
|
||||
## 도메인 후보
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue