전체 문서
이 페이지 목차
저장소·background service 모듈
ARTEX의 업무 상태는 PostgreSQL, HTTP capture는 별도 SQLite/blob tree, agent context와 artifact는 filesystem에 나뉜다. Manager가 이 저장소와 background service의 lifetime을 묶는다. 데이터 객체 전수는 DB 독립 진입, 경로/backup은 운영을 본다.
Manager 구성과 종료
Manager 구성과 종료 · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 계약 사용 · settings · DB.GetSetting: read FROM; DB.SetSetting: write INSERT · db-pg-access-settings-244498fc06 · db-pg-access-settings-18f2c4aada
이 대상을 사용하는 기능·모듈·계약 · 2개
- 의존 / 실행 · ARTEX 현재 시스템 지도 · manager가 storage/background service 소유 · core-edge-8
- 의존 / 실행 · Filesystem 상태 · manager가 workspace·evidence·traffic filesystem root를 조립 · core-edge-11
Mermaid 원문
flowchart TD New[NewManager] --> PG[PostgreSQL open + schema/seed] New --> Traffic[Traffic store/proxy optional] New --> Asset[Asset/Company stores] New --> Enrich[Enrichment pool] New --> Registry[Task runtime registry] Registry --> Restore[existing task recovery] Registry --> Engine[Engine instances] New --> Archive[Archive worker] New --> Scheduler[Agent scheduler] New --> Notifier[Notification worker] Close[Manager.Close] --> Engine Close --> Enrich Close --> Traffic Close --> PG click PG "../contracts/data-model.md#postgres-map" "PostgreSQL objects" click Traffic "../contracts/db/traffic-sqlite.md#db-sqlite" "Traffic store" click Engine "../features/task-exploration.md#feedback-loop" "Engine" click Archive "../operations.md#archives" "Archive"
PostgreSQL DSN은 필수다. Traffic proxy/store 초기화가 실패하면 capture disabled 상태로 계속할 수 있으므로 Manager 생성 성공이 evidence capture readiness를 뜻하지 않는다. Startup은 schema와 built-in rows를 적용한 뒤 task runtime을 복원한다. Manager DB open
PostgreSQL 책임 영역
PostgreSQL 책임 영역 · 관계
이 대상이 사용하는 구현·계약·의존 · 2개
- 계약 사용 · PostgreSQL 필드·접근 의미 카탈로그 · PostgreSQL physical/semantic contract · core-edge-3
- 계약 사용 · DB production SQL access matrix · PostgreSQL exact production SQL access contract · core-edge-4
이 대상을 사용하는 기능·모듈·계약 · 4개
- 구현 담당 · 자산이 들어오는 경로 · 기능 단계의 직접 상태/실행 구현 · feature-impl-6
- 구현 담당 · Company scope와 task scope · 기능 단계의 직접 상태/실행 구현 · feature-impl-8
- 구현 담당 · Coverage 분모와 tested 신호 · 기능 단계의 직접 상태/실행 구현 · feature-impl-9
- 구현 담당 · Finding writeback transaction · 기능 단계의 직접 상태/실행 구현 · feature-impl-11
| 영역 | 권위 상태 | 주요 구현 |
|---|---|---|
| task/admission/archive | task status, queue, sources, package job | db/tasks.go, db/intent_admission.go, db/task_archives*.go |
| asset/scope | typed asset, company, task link/scope, coverage | db/assets.go, db/company_scope.go, db/task_scope.go |
| exploration | node/edge/anchor/frontier/activity/main session | db/exploration*.go |
| agent runtime config | profiles, agents, prompts, tools, MCP, visibility, trigger | db/config.go, db/tools.go, db/triggers.go |
| finding/evidence | finding row, retest, snapshot/binding/version | db/findings.go, db/finding_traffic.go |
| approval/notification | rule, pending/history/audit, event/delivery lease | db/intercept*.go, db/notification*.go |
| conversations/side questions | independent activity/history/memory | db/conversation.go, db/side_questions.go |
| observation | logs, LLM raw records/usage, tool/skill usage | 여러 ensure/query modules |
Schema는 단일 migration number ledger가 아니라 schema.sql과 두 Ensure*Table 함수의 idempotent DDL 조합이다. 실제 instance가 중간 DDL 실패 없이 최종 상태인지 version row 하나로 확인할 수 없다.
Traffic recorder와 evidence store
Traffic recorder와 evidence store · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 계약 사용 · DB production SQL access matrix · Traffic SQLite exact production SQL access contract · core-edge-5
이 대상을 사용하는 기능·모듈·계약 · 1개
- 구현 담당 · 트래픽에서 증거 snapshot까지 · 기능 단계의 직접 상태/실행 구현 · feature-impl-12
Traffic store는 SQLite exchanges, exchange_bodies, blob_refs와 큰 body용 CAS blob을 소유한다. 현재 capture는 per-request host tree를 만들지 않으며 non-empty exchanges.path와 host/method tree는 legacy 조회·삭제·archive 호환에만 남는다. Evidence store는 선택 exchange를 다시 읽어 별도 evidence blob과 PostgreSQL snapshot/binding으로 고정한다. Traffic delete/reclaim과 evidence retention은 다른 생명주기다. Traffic Evidence
| mutation | 원자 경계 | crash/cleanup 경계 |
|---|---|---|
| capture exchange | SQLite metadata/body refs와 filesystem write 절차 | body/blob 부분 상태 reclaim 필요 가능 |
| finding record | PostgreSQL finding/snapshot/binding transaction | staged evidence blob cleanup 별도 |
| traffic delete | SQLite/CAS reference와 존재 시 legacy host tree 정리 | incremental vacuum/reclaim background |
| evidence GC | unreferenced snapshot/blob grace 확인 | running process/timer와 filesystem 상태 |
Filesystem 상태
Filesystem 상태 · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 의존 / 실행 · Manager 구성과 종료 · manager가 workspace·evidence·traffic filesystem root를 조립 · core-edge-11
| 경로 | 소유자 | 의미 |
|---|---|---|
<data>/tasks/<task> |
file/default tools, upload, artifact | task workdir; archive 대상 일부 |
<data>/transcripts |
Norma transcript store | session resume 원문 |
<data>/traffic |
traffic recorder | SQLite, MITM CA, CAS blobs, 선택적 legacy host tree |
<data>/evidence |
evidence store | finding snapshot body CAS |
<data>/noa |
experimental Noa | session별 persistent context archive |
<BaseDir>/skills |
Skill registry/UI | executable instruction/resources |
<BaseDir>/jwt.key |
auth | workspace 밖 signing key |
| archive package/stage | archive worker | task snapshot과 restore journal |
Workspace API는 configured work root 안의 file manager이며 jwt.key를 data workspace 밖으로 옮기는 방어가 있다. Path validation이 있어도 업로드/도구가 만든 파일의 신뢰성·secret 여부를 자동 판정하지 않는다.
Background loop와 완료 신호
Background loop와 완료 신호 · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 계약 사용 · server_logs · DB.InsertLog: write INSERT; DB.ListLogsBefore: read FROM; DB.RecentLogs: read FROM · db-pg-access-server-logs-e65f653e56 · db-pg-access-server-logs-d11fca0e4d · db-pg-access-server-logs-fb5556b4c7
이 대상을 사용하는 기능·모듈·계약 · 2개
- 구현 담당 · 4. 재계획을 깨우는 사건 · 기능 단계의 직접 상태/실행 구현 · feature-impl-4
- 구현 담당 · Agent trigger orchestration · 기능 단계의 직접 상태/실행 구현 · feature-impl-19
| loop | 입력 선택 | 재시도/제어 | 완료 판정 |
|---|---|---|---|
| task admission | queued tasks + provider/limit | FIFO 승격, runtime recovery | task running/engine 등록 |
| Engine | task frontier/triggers | worker/planner wake, deadline settlement | task/intent states |
| Scheduler | enabled interval triggers + scheduler_state | tick과 last fire | submitted agent run/후속 activity |
| Notifier | pending delivery lease/digest batch | backoff, rate token, retry budget | delivery sent/failed/deferred |
| Archive worker | task_archives queued state | stage journal/recovery | archived/restored/deleted state/phase |
| Enrichment | in-memory bounded jobs | cooldown, queue drop, no persistence | asset attrs/upsert; 실패는 best-effort |
| Evidence GC | unreferenced items | grace period/ticker | DB/file 제거 결과 |
| Self-update settle | staged binary marker | boot counter/rollback | settle marker 또는 old binary 복원 |
각 HTTP enqueue 응답은 위 loop에 작업이 등록됐다는 뜻이다. state, phase, activity 또는 delivery row를 확인해야 외부 효과 완료를 판단할 수 있다. Scheduler Notifier Archive
동시성·transaction·lock
동시성·transaction·lock · 관계
이 대상이 사용하는 구현·계약·의존 · 1개
- 계약 사용 · Function 4개 · transaction/lock 해석이 trigger와 function contract를 사용 · core-edge-15
이 대상을 사용하는 기능·모듈·계약 · 1개
- 구현 담당 · 2. admission과 동시성 · 기능 단계의 직접 상태/실행 구현 · feature-impl-2
- intent claim은 상태 조건부 update로 worker 경쟁을 제어한다.
- finding record는 task/finding 단위 advisory lock과 transaction으로 graph/row/evidence를 묶는다.
- active finding retest는 partial unique index로 finding당 하나를 제한한다.
- notification delivery는 lease claim으로 여러 worker의 중복 전송을 줄인다. crash 뒤 결과 불명 전송은 채널 idempotency와 함께 봐야 한다.
- task delete는 engine quiescence/barrier 뒤 DB/file cleanup을 진행한다.
DeleteTaskCascadePrepared와CompleteTaskArchive는 자산 삭제·archive exclusivity 재검사 전에 같은 순서로assets,exploration_anchors에SHARE ROW EXCLUSIVEtable lock을 잡는다. transaction commit까지 두 table의 일반 INSERT/UPDATE/DELETE와 같은 lock을 요구하는 작업을 막아 새 소유권·anchor phantom을 줄인다. delete lock archive lock- side question은 parent key command lock과 running-request unique를 사용한다.
- schema 적용은 PostgreSQL advisory lock과 일부 deadlock retry를 사용한다.
DB lock이 외부 HTTP, shell command, webhook delivery를 transaction처럼 rollback하지는 않는다.
삭제·archive·보존 경계
삭제·archive·보존 경계 · 관계
이 대상이 사용하는 구현·계약·의존 · 26개
- 계약 사용 · activity · DB.snapshotTaskArchive: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-activity-36e48e8d45 · db-pg-access-activity-66abc87251 · db-pg-access-activity-90da0128e3
- 계약 사용 · assets · DB.snapshotTaskArchive: read FROM; archiveAssetIDsQuery: read FROM; archiveAssetMetadata: read FROM; DB.CompleteTaskArchive: lock/write DELETE/LOCK/UPDATE; findArchiveAssetNaturalID: read FROM; restoreArchiveAssets: write INSERT/UPDATE; rowExists: read FROM · db-pg-access-assets-1cd2a35e08 · db-pg-access-assets-b1e13d04c1 · db-pg-access-assets-266516fe7e · db-pg-access-assets-42719fef02 · db-pg-access-assets-8ccea69ea4 · db-pg-access-assets-4552dc4867 · db-pg-access-assets-f214bc708b
- 계약 사용 · companies · rowExists: read FROM · db-pg-access-companies-451348e66d
- 계약 사용 · exploration_anchors · DB.snapshotTaskArchive: read FROM; archiveAssetIDsQuery: read FROM; archiveAssetMetadata: read FROM; DB.CompleteTaskArchive: lock/read FROM/LOCK; insertArchiveRows: write INSERT · db-pg-access-exploration-anchors-be474215d0 · db-pg-access-exploration-anchors-05cdec3c1d · db-pg-access-exploration-anchors-fa433a48a2 · db-pg-access-exploration-anchors-a71aa2d014 · db-pg-access-exploration-anchors-fe5a2c95b9
- 계약 사용 · exploration_edges · DB.snapshotTaskArchive: read FROM; insertArchiveRows: write INSERT · db-pg-access-exploration-edges-7848b19d51 · db-pg-access-exploration-edges-3370ec36d7
- 계약 사용 · exploration_nodes · DB.snapshotTaskArchive: read FROM/JOIN; archiveAssetIDsQuery: read JOIN; archiveAssetMetadata: read JOIN; DB.CompleteTaskArchive: read/write DELETE/JOIN; insertArchiveRows: write INSERT · db-pg-access-exploration-nodes-23d5e526fc · db-pg-access-exploration-nodes-73ee4ed5d8 · db-pg-access-exploration-nodes-3d946355b9 · db-pg-access-exploration-nodes-f63769614e · db-pg-access-exploration-nodes-9f2aa43be3
- 계약 사용 · explorations · DB.snapshotTaskArchive: read FROM; DB.CompleteTaskArchive: write UPDATE; DB.DeleteTaskArchiveStub: write DELETE; restoreExplorationStub: write UPDATE · db-pg-access-explorations-f87592c5a7 · db-pg-access-explorations-0f43bc3f8d · db-pg-access-explorations-11808b0f2b · db-pg-access-explorations-e10c8a676c
- 계약 사용 · finding_traffic_bindings · restoreFindingTrafficTx: read/write FROM/INSERT; DB.snapshotTaskArchive: read FROM · db-pg-access-finding-traffic-bindings-abe00c0cea · db-pg-access-finding-traffic-bindings-b08bb2bd09
- 계약 사용 · findings · restoreFindingTrafficTx: read FROM; DB.snapshotTaskArchive: read FROM/JOIN; archiveAssetIDsQuery: read FROM; taskArchiveAggregates: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-findings-7071b5d232 · db-pg-access-findings-a03f5a91cf · db-pg-access-findings-b9b653ba29 · db-pg-access-findings-76d247fd15 · db-pg-access-findings-076101d0cc · db-pg-access-findings-6741a035f8
- 계약 사용 · intercept_pending · DB.snapshotTaskArchive: read FROM; DB.CompleteTaskArchive: write DELETE; restoreInterceptRows: write INSERT · db-pg-access-intercept-pending-82c3ebdd3e · db-pg-access-intercept-pending-9b2baa67ed · db-pg-access-intercept-pending-5fc302ab64
- 계약 사용 · llm_profiles · rowExists: read FROM · db-pg-access-llm-profiles-2302429399
- 계약 사용 · llm_records · DB.snapshotTaskArchive: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveJSONSequenceRows: write INSERT; insertArchiveRows: write INSERT · db-pg-access-llm-records-f38b83f350 · db-pg-access-llm-records-c77d100838 · db-pg-access-llm-records-41341529c6 · db-pg-access-llm-records-b29e826f92
- 계약 사용 · llm_usage · DB.snapshotTaskArchive: read FROM; taskArchiveAggregates: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-llm-usage-23ac482369 · db-pg-access-llm-usage-615cc46c49 · db-pg-access-llm-usage-13a8f69171 · db-pg-access-llm-usage-e5292afc9f
- 계약 사용 · side_question_requests · DB.snapshotTaskArchive: read FROM; insertArchiveRows: write INSERT · db-pg-access-side-question-requests-62486f492d · db-pg-access-side-question-requests-2313c7c779
- 계약 사용 · side_question_sessions · DB.snapshotTaskArchive: read FROM/JOIN; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-side-question-sessions-8801a31633 · db-pg-access-side-question-sessions-d5127dfa7f · db-pg-access-side-question-sessions-e1e83729ca
- 계약 사용 · skill_usage · DB.snapshotTaskArchive: read FROM; taskArchiveAggregates: read FROM; DB.RestoreTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-skill-usage-7142046787 · db-pg-access-skill-usage-1bf74722f9 · db-pg-access-skill-usage-ff4bfd830a · db-pg-access-skill-usage-7d2fb6f50a
- 계약 사용 · task_archives · DB.AppendTaskArchiveWarning: write UPDATE; DB.ClaimTaskArchiveJob: read/write FROM/UPDATE; DB.FailTaskArchiveJob: write UPDATE; DB.GetTaskArchive: read FROM; DB.GetTaskArchiveByTask: read FROM; DB.IsTaskArchiveRestored: read FROM; DB.ListTaskArchives: read FROM; DB.QueueTaskArchive: read/write FROM/INSERT/JOIN; DB.QueueTaskArchiveDelete: read/write FROM/UPDATE; DB.QueueTaskArchiveRestore: write UPDATE; DB.RecoverTaskArchiveJobs: write UPDATE; DB.TaskArchiveBlockers: read JOIN; DB.UpdateTaskArchiveProgress: write UPDATE; DB.ArchivedAggregateStats: read FROM; DB.CompleteTaskArchive: read/write FROM/UPDATE; DB.CompleteTaskArchiveRestore: write DELETE; DB.DeleteTaskArchiveStub: read FROM; DB.restoreTaskArchive: read/write FROM/UPDATE · db-pg-access-task-archives-1d4aedee48 · db-pg-access-task-archives-bcd920f8ce · db-pg-access-task-archives-a72bb87396 · db-pg-access-task-archives-bb4a4fa0cb · db-pg-access-task-archives-8db7402369 · db-pg-access-task-archives-b349280073 · db-pg-access-task-archives-3e2f0aaac8 · db-pg-access-task-archives-bf408c8aa2 · db-pg-access-task-archives-ac239c3cfb · db-pg-access-task-archives-0e94b8026f · db-pg-access-task-archives-fb5a0b1c08 · db-pg-access-task-archives-aa7060d4f8 · db-pg-access-task-archives-3512ba58cb · db-pg-access-task-archives-55a2c514f5 · db-pg-access-task-archives-4a9623c4f7 · db-pg-access-task-archives-73da1ef42e · db-pg-access-task-archives-c1df948da6 · db-pg-access-task-archives-790681674e
- 계약 사용 · task_asset_links · DB.snapshotTaskArchive: read FROM; archiveAssetIDsQuery: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-task-asset-links-8fdbe1bf14 · db-pg-access-task-asset-links-845cf63947 · db-pg-access-task-asset-links-1da1eb7080 · db-pg-access-task-asset-links-b7665de9b5
- 계약 사용 · task_categories · DB.QueueTaskArchive: read JOIN; rowExists: read FROM · db-pg-access-task-categories-1268f5e175 · db-pg-access-task-categories-7a889cb87a
- 계약 사용 · task_constraints · DB.snapshotTaskArchive: read FROM; DB.CompleteTaskArchive: write DELETE; insertArchiveRows: write INSERT · db-pg-access-task-constraints-91f41f4c8e · db-pg-access-task-constraints-ac6211dfde · db-pg-access-task-constraints-b779165144
Task delete/archive는 task-owned DB/file/traffic/evidence의 선별 목록을 사용한다. Global profiles/tools/settings, 다른 task가 공유하는 자산, independent conversation, notification/intercept history 등은 같은 생명주기가 아니다. Archive snapshot 목록에 없는 retest conversation이나 global state는 task package에 포함됐다고 가정하지 않는다. Archive DB
실패 조건
- PostgreSQL commit과 filesystem blob write 사이 process crash는 한 transaction으로 덮이지 않는다.
- traffic/evidence/transcript/workspace를 PostgreSQL dump와 다른 시점에 복사하면 서로 참조가 어긋날 수 있다.
CREATE IF NOT EXISTS성공만으로 기존 column/constraint가 기대 정의와 같다고 증명하지 않는다.- background queue의 memory 부분은 restart로 사라질 수 있으며 DB row가 있는 loop와 없는 enrichment를 구별한다.
- archive package checksum은 포함된 bytes 무결성을 돕지만 snapshot 분모가 전체 인스턴스 상태라는 뜻은 아니다.