<!-- canonical: https://docs.axelabs.ai/architecture/artifacts -->
<!-- source: content/architecture/artifacts.mdx -->

---
title: Artifact 모델 · PARA 지식 레이어
description: Blueprint 의 typed fact layer. PARA 와 결합해 work/knowledge 를 organize. MCPs/Teams/Mail/OneDrive 의 citation chain.
---

# Artifact 모델 · PARA 지식 레이어

> **[2026-06-06 방향 갱신]** PARA 의 상위 설계 철학은 [/architecture/para-os](/architecture/para-os) 로 정리됨 (PARA=조직론, dispatch="집"/link-default, governance 결정로그, 죽은 딜 본질). 본 페이지의 **dispatch `copy-with-provenance` → `link-default` 로 revise** ([D-bp-para-1](/ops/decisions)), Area=workspace-container → 조직론 노드 + R/A 내포. 단 저장·citation·schema discovery 세부는 본 페이지가 유효한 reference.
>
> **[2026-06-06 구현 토폴로지 — [D-bp-rust-1](/ops/decisions)]** Artifact 레이어는 Blueprint 의 **첫 Rust organ** 으로 이관된다 (TS→Rust strangler-fig). 신규 substrate 서비스(Rust+axum)가 `blueprint-postgres` 의 **`substrate` schema** 에서 `artifact`/`artifact_link`/`mcp_schema` 를 소유 — `workspace_id`·`entity_id` 는 opaque 외부 ref(**Artifact-scoped 경계**), Workspace+paraLayer SoR 는 Prisma `public` 잔류. 모델 교정(처음부터 1급): **home/link("집")** = `artifact_link` 가 멤버십 본체 + **`annotation`**(Area별 해석), `parent_artifact_id` → **`derived_from_id`**(진짜 파생만), **2-level `scope`**(personal/shared), **citation 8종**(아래 7종 + `gate.decision` [D-gate-2](/ops/decisions)). 아래 본문의 Prisma SQL·"copy default"·"7 kind" 서술은 **현 TS(M6 Stage-1) 기록**이며 cutover(ADR §6 S3) 전까지 병존 — 권위 = [D-bp-rust-1](/ops/decisions) + ADR `docs/adr/blueprint-rust-migration.md`.

## 한 줄 정의

**Artifact = Blueprint 의 typed fact unit**. source 문서가 아니라 agent 가 직접 read 하는, 사전 추출된 사실 한 조각. per-field schema + per-field citation + confidence + audit trail + paraLayer scope 를 갖춤. Blueprint Postgres 거주 (D-config-16), large content / 원본 파일은 OneDrive · frame · hive · Teams · mail 등 원위치 유지하고 artifact 는 stable ID 로만 참조 — data 중복 0.

## 왜 필요한가

