전체 문서
이 페이지 목차
태스크 탐색 루프
사용자가 태스크를 생성하면 ARTEX는 입력을 영속화하고 목표·제약·scope를 준비한 뒤, event-driven planner와 PostgreSQL frontier를 통해 여러 worker를 반복 실행한다. 이 페이지는 접수부터 종료까지의 시간 순서를 소유한다. agent 내부 옵션은 에이전트 런타임, 물리 상태는 태스크·탐색 DB를 본다.
1. 접수와 부트스트랩
1. 접수와 부트스트랩 · 관계
이 대상이 사용하는 구현·계약·의존 · 7개
- 계약 사용 · explorations · ExplorationStore.BumpRound: write UPDATE; ExplorationStore.RoundNo: read FROM; DB.CreateExploration: write INSERT; DB.ExplorationDiag: read FROM; ExplorationStore.Root: read FROM; DB.CreateTaskWithOptions: write INSERT; DB.DeleteTaskCascadePrepared: write DELETE · db-pg-access-explorations-1cde922da3 · db-pg-access-explorations-d6a6e892aa · db-pg-access-explorations-148ac9d22a · db-pg-access-explorations-0ffe72b87c · db-pg-access-explorations-d750c727e6 · db-pg-access-explorations-7b5ecbeb86 · db-pg-access-explorations-ab3e7603f2
- 계약 사용 · task_categories · DB.CreateTaskCategory: write INSERT; DB.DeleteTaskCategory: write DELETE; DB.GetTaskCategory: read FROM; DB.ListTaskCategories: read FROM; DB.RenameTaskCategory: write UPDATE; DB.SetTaskCategory: read FROM; DB.SetTasksCategory: read FROM; DB.CreateTaskWithOptions: read FROM; DB.GetTask: read FROM; DB.ListTasks: read FROM; DB.UpdateTask: read FROM · db-pg-access-task-categories-5f5c62108f · db-pg-access-task-categories-5039981c71 · db-pg-access-task-categories-e4397f0b2b · db-pg-access-task-categories-13b86938bc · db-pg-access-task-categories-9b40170af7 · db-pg-access-task-categories-2b61f93d04 · db-pg-access-task-categories-20d6932241 · db-pg-access-task-categories-efec7c8eca · db-pg-access-task-categories-a8eac8736c · db-pg-access-task-categories-861bb451e0 · db-pg-access-task-categories-863a216fc0
- 계약 사용 · task_constraints · ExplorationStore.AddConstraint: write INSERT; ExplorationStore.DeleteConstraint: write DELETE; ExplorationStore.ListConstraints: read FROM; ExplorationStore.UpdateConstraint: write UPDATE · db-pg-access-task-constraints-d43b115d37 · db-pg-access-task-constraints-e7c316fe99 · db-pg-access-task-constraints-1966fa44c7 · db-pg-access-task-constraints-9d935e4a11
- 계약 사용 · task_relations · AssetStore.GetByIDsInScope: read FROM; AssetStore.QueryDSLInScope: read FROM; ExplorationStore.DirectSourceStores: read JOIN; AssetStore.IntentAssets: read FROM; AssetStore.HostsByTaskWithSources: read FROM; AssetStore.ListTaskScopeWithSources: read FROM; AssetStore.ListUntestedAssetsWithSources: read FROM; AssetStore.TaskCoverageWithSources: read FROM; DB.TaskSourceIDs: read FROM; DB.TaskSources: read FROM; DB.hydrateTasksContext: read FROM; AssetStore.BuildCoverageGraph: read FROM; insertTaskRelations: write INSERT · db-pg-access-task-relations-fc0739399a · db-pg-access-task-relations-d6b7cacb96 · db-pg-access-task-relations-c78896528c · db-pg-access-task-relations-e4cba26040 · db-pg-access-task-relations-2253a6eef8 · db-pg-access-task-relations-f795b2d481 · db-pg-access-task-relations-1e4cb6ca17 · db-pg-access-task-relations-53f3016317 · db-pg-access-task-relations-e914b0805b · db-pg-access-task-relations-b90594ba7d · db-pg-access-task-relations-94aa196e22 · db-pg-access-task-relations-e0f81ca749 · db-pg-access-task-relations-8545d44a48
- 계약 사용 · task_templates · DB.CreateTaskTemplate: write INSERT; DB.DeleteTaskTemplate: write DELETE; DB.GetTaskTemplate: read FROM; DB.ListTaskTemplates: read FROM; DB.PatchTaskTemplate: write UPDATE · db-pg-access-task-templates-06536e50c1 · db-pg-access-task-templates-7c04ed6ce4 · db-pg-access-task-templates-4d3f9d6b53 · db-pg-access-task-templates-544047bc2c · db-pg-access-task-templates-63621524a5
- 계약 사용 · tasks · AssetStore.GetByIDsInScope: read FROM; AssetStore.QueryDSLInScope: read FROM; hostsForTaskDeletion: read FROM/JOIN; DB.ExplorationDiag: read FROM; DB.TaskListMetricsAll: read FROM; ExplorationStore.DirectSourceStores: read FROM/JOIN; ExplorationStore.TaskID: read FROM; AssetStore.AttachAssetsToTask: read FROM; AssetStore.IntentAssets: read FROM/JOIN; AssetStore.RegisterTaskAssetScopes: read FROM; AssetStore.SetTaskAssetSource: read FROM; AssetStore.HostsByTaskWithSources: read FROM/JOIN; AssetStore.ListTaskScopeWithSources: read FROM/JOIN; AssetStore.ListUntestedAssetsWithSources: read FROM/JOIN; AssetStore.TaskCoverageWithSources: read FROM/JOIN; DB.GetTaskCategory: read JOIN; DB.ListTaskCategories: read JOIN; DB.RenameTaskCategory: read FROM; DB.SetTaskCategory: read/write FROM/UPDATE; DB.SetTasksCategory: read/write JOIN/UPDATE; DB.TaskSources: read JOIN; DB.hydrateTasksContext: read FROM; AssetStore.BuildCoverageGraph: read FROM/JOIN; AssetStore.CoverageEnabled: read FROM; DB.CreateTaskWithOptions: write INSERT; DB.DeleteTaskCascadePrepared: read/write DELETE/FROM/JOIN; DB.Dequeue: write UPDATE; DB.Enqueue: write UPDATE; DB.GetTask: read FROM; DB.ListTasks: read FROM; DB.SetParentRef: write UPDATE; DB.SetPaused: write UPDATE; DB.SetStatus: write UPDATE; DB.SetTerminalStatusGuarded: write UPDATE; DB.StampFirstRun: write UPDATE; DB.UpdateTask: write UPDATE; insertTaskRelations: read FROM; Manager.ApplyTaskAdmission: write UPDATE; Manager.ApplyTaskPause: write UPDATE; Manager.EnqueueTask: write UPDATE · db-pg-access-tasks-082ddb7a18 · db-pg-access-tasks-ad016247fc · db-pg-access-tasks-d66aa3ecdf · db-pg-access-tasks-b78a0ff81d · db-pg-access-tasks-1ebf46408f · db-pg-access-tasks-a783b00be6 · db-pg-access-tasks-8ffa4ed35f · db-pg-access-tasks-16de64d10e · db-pg-access-tasks-be683256d2 · db-pg-access-tasks-2ca07e02ce · db-pg-access-tasks-6e199db471 · db-pg-access-tasks-ee3e318216 · db-pg-access-tasks-fd61c8099e · db-pg-access-tasks-389b085ad4 · db-pg-access-tasks-d5cc808761 · db-pg-access-tasks-8c021898d6 · db-pg-access-tasks-67c49edeec · db-pg-access-tasks-3adf94a2ce · db-pg-access-tasks-fb40a4c990 · db-pg-access-tasks-239b123626 · db-pg-access-tasks-4520f8c9cf · db-pg-access-tasks-169672238e · db-pg-access-tasks-8da3043006 · db-pg-access-tasks-43ca5ea2c9 · db-pg-access-tasks-9857397f13 · db-pg-access-tasks-57cae4cf7e · db-pg-access-tasks-63ac846350 · db-pg-access-tasks-644bdbe575 · db-pg-access-tasks-4a928fa293 · db-pg-access-tasks-65d521c111 · db-pg-access-tasks-9432c2263f · db-pg-access-tasks-f4077b39a2 · db-pg-access-tasks-49a557bbce · db-pg-access-tasks-7c3c56d040 · db-pg-access-tasks-e121890883 · db-pg-access-tasks-15a2889c12 · db-pg-access-tasks-a1dc99d2be · db-pg-access-tasks-102eda9f17 · db-pg-access-tasks-53c393734c · db-pg-access-tasks-aa5f830b72
- 구현 담당 · Planner session · 기능 단계의 직접 상태/실행 구현 · feature-impl-1
POST /api/tasks는 name을 trim하고 goal은 그대로 전달하며, 빈 description은 未命名任务로 기본화한다. 음수 timeout_seconds는 거부하지 않고 0(무제한)으로 정규화한다. Handler가 직접 거부하는 것은 잘못된 profile chain, source task 개수·형식·중복·존재, company ID 정규화 한계, task intercept rule, category 등 helper가 확인하는 참조/경계다. per-task worker 수 입력은 없고 seed, coverage, heartbeat는 생성 옵션으로 전달된다. DB.CreateTaskWithOptions transaction은 task, exploration, 관계/scope/profile 연결을 만들고 Manager가 Task runtime을 구성한다. 접수 handler 요청 계약 태스크 저장
Mermaid 원문
sequenceDiagram participant U as Operator participant H as createTask participant DB as PostgreSQL participant G as Goal decomposer participant Q as Admission participant E as Engine U->>H: POST /api/tasks H->>H: 입력·source·profile·rule 검증 H->>DB: task + exploration + links transaction H->>DB: begin/root + optional seed intent H->>G: goal/constraint/scope decomposition G->>DB: set_goals / set_constraints / add_task_scope H->>Q: launch 또는 persistent queue Q->>E: Engine.Run H-->>U: 생성된 task DTO
startTaskEngine은 goal decomposition을 먼저 끝낸 뒤 Engine을 시작한다. 모델이 goal을 남기지 않으면 원래 goal 문자열을 한 goal로 저장하는 fallback이 있다. decomposer 출력이 policy의 권위가 되는 것은 아니며, task scope와 operation constraint의 실제 강제 범위는 보안 경계에서 분리한다. Goal 시작 Goal 도구
2. admission과 동시성
2. admission과 동시성 · 관계
이 대상이 사용하는 구현·계약·의존 · 2개
- 계약 사용 · exploration_nodes · ExplorationStore.DiscardOpenIntent: write DELETE · db-pg-access-exploration-nodes-6e9acab90e
- 구현 담당 · 동시성·transaction·lock · 기능 단계의 직접 상태/실행 구현 · feature-impl-2
| 결정 | 코드 규칙 | 실패/경계 |
|---|---|---|
| 즉시 시작 여부 | 사용할 LLM chain, 앞선 queue, 선택적 동시 task 제한을 확인 | provider 미가용이면 queue/blocked reason으로 남을 수 있음 |
| queue 순서 | queued_at, 그다음 task id |
명시적 aging은 없음 |
| worker 수 | global runtime settings를 manager.Workers()가 Engine 시작 때 해석 |
POST /api/tasks field가 아니며 실행 중 설정 변경의 적용 시점은 새 Engine 조립 경계에 따름 |
| intent 선택 | priority DESC, id ASC frontier |
높은 priority가 계속 들어오면 낮은 intent가 지연될 수 있음 |
| claim | DB에서 open → running 조건부 갱신 |
동일 intent 중복 claim을 막지만 외부 tool side effect의 멱등성은 보장하지 않음 |
Engine은 task당 planner loop 하나와 worker loop N개를 둔다. 메모리 channel은 wake-up 신호이고, pending work의 권위 원본은 PostgreSQL node state다. 재시작 시 open/running 상태를 복구·정리하는 경로가 있으므로 queue를 process memory만으로 해석하면 안 된다. Engine Frontier
3. 자율 feedback loop
3. 자율 feedback loop · 관계
이 대상이 사용하는 구현·계약·의존 · 3개
- 계약 사용 · exploration_edges · ExplorationStore.AddDigest: write INSERT; ExplorationStore.CoveredMembers: read FROM; ExplorationStore.DigestMembers: read FROM; ExplorationStore.SupersedeDigests: write DELETE; ExplorationStore.CancelIntent: read FROM; ExplorationStore.Edges: read FROM; ExplorationStore.EdgesTouching: read FROM; ExplorationStore.FactsYielded: read FROM; ExplorationStore.FindingIntents: read FROM; ExplorationStore.FindingIntentsTerminal: read FROM; ExplorationStore.FindingLineage: read FROM; ExplorationStore.Link: write INSERT · db-pg-access-exploration-edges-81bd2096a6 · db-pg-access-exploration-edges-015f60f999 · db-pg-access-exploration-edges-9223b53392 · db-pg-access-exploration-edges-8224e1bd48 · db-pg-access-exploration-edges-76b94df119 · db-pg-access-exploration-edges-9ebe84819c · db-pg-access-exploration-edges-c4d236d501 · db-pg-access-exploration-edges-8d33d00bf4 · db-pg-access-exploration-edges-917a32807b · db-pg-access-exploration-edges-447406e91e · db-pg-access-exploration-edges-9c53251fb5 · db-pg-access-exploration-edges-4a837468d6
- 계약 사용 · exploration_nodes · hostsForTaskDeletion: read JOIN; ExplorationStore.ActiveDigests: read FROM; ExplorationStore.AddDigest: write INSERT; ExplorationStore.ApplyStampOps: write UPDATE; ExplorationStore.ColdStamps: read FROM; ExplorationStore.ContentVersions: read FROM; ExplorationStore.CoveredMembers: read JOIN; ExplorationStore.NodeAssets: read JOIN; ExplorationStore.SupersedeDigests: write UPDATE; DB.GoalCountsAll: read FROM; DB.TaskListMetricsAll: read FROM; ExplorationStore.ActivityByIDsForTerminalIntents: read JOIN; ExplorationStore.ActivityListForTerminalIntent: read JOIN; ExplorationStore.ActivityPageForTerminalIntent: read JOIN; ExplorationStore.ActivityTraceForTerminalIntent: read JOIN; ExplorationStore.ActivityTraceSearchForTerminalIntent: read JOIN; ExplorationStore.ActivityTraceSearchTerminalIntents: read JOIN; ExplorationStore.AddNode: write INSERT; ExplorationStore.AssetRefs: read JOIN; ExplorationStore.CancelIntent: read/write DELETE/FROM; ExplorationStore.ClaimIntent: write UPDATE; ExplorationStore.CompareAndSetIntentState: write UPDATE; ExplorationStore.CountFinishedIntents: read FROM; ExplorationStore.CountOpenIntents: read FROM; ExplorationStore.DeleteGoal: write DELETE; ExplorationStore.FactsYielded: read JOIN; ExplorationStore.FindingIntents: read JOIN; ExplorationStore.FindingIntentsTerminal: read JOIN; ExplorationStore.FindingLineage: read FROM; ExplorationStore.Frontier: read FROM; ExplorationStore.GetNode: read FROM; ExplorationStore.HasActiveIntent: read FROM; ExplorationStore.HasOpenGoal: read FROM; ExplorationStore.ListByKind: read FROM; ExplorationStore.ListByKindPage: read FROM; ExplorationStore.Nodes: read FROM; ExplorationStore.NodesByIDs: read FROM; ExplorationStore.NodesPage: read FROM; ExplorationStore.OriginFactID: read FROM; ExplorationStore.ReopenBlockedIntents: write UPDATE; ExplorationStore.ReopenIntent: write UPDATE; ExplorationStore.ResetRunningIntents: write UPDATE; ExplorationStore.SetIntentState: write UPDATE; ExplorationStore.SetNodeState: write UPDATE; ExplorationStore.SoftDeleteIntent: read/write FROM/UPDATE; ExplorationStore.Stats: read FROM; ExplorationStore.TokenStatsBySession: read JOIN; ExplorationStore.UpdateGoalPayload: write UPDATE; ExplorationStore.countByKindFiltered: read FROM; ExplorationStore.listByKindPageFiltered: read FROM; AssetStore.IntentAssets: read JOIN; AssetStore.HostsByTaskWithSources: read JOIN; AssetStore.ListUntestedAssetsWithSources: read JOIN; AssetStore.TaskCoverageWithSources: read JOIN; ExplorationStore.ReopenIntentsByBlockedReason: write UPDATE; ExplorationStore.SetIntentBlockedReason: write UPDATE; AssetStore.BuildCoverageGraph: read JOIN; AssetStore.ListUntestedAssets: read JOIN; AssetStore.TaskCoverage: read JOIN; DB.CreateTaskWithOptions: write INSERT; DB.DeleteTaskCascadePrepared: read JOIN · db-pg-access-exploration-nodes-f98e35c886 · db-pg-access-exploration-nodes-6451d26bf7 · db-pg-access-exploration-nodes-d30caf782b · db-pg-access-exploration-nodes-5e28c79b6c · db-pg-access-exploration-nodes-6f36c45653 · db-pg-access-exploration-nodes-4f0f2e9ad3 · db-pg-access-exploration-nodes-2c30687866 · db-pg-access-exploration-nodes-a66e196ed3 · db-pg-access-exploration-nodes-fa614862de · db-pg-access-exploration-nodes-e128b07ee9 · db-pg-access-exploration-nodes-4e01ec1291 · db-pg-access-exploration-nodes-f5d9cecafa · db-pg-access-exploration-nodes-68eecf0476 · db-pg-access-exploration-nodes-6a188d9e75 · db-pg-access-exploration-nodes-2cd50148b3 · db-pg-access-exploration-nodes-e7118eba8d · db-pg-access-exploration-nodes-ad73ed6b38 · db-pg-access-exploration-nodes-2d8c2df3cf · db-pg-access-exploration-nodes-8ccc10e56b · db-pg-access-exploration-nodes-460d830d77 · db-pg-access-exploration-nodes-f7fa8c573c · db-pg-access-exploration-nodes-e8f89c3ef6 · db-pg-access-exploration-nodes-1d9b978960 · db-pg-access-exploration-nodes-076c07639d · db-pg-access-exploration-nodes-067cf150f2 · db-pg-access-exploration-nodes-3cdf4329cb · db-pg-access-exploration-nodes-fc89be98dd · db-pg-access-exploration-nodes-bcff87f031 · db-pg-access-exploration-nodes-dea2424b70 · db-pg-access-exploration-nodes-c17cfcbbb8 · db-pg-access-exploration-nodes-296f47bb59 · db-pg-access-exploration-nodes-343fca7e02 · db-pg-access-exploration-nodes-da339303ec · db-pg-access-exploration-nodes-2eec126b66 · db-pg-access-exploration-nodes-94d3101018 · db-pg-access-exploration-nodes-2d45067d9e · db-pg-access-exploration-nodes-20fa484c5f · db-pg-access-exploration-nodes-7f95ad8387 · db-pg-access-exploration-nodes-6707a6e6ff · db-pg-access-exploration-nodes-a2896c79b4 · db-pg-access-exploration-nodes-e65799314b · db-pg-access-exploration-nodes-01572f975f · db-pg-access-exploration-nodes-dbfee56565 · db-pg-access-exploration-nodes-8c7782306f · db-pg-access-exploration-nodes-19ae98bf02 · db-pg-access-exploration-nodes-fdb7c0ee53 · db-pg-access-exploration-nodes-13feab6dd0 · db-pg-access-exploration-nodes-36e1c80def · db-pg-access-exploration-nodes-86286e352e · db-pg-access-exploration-nodes-fe309e4470 · db-pg-access-exploration-nodes-2d8095d714 · db-pg-access-exploration-nodes-0c1dd0c452 · db-pg-access-exploration-nodes-6dd02d4e13 · db-pg-access-exploration-nodes-f08f896542 · db-pg-access-exploration-nodes-4dd0047815 · db-pg-access-exploration-nodes-51cd9bfd51 · db-pg-access-exploration-nodes-36117988d4 · db-pg-access-exploration-nodes-2492aca0a0 · db-pg-access-exploration-nodes-0353afaaa2 · db-pg-access-exploration-nodes-3571e6f425 · db-pg-access-exploration-nodes-f22b29e5cd
- 구현 담당 · Planner session · 기능 단계의 직접 상태/실행 구현 · feature-impl-3
Mermaid 원문
flowchart LR Trigger[초기·worker 종료·finding·사람 변경·heartbeat] --> Snapshot[graph overview + delta + Todo] Snapshot --> Planner[Planner.Plan] Planner -->|add_intent| Frontier[(DB frontier)] Planner -->|steer / kill| Running[실행 중 worker] Frontier -->|CAS claim| Worker[Worker session] Worker --> Tool[Tool · Skill · MCP · Web] Tool --> Observation[응답·관찰] Observation --> Worker Worker -->|insert_assets| Assets[(Asset graph)] Worker -->|add_fact / report_finding| Graph[(Exploration graph)] Worker -->|terminal reason| Trigger Graph --> Trigger Assets --> Trigger click Planner "../modules/agent-runtime.md#planner-session" "Planner session" click Worker "../modules/agent-runtime.md#worker-session" "Worker session" click Tool "../modules/tool-policy.md#assembly" "Tool assembly" click Assets "assets-scope.md#asset-write" "Asset write" click Graph "../contracts/data-model.md#exploration-graph" "Exploration graph"
Planner 입력은 전체 transcript를 무한히 다시 읽는 구조가 아니다. 축약된 graph overview, 이번 wake-up의 구체적 delta, task별로 유지되는 Todo를 조합한다. prompt는 미달 goal인데 live intent가 없으면 새 intent를 만들고, 독립 방향은 병렬화하며 강한 선후관계는 Todo로 순차화하도록 요구한다. batch 크기·중복 회피의 일부는 prompt 지침이므로 DB 불변조건으로 보장되지 않는다. Planner
Worker는 intent, anchor asset, task constraint, 관련 graph context를 받아 Norma session을 실행한다. tool 결과를 보고 같은 session에서 다음 요청을 자율 선택하며, asset/fact/finding을 즉시 writeback할 수 있다. 즉 “한 번 scanner 실행 후 종료”가 아니라 관찰 → 가설 수정 → 다른 tool/요청 → 구조화 writeback이 한 worker session 안에서 반복된다. Worker Tool writeback
4. 재계획을 깨우는 사건
4. 재계획을 깨우는 사건 · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 구현 담당 · Background loop와 완료 신호 · 기능 단계의 직접 상태/실행 구현 · feature-impl-4
| trigger | delta에 포함되는 핵심 | 일반 효과 |
|---|---|---|
| initial/heartbeat | 현재 goals, frontier, 최근 graph | 비어 있는 방향 보충·stale work 판단 |
worker done |
intent id, 결론, 새 fact ids | 후속 가설 또는 goal proof |
| finding | intent와 finding 요약 | 인접 영향 확대·reporter와 별개로 재계획 |
| goal add/edit/delete | 사람이 바꾼 텍스트 | task resume 또는 남은 방향 재판정 |
| hint | 새 전략 힌트 | 기존 work와 중복을 피해 새/수정 방향 결정 |
| intent delete/cancel | 삭제 전 요약과 이유 | 해당 방향을 중단하고 plan 갱신 |
| provider/quota 전환 | task LLM chain 상태 | blocked intent 재개 또는 다음 profile 사용 |
동일 시간대 사건은 debounce/merge될 수 있다. trigger는 “왜 이번 round가 열렸는가”를 좁혀 주지만 전체 graph의 진실을 대체하지 않는다. Planner trigger Engine notification
5. intent 상태와 재시도 의미
Mermaid 원문
stateDiagram-v2 [*] --> open open --> running: DB claim running --> done: 정상 session 종료 running --> blocked: retry 불가 오류/명시 차단 running --> exhausted: turn 또는 runtime 소진 running --> paused: task/intent 제어 running --> stopped: 삭제·kill·shutdown 경계 paused --> open: resume/rerun blocked --> open: rerun 또는 provider 회복 exhausted --> open: 명시 rerun stopped --> [*] done --> [*]
blocked, exhausted, stopped은 서로 다른 terminal cause를 보존한다. 단일 intent rerun과 task 내 blocked batch rerun API가 있고, task pause/stop/delete는 engine cancel cause와 DB 상태를 함께 다룬다. hard delete는 intent의 독점 자손을 계산해 지우되 공유 노드·goal/root는 보존한다. soft delete는 node와 lineage를 남긴다. Engine terminal 처리 Intent 제어
6. 종료·settlement·사람 개입
6. 종료·settlement·사람 개입 · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 구현 담당 · Planner session · 기능 단계의 직접 상태/실행 구현 · feature-impl-5
정상 goal 기반 task는 planner가 모든 goal을 prove_goal로 충족해야 done으로 갈 수 있다. goal proof는 같은 task graph의 fact/finding reference를 요구하지만 그 security conclusion을 다시 실행하지 않는다. goal이 없는 직접 seed 형태는 frontier와 live work가 소진된 조건을 사용한다. Planner tools
deadline은 즉시 process kill이 아니다. Engine은 새 claim과 일반 round를 차단하고 inflight worker의 writeback을 제한 시간까지 기다린 뒤 final planner round를 수행하며, 남은 worker를 cancel하고 terminal state를 정리한다. 중간 HTTP 응답이나 planner text가 settlement 완료를 뜻하지 않는다. Timeout settlement
사람은 task control, intent control/rerun, worker message, main agent steer/kill과 goal/hint 변경으로 진행을 바꿀 수 있다. 자세한 경로는 사람 개입을 본다.
7. 구조적 실패 조건
| 실패 조건 | 남는 신호 | 해석 |
|---|---|---|
| provider/key/quota 실패 | LLM record, health, task/profile blocked reason | 대상 취약성의 부재와 무관 |
| tool crash/timeout | activity tool result, terminal reason | side effect가 이미 발생했는지는 tool별 확인 필요 |
| prompt duplicate 판단 실패 | 유사 intent/fact가 graph에 반복 | DB semantic unique 제약 없음 |
| low-priority starvation | 오래된 open node와 반복 high priority | frontier 정렬상 가능한 추론; 실제 빈도 미측정 |
| context compaction 손실 | digest/summary와 원 activity 차이 | cold graph/Noa가 원문을 의미적으로 보존하는지 모델 품질에 의존 |
| worker writeback 누락 | session output은 있으나 asset/fact/finding 없음 | planner가 결과를 구조적으로 이용하기 어려움 |
| proxy bypass/fail-open | tool 성공·traffic evidence 없음 | 실행 성공과 증거 completeness를 분리 |
| deadline 중 외부 작업 | cancellation 후 외부 시스템 상태 불명 | local terminal state만으로 원격 side effect rollback을 주장할 수 없음 |
운영자는 task 상태만 보지 말고 activity cursor, intent terminal reason, provider health/usage, traffic/evidence와 open frontier를 함께 확인해야 한다. 관찰 경로