From c4a457c5c4fe9b55a2242c00d20c80f6601f957e Mon Sep 17 00:00:00 2001 From: toki Date: Sun, 31 May 2026 06:53:24 +0900 Subject: [PATCH] =?UTF-8?q?docs(agent-ops):=20domain=20rule=EA=B3=BC=20?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=EB=A7=B5=EC=9D=84=20operator=20reliability?= =?UTF-8?q?=20refactor=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EA=B0=B1=EC=8B=A0?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit API domain에 workerclient proxy와 handler responsibility를 추가하고, worker domain에 backtest engine, storage, provider, socket surface를 명시한다. Client domain에 socket integration과 push integration 경계를 보강한다. Operations domain에 agent-test/local과 bin 명령어를 포함하며, operations domain table에 agent-test/local 경계를 추가한다. 로드맵에 Operator Runtime Reliability Refactor Milestone를 추가하고 현재 활성 Milestone으로 설정하여 Flutter Operator Console 전에 선행할 작업으로 변경한다. --- agent-ops/rules/project/domain/api/rules.md | 20 ++++-- .../rules/project/domain/client/rules.md | 15 ++++- .../rules/project/domain/operations/rules.md | 16 ++++- .../rules/project/domain/worker/rules.md | 34 ++++++++-- agent-ops/rules/project/rules.md | 2 +- agent-roadmap/current.md | 4 +- agent-roadmap/phase/operator-surface/PHASE.md | 3 + .../milestones/operator-runtime-refactor.md | 67 +++++++++++++++++++ 8 files changed, 141 insertions(+), 20 deletions(-) create mode 100644 agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md diff --git a/agent-ops/rules/project/domain/api/rules.md b/agent-ops/rules/project/domain/api/rules.md index c7bf839..d6b7875 100644 --- a/agent-ops/rules/project/domain/api/rules.md +++ b/agent-ops/rules/project/domain/api/rules.md @@ -1,21 +1,22 @@ --- domain: api -last_rule_review_commit: 711dbb9f0c8287d2b52a034684e8e31d38eb6228 -last_rule_updated_at: 2026-05-28 +last_rule_review_commit: 3b1be95e625cfd110a42d2ee0d12653dc35f7579 +last_rule_updated_at: 2026-05-31 --- # api ## 목적 / 책임 -클라이언트-facing socket API endpoint와 ALT operator-facing control plane을 제공한다. proto-socket server lifecycle, connection setup, heartbeat timing, ALT protobuf parser registration, and API configuration을 이 경계에서 관리한다. +클라이언트-facing socket API endpoint와 ALT operator-facing control plane을 제공한다. proto-socket server lifecycle, connection setup, heartbeat timing, ALT protobuf parser registration, API configuration, and worker-facing client proxy lifecycle을 이 경계에서 관리한다. ## 포함 경로 - `services/api/cmd/alt-api/` - API service entrypoint - `services/api/internal/config/` - API environment configuration - `services/api/internal/contracts/` - API-local ALT protobuf parser map -- `services/api/internal/socket/` - proto-socket server construction +- `services/api/internal/socket/` - client-facing proto-socket server, session handlers, worker forwarding +- `services/api/internal/workerclient/` - API-owned proto-socket client proxy to worker - `services/api/go.mod` - API module dependencies ## 제외 경로 @@ -30,7 +31,9 @@ last_rule_updated_at: 2026-05-28 - `config.Config` - host, port, socket path, heartbeat interval, heartbeat wait - `config.Load` - environment variable parsing with local fallback defaults - `contracts.ParserMap` - parser registration for generated ALT protobuf messages -- `socket.NewServer` - proto-socket `WsServer` construction +- `socket.NewServer` - proto-socket `WsServer` construction and session handler registration +- `socket.marketHandlers`, `socket.backtestHandlers` - request validation and worker forwarding handlers +- `workerclient.WorkerClient` - API-side worker request/response proxy - `cmd/alt-api/main.go` - signal handling and service lifecycle ## 유지할 패턴 @@ -39,17 +42,20 @@ last_rule_updated_at: 2026-05-28 - Keep process lifecycle in `cmd/alt-api`; keep reusable socket construction under `internal/socket`. - Keep ALT protobuf parser registration under `internal/contracts` and inject it into proto-socket server construction. - Treat proto-socket as the transport abstraction; ALT payload parsing should be derived from contracts. -- Keep client-facing command/query handling in API and route long-running execution or worker-owned reads through the worker boundary. +- Keep client-facing command/query handling in API thin: validate request shape, map transport failures to typed contract errors, and route long-running execution or worker-owned reads through the worker boundary. +- Keep worker connectivity lifecycle observable and injectable enough for tests; avoid spreading worker connection state through unrelated API packages. +- Keep `HelloResponse.capabilities` aligned with actually registered API session handlers. ## 다른 도메인과의 경계 - **contracts**: API imports generated contract packages and owns API-local parser registration, but contract source stays in `packages/contracts`. -- **worker**: API may enqueue or observe worker jobs, but should not run long backtest/import work inline. +- **worker**: API may forward commands/queries to worker and surface worker availability, but should not run long backtest/import work inline or own worker storage dependencies. - **client**: API serves client sessions; client UI state and navigation stay in Flutter. ## 금지 사항 - Do not add direct Flutter/client assumptions to API internals. - Do not put scheduled job loops or heavy data processing in the API service. +- Do not add worker execution engines, PostgreSQL stores, Redis queues, or provider adapters to API internals. - Do not bypass proto-socket for the main client session path without an explicit architecture update. - Do not require Flutter client or any external operator surface to connect directly to worker runtime surfaces. diff --git a/agent-ops/rules/project/domain/client/rules.md b/agent-ops/rules/project/domain/client/rules.md index 84122c6..5104c61 100644 --- a/agent-ops/rules/project/domain/client/rules.md +++ b/agent-ops/rules/project/domain/client/rules.md @@ -1,14 +1,14 @@ --- domain: client -last_rule_review_commit: 711dbb9f0c8287d2b52a034684e8e31d38eb6228 -last_rule_updated_at: 2026-05-28 +last_rule_review_commit: 3b1be95e625cfd110a42d2ee0d12653dc35f7579 +last_rule_updated_at: 2026-05-31 --- # client ## 목적 / 책임 -ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, application shell, routing, feature presentation, and client-side tests belong here. +ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, application shell, routing, feature presentation, socket integration adapters, optional external push integrations, and client-side tests belong here. ## 포함 경로 @@ -18,7 +18,9 @@ ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, appli - `apps/client/lib/src/features/` - feature presentation code - `apps/client/lib/src/generated/` - generated Dart protobuf outputs consumed by the client - `apps/client/lib/src/integrations/` - client-side external integration adapters +- `apps/client/integration_test/` - Flutter integration tests - `apps/client/test/` - Flutter widget/unit tests +- `apps/client/test_runtime/` - runtime smoke test helpers - `apps/client/pubspec.yaml` - Flutter package dependencies ## 제외 경로 @@ -36,6 +38,8 @@ ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, appli - `AltSocketClient` - proto-socket client wrapper for ALT request/response flows - `AltSocketEndpoint` - local/default socket endpoint value object - `SocketConnectionController` - Riverpod connection state controller for socket lifecycle +- `MattermostPushHostIntegration` - optional external push integration boundary +- `bootstrapAltClient` - app bootstrap and platform integration startup ## 유지할 패턴 @@ -46,12 +50,16 @@ ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, appli - Use Material 3 components and responsive navigation patterns. - Test user-visible app shell behavior through Flutter tests. - Use `services/api` as the only ALT-owned runtime endpoint. Do not connect directly to worker runtime surfaces from client code. +- Keep operator shell bootstrapping separable from optional push/Firebase/Mattermost setup so core operator UI can start without external push readiness. +- Keep endpoint defaults in `AltSocketEndpoint` or provider/config boundaries; presentation widgets should consume state, not hard-code runtime endpoints. +- Keep Mattermost/Firebase/platform-channel behavior under `lib/src/integrations` and out of dashboard presentation widgets. ## 다른 도메인과의 경계 - **api**: client connects to API through integration adapters; server lifecycle and server-side socket parsing stay in `services/api`. - **contracts**: client consumes generated/mapped contracts and owns Dart parser helpers; protobuf source stays in `packages/contracts`. - **operations**: `bin/test`, `bin/lint`, and `bin/build` run client checks from the workspace root. +- **worker**: client never connects to worker directly; worker state reaches client only through API contracts. ## 금지 사항 @@ -60,3 +68,4 @@ ALT의 Flutter client surface를 담당한다. web/mobile/desktop targets, appli - Do not hand-edit generated protobuf Dart outputs. - Do not hard-code production endpoint assumptions in presentation widgets. - Do not add direct worker, database, Redis, or ALT-owned non-API runtime connections to Flutter client code. +- Do not make push notification or Mattermost availability a prerequisite for the base operator shell unless a dedicated push Milestone explicitly changes that boundary. diff --git a/agent-ops/rules/project/domain/operations/rules.md b/agent-ops/rules/project/domain/operations/rules.md index 1f99a44..af40dd9 100644 --- a/agent-ops/rules/project/domain/operations/rules.md +++ b/agent-ops/rules/project/domain/operations/rules.md @@ -1,14 +1,14 @@ --- domain: operations -last_rule_review_commit: 711dbb9f0c8287d2b52a034684e8e31d38eb6228 -last_rule_updated_at: 2026-05-28 +last_rule_review_commit: 3b1be95e625cfd110a42d2ee0d12653dc35f7579 +last_rule_updated_at: 2026-05-31 --- # operations ## 목적 / 책임 -로컬 개발, workspace orchestration, operator CLI, and infrastructure entrypoints를 관리한다. 개발자가 반복적으로 쓰는 root-level commands and local services stay discoverable here. +로컬 개발, remote verification routing, workspace orchestration, operator CLI, generated output checks, and infrastructure entrypoints를 관리한다. 개발자와 agent가 반복적으로 쓰는 root-level commands, local/remote test rules, and service entrypoints stay discoverable here. ## 포함 경로 @@ -17,6 +17,7 @@ last_rule_updated_at: 2026-05-28 - `go.work.sum` - Go workspace dependency checksum - `apps/cli/` - Go operator CLI for local/admin workflows - `deployments/local/` - local Docker Compose infrastructure +- `agent-test/local/` - local profile test routing that executes on the remote test host - `.gitignore` - repository-level ignore policy ## 제외 경로 @@ -34,25 +35,34 @@ last_rule_updated_at: 2026-05-28 - `bin/build` - builds Go binaries and Flutter web - `bin/contracts-gen` - regenerates contract outputs - `bin/contracts-check` - checks generated contract outputs are current +- `bin/infra-check` - checks PostgreSQL/Redis availability for the configured environment +- `bin/worker-storage-gen` - regenerates worker sqlc outputs +- `bin/worker-storage-check` - checks worker sqlc generated output drift - `deployments/local/docker-compose.yml` - PostgreSQL and Redis local stack - `apps/cli/cmd/alt/main.go` - operator CLI scaffold +- `agent-test/local/rules.md` - local profile routing with remote host execution policy ## 유지할 패턴 - Keep root helper scripts executable, idempotent where practical, and `set -euo pipefail`. - Prefer root `bin/*` commands for whole-workspace workflows. - Keep contract codegen/check scripts under `bin/` and route schema ownership back to `packages/contracts`. +- Keep worker storage codegen/check scripts under `bin/` and route schema/query ownership back to `services/worker/internal/storage/postgres`. - Keep local infrastructure defaults aligned with worker/API environment fallback values. - Add new Go modules to `go.work` when they are part of local development. +- Treat `agent-test/local` as a local profile whose commands run from the remote ALT checkout; do not imply local shell execution when local testing is forbidden. +- Keep root scripts explicit: generated drift checks should fail loudly and tell the user which generation command to run. ## 다른 도메인과의 경계 - **api** and **worker**: operations starts, tests, and builds services; service behavior belongs to each service domain. - **client**: operations invokes Flutter commands; UI implementation stays under `apps/client`. - **contracts**: operations may run codegen later; schema design remains in contracts. +- **agent-test**: operations owns routing to test profiles, but domain-specific smoke criteria remain in each `agent-test/local/*-smoke.md` document. ## 금지 사항 - Do not put application business logic in shell scripts. - Do not commit local secrets or machine-specific state. - Do not make root scripts silently skip failing module checks. +- Do not record raw remote paths, tokens, passwords, account numbers, or personal endpoints in tracked test rules or command output. diff --git a/agent-ops/rules/project/domain/worker/rules.md b/agent-ops/rules/project/domain/worker/rules.md index ec67265..0fbac2b 100644 --- a/agent-ops/rules/project/domain/worker/rules.md +++ b/agent-ops/rules/project/domain/worker/rules.md @@ -1,19 +1,32 @@ --- domain: worker -last_rule_review_commit: 711dbb9f0c8287d2b52a034684e8e31d38eb6228 -last_rule_updated_at: 2026-05-28 +last_rule_review_commit: 3b1be95e625cfd110a42d2ee0d12653dc35f7579 +last_rule_updated_at: 2026-05-31 --- # worker ## 목적 / 책임 -데이터 수집, 정규화, backtest 실행, scheduled jobs처럼 오래 걸리거나 비동기적인 작업의 runtime surface를 담당한다. PostgreSQL과 Redis 연결 정보는 이 경계에서 운영 관점으로 다룬다. worker는 client-facing surface가 아니며 API control plane을 통해 제어된다. +데이터 수집, 정규화, backtest 실행, scheduled jobs처럼 오래 걸리거나 비동기적인 작업의 runtime surface를 담당한다. PostgreSQL/Redis integration, worker socket command/query handlers, provider adapters, storage ports, and execution wiring은 이 경계에서 운영 관점으로 다룬다. worker는 client-facing surface가 아니며 API control plane을 통해 제어된다. ## 포함 경로 - `services/worker/cmd/alt-worker/` - worker process entrypoint +- `services/worker/cmd/alt-worker-data-check/` - credential-free data pipeline smoke command +- `services/worker/cmd/alt-worker-migrate/` - PostgreSQL migration command +- `services/worker/internal/backtest/` - backtest execution engine - `services/worker/internal/config/` - worker runtime configuration +- `services/worker/internal/contracts/` - worker-local ALT protobuf parser map +- `services/worker/internal/jobs/` - worker job runner, payloads, and execution starters +- `services/worker/internal/marketdata/` - market data import and data-check pipeline +- `services/worker/internal/providers/` - external market data provider adapters +- `services/worker/internal/rediskeys/` - worker Redis key naming helpers +- `services/worker/internal/socket/` - worker proto-socket command/query surface +- `services/worker/internal/storage/` - storage ports and PostgreSQL implementation +- `services/worker/sqlc.yaml` - worker SQL codegen configuration +- `services/worker/testdata/` - secret-free provider fixtures +- `services/worker/tools.go` - tool dependency anchors - `services/worker/go.mod` - worker module metadata ## 제외 경로 @@ -26,7 +39,15 @@ last_rule_updated_at: 2026-05-28 - `config.Config` - database and Redis URLs - `config.Load` - environment variable parsing with local development defaults -- `cmd/alt-worker/main.go` - worker process bootstrap +- `cmd/alt-worker/main.go` - worker process bootstrap and dependency wiring +- `socket.NewServer` - worker proto-socket server construction +- `socket.Deps` - socket handler dependency bundle for starter, analysis, result, instrument, and bar stores +- `jobs.Runner` - registered job handler dispatcher +- `jobs.BacktestStarter` - pending run persistence and asynchronous backtest job launch +- `backtest.Engine` - strategy loop and result persistence +- `storage.Store` - PostgreSQL-backed market/backtest store +- `marketdata/importer.Importer` - provider-to-store daily bar import flow +- `providers/kis` - KIS fixture decode and normalization adapter ## 유지할 패턴 @@ -34,12 +55,16 @@ last_rule_updated_at: 2026-05-28 - Put job orchestration and worker-specific adapters under `services/worker/internal`. - Use `packages/domain` for shared business shapes instead of redefining market/backtest concepts. - Expose worker-owned command/query/event runtime boundaries to `services/api` through proto-socket when crossing process boundaries. +- Wire worker execution dependencies in worker entrypoints or worker-internal constructors; API and client must only observe typed availability/errors. +- Keep store-backed socket surfaces tolerant of unavailable dependencies by returning typed contract errors instead of panicking. +- Keep provider fixtures secret-free and provider-specific raw payload handling inside provider/marketdata adapters. ## 다른 도메인과의 경계 - **domain-model**: worker consumes domain-model types; it should not make domain-model depend on worker infrastructure. - **api**: API may request or observe work; worker owns execution. - **operations**: Docker Compose supplies local infrastructure; worker code owns runtime behavior. +- **contracts**: worker consumes generated ALT protobuf types in socket/contracts adapters; protobuf source remains in `packages/contracts`. ## 금지 사항 @@ -47,3 +72,4 @@ last_rule_updated_at: 2026-05-28 - Do not hide required infrastructure in package-level globals. - Do not store generated contract code in the worker module. - Do not expose worker as a direct Flutter/client runtime endpoint. +- Do not put provider credentials, account numbers, raw tokens, or personal endpoints in worker fixtures, logs, README, or tracked docs. diff --git a/agent-ops/rules/project/rules.md b/agent-ops/rules/project/rules.md index 7887dbf..74e3759 100644 --- a/agent-ops/rules/project/rules.md +++ b/agent-ops/rules/project/rules.md @@ -71,7 +71,7 @@ ALT는 개인 quant system workspace다. Go 서비스와 도구는 루트 `go.wo | `services/api/**` | api | `agent-ops/rules/project/domain/api/rules.md` | | `services/worker/**` | worker | `agent-ops/rules/project/domain/worker/rules.md` | | `apps/client/**` | client | `agent-ops/rules/project/domain/client/rules.md` | -| `apps/cli/**`, `bin/**`, `deployments/local/**`, `go.work`, `go.work.sum`, `.gitignore` | operations | `agent-ops/rules/project/domain/operations/rules.md` | +| `apps/cli/**`, `bin/**`, `deployments/local/**`, `agent-test/local/**`, `go.work`, `go.work.sum`, `.gitignore` | operations | `agent-ops/rules/project/domain/operations/rules.md` | ## 검증 명령 diff --git a/agent-roadmap/current.md b/agent-roadmap/current.md index e6adf38..5daead1 100644 --- a/agent-roadmap/current.md +++ b/agent-roadmap/current.md @@ -7,9 +7,9 @@ ## 활성 Milestone -- [계획] Flutter Operator Console UX Plan +- [계획] Operator Runtime Reliability Refactor - Phase: `agent-roadmap/phase/operator-surface/PHASE.md` - - 경로: `agent-roadmap/phase/operator-surface/milestones/flutter-operator-console.md` + - 경로: `agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md` ## 선택 규칙 diff --git a/agent-roadmap/phase/operator-surface/PHASE.md b/agent-roadmap/phase/operator-surface/PHASE.md index abe4dad..26ac464 100644 --- a/agent-roadmap/phase/operator-surface/PHASE.md +++ b/agent-roadmap/phase/operator-surface/PHASE.md @@ -16,6 +16,9 @@ Flutter client를 ALT의 공식 operator surface로 삼아 market data 상태와 - [완료] API-Centered Proto-Socket Rail - 경로: `agent-roadmap/archive/phase/operator-surface/milestones/api-centered-proto-socket-rail.md` - 요약: API 서버를 control plane으로 두고 client-api, api-worker 내부 통신을 proto-socket과 ALT protobuf contracts로 통일한다. +- [계획] Operator Runtime Reliability Refactor + - 경로: `agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md` + - 요약: Flutter operator console/headless validation 전에 API-worker lifecycle, worker execution wiring, capability reporting, client bootstrap, 원격 테스트 룰을 정리한다. - [계획] Flutter Operator Console UX Plan - 경로: `agent-roadmap/phase/operator-surface/milestones/flutter-operator-console.md` - 요약: terminal형 콘솔이 아니라 dashboard/control surface라는 제품 의미를 정하되, 실화면 구현 전 headless 검증 우선 원칙과 wireframe gate를 먼저 정의한다. diff --git a/agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md b/agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md new file mode 100644 index 0000000..157036f --- /dev/null +++ b/agent-roadmap/phase/operator-surface/milestones/operator-runtime-refactor.md @@ -0,0 +1,67 @@ +# Milestone: Operator Runtime Reliability Refactor + +## 위치 + +- Roadmap: `agent-roadmap/ROADMAP.md` +- Phase: `agent-roadmap/phase/operator-surface/PHASE.md` + +## 목표 + +Flutter operator console 작업을 더 진행하기 전에 API-worker runtime rail, worker execution wiring, capability reporting, client bootstrap, and remote test rule 기준을 정리한다. 이 Milestone이 끝나면 후속 UX/headless 작업이 실제 연결 가능한 control surface 위에서 계획될 수 있어야 한다. + +## 상태 + +[계획] + +## 구현 잠금 + +- 상태: 해제 +- 결정 필요: 없음 + +## 범위 + +- API의 worker client lifecycle, injection boundary, reconnect/error reporting 정리 +- worker의 backtest start/execution wiring 또는 명시적 unavailable 상태 정리 +- hello capability와 handler registration test를 실제 surface와 일치 +- `../nexo/agent-test/local/rules.md`의 원격 실행 기준을 참고해 ALT local test profile을 원격 테스트 host 기준으로 정리 +- Flutter app bootstrap에서 operator shell과 push/Firebase/Mattermost 초기화를 분리 +- remote verification evidence, generated drift check, skipped integration 조건을 plan/review 루프에서 재현 가능하게 정리 + +## 기능 + +### Epic: [runtime-refactor] Operator runtime reliability refactor + +Operator console과 headless validation이 의존할 API-worker-client rail을 scaffold 상태에서 실행 가능한 운영 경계로 끌어올린다. + +- [ ] [worker-exec] `services/worker` main에서 `BacktestStarter`, concrete `KindRunBacktest` handler, engine/store dependency를 연결하거나, 아직 실행 불가인 부분은 capability와 typed error로 명시한다. +- [ ] [api-worker-lifecycle] `services/api`의 worker client 전역 상태와 one-shot connect 흐름을 주입 가능한 lifecycle로 정리하고, connect failure, timeout, disconnect behavior를 테스트한다. +- [x] [test-rules] `agent-test/local` 규칙을 `../nexo/agent-test/local/rules.md`의 원격 실행 방식에 맞춰 `ssh toki@toki-labs.com` 기준으로 정리하고, ALT smoke profile이 local shell 실행을 암시하지 않게 한다. +- [ ] [capabilities] API/worker `HelloResponse.capabilities`와 handler coverage test가 market/backtest/worker availability를 실제 등록 surface와 일치하게 검증한다. +- [ ] [client-bootstrap] Flutter operator shell이 push/Firebase/Mattermost 초기화 없이도 시작 가능한 경계로 분리되고, push-specific integration은 후속 push Milestone 범위로 남는다. +- [ ] [verification-handoff] 원격 ALT checkout에서 실행할 검증 명령, `bin/contracts-check`, `bin/worker-storage-check`, 통합 테스트 skip 조건과 실제 stdout/stderr 기록 기준을 plan/review 산출물에 남길 수 있게 정리한다. + +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: `test-rules`는 Milestone 생성 시점에 반영했다. runtime/client refactor 기능 Task는 아직 충족되지 않았다. +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + +## 범위 제외 + +- Flutter production 화면, dashboard layout, chart/form wireframe 확정 +- KIS live credential, provider live smoke, trading/order execution +- push notification 구현 자체 +- 신규 strategy catalog 또는 고급 backtest 분석 기능 + +## 작업 컨텍스트 + +- 관련 경로: `services/api/`, `services/worker/`, `apps/client/`, `agent-test/local/`, `bin/` +- 표준선(선택): API는 thin control plane으로 유지하고 worker execution/storage는 worker에 둔다. 로컬 테스트 profile의 명령은 로컬 shell이 아니라 원격 테스트 host의 ALT checkout에서 실행한다. Client operator shell은 push integration 없이도 기본 실행 가능해야 한다. +- 초기 반영: 2026-05-31에 `../nexo/agent-test/local/rules.md`를 참고해 `agent-test/local/rules.md`와 smoke profile의 host/blocker 문구를 원격 테스트 host 기준으로 갱신했다. +- 선행 작업: API-Centered Proto-Socket Rail +- 후속 작업: Flutter Operator Console UX Plan, Operator Headless Workflow Validation, Flutter Operator Console MVP +- 확인 필요: 없음