현재 Blueprint 의 knowledge layer 는 [ctx skill](https://docs.axelabs.ai/services/blueprint) 의 markdown PKM 한 단계뿐. agent 가 grep + cat 으로 markdown 본문을 읽어 사실을 추출하는 방식이라 다음이 모두 불가능:

| 격차 | 현재 (markdown only) | 결과 |
|---|---|---|
| Cross-functional query | "portfolio cos 중 Q4 churn > 15%" 를 grep 으로 못 풀음 | Area query 가 LLM 토큰 폭증 |
| Field-level provenance | 사실 한 줄의 출처 추적 불가 (markdown 안에 인용 표기 의무 X) | citation chain 끊김, IC 결정의 audit 불가능 |
| Time-travel | "Project Deal X 가 지난 주 이후 무엇 바뀌었나" 답 불가 | 의사결정의 시점형 archaeology 불가 |
| 결정론적 충돌 해소 | 두 agent 가 같은 markdown 동시 편집 시 last-write-wins | 사실 무결성 보장 X |
| Multi-agent concurrent read-write | markdown lock 없음 | 동시 작업 시 race |

격차의 본질: 인프라는 dev-co level (per-customer macmini isolation · blue/green deploy · OAuth-RP · restic backup · 7-stack 응집) 이지만 knowledge layer 만 single-operator PKM tool 수준에 머문다. AI-native fund 가 자기 의사결정의 SOT 로 쓰려면 typed fact layer 가 필요.

## PARA 와의 관계

PARA (Tiago Forte) 의 Project / Area / Resource / Archive 4 layer 각각에 typed artifact 집합이 거주. PARA layer 가 artifact 의 lifecycle 과 visibility 를 결정.

| Layer | 역할 | 대표 artifact 유형 |
|---|---|---|
| **Project** | 기한 + goal cross-functional 컨테이너 (IC for Deal X, Fund 2 fundraising, 2026 Q3 LP report) | `ICMemoArtifact` · `BoardMeetingNotesArtifact` · `LPCapitalCallArtifact` |
| **Area** | function 별 지속 reference state (CFO · IR · Sourcing · Portfolio). read 빈도 높음, 끊임없는 갱신 | `PortcoBoardKPIArtifact` (Portfolio Monitoring) |
| **Resource** | 재사용 가능한 versioned framework + template | `SectorFrameworkArtifact` |
| **Archive** | 기한 지난 Project + outdated resource. pattern detection corpus | 위 모든 종류의 frozen snapshot |

Project 가 closeout 되면 그 안의 artifact 들이 typed fact 단위로 Area / Resource / Archive 로 field-level dispatch. [M3 PARA Dispatch](/ops/roadmap#m3--blueprint-para-dispatch-d-bp-entity-1-pr-5) 가 현재 workspace-level (file-level) provenance (`sourceWorkspaceId` / `sourceArtifactPath` / `copiedAt`, [D-bp-entity-2](/ops/decisions)) 까지 land — Artifact 는 그 위에서 **field-level** 진화.

### Cross-PARA query 예시

현재 ctx markdown 으로 불가능하지만 artifact layer 위에서 자연:

- "portfolio cos 중 Q4 churn > 15%" — Area query (`PortcoBoardKPIArtifact.confidence ≥ 0.8`)
- "과거 deal 중 현재 Sentry 와 IRR trajectory 비슷한 것" — Archive cross-Project pattern match
- "portco Y 가장 최근 revenue, citation 포함" — Area lookup with citation chain
- "Project Deal X 가 지난 주 이후 무엇 바뀌었나" — time-travel diff
- "LP X 와 마지막 comm 후 변한 portfolio fact" — IR Area × Portfolio Area cross-query

## 데이터 모델

Blueprint Postgres 의 `Artifact` + `Citation` 테이블 (Prisma). schema 는 versioned (`schema_id` FK), content 는 JSONB (schema 별 typed field), citations 는 JSONB array.

```sql
CREATE TABLE artifact (
  id                  uuid PRIMARY KEY,
  schema_id           text NOT NULL REFERENCES artifact_schema(id),  -- MCP discovery schema (e.g., `frame.balance@1.0`, `hive.employee@1.0`) 또는 free-form (`freeform.llm@auto`). MCP authority — Blueprint 는 registry 아니라 discovery/mirror
  workspace_id        uuid NOT NULL REFERENCES workspace(id),
  entity_id           text NOT NULL REFERENCES entity(slug),         -- D-bp-entity-3 NOT NULL
  para_layer          text NOT NULL CHECK (para_layer IN ('PROJECT','AREA','RESOURCE','ARCHIVE')),
  content             jsonb NOT NULL,                                -- schema 별 typed field
  citations           jsonb NOT NULL DEFAULT '[]'::jsonb,            -- per-field citation array
  confidence          numeric(3,2) NOT NULL DEFAULT 1.0,             -- 0.00 ~ 1.00
  audit_trail         jsonb NOT NULL DEFAULT '[]'::jsonb,            -- propose/review/confirm/edit events
  parent_artifact_id  uuid REFERENCES artifact(id),                  -- PARA dispatch fork chain
  created_at          timestamptz NOT NULL DEFAULT now(),
  updated_at          timestamptz NOT NULL DEFAULT now(),
  archived_at         timestamptz                                    -- soft delete (Archive 진입 시 set)
);

CREATE INDEX artifact_workspace_idx ON artifact (workspace_id);
CREATE INDEX artifact_entity_para_idx ON artifact (entity_id, para_layer);
CREATE INDEX artifact_schema_idx ON artifact (schema_id);
CREATE INDEX artifact_parent_idx ON artifact (parent_artifact_id) WHERE parent_artifact_id IS NOT NULL;
```

`audit_trail` 의 한 entry 는 `{ event, actor, ts, diff?, prompt? }` 형식. 변경 history 가 row 안에 누적되며 `updated_at` 만 갱신 — pg_jsonschema validation 으로 무결성 가드 (확장 add-on).

## Citation 형태

Citation 은 외부 source 의 **stable ID** 만 가짐. data 자체는 원위치 (OneDrive driveItem / frame query / hive ID / index DB ref / gate decision cert / Teams chat+msg / mail thread+msg / external URL) — artifact 에 중복 0. 8 kind:

```jsonc
// content 의 field 별 1+ citation
{
  "field": "revenue_q4_2025",
  "citations": [
    // 1) OneDrive Excel cell
    { "kind": "onedrive",
      "drive_item_id": "01ABCD...",
      "version": "v3",
      "sheet": "Q4 Recurring",
      "cell": "B14" },

    // 2) frame typed query (회계 도메인)
    { "kind": "frame.balance",
      "entity": "axec",
      "account": "4001",
      "period": "2025-Q4",
      "queried_at": "2026-05-22T03:14:00Z" },

    // 3) hive employee record (HR 도메인)
    { "kind": "hive.employee",
      "entity": "axev",
      "employee_id": "uuid-...",
      "queried_at": "2026-05-22T03:14:00Z" },

    // 4) Teams chat message
    { "kind": "teams.message",
      "chat_id": "19:...",
      "message_id": "1700000000000" },

    // 5) Mail thread message
    { "kind": "mail.thread",
      "thread_id": "AAMkAD...",
      "message_id": "AAMkAD...." },

    // 6) External web fetch (snapshot 시점 명시)
    { "kind": "external.web",
      "url": "https://...",
      "fetched_at": "2026-05-22T03:14:00Z" },

    // 7) index typed query (투자 도메인 — D-index-6)
    { "kind": "index.financial_output",
      "deal_id": "uuid-iippo",
      "model_id": "uuid-iippo-v7-base",
      "scenario_code": "weighted",
      "output_code": "irr_loss_included",
      "computed_at": "2026-05-06T10:00:00Z" },
    // 기타 index.* sub-kinds: index.deal · index.fund_investment ·
    // index.dd_finding · index.ic_decision · index.portfolio_kpi ·
    // index.financial_model · index.valuation · index.lp_comm 등

    // 8) gate 거버넌스 결정 (gate.decision SoR 의 mirror — D-gate-2)
    { "kind": "gate.decision",
      "decision_id": "uuid-...",
      "cert_id": "modusign-...",        // 모두싸인 서명완료 cert (citation only)
      "decided_at": "2026-06-06T01:00:00Z" }
  ]
}
```

각 kind 에 대응하는 **citation resolver** (`src/lib/artifact/citations/`) 가 stable ID 로 실 데이터를 fetch + cache. Trinity dashboard (Workspace × OneDrive × TeamsChat) 의 진화형 — 기존 GUID 3축 → field 단위 citation chain.

## MCPs 와의 분리

별 트랙. **MCP = domain-specific data system**, **Artifact + PARA = Blueprint 내부 work/knowledge organization meta-layer**.

| Layer | 책임 |
|---|---|
| frame MCP | 회계 도메인 데이터 (journal, balance, period) — schema-per-entity Postgres |
| hive MCP | HR 도메인 데이터 (employee, payroll, leave) — frame mirror |
| magnet / stream / 기타 MCP | 각 도메인 데이터 시스템 |
| **Artifact + PARA (Blueprint)** | **위 MCP 들이 발행하는 사실을 typed fact 로 organize. citation 으로 stable ID 참조** |

Artifact 가 frame 의 `query_balance` 결과를 자기 안에 복사하지 않음. citation `{ kind: "frame.balance", entity, account, period, queried_at }` 만 보유. agent 가 artifact read 시 resolver 가 frame MCP 를 다시 호출하거나 cache 사용. MCP backend 가 sole owner — artifact 는 reference + interpretation 의 home.

### Schema authority 분산

Schema 의 권위는 **MCP service** (frame · hive · magnet · stream · Matrix · …). 각 MCP 가 자기 도메인 schema 를 정의하고 `/schemas` endpoint 로 노출. Blueprint 는 그 schema 들을 **discovery / mirror** — fetch + cache + version. registry 아님. 새 MCP 추가 시 자기 schema 를 가지고 들어오므로 Blueprint 측 변경 0.

MCP 가 정한 규칙이 없는 영역 (IC memo / Board meeting / Trip / LP comm / Sector framework 등 free-form) 은 **LLM 자율** — extract 시점에 ad-hoc typed structure 결정하거나 free-form content + citation/confidence wrap 으로 보존. AXE 가 미리 schema 다 정의할 필요 없음.

| 영역 | Schema authority | 예 schema_id |
|---|---|---|
| 회계 (journal, balance, period, account) | **frame MCP** | `frame.balance@1.0` · `frame.journal@1.0` |
| HR (employee, payroll, leave, compensation) | **hive MCP** | `hive.employee@1.0` · `hive.payslip@1.0` |
| 투자 (deal, fund_investment, financial_model, dd_finding, ic_decision, portfolio_kpi, valuation, lp_comm) | **index MCP** | `index.deal@1.0` · `index.fund_investment@1.0` · `index.financial_output@1.0` ([14 schemas](/services/index/schema-catalog)) |
| 마케팅 (campaign, channel, lead) | **magnet MCP** | `magnet.campaign@1.0` |
| S&OP (forecast, plan) | **stream MCP** | `stream.forecast@1.0` |
| 모니터링 (health, alert) | **Matrix MCP** | `matrix.health@1.0` |
| 관계망 (person, interaction, relationship) | **cortex MCP** | `cortex.person@1.0` · `cortex.interaction@1.0` |
| Board meeting / Trip / Sector framework (도메인 외 free-form) | **LLM 자율** | `freeform.llm@auto` 또는 skill-defined (`ic.memo@1.0`) |

`/schemas` endpoint contract (각 MCP 가 표준화):

```jsonc
GET /schemas
{
  "service": "frame",
  "version": "1.2.0",
  "schemas": [
    { "id": "frame.balance@1.0", "fields": { ... }, "description": "..." },
    { "id": "frame.journal@1.0", "fields": { ... }, "description": "..." }
  ]
}
```

Blueprint 의 `src/lib/artifact/schemas/` 가 각 MCP 의 `/schemas` 를 주기적으로 fetch → `artifact_schema` 테이블 upsert. 변경 감지 시 새 version row 추가 (기존 row 미변경 — 기존 artifact 의 citation chain 보존).

## ctx skill 의 진화

**대체 아님, 진화.** 기존 `ctx` (agent session delta → markdown append + parent KB propagation) 는 artifact store 의 **curation interface** 로 재정의.

```
source (OneDrive doc / frame query / Teams chat / mail thread / web fetch)
    ↓
ingest (skill: ingest, 별도 skill 신설 가능)
    ↓
typed extraction (schema-aware LLM extract, e.g., ICMemoArtifact §재무)
    ↓
proposed fact (audit_trail entry: { event: "propose", actor: "agent", ... })
    ↓
ctx review (user confirm / edit / reject — UX 가 markdown diff + citation hover)
    ↓
confirmed fact + audit (audit_trail entry: { event: "confirm", actor: "user", ... })
    ↓
agent reads via Query API (grep 안 함 — typed query + citation chain)
```

Markdown 은 보조 — review UX 의 diff 표면 + archive 보존 + emergency cat (DB 장애 시). primary read path 는 Query API.

### Markdown → artifact 점진 migration (AI-assisted)

기존 markdown PKM (`ctx/MEMORY.md` 의 누적 entry, project_*.md, feedback_*.md 등) 은 **목표는 전면 artifact 화**. 단 mass migration 안 함 — **항목 단위 AI-assisted ctx review** 로 점진:

```
기존 markdown 파일 1개 (예: ctx/MEMORY.md 의 한 entry)
    ↓
LLM 이 read → typed extract 시도 (MCP discovery schema 매칭 또는 LLM 자율 free-form)
    ↓
proposed artifact (audit_trail: { event: "migration_propose",
                                  actor: "agent",
                                  source_markdown: "ctx/MEMORY.md#L42-58",
                                  ts: "..." })
    ↓
ctx review (사용자 confirm / edit / reject — UX 가 source markdown 발췌 + extracted typed fact 나란히)
    ↓
confirmed artifact + 기존 markdown entry 에 `<!-- migrated: <artifact_id> -->` archive 마킹
    ↓
markdown 파일 전체 entry 가 모두 migrate 되면 그 파일 자체 deprecation
    ↓
신규 fact 는 처음부터 artifact 로 — markdown append 안 함
```

핵심 원칙:
- **점진** — 1주에 1 파일 또는 1 batch (10 entry) 수준. 인간 정비 cadence 안에서
- **AI-assisted** — LLM 이 자동 extract, 사람은 confirm 만 (인간 개입 최소화)
- **archive 마킹** — migrated entry 가 어떤 artifact 로 변환됐는지 trace 보존 (`<!-- migrated: <artifact_id> -->`). 이후 audit / 재migration 가능
- **신규 fact = artifact 처음부터** — 마이그레이션 완료 전이라도 새 사실은 artifact 로 직접 들어옴 (markdown append 옵션 안 줌)

## Workspace lifecycle

PARA 4 layer 는 Workspace 의 `paraLayer` 컬럼 (PROJECT / AREA / RESOURCE / ARCHIVE) 으로 표현. 각 Workspace 는 정확히 1 paraLayer 보유. lifecycle 의 핵심: **Dispatch ≠ Close** — 두 활동 분리.

### 4 paraLayer transition

```
                  create(paraLayer=PROJECT|AREA|RESOURCE)
                                  │
                                  ▼
              ┌──────── PROJECT (working) ─────────┐
              │                                     │
              │  dispatch (anytime — copy/link)     │
              │  artifact/file 을 다른 Workspace 로  │
              │  reclassify (any-to-any)            │
              │                                     │
              └────── close (paraLayer 변경 1회) ────┘
                                  │
                ┌─────────────────┼─────────────────┐
                ▼                 ▼                 ▼
              AREA            RESOURCE          ARCHIVE
              (현재형)         (재사용)          (시점형)
                │                 │                 │
                │   reclassify bidirectional 가능    │
                │   (ARCHIVE resurrect 포함)        │
                └─────────────────┴─────────────────┘
```

규칙:
- **create** — paraLayer 선택 (PROJECT 가 default, AREA/RESOURCE 도 직접 가능)
- **dispatch (anytime)** — Project 진행 중에도 file/artifact 를 다른 Workspace 로 흘려보냄. 3 mode: **link**(기본, 집 배정) / **copy_curate**(재사용본 저작→Resource) / **move**(소모성→Archive) — 아래 §Dispatch 3 mode
- **close (한 번)** — `workspace.paraLayer` 를 한 번 변경. PROJECT → ARCHIVE (보통) 또는 PROJECT → AREA/RESOURCE (reclassify). audit trail 에 close event 기록
- **reclassify (bidirectional)** — ARCHIVE → AREA 도 가능 (resurrect). 단 audit_trail 보존 — 누가 언제 왜 resurrect 했는지

### Dispatch 3 mode — link(기본) / copy-curate / move ([D-bp-para-1](/ops/decisions))

> dispatch = "집(home)" 배정 ([para-os §6](/architecture/para-os)). **link 가 기본** (artifact 몸통 1 + 집 N). 구 "copy-default"(`copy-with-provenance`)는 폐기 — copy 는 *재사용본 저작* 예외만.

| Mode | 의미 | 사용 사례 |
|---|---|---|
| **link** (기본) | `artifact_link` 에 (artifact_id, workspace_id, link_type, **annotation**, linked_at, linked_by) row 추가. artifact 본문 1 row, 여러 Workspace 가 share. `annotation` = Area별 해석 레이어 | 같은 PortcoBoardKPI 를 Portfolio Area + IC Project + LP Project 가 동시 참조 (각 Area 다른 annotation) |
| **copy-curate** | method/지식을 *새 Resource artifact 로 저작* (사실 복제 아님). lineage 는 `derived_from_id`(진짜 파생만, 구 `parent_artifact_id`) | 죽은 딜 경쟁분석 → 섹터 Resource 큐레이션, 펀드 결성 템플릿 1호→2호 |
| **move** | 소모성 working corpus → Archive → 폐기 (workspace 레벨 + OneDrive trinity-sync) | LoI 초안 v1~v5, dataroom 원본, 회의 스크래치 |

`artifact_link` 테이블:

```sql
CREATE TABLE artifact_link (
  artifact_id   uuid NOT NULL REFERENCES artifact(id) ON DELETE CASCADE,
  workspace_id  uuid NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
  link_type     text NOT NULL CHECK (link_type IN ('reference', 'sub_project', 'cross_link')),
  linked_at     timestamptz NOT NULL DEFAULT now(),
  linked_by     text NOT NULL,                       -- user.id or agent.id
  PRIMARY KEY (artifact_id, workspace_id)
);

CREATE INDEX artifact_link_workspace_idx ON artifact_link (workspace_id);
```

dispatch API (substrate, ADR §6 S1):
- `dispatch_artifact(artifact_id, to_workspace_id, mode="link"|"copy_curate"|"move", annotation?)` → **link**(기본) = `artifact_link` row INSERT(+annotation), **copy_curate** = 새 Resource artifact + `derived_from_id`, **move** = workspace 레벨 + OneDrive 이동
- `unlink_artifact(artifact_id, workspace_id)` → link 해제 (`artifact_link` row DELETE). copy_curate 산출은 별 artifact 라 unlink 대상 아님

### Area cardinality + AXEV 현재 seed

**Area 1개 / function**: 중복 function 의 Area 가 둘 생기지 않도록 UI/LLM 가드. 새 Area 만들기 시도 시 기존 Area 와 function overlap 검출 → "기존 `<Area name>` 와 merge 권고" 모달. operator 가 override 시도 시 audit 기록.

AXEV 현재 Area seed (2026-05-23):

| Area | Function | 비고 |
|---|---|---|
| **Finance** | 회계 / 재무 / cash flow / 예산 | frame MCP 의 data 가 주 |
| **BOD** | 이사회 / 결의 / 거버넌스 | resolution + meeting note |
| **Legal** | 계약 / 컴플라이언스 / 등기 | 법무 사항 |
| **License** | AC (Advisory Committee) 라이센스 관리 | AC 관련 |

Resource = 0 (아직 없음). naturally emerge — 첫 Project close 시점 또는 첫 framework consolidate 시점에 생성.

### UX 흐름 4 페이지 분리

UI 측면에서 paraLayer 별 entry point 를 분리 (cross-PARA query 는 별 surface):

| URL | 역할 | 표시 |
|---|---|---|
| `/axe/projects` | 진행 중 Project 리스트 + close button | PROJECT only |
| `/axe/areas` | function 별 living knowledge 그리드 + last-updated heatmap | AREA only |
| `/axe/resources` | reusable template/framework | RESOURCE only |
| `/axe/archive` | 시점형 의사결정 archaeology + search | ARCHIVE only |

각 page 에 "+New Workspace" 시 paraLayer 가 그 page 에 fix (PROJECT page = 새 PROJECT, AREA page = 새 AREA …). 4 page 위에 cross-PARA query 는 Knowledge Overview dashboard 에서 진입.

Workspace create 시 paraLayer 선택 UI (mock):

```
┌─ New Workspace ──────────────────────────────┐
│ Name:      [_______________________________] │
│ Entity:    [axev ▾]                          │
│ paraLayer: ( ) Project  ( ) Area             │
│            ( ) Resource ( ) Archive          │
│                                              │
│ ▶ Target close date (optional, PROJECT only) │
│   [____________]                             │
│                                              │
│              [Cancel]      [Create]          │
└──────────────────────────────────────────────┘
```

### OneDrive 폴더 mirror

trinity-sync 가 Workspace 의 paraLayer 변경을 OneDrive 폴더 이동으로 mirror. **2 시점** 에 file move 발생:

| 시점 | 동작 | 예 |
|---|---|---|
| **dispatch (file 별)** | artifact 에 attached 된 file 1개를 다른 Workspace 로 dispatch 시, 그 file 만 destination Workspace 의 OneDrive 폴더로 부분 이동 (copy mode = OneDrive copy, link mode = OneDrive shortcut/symlink) | IC artifact 의 spreadsheet 1개를 Portfolio Area 로 link |
| **close (workspace 전체)** | Workspace.paraLayer 변경 시 그 Workspace 의 OneDrive 폴더 전체가 destination paraLayer 의 root 로 이동 | `/Ventures/1. Project/Deal X/` → `/Ventures/4. Archive/Deal X/` |

trinity-sync 가 OneDrive driveItem 이동 trigger + Blueprint Workspace.drivePath 업데이트. paraLayer 변경 자동 propagation.

## Knowledge Overview dashboard

회사 지식체계 P → A/R → A 흐름을 한눈에 조망하는 별도 page (`/axe/knowledge`). 4 paraLayer page 위에 cross-PARA view.

### 3-pane layout

```
┌─────────────────────────────────────────────────────────────┐
│  Knowledge Overview (axev)                                  │
├──────────────────┬──────────────────┬───────────────────────┤
│ Layer counts +   │ Sankey: PARA     │ Cross-PARA query 입력 │
│ state            │ flow (지난 30일)  │                       │
│                  │                  │ "portfolio cos 중      │
│ PROJECT:    12   │   PROJECT        │  Q4 churn > 15%"      │
│  - active:   8   │   ↓ dispatch      │                       │
│  - closing:  2   │  copy: 23        │ [Query] [Save]        │
│  - stale:    2   │  link: 15        │                       │
│                  │   ↓                │ 결과: 3 artifact      │
│ AREA:        4   │   AREA   RESOURCE │  - portco Y (0.18)   │
│  - Finance       │   ↓               │  - portco Z (0.17)   │
│  - BOD           │   ↓ reclassify    │  - portco W (0.16)   │
│  - Legal         │  3 (manual)       │  [view citation]      │
│  - License       │                  │                       │
│                  │   ARCHIVE:        │                       │
│ RESOURCE:    0   │   close: 5       │                       │
│ ARCHIVE:    27   │   resurrect: 1   │                       │
└──────────────────┴──────────────────┴───────────────────────┘
```

### Area health alert

각 Area 의 last-updated timestamp 기반:

- **stale** (30일 무변경) — Area 카드에 yellow ⚠ banner
- **inactive** (90일 무변경) — Area 카드에 red ⏸ banner + "이 Area 가 living 인지 재평가" 알림

운영자 review queue 에 자동 추가.

### 추가 view (drill-down)

| View | 표시 |
|---|---|
| **PARA flow over time** | 월 별 P→A/R/A dispatch count 추세 (lifecycle 활성도) |
| **Artifact graph** | citation chain 의 graph 시각화 (artifact ↔ citation source) — 의존성 spot |
| **Provenance trace** | 1 artifact 선택 → 그 artifact 의 모든 dispatch / link / migration history (audit_trail timeline) |

### 의도

Knowledge Overview 의 자체 가치 — **회사의 fact health 가 한눈에**. PARA OS 가 단지 "파일 정리" 가 아니라 살아있는 지식체계라는 것을 운영자/직원이 daily 로 확인할 surface. inactive Area, dispatch 끊긴 흐름, citation chain 깨진 artifact 가 시각적으로 detect 됨.

## MCP tool 분리 (paraLayer 별)

UI 4 page 분리와 같은 원칙으로 MCP tool 도 paraLayer 별 분리. **LLM intent clarity** — tool name 자체에 paraLayer 의도 드러남.

### Workspace level tools

| Tool | 역할 |
|---|---|
| `list_projects(entity?, state?)` | PROJECT only, state = active / closing / stale |
| `list_areas(entity?)` | AREA only, last_updated 정렬 default |
| `list_resources(entity?)` | RESOURCE only |
| `search_archive(entity?, query, since?, until?)` | ARCHIVE only, time-travel + full-text |
| `create_workspace(paraLayer, name, entity, target_close_date?)` | 신규 (4 paraLayer 어디든) |
| `close_workspace(id, dispatch_plan?)` | paraLayer 변경 1회 + 동시 dispatch 가능 |
| `reclassify_workspace(id, new_paraLayer)` | bidirectional reclassify (ARCHIVE resurrect 포함) |

### Artifact level tools

| Tool | 역할 |
|---|---|
| `get_artifact(id)` | 단일 artifact + citations + audit_trail |
| `list_artifacts(workspaceId, schema_id?, paraLayer?)` | filter by workspace / schema / paraLayer |
| `propose_artifact(workspaceId, schema_id, content, citations, confidence?)` | agent propose (audit_trail event: "propose") |
| `dispatch_artifact(artifact_id, to_workspace_id, mode="copy" \| "link")` | copy or link |
| `unlink_artifact(artifact_id, workspace_id)` | link 해제 (copy 는 별 artifact 가 됐기 때문 미적용) |

### Knowledge query

| Tool | 역할 |
|---|---|
| `query_knowledge(query, paraLayers?, entity?, since?)` | KnowQL-lite — cross-PARA / time-travel / confidence filter. agent 가 grep 안 함 |

이유: `list_workspaces(paraLayer=PROJECT)` 같은 generic tool 보다 `list_projects` 가 LLM 의 intent 명확. plan 단계 토큰 절감 + 잘못된 paraLayer 호출 가능성 차단.

## LLM 호출 + Access 정책

artifact 의 두 가지 access pattern 결정:

### Layer 1: LLM 호출 = Max plan OAuth 우선

Artifact extraction / proposing / review 의 LLM 호출은 **Claude Code OAuth token (Anthropic Max plan) 우선**. Anthropic API direct (per-token billing) 은 fallback / 대량 batch 용.

| Surface | 호출 방식 |
|---|---|
| Teams bot | Claude Code OAuth (Max plan session) |
| 로컬 Claude Code CLI | OAuth (operator session) |
| 웹 UI (review queue, ctx review) | OAuth (Max plan, 사용자 본인 session) |
| 대량 batch (한 번에 1000+ artifact extraction) | Anthropic API direct fallback |
| vision-heavy ingest (pdf/pptx 대량) | Anthropic API direct ([기존 패턴 `vision_ingest.py`](/services/blueprint)) |

**비용 측면** — per-token incremental cost 0 (Max plan 안 무제한). 대량 batch / vision-heavy 만 per-token billing 노출.

**기존 패턴 정합** — `vision_ingest.py` 의 API direct 호출은 대량 vision 처리 한정. 같은 원칙을 artifact extraction 으로 확장.

### Layer 2: Access = MCP tool 위주, REST 최소화

Artifact access 의 primary layer 는 **Blueprint MCP tool** (위의 `query_knowledge` / `get_artifact` / `dispatch_artifact` 등). 별도 REST endpoint proliferation 회피.

| Surface | Access |
|---|---|
| Claude Code (CLI / Teams bot / 웹 agent) | Blueprint MCP tool |
| 외부 agent (third-party MCP client) | Blueprint MCP tool (OAuth-RP) |
| 웹 UI (Blueprint Next.js) | 최소 REST endpoint (curation UX 용) |
| Cross-service backend (frame ↔ Blueprint event consumer) | Postgres direct (격리 X — 같은 instance) |

이유: MCP tool surface 한 곳으로 통합 = audit 한 곳, OAuth-RP 한 번 (D-bp-mcp-1), 권한 모델 한 번 (D-bp-entity-17 EntityRole). REST endpoint 가 늘면 권한 모델 중복 + audit silo + version drift.

## 저장 결정 + 대안 비교

**Primary storage = Blueprint Postgres 16** (D-config-16 cutover 완료). 신규 인프라 0. per-customer macmini isolation (D1) 안에서 Blueprint Postgres 동거.

Monolith first — 별도 `KnowledgeStore` service 분리 안 함. Blueprint 가 이미 PARA OS home, surface 분리는 추출 필요 시 나중.

| 대안 | 거절 사유 |
|---|---|
| **Graph DB (Neo4j)** | citation chain 이 graph 형태이긴 하나 query workload 가 hash-lookup + filter 위주. Postgres JSONB GIN index 로 충분. 신규 dependency 추가만 부담 |
| **Vector DB (Qdrant) primary** | 의미 검색은 필요 시 pgvector extension 으로. primary 로 두면 trans actional consistency / FK constraint / audit trail 다 잃음 |
| **ClickHouse** | analytical query OLAP 강점은 있으나 artifact 는 row count < 100k 수준의 transactional/curation workload. column-store 이점 X |
| **MongoDB** | JSONB 의 동등 기능 + sharding 미필요 + frame/hive 와 Postgres 일관성. 별 DB 추가 부담 |
| **SQLite (file-per-workspace)** | concurrent read-write 모델 (multi-agent) 미적합. Postgres advisory lock 으로 자연 |

## 확장 (필요 시 add-on)

기본 Postgres 위에 Phase 별 add-on 가능. 모두 신규 인프라 없이 extension install 수준.

| 확장 | 활성화 조건 |
|---|---|
| `pgvector` | semantic search (artifact content / citation text embedding) 필요 시. Stage 2 의 cross-PARA query 가 정확도 부족하면 도입 |
| `pg_jsonschema` | content + audit_trail JSONB validation 강제 시. schema_id 별로 JSON Schema 등록 → INSERT/UPDATE 시 reject |
| `temporal_tables` (또는 `timestamptz` column + soft archive) | time-travel query 정확도 필요 시. Stage 1 까지는 `updated_at` + `archived_at` 으로 충분 |

## 단계 (활성화 조건 충족 시 — 활성화 자체는 다음 결정)

[M3 PARA Dispatch](/ops/roadmap#m3--blueprint-para-dispatch-d-bp-entity-1-pr-5) land + [M1 multi-tenant](/ops/roadmap#m1--stage-0--1-외부-출시) 종료 가 자연스러운 entry. 단 평행 진행 가능 — 외부 surface 영향 0.

| Stage | 산출 | 기간 |
|---|---|---|
| **0. PoC** | filesystem-only 첫 schema (`ICMemoArtifact §재무`) — DB 변화 0. ctx 의 markdown diff UX 위에 typed extraction proof | ~3일 |
| **1. DB 진입** | `Artifact` + `Citation` Prisma migration, KnowQL-lite HTTP endpoint, Blueprint UI 탭 1개 | ~3-4주 |
| **2. Full integration** | 5종 schema (IC / Board / LP / Sector / KPI) active, PARA dispatch field-level engine, ctx 진화 (curation mode) | ~3-4주 |

## Open implementation decisions

본 페이지의 design 위에 implementation 단계에서 결정할 항목들. 각 항목마다 framework (방향성) 만 명시, 구체 결정은 deferred. **Implementation 단계에서 각 항목 결정 시 D-bp-artifact-N 추가 등재**.

| # | 항목 | Framework (방향성) |
|---|---|---|
| **B1** | Agent ↔ artifact API contract | Agent (Claude / Teams bot) 의 artifact propose 권한은 implementation 시 [D-bp-entity-17](/ops/decisions) EntityRole 위에 layer 추가 검토. propose 는 ctx review queue 경유 default — 직접 confirmed 진입은 별 권한 grant 필요 |
| **B2** | Schema evolution 호환성 | Schema versioning: MCP source schema 변경 = MCP 의 도메인 정책 따름 (frame/hive 각자 backward compat 책임). free-form artifact 는 `schema_id` 마다 append-only 보존 (`freeform.llm@auto-2026-05` 같은 timestamped variant). forced migration 도구는 implementation 시 결정 |
| **B3** | Concurrent write 정책 | optimistic lock (`updated_at` version check) + audit_trail conflict event. detail TBD — 첫 multi-agent concurrent write 발견 시 결정 |
| **B4** | Time-travel 정확도 | Stage 1 = `updated_at` filter (근사). Stage 2 = audit_trail event replay. snapshot table 신설 여부는 정확도 정당화 시점에 결정 (e.g., IRR 결정론 검증이 시점 정확도 요구할 때) |
| **B5** | Failure modes (degradation) | graceful degradation 원칙: (a) LLM extraction 실패 → markdown fallback (raw content + warning); (b) Citation resolver 실패 → cached value + warning chip; (c) Dispatch partial fail → savepoint rollback (all-or-nothing). detail TBD |
| **C1** | Cross-customer aggregation | per-customer macmini isolation ([D1](/ops/decisions)) 의도된 격리 유지. meta-layer aggregation (예: AXE 가 운영하는 N customer 의 PARA flow 집계) 미설계. 외부 GP 명시 요구 시 재검토 |
| **C2** | axec PARA 구조 | axec / axev / sys entity 각각 자체 PARA tree. axec Area 정의는 axec workflow 진행 시 자연 emerge (현재 axec workflow 비중 낮음 — axev 가 primary) |
| **C3** | Resource 외부 import | 외부 framework (e.g., Atomico VC playbook, McKinsey portfolio template) 의 RESOURCE 등재는 implementation 시 IP / license 정책 합의 후 결정. v1 = AXE 내부 사용만 |
| **C4** | Multi-language artifact | v1 = 한국어 우선 (모든 schema 정의 + UI 한국어). content 안 영문 field 가 자연 등장 시 (예: 외국인 employee record, 영문 LP comm) schema 별 multi-lang 결정 |

각 항목은 implementation PR 시점에 D-bp-artifact-N 으로 등재 + 본 표 update. framework 만으로 시작 가능 (구체 결정 deferred 가 작업 정체 trigger 아님).

## 관련 결정

- [D-bp-artifact-1~7](/ops/decisions) (본 페이지 등재 동반, 2026-05-23)
- [D-bp-entity-1](/ops/decisions) (Blueprint entity 개념 + PARA 4 layer schema)
- [D-bp-entity-2](/ops/decisions) (PARA dispatch workspace-level provenance — 본 페이지가 field-level 진화)
- [D-bp-entity-17](/ops/decisions) (EntityRole — propose/review 권한 layer 의 base)
- [D-config-16](/ops/decisions) (Blueprint Postgres — artifact 거주지)

## 관련 페이지

- [/services/blueprint](/services/blueprint) — Blueprint 서비스 페이지의 artifact 섹션
- [/ops/roadmap M3, M6](/ops/roadmap) — PARA dispatch + artifact layer
- [/architecture/data](/architecture/data) — 데이터 격리 모델 (entityId scope)
- [/ops/backlog](/ops/backlog) — M6 태그 항목들
