Artifact 모델 · PARA 지식 레이어
[2026-06-06 방향 갱신] PARA 의 상위 설계 철학은 /architecture/para-os 로 정리됨 (PARA=조직론, dispatch=“집”/link-default, governance 결정로그, 죽은 딜 본질). 본 페이지의 dispatch
copy-with-provenance→link-default로 revise (D-bp-para-1), Area=workspace-container → 조직론 노드 + R/A 내포. 단 저장·citation·schema discovery 세부는 본 페이지가 유효한 reference.[2026-06-06 구현 토폴로지 — D-bp-rust-1] Artifact 레이어는 Blueprint 의 첫 Rust organ 으로 이관된다 (TS→Rust strangler-fig). 신규 substrate 서비스(Rust+axum)가
blueprint-postgres의substrateschema 에서artifact/artifact_link/mcp_schema를 소유 —workspace_id·entity_id는 opaque 외부 ref(Artifact-scoped 경계), Workspace+paraLayer SoR 는 Prismapublic잔류. 모델 교정(처음부터 1급): home/link(“집”) =artifact_link가 멤버십 본체 +annotation(Area별 해석),parent_artifact_id→derived_from_id(진짜 파생만), 2-levelscope(personal/shared), citation 8종(아래 7종 +gate.decisionD-gate-2). 아래 본문의 Prisma SQL·“copy default”·“7 kind” 서술은 현 TS(M6 Stage-1) 기록이며 cutover(ADR §6 S3) 전까지 병존 — 권위 = D-bp-rust-1 + ADRdocs/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 의 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 가 현재 workspace-level (file-level) provenance (sourceWorkspaceId / sourceArtifactPath / copiedAt, D-bp-entity-2) 까지 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.
CREATE TABLE artifact (
id uuid PRIMARY KEY,
schema_id text NOT NULL REFERENCES artifact_schema(id), -- MCP discovery schema (e.g., `[email protected]`, `[email protected]`) 또는 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:
// 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 | [email protected] · [email protected] |
| HR (employee, payroll, leave, compensation) | hive MCP | [email protected] · [email protected] |
| 투자 (deal, fund_investment, financial_model, dd_finding, ic_decision, portfolio_kpi, valuation, lp_comm) | index MCP | [email protected] · [email protected] · [email protected] (14 schemas) |
| 마케팅 (campaign, channel, lead) | magnet MCP | [email protected] |
| S&OP (forecast, plan) | stream MCP | [email protected] |
| 모니터링 (health, alert) | Matrix MCP | [email protected] |
| 관계망 (person, interaction, relationship) | cortex MCP | [email protected] · [email protected] |
| Board meeting / Trip / Sector framework (도메인 외 free-form) | LLM 자율 | freeform.llm@auto 또는 skill-defined ([email protected]) |
/schemas endpoint contract (각 MCP 가 표준화):
GET /schemas
{
"service": "frame",
"version": "1.2.0",
"schemas": [
{ "id": "[email protected]", "fields": { ... }, "description": "..." },
{ "id": "[email protected]", "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)
dispatch = “집(home)” 배정 (para-os §6). 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 테이블:
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_linkrow INSERT(+annotation), copy_curate = 새 Resource artifact +derived_from_id, move = workspace 레벨 + OneDrive 이동unlink_artifact(artifact_id, workspace_id)→ link 해제 (artifact_linkrow 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) |
비용 측면 — 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 land + M1 multi-tenant 종료 가 자연스러운 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 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) 의도된 격리 유지. 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 (본 페이지 등재 동반, 2026-05-23)
- D-bp-entity-1 (Blueprint entity 개념 + PARA 4 layer schema)
- D-bp-entity-2 (PARA dispatch workspace-level provenance — 본 페이지가 field-level 진화)
- D-bp-entity-17 (EntityRole — propose/review 권한 layer 의 base)
- D-config-16 (Blueprint Postgres — artifact 거주지)
관련 페이지
- /services/blueprint — Blueprint 서비스 페이지의 artifact 섹션
- /ops/roadmap M3, M6 — PARA dispatch + artifact layer
- /architecture/data — 데이터 격리 모델 (entityId scope)
- /ops/backlog — M6 태그 항목들