<!-- canonical: https://docs.axelabs.ai/ops/backlog -->
<!-- source: content/ops/backlog.mdx -->

---
title: 백로그 (실행 큐)
description: 다음 세션의 entry point. 신규/Ready/in-progress/done lifecycle 로 무엇부터 할지가 5초 안에 보임.
---

# 백로그 (실행 큐)

> **다음 세션이 들어오면 이 페이지부터 본다.** [known-gaps](/ops/known-gaps) 는 "함정과 미해결 사실", 본 페이지는 "다음 실행 항목". [roadmap](/ops/roadmap) 은 마일스톤 큰 그림 — 각 백로그 항목은 마일스톤 ID (M1~M5) 로 묶임. 이미 ship 된 ✅ 항목은 [updates](/ops/updates) 의 Ship Log 로 promote (Phase 2 자동 = `B-axe-ship-update-hook`).
>
> **시간축 4 페이지** ([D-docs-updates-1](/ops/decisions)): **본 페이지** (현재) · [roadmap](/ops/roadmap) (미래) · [updates](/ops/updates) (과거) · [known-gaps](/ops/known-gaps) (사실).
>
> **Lifecycle**: 🆕 신규 (분류 안 됨) → 📋 ready (다음 세션이 집어가도 됨) → 🔧 in-progress (작업 중) → ✅ done (1주 후 archive 또는 삭제) → ⏸️ blocked (외부 차단)
>
> **운영 ritual**:
> 1. **세션 시작**: 본 페이지 + [known-gaps](/ops/known-gaps) 같이 확인. 작업 주제의 항목 있으면 🔧 로 옮기고 owner 자기 이름으로
> 2. **세션 종료**: 끝낸 항목 ✅ + 새 발견 🆕. ✅ 항목은 다음 정비 시 archive 표로 이동
> 3. **항상**: 항목 = 한 줄 행동. 1주 안 끝날 항목은 마일스톤 (M-) 으로 승격하거나 쪼개기

## 🔧 In-progress (작업 중)

| ID | 항목 | 마일스톤 | owner | 시작일 | 비고 |
|---|---|---|---|---|---|
| **B-search-deploy** | docs.axelabs.ai UI 검색 (Pagefind) 라이브 배포 — 코드 머지 끝, `axe ship docs` 후 검색박스 동작 검증 | — | 운영자 | 2026-05-22 | [D-docs-search-1](/ops/decisions), 본 항목 ✅ 후 [known-gaps](/ops/known-gaps) 의 "docs 사이트 UI 검색" 섹션 제거 |
| **B-axe-idp-1** 🔧 | **Blueprint = 플랫폼 OIDC Provider** — 로그인 1회로 전 서비스 ([D-axe-idp-1](/ops/decisions), 설계 SSOT [/architecture/platform-identity](/architecture/platform-identity)). **Phase 1 (모델 증명, 진행 중)**: Blueprint OIDC-OP(`.well-known/openid-configuration`·`jwks.json`·`/oauth/authorize`(getServerSession 재사용)·`/token`·`/register`·`/revoke`) + RS256 키(vault) + Prisma 모델(AuthCode·RefreshToken·Client) + `axe login` loopback PKCE + **frame 만** Blueprint 신뢰(`_is_blueprint_iss` 분기 + `auth_blueprint.py`). **Phase 2**: hive·cortex·index·matrix trust 이전 + frame/cortex 프록시([D-ops-14/15](/ops/decisions)) 통합·폐기. **Phase 3**: 인가 중앙화(`ent` 클레임 + fine scope) + 감사 UI + headless device-code + 키 회전. **비파괴 cutover**: 서비스별 flag `BLUEPRINT_ISSUER`/`BLUEPRINT_JWKS_URL` unset = 현행 그대로(롤백 = env 제거). | — | Claude Code (ai@axellc.com) | 2026-06-03 | 보안 핵심 → 설계 우선. **최종 검증 = 운영자 브라우저 SSO 1회 필요**(단독 e2e 불가). B-axe-cli-P0 후속. |

## 📋 Ready (다음 세션이 집어갈 수 있음)

> 📋 항목은 의존성이 해소돼서 **지금 시작해도 되는 것들**. 마일스톤 ID 가 묶음을 보여줍니다.

| ID | 항목 | 마일스톤 | 추정 | 의존성 / 비고 |
|---|---|---|---|---|
| **B-bp-mcp-teams-admin-consent** | Blueprint Next.js app (`2b222356-1c36-48e0-96a3-2c5e0ecbf937`) 에 Microsoft Graph **`Chat.Read.All` + `ChatMessage.Read.All`** Application permission 추가 + tenant admin consent grant. 검증: `get_teams_message(url=...)` → 200 (현재 AADSTS65001 `invalid_grant` 502). 운영자 1회 작업. D-bp-mcp-teams-1/2/3 가 LIVE 됐으나 본 grant 부재로 tool 모두 사실상 unusable. `B-bp-mcp-calendar-2 admin consent` 와 동일 패턴 (known-gaps "Blueprint Azure App ID 혼동" 참조). 후속: `docker restart blueprint-app-green` 으로 MSAL `.default` 토큰 캐시 무효화 (D-bp-mcp-calendar-2 함정 #3). | M1 | 0.2d | 2026-05-26 본 세션 발견 (soohun.kang 1:34 메시지로 smoke test → 두 chat 모두 AADSTS65001). 운영자(Global Admin = soohun.kang) 만 가능 — `ai@axellc.com` 은 일반 사용자라 admin consent 권한 X (known-gaps D-bp-mcp-calendar-2 §"Global Admin = soohun.kang 단독"). |
| **B-cortex-xlsx-import-run** 🆕 | Cortex live 후 잔여 — `Network_CRM.xlsx` 660 행 enrichment 1회 마이그. 전제: operator 가 connect_google + sync_google_now 완료 (Google Contacts → person artifact). 절차: xlsx 를 macmini 로 복사 → `cortex import-xlsx --path <xlsx> --owner <whoami email>` (dry-run) → 매칭 통계 + private 카운트 확인 → 필요시 `--private-cols HPE,메모,소개` 조정 → `--apply`. owner_id 는 claude.ai 로그인한 Entra email (whoami 로 확인). 멱등 (subject+key 중복 skip). 완료 후 `~/Network/` → `~/Network.legacy/` archive + Network Manager Desktop OAuth client 폐기 | M1 | 0.3d | 2026-05-28 — cortex production live 후. CLI 전용 (로컬 파일이라 MCP tool 불가). **민감 컬럼 → `visibility=private` 태깅 구현 완료** (`--private-cols`, default HPE, commit `2ff4cf4`, [D-cortex-9](/ops/decisions)) — 잔여 = 파일 복사 + Google sync + 실 dry-run/apply (운영자 prerequisite) |
| **B-cortex-visibility-phase2-mirror-contract** 🆕 | [D-cortex-9](/ops/decisions) Phase 2 (M6 착수 시) — Blueprint mirror job 이 `visibility='shared'` 만 가져가도록 계약 enforce + field-level privacy (payload `private` 하위객체 mirror 제외 + 선택적 `CORTEX_PII_PASSPHRASE` pgp 암호화) + private artifact 의 audit event redact. 선행 = M6 Blueprint artifact mirror ([D-bp-artifact-1](/ops/decisions)) | M6 | 2d | 2026-05-28 요청 3.2+3.4. M6 (2026 Q4) 종속 |
| **B-cortex-visibility-phase3-e2e** 🆕 | [D-cortex-9](/ops/decisions) Phase 3 (opt-in) — client-held key sealed payload, 서버 복호화 불가. search_person(`payload::text ILIKE`)·Google push 포기 trade-off → 가장 민감한 메모만 "sealed" 모드 | M6 | 3d | 2026-05-28 요청 3.5 (보너스). 우선순위 최하 |
| **B-cortex-mcp-catalog-publish** 🆕 | `axe mcp publish` 로 cortex_mcp 를 Vaultwarden MCP Connectors collection 에 등재 ([D-vault-mcp-catalog](/ops/decisions)). customers.yaml `sso.apps.cortex_mcp` 이미 4-key (client_id + application_id_uri + scopes + client_secret_env) 있음 → publish idempotent. 그러면 다음 사용자가 claude.ai connector 등록 시 Bitwarden 확장이 URI 매칭으로 cortex 4-piece auto-suggest | M1 | 0.1d | 2026-05-28. frame/hive/blueprint 와 동일 |
| **B-cortex-google-oauth-verify** 🆕 | Cortex Google OAuth 앱 정식 검증(verification) 제출 → 동의 화면 "확인되지 않은 앱" 경고 제거. 앱 = External+production, 스코프 `auth/contacts` (**sensitive**), client `135512942819-l18ra7gkf1ac93ai8t4hf2h4jl6mi0a2.apps.googleusercontent.com` (project no. 135512942819). 현재 unverified → 동의 시 경고("고급 → 이동" 우회 중) + unverified 100-user 상한. 외부 개인 Gmail(kangthge@gmail.com 등) 온보딩 신뢰 문제로 검증 필요. **제출물**: 브랜딩(앱명·로고·지원이메일) + 앱 도메인(홈페이지·개인정보처리방침·서비스약관 URL) + 승인된 도메인 Search Console 소유권 verify(axelabs.ai) + 민감 스코프 정당화 사유 + OAuth 동의 흐름 데모 영상 → Google Auth Platform(`console.cloud.google.com/auth/*`) 제출. **금전비용 0** — contacts 는 sensitive(not restricted)라 CASA 제3자 보안평가 불필요(restricted였으면 수천 $/yr). 대안 기각: Internal user type = Workspace 한정이라 개인 Gmail 제외 부적합. 참고: production 전환으로 Testing 의 refresh_token 7일 만료는 이미 회피(sync 안정성 확보, 검증과 별개). | M1 | 0.5d (+Google 검토 수일~수주) | 2026-05-29 발견. 관문 = 개인정보처리방침/약관 페이지(axelabs.ai 정적 호스팅) — [B-legal-pages](/ops/backlog) 연계 |
| **B-axe-secret-pull-noquote** 🆕 | `axe secret pull` 이 env_file 작성 시 값에 따옴표를 붙이는데, docker compose `env_file:` directive 는 따옴표를 literal 로 처리 (compose `.env` variable substitution 과 다름) → 컨테이너 안 secret 에 따옴표 포함 → DB auth / API key mismatch. cortex 가 첫 피해 (postgres auth 실패, 수동 sed 로 우회). fix: `axe secret pull` 이 quote 안 붙이게 (또는 env_file 소비처가 strip). frame/hive 는 Python config 가 우연히 strip 해서 안 터졌을 뿐 | M1 | 0.3d | 2026-05-28 cortex 발견. [known-gaps Cortex #2](/ops/known-gaps) |
| **B-axe-tunnel-add-ingress** 🆕 | `axe tunnel add-ingress <hostname> <path> <service>` CLI 신설. `axe` 에 이미 `_cf_request` helper + CF API token (vault `Cloudflare API - axelabs`) 있음 → Cloudflare Dashboard remote-managed 터널의 ingress 를 GET→insert→PUT. cortex 등재 시 4-step curl 수동 (fetch config + jq insert + PUT) — 1 명령으로 축소. catch-all 보다 앞 + axe.axelabs.ai 의 no-path rule 보다 앞에 삽입 | M1 | 0.3d | 2026-05-28 cortex 발견. [known-gaps Cortex #7](/ops/known-gaps) |
| **B-artemis-tunnel-orphan** 🆕 | `artemis-tunnel` (cloudflared, Up, 2026-05-09 생성) 가 `project=artemis` compose 라벨만 달고 현 `docker-compose.yml` 엔 정의 없음 — [D-ops-20](/ops/decisions)(터널 axelabs 스택 이전)의 잔재. 증상: artemis 에 `docker compose` 명령 시 orphan 경고 + `down/up --remove-orphans` 시 **살아있는 터널 삭제** 함정. 조치: 용도 확인(서빙 라우트 식별) → 불필요시 `docker rm -f artemis-tunnel`, 필요시 axelabs 스택 compose 로 라벨 이전. 2026-06-03 artemis launchd 스크립트(filings/collectors/reporters) `docker run`→`docker compose run` 전환으로 경고 노출 빈도↑. | M1 | 0.2d | 2026-06-03 발견. 현재 동작 무영향(안전). [D-ops-20](/ops/decisions) 잔재 |
| **B-bp-entity-table-create** 🆕 | Blueprint Prisma `Entity` model 신설 ([D-bp-entity-canonical](/ops/decisions) Phase 1). schema = `Entity` 의 컬럼 (id text PK = axec/axev/axep/truvia, canonicalName 한글, customerId axe/realchoice, role 운영법인/GP/기타, isActive, createdAt) + EntityRole FK refactor (현재 EntityRole.entityId text → Entity.id FK). **데이터 seed**: (a) customers.yaml.entities iterate → Entity row 1 per id, (b) customers.yaml.entity_meta.(id).legal_name → canonicalName, (c) frame.shared.entity.legal_name 과 cross-check (D-bp-entity-canonical migration 의 frame i18n 정정 후 sync). REST endpoint `/api/admin/entities` (GET list + GET by id) — axe CLI 와 docs/inventory.mdx 가 fetch 가능. backward compat = customers.yaml.entities 는 SoT 유지 (deployment prerequisite, 부팅 self-contained) | M2 | 1d | [D-bp-entity-canonical](/ops/decisions). 선행 = `B-org-fanout-1` (organizationId FK pattern 일관) |
| **B-customers-yaml-entity-meta-derive** 🆕 | `customers.yaml.entity_meta` (2026-05-27 본 세션 신설) 를 Blueprint Entity 의 derived view 로 전환 ([D-bp-entity-canonical](/ops/decisions) Phase 2). **3 sub-step**: (a) axe CLI 의 `cmd_customers_list` 가 Blueprint REST `/api/admin/entities?customerId=(id)` fetch → entity_meta 표시 (yaml 의 entity_meta block 은 보존하되 "derived from Blueprint Entity, do not edit manually" comment 추가), (b) matrix collector 에 `entity_meta_drift_check` 추가 — customers.yaml 의 entity_meta vs Blueprint Entity table cross-check, mismatch detect 시 alert, (c) `axe deploy` 부팅 시 entity_meta 가 stale 이면 warning (단 부팅은 계속). transitional 기간 = Phase 1 완료 후 1 주 검증 + Phase 2 진입 | M2 | 0.5d | [D-bp-entity-canonical](/ops/decisions). 선행 = B-bp-entity-table-create |
| **B-axelabs-matrix-customers-yaml-direct** 🆕 | `axelabs.ai/matrix` UI 의 customer 정보 drift 영구 fix. **현재**: `/Users/axe/axelabs/app/api/matrix/customers/route.ts` 가 `http://axe-console-app:8228/api/customers` proxy. console-app = 폐기 대상 ([B-matrix-admin-retire](/ops/backlog)), docker ps 미가동, build 시점 prerender stale 본 노출. 2026-05-27 본 세션이 customers.yaml SoT (axec/axev/axep 한글명 + truvia rename + entity_meta 신설) 변경했으나 production UI 는 옛 본 (axe="에이엑스이 LLC" / axev 누락 / realchoice="리얼초이스 주식회사" / entities=["realchoice"]). **fix**: (a) route.ts 를 `fs.readFile('/axe-data/customers.yaml')` + js-yaml parse 로 변경 (console proxy 제거), (b) axelabs container `docker-compose.yml` 에 `/Users/axe/.axe:/axe-data:ro` mount + js-yaml deps 추가, (c) Next.js `revalidate: 0` 유지 + page 의 customers metric card 가 server-fetch (현재 client fetch → SSR 으로 변환 권장), (d) /api/matrix/services / launchd / containers / backups / console / state 6 route 도 동일 패턴 검토 (모두 console proxy). [D-bp-entity-canonical](/ops/decisions) "customers.yaml = deployment SoT" 정합 + [B-matrix-admin-retire](/ops/backlog) prerequisite (console-app 폐기 가능). 작업자 = axelabs container owner | 2026-05-27 | M1, 1d (route 6개 마이그레이션 + compose mount + rebuild + ship) |
| **B-org-fanout-1** | Blueprint `Workspace/UsageLog/Agent` 에 `organizationId` FK 추가 (`prisma/schema.prisma:688` "별도 PR" 주석 해소) — D-bp-org-fanout 신규 결정 등재 동반 | M1 | 0.5d | cross-tenant 쿼리 누락 = 전 고객 노출 차단 |
| **B-azure-multi-tenant** | `src/lib/auth.ts:101` 의 `AZURE_AD_TENANT_ID` 단일 env → per-org `Organization.azureTenantId` + multi-tenant Azure AD provider 분기 | M1 | 1d | B-org-fanout-1 선행 |
| **B-legal-pages** | TOS / Privacy / DPA / PIPA 4 페이지 신설 + Blueprint 노출 | M1 | 1d | 법무팀 review 1회 필요 |
| **B-edge-rate-limit** | Blueprint API edge rate-limit (per-org, IP 보조). Cloudflare WAF 또는 next/middleware | M1 | 0.5d | — |
| **B-sentry-wire** | Blueprint + frame + hive 에 Sentry SDK + DSN secret + sourcemap upload | M1 | 0.5d | vault 에 SENTRY_DSN 등재 prereq |
| **B-matrix-docker-deploy** | matrix Docker compose full deployment — launchd 또는 systemd 자동 시작 등록 | M1 | 0.5d | [D-matrix-1](/ops/decisions) |
| **B-matrix-blueprint-mcp** | Blueprint 에이전트에 matrix MCP connector 등록 | M1 | 0.5d | [D-matrix-1](/ops/decisions) |
| **B-matrix-admin-retire** | `admin.axelabs.ai` → `axelabs.ai/matrix` 리다이렉트 + `axe-console-app` 컨테이너 폐기. Caddy ingress 변경 + DNS CNAME 제거 | M1 | 0.5d | matrix 가 console 데이터 전량 흡수 완료 (2026-05-23). 인증(Entra ID OAuth) 미구현 — 상태 보드 공개 또는 별도 auth gate 결정 필요 |
| **B-matrix-wan-monitor** 🔧 | matrix collector WAN/인터넷 가용성 모니터링 (`wan-gateway`/`wan-internet`/`wan-dns` + ISP 귀책 판별) — [D-matrix-2](/ops/decisions). **상태**: 코드 구현 완료 (matrix branch `feat/wan-monitor`, `cargo check` 통과) + docs draft 완료. **잔여 = 운영자 검토 → docs `axe ship` (D-matrix-2 origin/main 반영) → matrix `axe ship` (blue/green rebuild, NET_RAW+iputils-ping+env 3종) → `/matrix/api/status` 에서 wan-* 등장 + 강제 차단 테스트**. 시작점 = 댁내 wifi 민원용 wifi.log 분석 (`~/wifi-complaint/`) | M1 | 0.2d (ship만) | 2026-06-03, ship 대기 |
| **B-matrix-wan-report-tool** 🆕 | matrix `get_wan_report` MCP tool (D-matrix-2 v2) — `check_results` 에서 `wan-internet`/`wan-gateway` 전환을 읽어 **장애 구간 (start/end/지속) + 업타임% + 귀책** 을 ISP 민원 제출용 타임라인으로 출력. wifi.log 일회 분석 (2026-06-03 `~/wifi-complaint/`) 의 상시 자동화 버전 | M1 | 0.5d | [D-matrix-2](/ops/decisions) v2, B-matrix-wan-monitor 선행 |
| **B-netheal-install** ✅ | 인터넷 자가치유 데몬 — [D-matrix-4](/ops/decisions). **완료 (2026-06-04)**: pty 고갈로 sudo 불가 → `osascript ... with administrator privileges` 우회 설치, `com.axe.netheal` LaunchDaemon 가동 중 (PID 16331, `netheal started` 로그, 오발동 0), inventory.mdx 등재. **잔여(선택)** = 콘솔에서 실 WiFi-바운스 치유 1회 검증 (원격 ~15s 끊김) | M1 | ✅ | 2026-06-04 |
| **B-frame-runtime-invariant-test** | DB CHECK runtime test (entity_kind 위반·ownership all-or-none·bounds·link_kind 등 invalid INSERT 차단 검증) + sum invariant (active row sum(numerator)==denominator) | M2 | 0.5d | [D-ops-22](/ops/decisions) 후속. tests/test_shared_fund_domain.py 의 metadata test 외 runtime layer |
| **B-bp-workspace-entity-nm** | Blueprint `WorkspaceEntity` join migration — D-bp-entity-1 plan 의 `Workspace.entityId` scalar → N:M 수정 | M2, M3 | 1d | D-bp-entity-1 plan 수정 등재 |
| **B-bp-para-dispatch-spike** | Path B Spike — DB 변경 없이 단일 workspace 로 PARA dispatch 흐름 검증 (3~5일) | M3 | 4d | 본 구현 (Path A) 전 권장 |
| **B-hive-payroll-cell-compare** | 첨부 급여대장 셀별 정확 일치 검증 (axec/axev 4월·5월 데이터) | M4 | 1d | payroll v2 ✓ 검증 마지막 단계 |
| **B-hive-dkim-prod** | hive 메일 발송용 DKIM/DMARC DNS prod 확정 (Cloudflare API token 자동화 검증) | M4 | 0.5d | [D-hive-23](/ops/decisions) |
| **B-backup-restore-drill** | frame-postgres / blueprint-postgres / hive-postgres restore drill 첫 실시 + 회고 + 정기 cron. **부분진척 2026-06-03**: `axe drill`(D-config-14 restic canary) 메커니즘 강화 — snapshot freshness 검사(`--max-age-days`·`--strict`, silent backup-stop 탐지) + robust canary(non-empty+YAML parse, customers.yaml live-drift false-FAIL 해소; axe-cli `fc0f29f`). **잔여 = 본 항목 핵심**: frame/blueprint/hive **postgres 실제 restore drill + 회고** (restic 스냅샷은 DB Docker 볼륨 미포함이라 별도 pg_dump 기반 drill 필요) | M5 | 1d | [D-hive-backup](/ops/decisions), [D-config-14](/ops/decisions) |
| **B-mysrt-backup-decision** | mysrt-postgres 의 SRT 외부 SOT 여부 사용자 확인 → Tier A 합산 또는 보류 결정 등재 | M5 | 0.5d | — |
| **B-frame-observability** | frame `observability.py` 의 Prometheus percentile 계산 — 현재 TODO 상태 | M1 | 0.5d | `/Users/axe/frame/src/frame/observability.py` TODO 코멘트 |
| **B-frame-lpm-classify** | LLM classify pipeline (`raw_transaction → journal_line` 자동 분류) — 현재 `analyze_file_format` 만 존재. **ETA 3-단계 (2026-05-25 RE^4 회신)**: (a) **D+90 (2026-09-01) minimum viable** — LLM proposal + 운영자 confirm + commit, 정확도 60~80% (axe 백테스트), (b) **D+120 (2026-10-01) rule-based pre-classifier 결합**, 정확도 80%+, (c) **2026-12-01 stable** — axec/axev 1년 backtest + 회귀 green. Truvia D+30 사이클은 수작업 분개 (`/services/frame#신규-customer-1-차-사이클-runbook`) 로 보완 | **M2 (top)** | 누적 4-6 주 | `/Users/axe/frame/DECISIONS.md` M2 Phase C, 트루비아 RE^4 |
| **B-frame-fund-cross-journal** | 펀드 cross-entity mirror 분개 도구 (GP commitment / 운용보수 / 성과보수) | M2 | 2d | `/Users/axe/frame/DECISIONS.md` D-frame-N4. B-frame-cross-journal-link 선행 |
| **B-frame-vat-schema** | journal_line 의 VAT (부가세) 컬럼 계산 로직 — 현재 컬럼만 예약, 로직 0 | M2 | 1d | `/Users/axe/frame/DECISIONS.md` "VAT handling... but no logic yet" |
| **B-hive-phase2-spike** | hive Phase 2 (성과평가 OKR/KPI, AI 목표 추천) 기능 명세 SPIKE 문서 작성 | — | 3d | `/Users/axe/hive/DECISIONS.md` Phase 2 scope. 본격 구현 전 명세 |
| **B-hive-dispatch-channel** | hive 이벤트 채널 5개 추가 (`employee.hired/terminated`, `payroll.finalized`, `compensation.granted`, `blueprint.agent.*`) | — | 1d | `/Users/axe/hive/DECISIONS.md` KNOWN_INCOMING_EVENT_TYPES Phase 2 |
| **B-hive-compensation-validate** | hive compensation Phase 3 검증 — 현재 Phase 1 schema 만, Phase 3 tools 검증 조건 정의 | M4 | 1d | `/Users/axe/hive/DECISIONS.md` Phase 1=schema / Phase 3=tools |
| **B-bp-artifact-propose-api** | Blueprint `POST /api/artifact/propose` REST endpoint 신설 — **cross-service automation 용 generic surface**. axelabs platform 내부 worker / 외부 서비스 / 사용자 정의 automation 이 artifact propose 가능. body = ProposeInput JSON. Bearer `ARTIFACT_PROPOSE_TOKEN` AppSetting auth (service-account, NextAuth session 미요구). admin UI 의 NextAuth-gated `/api/admin/mcp-schemas/refresh` 와 별 surface. response = StoredArtifact JSON | M6 | 2d | [D-bp-artifact-1](/ops/decisions). 통합 자체의 도메인 결정은 각 호출자 측 별도 |
| **B-mysrt-srt-risk-review** | SRT 약관 위반 risk 재검토 (자동 예매 기능, 계정 정지 risk) + 운영 정책 재정의 | — | 0.5d | `/Users/axe/mysrt/README.md` "약관 위반... 계정 정지" |
| **B-ops-stack-consolidation** | docker-compose 7-stack 통합 운영 시작 (`~/.axe/axelabs/docker-compose.yml` 신설 + 12→7 마이그레이션) | M1 | 1d | [D-ops-20](/ops/decisions) |
| **B-bp-artifact-arch-doc** | Blueprint artifact + PARA 아키텍처 결정 문서 본격 작성 — D-bp-artifact-1~7 등재 후 implementation 결정 문서 (`Artifact` 테이블 정확한 컬럼 / Citation 6-kind resolver contract / PARA dispatch field-level engine / MCP tool 시그니처 / ctx 진화 path) | M6 | 2d | [D-bp-artifact-1](/ops/decisions) ~ [D-bp-artifact-7](/ops/decisions). 코드 0줄, ADR landing |
| **B-bp-artifact-citation-resolver** | Citation kind 별 resolver (onedrive / frame.* / hive.* / teams.message / mail.thread / external.web) — typed contract + 통합 read API | M6 | 3d | B-bp-artifact-prisma 선행 |
| **B-bp-artifact-dispatch-engine** | PARA dispatch field-level engine — Project artifact 종료 시 Area/Resource/Archive routing rule + 자동 분배 (LLM 제안 + 사용자 confirm). copy + link 2 mode 지원. M3 의 workspace-level dispatch (B-bp-para-provenance-fields) 의 field-level 진화 | M6 | 5d | M3 PARA Dispatch land 선행 권장 + B-bp-artifact-link-table |
| **B-bp-artifact-query-api** | Cross-PARA / cross-artifact / time-travel query — **MCP tool 위주** (`query_knowledge`, `get_artifact`, `list_artifacts` 등 [D-bp-artifact-7](/ops/decisions) Layer 2 정합). 웹 UI 만 최소 REST endpoint (curation UX). agent SDK 가 grep 대신 typed query | M6 | 3d | B-bp-artifact-citation-resolver 선행 |
| **B-bp-mcp-paraLayer-tools** | `list_projects` / `list_areas` / `list_resources` / `search_archive` 등 paraLayer 별 MCP tool 분리 — LLM intent clarity (tool name 자체에 paraLayer 의도 드러남). + `create_workspace(paraLayer, ...)` / `close_workspace(id, dispatch_plan?)` / `reclassify_workspace(id, new_paraLayer)` workspace lifecycle tool | M6 | 2d | [D-bp-artifact-6](/ops/decisions). B-bp-artifact-query-api 와 같이 진행 가능 |
| **B-bp-workspace-lifecycle-ui** | 4 paraLayer 별 UI 페이지 신설 — `/axe/projects` (기존) + `/axe/areas` / `/axe/resources` / `/axe/archive` (신설). 각 page 의 "+New Workspace" 가 paraLayer 그 page 에 고정. + "Close Project" / "Reclassify" / dispatch plan 모달. ARAClient 의 3-tab 폐기 (분리로 대체) | M6 | 5d | [D-bp-artifact-6](/ops/decisions). B-bp-artifact-prisma 선행 (paraLayer 컬럼 활성) |
| **B-bp-ctx-skill-evolve** | ctx skill 진화 — markdown PKM → artifact curation interface. flows: agent propose → ctx review → confirmed fact + audit. markdown 은 보조 (review UX, archive). 기존 ctx sync/review/status 3 mode 호환 유지 + artifact 모드 추가. **+ markdown → artifact 점진 migration mode** (LLM extract 시도 → ctx review queue 등재 → 사용자 confirm/edit/reject → confirmed artifact + 원본 entry `<!-- migrated: <id> -->` 마킹) | M6 | 5d | B-bp-artifact-query-api 선행. [D-bp-artifact-5](/ops/decisions) |
| **B-bp-ctx-migration-mode** | ctx review 의 markdown → artifact propose flow (점진 마이그레이션 UX) — review queue 에 migration_propose event 표시 + source markdown 발췌와 extracted typed fact 나란히 + confirm 시 markdown entry 에 archive 마킹 자동 삽입. B-bp-ctx-skill-evolve 안 포함될 수 있으나 UX 작업량 명시 분리 | M6 | 3d | B-bp-ctx-skill-evolve 와 같이 진행 |
| **B-bp-markdown-archive-marker** | migrated 마킹 표준 (`<!-- migrated: <artifact_id> -->`) — 어떤 markdown entry 가 어떤 artifact 로 변환됐는지 trace. ctx review confirm 시 자동 삽입 + grep tool (`ctx migrated-trace <markdown_path>`) | M6 | 1d | B-bp-ctx-migration-mode |
| **B-bp-knowledge-overview** | Knowledge Overview dashboard (`/axe/knowledge`) — 3-pane layout (4 layer count + state / Sankey flow 지난 30일 / Cross-PARA query 입력) + Area health alert (stale 30일, inactive 90일) + drill-down view (PARA flow over time / artifact graph / provenance trace) | M6 | 5d | B-bp-artifact-query-api + B-bp-mcp-paraLayer-tools 선행 |
| **B-bp-artifact-ic-pilot** | IC pipeline 첫 vertical pilot — 1 deal (Sentry 권고) 의 §재무 가 raw markdown 대신 `ICMemoArtifact` 의 typed fact read. before/after 토큰 측정 + IRR 결정론성 검증. M6 활성화 검증 datapoint | M6 | 5d | B-bp-ctx-skill-evolve 후. Stage 0 PoC 의 production 변환 |
| **B-index-blueprint-citation-kind** | Blueprint `src/lib/artifact/citations/index.ts` resolver 신설 — `index.*` kind 14 sub-type 의 stable ID → MCP call mapping. `index.financial_output` → `query_irr` / `index.deal` → `get_deal` 등 | M7 | 1d | [D-index-6](/ops/decisions) Phase 1 |
| **B-index-ic-skill-push-mode** | ic skill SKILL.md 에 신규 Rule 25 (`--push-to-index` mode) 추가 + 산출물 5종 (financial_model xlsx + scenario_deltas yaml + exit_matrix yaml + memo md + recap yaml) → index propose 자동화 script. ctx review queue 경유 | M7 | 2d | [D-index-8](/ops/decisions) Phase 1, B-index-phase0-mcp-tools 선행 |
| **B-index-frame-event-mirror** | pg_notify `index_events` channel (capital_call / valuation_recorded / exit_distributed) + frame 측 `frame-worker` LISTEN 추가 + cross_journal_link 분개 mirror. frame M2 의 commitment_ledger 정합 | M7 | 2d | [D-index-9](/ops/decisions) Phase 2, M2 의존 |
| **B-index-axev-fund2-frame-register** | frame 에 `axe_ia_002` (액스 투자조합 2호) 등록 — Iippo 2호 split 의 fund entity 가 frame 에 부재 (현재 axe_ia_001 만). `frame register-entity --id axe_ia_002 --kind kvf` + fund_meta JSONB 채움 | M7 | 0.2d | M2 frame 펀드 회계 + index Phase 0 prereq |
| **B-ic-push-mode-impl** | ic skill `--push-to-index` 5th mode 구현 ([D-index-11](/ops/decisions)) — SKILL.md Rule 25 + Step 5.5 (40-60 lines) + gate_memo.sh post-V_COUNT atomic propose dispatch (80-120 lines, idempotency_key 계산 + `propose_deal_closure` curl + polling) + orchestration-initial.md (50-80 lines) + build_3fs.py / calc_irr.py / postmortem_stub.py minor edits. 총 ~280-350 lines. **backward compat 100%** (flag 미사용 시 기존 동작). `ic/index_push_state/v(N).json` local checkpoint 도입 | M7 | 2d | [D-index-11](/ops/decisions), B-index-phase0-mcp-tools 선행 |
| **B-portfolio-mgmt-deprecation** | `portfolio-management` skill 3-phase deprecation ([D-index-12](/ops/decisions)) — Phase 0 (즉시) SKILL.md 에 deprecation notice + Blueprint suggest UI 에 marker / Phase 1 (M7 Phase 1 launch 후) KPI 표 → `pmc/references/kpi-catalog.md` copy + cross-link / Phase 2 (3개월 후) SKILL.md disable (Blueprint search 에서 미노출) / Phase 3 (6개월 후) archive (`.deprecated/` 이동). 점진 패턴 [D-bp-artifact-5](/ops/decisions) 정합 | M7 | 0.5d per phase | [D-index-12](/ops/decisions) |
| **B-investor-relations-deprecation** | `investor-relations` skill 3-phase deprecation ([D-index-12](/ops/decisions)) — portfolio-mgmt 와 동형. LP 보고 구조 + 펀드 성과 지표 → `pmc/references/ir-lifecycle.md` migration. Phase 0/1/2/3 timing 동일 | M7 | 0.5d per phase | [D-index-12](/ops/decisions) |
| **B-index-error-model-enum** | `src/index/error_model.rs` Rust enum SoT ([D-index-14](/ops/decisions)) — 12+ case (IdempotencyConflict / ValidationWarning / SchemaNotFound / CitationResolveFailed / FinancialModelLocked / DslSyntaxError / UnknownEnum / DealNotFound / FundEntityNotFound / ServiceUnavailable / RateLimitExceeded / InsufficientScope) + `impl From IndexError to McpErrorResponse` deterministic mapping. ic/pmc skill 측 `lib/index_client.py` (또는 동형) 의 code 별 분기 handler. unit test 가 모든 case 의 wire-level response 검증. silent fallback 절대 금지 | M7 | 1d | [D-index-14](/ops/decisions), B-index-skeleton-mirror 선행 |
| **B-index-integration-fixtures** | `/Users/axe/index/tests/fixtures/ic_integration_phase0.json` + `pmc_integration_phase1.json` + `cross_skill_regression.json` ([D-index-14](/ops/decisions), D-index-15 정합) — Iippo (1:N fund) + Sentry (option round) + Canopy (multi-round) 3 deal regression. ic_integration_phase0 assertion: `propose_deal_closure` 성공 + `compute_outputs(base)` IRR ±0.5pp vs ic `v(N).xlsx` cell J42 + citation roundtrip resolve. cross_skill_regression: 5 skill (ic/dd/vc-deal-sourcing/portfolio-management/investor-relations) 동시 propose → audit_trail 충돌 없음 + 마지막 silent overwrite 검출. PR merge gate (`axe test index --fixtures`) | M7 | 1.5d | B-index-phase0-mcp-tools + B-ic-push-mode-impl 후 |
| **B-index-mcp-checklist-extension** | [/architecture/mcp-server-checklist](/architecture/mcp-server-checklist) § 8 운영 14 체크포인트 → **21** 항목으로 확장 — skill 통합 5 항목 (#17 skill idempotency 2× call 409 검증 / #18 citation resolver roundtrip ±0.001 percent / #19 cross-skill conflict 시 audit_trail 또는 last-write-wins + warning modal / #20 graceful degradation: index 죽이고 ic 호출 시 markdown-only fallback / #21 schema evolution: 새 field 추가 시 old skill 호환). `axe test index --accept-gate` 명령 + 24h production monitor (error rate under 0.1 percent, citation cache hit over 95 percent) | M7 | 1d | B-index-error-model-enum + B-index-integration-fixtures 선행 |
| **B-index-vision-boundary-rule** | xlsx vision 보조 vs PDF vision 분리 룰 ([D-index-15](/ops/decisions) worst-case #2 차단) — index 의 `ingest_financial_model_xlsx` 는 xlsx sheet/row label 만 vision (LLM 보조 inference), numeric cell value 는 mechanical (Rust calamine) 파싱 강제, PDF (IR pack 등) 는 vision 불가 → ingest skill 의 markdown clone 만. dataroom IR PDF 의 "5,941원" 가 "5,941엔" 오인식 → DB authoritative cell 가 되는 worst-case 영구 차단. 본 룰 `/services/index/financial-model.mdx` 추가 + ingest tool 의 input validation (PDF blob 거부) | M7 | 0.3d | [D-index-15](/ops/decisions), B-index-phase0-mcp-tools 선행 |
| **B-index-proceeds-bridge-retrofit** 🆕 | [D-index-22](/ops/decisions) 후속 — Iippo·Canopy 의 `legacy_ev` → `ev_bridge` per-leaf 전환. 두 deal 은 EV-based 이나 per-leaf 에 exit_ev_krw/exit_net_debt_krw/exit_stake_pct 미itemize (validate Check 7 = legacy_ev WARN 2건). **작업**: (a) Canopy — `exit_assumptions` 의 net debt 300억(EqV 498억) 를 per-leaf 로 분해, 40+ leaf 각각 exit_ev + stake 도출 → axe_proceeds ±2% reconcile, (b) Iippo — asset-light net debt 0, 30+ leaf 에 exit_ev(=proceeds/stake) + stake; **동시에 entry-F/D-flat dilution 교정** (중간 라운드 희석 미반영 → exit_stake 를 round-별 희석 반영값으로 — proceeds 수 pp 과대 낙관 해소), (c) proceeds_basis=ev_bridge 변경 + re-ingest + IRR ±1pp regression. Sentry(equity_value)·pre-IPO 3(mom) 는 bridge N/A 라 대상 아님. | M7 | 1d | 2026-05-29 [D-index-22](/ops/decisions). **검토 후 보류** (2026-05-29 "정확도 심화" 세션): (a) Canopy 는 per-leaf 순부채가 **원자료에 없어** itemize 하려면 시나리오별 부채를 근거 없이 가정해야 함 ([D-index-22](/ops/decisions) "없는 부채 날조 안 함" 원칙상 불가) — 모델-level net debt 300억은 이미 명시·정확, proceeds/IRR 도 검증됨 (즉 현 데이터는 정확, itemize 만 미수행); (b) Iippo net_debt=0 이라 itemize 가 tautological (exit_ev=proceeds/stake 환원); (c) **dilution 교정은 [D-index-24](/ops/decisions) 와 충돌** (Iippo/Sentry 는 executed → 모델 사후 재작성 금지). 숫자 불변 + WARN→PASS 표현 rigor 만이라 효과 대비 위험 큼 → legacy_ev WARN 유지가 정직. 실 DD per-leaf 부채 데이터 확보 시 재개 |
| **B-index-skill-overlap-sunset** | [D-index-17](/ops/decisions) overlap 기간 종료 후 Blueprint mirror 측 `.claude/skills/{ic,ingest}` 제거. 3 sunset 기준 모두 충족 시: (a) 다음 3 deal IC 가 `index/skills/ic/` 기반 정상 작동, (b) Blueprint Claude Agent SDK 의 index/skills/ mount/sync 자동화 확립, (c) ic skill `--push-to-index` mode 일반화 ([B-ic-push-mode-impl](/ops/backlog)). 작업 = Blueprint repo `.claude/skills/ic` + `.claude/skills/ingest` 디렉토리 삭제 + Claude Agent SDK 가 index/skills/ 또는 MCP 로 fetch 하도록 변경. drift 0 검증 (sha256). 충족 안 되면 overlap 지속 | M7 | 0.5d | 3 기준 충족 후 |
| **B-index-skill-versioning-schema** | [D-index-17](/ops/decisions) Phase 2 — `shared.skill_resource` table + `index.skill_resource@1.0` schema. name + version + skill_md + scripts (JSONB) + references_md (JSONB) + domain + locked_at + superseded_by. Per-deal trace: `index.ic_decision.skill_version_used` field 추가 → "이 IC 메모는 ic skill v8.3 으로 작성" 영구 audit. Cross-deal "ic v8.3 vs v8.0 평균 IRR" 분석 가능 | M7 | 1d | [D-index-17](/ops/decisions) |
| **B-index-dd-vc-sourcing-ownership** | [D-index-17](/ops/decisions) Phase 1 후속 — `due-diligence` + `vc-deal-sourcing` skill 의 index 산하 이전 검토. 두 skill 모두 투자 도메인이지만 ic + ingest 보다 결합도 낮음. 별도 결정 필요 (D-index-? 신규) | M7 | 0.3d (검토) + 1h (이전) | [D-index-17](/ops/decisions) overlap 안착 후 |
| **B-index-ingest-structured-extraction** 🔧 ⭐ | **✅ L1 SHIPPED (2026-05-30, [D-index-41](/ops/decisions), blueprint PR #379 merged → `~/.claude/skills/ingest` v2)** — convert_xlsx v2 (`{stem}_xlsx.cells.json` + key_outputs 자동탐지 + Model Summary/Key Outputs md) + convert_pdf v2 (`figures.json`). Apposter 20-sheet model → 31 key outputs(Exit IRR 57.2%/MoM 8.60x/EV 270억) 자동 surfacing(이전 truncated 주석 매몰), test 40/40, 의존성 0. **+ ✅ L2-core artifact화 SHIPPED ([D-index-42](/ops/decisions), index `4ca5868`, blue/green live)** — ingest sidecars → proposed artifacts (`artifact`+`citation`+`artifact_event` op=propose, RLS index_app+GUC, idempotent). artifact store 0→35 (dormant 던 store 첫 가동). **+ ✅ lifecycle SHIPPED ([D-index-43](/ops/decisions), `3eece93`+`118568a`, blue/green live)**: Query API(`query_artifacts`/`get_artifact`) + ctx review(`confirm_artifact`/`reject_artifact`) + L3-lite `reconcile_artifacts`(metric spread flag) + L2 `draft_seed_from_artifacts`(보수적 scaffold — 날조금지 구조강제, draft non-ingestable). 6 신규 MCP tool, 27 test. **+ ✅ metric_kind 세분 ([D-index-44](/ops/decisions), blueprint PR #380 — valuation/multiple/moic 분리+curation) + lifecycle 회귀 스위트(8 test, audit 영속성 발견) SHIPPED**. **잔여 (축소, 📋): ctx review UI(Blueprint markdown-diff) · Query API → /ic·seed-building primary read path 통합 · 전 deal artifact화(현 Apposter 1) · L4 versioned diff**. **⭐ 중요 — ingest 고도화: 단순 md transcription → source-type-aware structured extraction** (사용자 2026-05-30 "IR·Excel 이 md 로 소화 안 되는 케이스 많음"). ingest 는 파이프라인 정문이라 여기 손실은 ic·index 에서 복구 불가 (GIGO). 현 md photocopy = L0. **L1 (즉시·저위험)**: source-type routing — xlsx→구조화(HTML table 또는 cell+merge JSON), IR deck(PDF/PPT)→페이지 이미지+vision, 일반 prose→md 유지. 사용자 체감 손실(Excel 표 구조·deck 차트)의 80% 해결. **L2 (핵심 레버리지)**: transcription→typed extraction — ingest 가 베끼는 대신 index typed 스키마를 채움 ([D-index-31](/ops/decisions) intake 5필드 series·round_size·committed·entry_date·pre/post + exit 가정 + cap table → seed·financial_model 초안 생성). 지금 사람이 dataroom 읽고 손으로 쓰는 seed yaml 을 ingest 가 초안 잡고 사람은 검토·confirm — 정문 자동화. **L3 (품질 배수)**: cross-source reconciliation — deck vs xlsx vs cap table 수치 불일치 flag (silently 택1 금지) + confidence 태그 (mechanical=high · vision-inferred=review). **L4**: versioned/idempotent 재ingest diff (v2 IR vs v1 변경점). **불변식**: ① 숫자는 항상 mechanical(calamine) → vision 은 정성·cross-check 만 ([D-index-15](/ops/decisions) vision-boundary 정합·확장), ② 원본은 항상 evidence blob 보존 (fidelity SoT, 클론은 파생·교체가능), ③ 추출 fact 마다 citation(page/cell) 자동 부착. **선행**: 구현 전 D-index 결정으로 설계 ratify (extraction-not-transcription + source-type-aware 명문화). 관련 [B-index-vision-boundary-rule](/ops/backlog). | M7 | L1 1d / L2 3-5d / L3 2d | 2026-05-30 사용자 "중요". [D-index-15](/ops/decisions)+[D-index-31](/ops/decisions) 위에서 진행, D-index 결정 선행 |

## 🆕 신규 (분류 안 됨)

> 발견했지만 아직 마일스톤·우선순위·owner 미정. 다음 정비 시 📋 로 옮기거나 [known-gaps](/ops/known-gaps) 로 강등.

| ID | 항목 | 발견일 | 비고 |
|---|---|---|---|
| **B-index-judgment-in-seeds** ✅ ⭐ | **완료 2026-06-03 ([D-index-46](/ops/decisions), index `8ec2c10`)** — seed.yaml 이 judgment 단일 SoT: per-seed `judgment:`(assumptions+calibrations) + `seeds/_corpus.yaml` + seed-ingest `--emit-judgment`(natural-name anchor→corpus id 해소, idempotent). 23 seed 마이그레이션 후 `backfill.rs`+`corpus.rs`(2824 LoC) 삭제. GATE: 재ingest +0 new · committed wipe→재현 byte-identical(42 dup citation pruned) · append-only intact · 51 test · validate-seeds Δ0. 신규 deal 자동 artifact화 — hardcode transcription 0. | 2026-06-03 ✅ | [D-index-46](/ops/decisions) |
| **B-index-epic2-confidence-load-bearing** 🆕 | [D-index-45](/ops/decisions) Epic 2 — confidence 를 장식→load-bearing. 입력 assumption 신뢰도를 출력(E[CF]·E[MoM])으로 전파: 미확정/저신뢰 가정 위 딜은 저신뢰 플래그. provenance 위 confidence rollup. epistemic 차별점 심화. | 2026-06-03 | M7, 2-3d |
| **B-index-epic3-self-calibrating-loop** 🆕 ⭐ | [D-index-45](/ops/decisions) Epic 3 (북극성) — prediction→outcome→recalibration. IC 시점 calibrated E[CF]/P(loss) 를 불변 `prediction` artifact 로 freeze → 실제 outcome(exit·후속·writeoff) 포착 → deal-class 별 예측-실제 bias 노출(체계적 낙관/비관) → 다음 IC 자동 보정. base-rate corpus(현 35 comp+5 base_rate) 누적. Palantir 가 안 주는 복리 자산. **outcome-capture 는 B-index-postmortem-loop 가 공급.** | 2026-06-03 | M8, prediction freeze 선행 |
| **B-index-pmc-operational** 🆕 ⭐ | [roadmap M7 Phase 3](/ops/roadmap) — pmc(Post-Money Care) 운영 파이프라인. 현재 pmc 는 skill skeleton([D-index-12](/ops/decisions)) + P3 에서 blueprint mirror 됐으나 **index persistence 미구현**. 8-agent 분기 cycle(KPI/risk/NAV/postmortem) → `index.portfolio_kpi`·`risk_alert`·`valuation_snapshot`·`postmortem` typed fact + pmc `--push-to-index`. IC결의~Exit(5년+) 포트폴리오 케어 phase. | 2026-06-04 | M7 Phase 3 |
| **B-index-postmortem-loop** 🆕 ⭐ | [roadmap M7 Phase 3](/ops/roadmap) — post-mortem 루프: ic `postmortem_stub` → reminder cadence → pmc fill → `index.postmortem`(IC 예측 vs 실제 회고). **Epic 3 의 outcome-capture leg** — prediction(freeze)과 짝이 되어 self-calibrating 루프를 닫음. ic postmortem_stub/reminder(투자 phase) + pmc fill/render/push(care phase) 2-track([D-index-12](/ops/decisions)). | 2026-06-04 | M7/M8, Epic 3 짝 |
| **B-index-evidence-durability** ✅ v1 ⭐ | **v1 완료 2026-06-04 (index `b273979`, deployed)** — citation `sha256` content-anchor(범용·무의존) + Blueprint-id 필드 readiness(`workspace_id`/`driveItemId`/`marker`/`rel_path`). `CitationAnchor`+`is_durable`(durable = sha256 OR drive_item_id OR workspace_id+rel_path) · ingest sidecar sha256 emit + **propose-time fallback hashing**(skill 무변경에도 durable) · `verify_citations(deal?)` MCP tool · 현황 페이지 "citation durability %" 라인. additive(기존 357 artifact/545 citation byte-identical) · 80 test · validate-seeds Δ0 · 공개 페이지 누출 0. 폴더 이동·삭제 분석 + 운영자 "workspace unique id" 제안에서 도출. | 2026-06-04 ✅ | [D-index-45](/ops/decisions)/47 |
| **B-index-evidence-durability-v2** 🆕 | [roadmap M7 Phase 3](/ops/roadmap) — v1 deferred 잔여(cross-repo): ① 기존 545 path-only citation **backfill**(resolvable source hash→ref 에 sha256 merge, 또는 deal 별 재ingest) ② **Blueprint resolve API**(stable id→현 위치, sync 갱신) ③ `driveItemId`/`workspace_id` 채우기(Blueprint `Workspace` 쿼리) ④ ic/ingest skill blueprint mirror(런타임이 sidecar sha256 emit). v1 schema/predicate 가 이미 수용. | 2026-06-04 | M7 Phase 3, cross-repo |
| **B-index-skill-p1-stamp** ✅ | **완료 2026-06-03 ([D-index-47](/ops/decisions), index `11aca12`, deployed)** — `artifact_event`(op=propose).payload_after 에 `_provenance`(skill·skill_version·bundle_sha256·schema_envelope_version·frozen_enums_hash·actor·surface) 스탬프 + propose 시 schema-drift hard gate(불일치→`SCHEMA_CONTRACT_DRIFT`, insert 전 fail-closed). frozen_enums_hash=`3b58b4b0…`(전용 SoT fn, pinned tripwire test) + /index/schemas 가 publish(ic-push discover+pin). 66 test(+17) · additive(기존 357 untouched, append-only 라 retro-stamp 불가) · validate-seeds Δ0. live: 드리프트 probe→SCHEMA_CONTRACT_DRIFT(무오염). | 2026-06-03 ✅ | [D-index-47](/ops/decisions) |
| **B-index-skill-p2-ci-mirror** ✅ ⭐ | **완료 2026-06-03 ([D-index-47](/ops/decisions), index `6edf0ff`)** — ⭐ **"런타임 fix" 는 이미 달성**(P0 + 기존 sync): ic/ingest 가 index SoT↔blueprint origin/main↔런타임 전부 byte-identical(attest: ic `cb9b9ec`/ingest `7d09bcd` IN-SYNC). 그래서 P2 = content push 아닌 **메커니즘**: `index-skill-sync.py`→`--attest`(deterministic dir-sha256 drift sentinel, advisory) 재범위(깨진 byte-delivery 제거) + `index-skill-mirror.sh`(미래 미러, sanctioned PR flow, pmc fail-closed 거부) 빌드. **blueprint 무쓰기·무push·무PR**, pmc 보류(P3). | 2026-06-03 ✅ | [D-index-47](/ops/decisions) |
| **B-index-skill-sync-wrapper-retire** ✅ | **resolved 2026-06-03 — neutralized by P0** — `blueprint/scripts/sync-index-skills.sh` 는 (a) origin/main 에 없음(untracked local-only) (b) 호출하던 launchd `ai.axe.index-skill-sync.plist` 가 P0 에서 폐기 → **invoker 0 = 무해**. 물리 파일은 blueprint working-tree 의 untracked 파일(병렬 세션 활성 편집 중 — re-point 가능성) → index scope 밖, blueprint tree owner 가 rm/re-point. index-side action 불필요. | 2026-06-03 ✅ | [D-index-47](/ops/decisions) |
| **B-index-skill-p3-contamination-purge** ✅ ⭐ | **완료 2026-06-03 ([D-index-47](/ops/decisions), blueprint PR #381 gate + #382 pmc, both squash-merged origin/main)** — 8 투자 skill(ic·ingest·due-diligence·vc-deal-sourcing·investor-relations·portfolio-management·legal-compliance + pmc)에 `owner:index` 태그 + boot(`start.sh`)/webhook(`route.ts`) 양 경로 gate(customer `services.index` 판정 → 비-index `rm -rf`+skip purge, index keep). **axe 3중 안전**(services.index + `:-axe` 기본 + fail-safe keep + 운영자 skills-sync.sh ungated → simul KEEP 16/16) · realchoice/Truvia PURGE 7/KEEP 9 · `customers.ts customerHasService` + test 21/21 · tsc 0. pmc(index-only)도 base 로 mirror(gated→axe 만). **운영자 잔여**: Truvia `BLUEPRINT_CUSTOMER_ID` 확인 + 컨테이너 재기동(boot gate 가 purge) + R7 DB residue(assigned skill row). rollback=revert(axe 무영향). | 2026-06-03 ✅ | [D-index-47](/ops/decisions) |
| **B-index-skill-owner-frontmatter** 🆕 | [D-index-47](/ops/decisions) follow-up — ic/ingest/pmc SKILL.md frontmatter 에 `owner: index` 추가(현재 `INDEX_OWNED.txt` manifest 가 de-facto SoT, frontmatter 미기재). drift-guard 가 frontmatter 키로 동작 시 필요. blueprint mirror PR 동반. | 2026-06-03 | 소, P2 동반 |
| **B-index-ic-screen-mode** 🆕 | [D-index-36](/ops/decisions) 후속 — `/ic` skill 에 lightweight **screen-mode** 통합. 현재 Screening 게이트는 수동(Claude best-effort: 외부 리서치 5종 + research-calibrated 재무모델 + engine IRR(E[CF]) + premortem 가정라벨). 이를 `/ic --screen`(또는 stage 자동감지)로 정규화: 19-agent full 대신 축약 파이프라인(market/competition/comps base-rate research + financial model + premortem-critic + screen-memo synthesist), **dataroom 불요**(teaser/1-pager 입력), 산출 = ic/memo screen + research + finance + index 적재(stage='Screening'). DD 전환 gate(조건) 명시. 첫 수동 사례 = 에듀온([D-index-36](/ops/decisions)). | 2026-05-30 | M7, 1.5d. ic skill 4-mode(INITIAL·REVISION·APPEND·FINALIZE)에 SCREEN 추가 |
| **B-hive-compensation-adjustment-impl** ✅ | hive `compensation_events.adjustment` 정식 MCP 도구 구현 — D-hive-17 후행 leg 완성. **2026-06-01 완료 ([D-hive-29](/ops/decisions))**: `compensation_event_adjustment_create(employee_id, period_label, line_kind, delta_krw, reason, evidence_url?)` admin scope. 페이슬립 line append + 합계 보정 + `compensation_events.adjustment` audit row + `hive.payroll.event` (subtype=adjustment) 발행. `compute_period` UPSERT-with-gates 의 case C/D/E (발송됨/지급됨/역분개됨) skip 케이스의 정공법 정정 경로. `delta_krw` 부호 = `line_items.amount_krw` 부호 (공제 460원 증가 = -460). 발송된 페이슬립 정정 시 직원 메일 ≠ DB → 운영자 재발송 책임 (운영 절차). | 2026-05-30 → 2026-06-01 ✅ | [D-hive-17](/ops/decisions) + [D-hive-29](/ops/decisions) |
| **B-frame-payroll-event-consumer-adjustment** 🆕 | frame consumer-worker 측 `hive.payroll.event` LISTEN + subtype='adjustment' dispatch → 인건비 정정 분개 자동. [D-frame-1](/ops/decisions) pending_payroll 패턴 정합 (이중 분개 위험 0). [D-hive-29](/ops/decisions) 동반 — hive 측 event 발행 ✅ but consumer 측 미구현. 본 leg 없으면 frame 분개 ≠ hive 페이슬립 차액 누적. | 2026-06-01 | M3, 1.5d. [D-hive-29](/ops/decisions) |
| **B-hive-adjustment-auto-redispatch** 🆕 | `apply_adjustment` 직후 `send_payslip_email` 자동 호출 (`auto_redispatch=True` default) + 메일 본문 템플릿에 정정사유·차액·새 net 표시 (정정명세서 전용 템플릿 `payslip_adjusted.j2`). 운영자가 "정정 → 재발송" 두 step 잊지 않게. 직원 메일 (옛 net) ≠ DB (새 net) 정합 갭 해소. | 2026-06-01 | M3, 1d. [D-hive-29](/ops/decisions) |
| **B-hive-adjustment-operator-alert** 🆕 | `apply_adjustment` 직후 Blueprint Teams DM 운영자 알림 (`payslip 정정 ps#<id> 직원 <name> <delta>원 — 재발송 자동 ✅ / 운영자 확인 필요 ⚠️`) — `auto_redispatch` 실패 / 차액 송금 필요 시 강조. | 2026-06-01 | M3, 0.5d. [D-hive-29](/ops/decisions) + B-hive-adjustment-auto-redispatch 후속 |
| **B-hive-payroll-base-policy-decision** 🆕 | hive `compute_period` 의 4대보험 base **일할 케이스 정책 결정** — 현재 [D-hive-29 룰 K](/ops/decisions) 로 base = `reported_income_*_krw` (보수월액), 값은 R(과세표준)과 같게 set 정책. **정액 케이스**: 보수월액 = R → 결과 일치. **일할 케이스** (신규 입사·중도 퇴사): R(일할 적용된 변동값) vs 보수월액(고정값) → 결과 다를 수 있음. 예: 강태훈 axev 2/19 입사 → 2월 prorate. compute_payroll_v2 가 `taxable_total` 에는 prorate 적용 (= R 변동) 하는데 base = reported_income 사용 시 보수월액 고정값으로 NPS/NHIS 계산 → 일할 적용 안 됨. **요구**: 일할 케이스 시뮬 + 회계법인 cross-check (NPS/NHIS 공단 정합 = 일할 시 보수월액도 비례 조정? 또는 고정?) → 룰 K 보강 결정 (예: 일할 비율을 보수월액에도 곱 적용 vs 보수월액은 항상 고정). | 2026-06-05 | M3, owner: 강수훈 dev. 우선도 🟡 중간 (현재 정액 결과 정합이라 시급 X). [D-hive-29](/ops/decisions) 룰 K 후속 일할 정책 |
| **B-index-ingest-pipeline-candidates** 🆕 | 2026-05-30 데이터룸 스캔 발견 — index 미적재 deal 중 **IC 완료 후 적재 대상**: **Prj_Render** (dataroom + ic 스캐폴드 有, IC 메모 미완 → 메모 완료 시 적재), **Prj_Whale=위시켓** (보유 포폴 — 세무조정·주식이관·주총·등기 admin docs 만, 원 IC 재무모델 확보 시 적재). 비대상: 델리후레쉬(RFP 제휴건), Pipeline 잔여(Curi AI·엘리시움 등 — 미screen). **적재 완료** (7-deal): Interstellar(10th, PASS)·에듀온(11th, Screening PASS [D-index-36](/ops/decisions))·EGA(12th, IC)·수성별(13th, Passed)·Nanora(14th, full IC, [D-index-37](/ops/decisions))·**디벨로퍼그룹(15th, buyout-class)·유비랩(16th, Screening)** ([D-index-38](/ops/decisions), 2026-05-30). 나머지 Pipeline 은 screen 또는 IC 시 D-index-36/21/24/26 프로토콜 적용. **Prj_Render = 리얼초이스/트루비아** = 2026-05-30 best-effort SCREEN 완료 → 적재 (23rd, [D-index-40](/ops/decisions), par-entry cheap-option). ⭐ **별도 Archive batch** (`1_Project (Archive)`): Medistaff·Open Research·JS E&L·Catalyst·데이톤·Apposter 6건 = [D-index-39](/ops/decisions) 적재 (17~22th, 전부 미투자/correctly-avoided). **⛔ 데이터룸 소진 (DB 23)** — 잔여 = Prj_Whale=위시켓(executed 포폴이나 원 IC/재무모델 부재, **자료 확보 시 적재**) · Purple AI/TR Corp/엘리시움(DHP 빈 폴더, 자료 입수 시 screen) · 이노씨앤에스/Curi AI/가람봇/딥트리/블루밍(thin lead). 비-딜: Prj_Artemis(AXE 자체 제품)·델리후레쉬(RFP). | 2026-05-30 | M7, deal당 ~1d (screen) / DD 시 full /ic |
| **B-blueprint-broadcast-mail** 🆕 | Blueprint `/api/admin/broadcast-dm` (Teams DM) 와 동급의 **실 SMTP/Graph email broadcast REST 추가** — `/api/admin/broadcast-mail`. 본 use case = 운영자가 임직원 1:N 공지 시 Teams DM 외에 이메일도 발송 필요한 경우 (외부 회계법인 cc / 감사 audit trail 보존 / 비-Teams 사용자 대비). `sendEmail()` 함수 (`src/lib/graph.ts:412`) + Mail.Send permission 이미 보유 — REST wrapper 만 추가하면 됨. Auth 동일 `CRON_SECRET`. 운영 정합 = [/ops/runbook/operator-broadcast](/ops/runbook/operator-broadcast) 의 함정 표 그대로 적용. 사용 빈도 추정 = 분기 1-2회 (vault 공지 / 신규 customer launch / 시스템 변경). 본 작업 ROI = 작음 (Teams DM 으로 대부분 충분), 다만 audit trail / 외부 cc 가 본질 필요한 deal 결정 발생 시 즉시 우선순위 ↑. **2026-05-29 update**: MCP `send_mail` ([D-bp-mcp-mail-1](/ops/decisions)) 가 agent/connector 의 단발(1:N 임의 수신자 포함) 발송 + `MailSendLog` audit + 외부 cc 를 이미 커버 — 본 항목은 이제 **운영자용 REST bulk broadcast** (CRON_SECRET auth, 비-MCP 트리거) 한정으로 축소, ROI 더 작아짐. | 2026-05-26 | M5, 0.3d |
| **B-axe-secret-prompt-store-cli** 🆕 | `axe secret prompt-store <name> --collection X --uri ... --username ...` CLI subcommand 신설 — [vault-secret-capture](https://github.com/axelabs-ai/blueprint/blob/main/.claude/skills/vault-secret-capture/SKILL.md) skill 의 osascript hidden-dialog + vault item 저장 패턴을 한 줄 명령으로. 사용 빈도 (PAT 발급 / API key 등록 / OAuth client_secret 회전 등) 증가하면 진행. 본 작업 ROI = 중간 (skill 로도 충분, CLI 화 = 운영자 본인 typing 짧아짐). | 2026-05-26 | M3, 0.3d |
| **B-dev-platform-dns-placeholder-cli** | `axe customers dns-placeholder <id>` — Cloudflare DNS API 로 `<id>.axelabs.ai` 의 CNAME stub 추가 (tunnel target). vault token (`Cloudflare API - axelabs`) 가 zone DNS Edit 보유 — 즉시 가능 | 2026-05-23 | 1시간 추정 |
| **B-dev-platform-customer-deploy** | `axe customer deploy <id>` — D-dev-platform-2 후속, customer macmini side. SSH (Tailscale/Cloudflare Tunnel) 로 customer 머신 진입 → Docker stack (frame/hive/blueprint blue/green + postgres + caddy) 배포 + cloudflared tunnel 등록 + customers.yaml 동기화. realchoice 첫 실 운영 | 2026-05-23 | b5 — 2-3시간 추정. M1-M2 |
| **B-dev-platform-user-add-cli** | `axe user add <email> --customer <id>` — Phase 1 강태훈 setup (macOS user + SSH key + Vaultwarden item + GitHub collaborator + Cloudflare Access policy) 의 자동화. 본 PR 의 강태훈/Soohun 수동 절차 1 명령으로 | 2026-05-23 | Phase 1 의 반복 가능 형태 |
| **B-axe-pat-rotation-cron** | GitHub PAT (axe-labs-ai, 90일 TTL) + Cloudflare token + 기타 vault secret 의 만료 D-7 launchd alert (D-bp-alert-1 패턴) + `axe secret rotate <path>` end-to-end 회전 명령. D-dev-platform-4 의 운영 prereq | 2026-05-23 | 0.5d |
| **B-dev-platform-host-rebuild-doc** | axe-macmini 전체 host 재구성 시 본 세션의 multi-user setup 재현 자동화 — sudoers + dev group + macOS users + sshd_config drop-in + Cloudflare tunnel + Vault. ad-hoc script 가 아니라 도구화 (e.g. `axe host bootstrap`) | 2026-05-23 | 1d |
| **B-axe-host-inventory-cli** | `axe host inventory` — 본 머신 13 layer ([ops/host-setup](/ops/host-setup)) 의 현재 값 자동 수집 + docs 의 표 와 drift detect → markdown report. 신규 머신 진단 + 본 머신 정기 audit (launchd cron) | 2026-05-23 | 1d. D-host-setup-1 후속 |
| **B-axe-host-bootstrap-cli** | `axe host bootstrap` — 신규 macmini 의 layer 1-13 자동 setup. inventory CLI 의 reverse — 본 머신 현 값을 reference 삼아 신규 머신 동일 상태로. layer 0/6/12 (Hardware/Entra/OneDrive) 는 manual prompt, 나머지 자동. Tailscale invite + Cloudflare tunnel UUID 발급 + sudoers + SSH + Docker stack + launchd + git config 모두 1 명령 | 2026-05-23 | 3-5d. realchoice 본격 onboarding 의 핵심 prereq |
| **B-axe-pty-max-launchd** | `kern.tty.ptmx_max=511` 한도 → 2047 로 늘림 + launchd plist 로 boot 시 자동 적용 (sudoers `/usr/sbin/sysctl` 추가 필요). Claude Desktop PTY leak 같은 함정 영구 차단 | 2026-05-23 | 0.3d. ops/host-setup 의 알려진 함정 |
| **B-claude-desktop-pty-leak-track** | Claude Desktop app (`/Applications/Claude.app/Contents/MacOS/Claude`) 의 PTY leak. **재발 확정 — 2026-05-26 D-bp-mcp-calendar-2 ship 중 `forkpty: Device not configured` (ENXIO) 로 새 터미널 차단** (43일 가동 누적, 511 한도 도달). `lsof /dev/ptmx` 결과 = Claude.app PID 가 fd 43,44,46,88,89,92,94,98,99,102+ 점유. userspace zsh 좀비 (82개 누적, Claude Code subprocess) 정리해도 해소 안 됨 = Claude.app 본체 leak 확정. macOS `kern.tty.ptmx_max` 가 511 초과 거부 → sysctl raise 무효 → Claude.app 종료/재시작이 유일한 fix. **Anthropic 측 issue 제기 (5/26 재발로 1주 모니터 기간 단축, B-claudeapp-fd-leak-anthropic-report 로 split)** | 2026-05-23, 2026-05-26 재발 | 모니터 → 리포트 |
| **B-blueprint-user-add-entra-oid** | Blueprint `User` 테이블에 `entraOid` 컬럼 추가 (NextAuth Azure AD callback 에서 `account.providerAccountId` 또는 `profile.oid` 저장). 현재 `User.id` = Prisma cuid 라 Graph `/users/{key}` 호출 시 UPN/email 만 사용 가능. 미래 Graph endpoint 중 oid 만 받는 것 (event subscription, change notification 등) 대응. D-bp-mcp-calendar-2 의 send-as 함정 발견 직접 결과 ([/ops/known-gaps#blueprint-user.id-≠-microsoft-entra-oid](/ops/known-gaps)) | 2026-05-26 | 0.3d (schema migration + auth callback 갱신 + 백필 1회) |
| **B-msal-cache-flush-on-consent** | Azure App admin consent 직후 MSAL `acquireTokenByClientCredential` 의 in-memory 토큰 캐시가 옛 (insufficient-scope) 토큰 계속 반환하는 함정. 현재 우회 = blueprint-app 컨테이너 수동 재시작 (전체 MSAL instance 폐기). 영구 fix 후보: (a) `getMsalApp()` 의 캐시 invalidation hash 에 "last admin consent timestamp" 같은 외부 signal 포함 — Azure CLI 의 admin-consent 명령 후 운영자가 `axe blueprint touch-msal-cache` 한 줄 실행, (b) `acquireTokenByClientCredential({ skipCache: true })` 를 매 호출 사용 (성능 영향 검토), (c) MSAL 의 `clearCache()` API 호출하는 admin endpoint 신설. (a) 가 가장 간단. ([/ops/known-gaps#msal-acquiretokenbyclientcredential-토큰-캐시](/ops/known-gaps)) | 2026-05-26 | 0.5d |
| **B-frame-cross-check-workflow** | 외부 회계법인 cross-check workflow — frame 의 monthly trial_balance / income_statement export + 회계법인 회신 매칭 + adjustment 분개 자동 생성. hive payroll L2 패턴 mirror. Truvia 측 외부 회계법인 협의 결과 회신 시 본격 등재 (사내 협의 진행 중) | 2026-05-25 | M2, 1d (회신 후) |
| **B-customer-deploy-generalization-phase3-3rd-customer** | B-customer-deploy-generalization Phase 3 잔여 — 3rd customer dry-run (realchoice 이후 다음 신규 customer 의 self-deploy 검증). Phase 1 + Phase 2 (realchoice D-day) ✅ 2026-05-25/26. 3rd customer 사례 발생 시 axe CLI flow 재현성 확인 + 추가 함정 발견 시 R6+ phase 등재 | 2026-05-25 | M2, 0.5d (3rd customer onboard 시) |
| **B-cf-token-rotation-2026-05-25** | Cloudflare API token (`Cloudflare API - axelabs`) 의 실제 값이 본 세션 transcript (axe secret get 출력) 에서 평문 노출. 토큰 가치 = 도메인 zone DNS Edit 권한 = 운영자 측 인프라 통제. 회전 권장: Cloudflare dashboard → API token → revoke + 신규 발급 → `axe secret push CLOUDFLARE_API_TOKEN ...` | 2026-05-25 | M1, 0.3d |
| **B-realchoice-d-plus-checklist** | realchoice 측 후속 회신 (RE^2 §7): vault 데이터 마이그레이션 plan (D+7), 마케팅 에이전트 10 → Blueprint Agent row 매핑표 (D+7), nemotron-personas 라이선스/origin (D+14), 2026 4Q 회계 병행 인력 분배 (D+30). 각 회신 시점에 docs / customers.yaml / Blueprint Agent row 반영 | 2026-05-23 | M1-M2, 각 0.5d (회신 후) |
| **B-magnet-tenant-env-injection** | `axe ship magnet --customer <id>` 가 `customers.yaml.service_tenant_map.magnet` 에서 `MAGNET_TENANT_SLUG`/`MAGNET_TENANT_ID` 자동 주입. 현재는 service operator 가 .env.local 수동 편집. D-magnet-tenant-map-1 후속 | 2026-05-23 | M1, 0.5d |
| **B-nemotron-catalog-promote** | Truvia 측 D+14 라이선스 회신 후, cross-customer OK 면 `/services/nemotron-personas` placeholder 본격 보강 + Blueprint MCP registry 등재. cross-customer X 면 `customers.realchoice.private_services[]` 신설 + 라이선스 박스 명시 | 2026-06-15 | M1, 0.5d |
| **B-operator-bus-factor** | 운영자 SPOF (인력 1 명만 운영 가능) 해소. 2 인 이상 운영 가능 + cold SSD paper memo 분리 ownership + 분기 drill. 트루비아 측 보고서 (RE^2 §Q8) 가 drill 동참 의사 명시 — 분기 drill 일정 사전 통보 약속 | 2026-05-23 | M5, 2d |
| **B-container-name-customer-prefix** | `frame/docker-compose.yml:197 (axe-frame-proxy)`, `hive/docker-compose.yml:124 (axe-hive-proxy)`, `vault/docker-compose.yml:29/66 (axe-vaultwarden, axe-vault-caddy)` 의 container_name 이 `axe-` prefix 박혀 있음 — customer-per-macmini 격리로 충돌 없으나 realchoice macmini 에 `axe-frame-proxy` 가 떠서 misleading. `${CUSTOMER_PREFIX}-` 변수화 또는 customer-agnostic 으로 정규화. 트루비아 측 첫 보고서 직접 지적 (2026-05-23). 운영 영향 0, docs/도식 명확성 中 | 2026-05-23 | M1, 0.5d |
| **B-axe-labs-ai-2fa** | axe-labs-ai GitHub 계정 2FA 강제 활성 — Settings → Password and authentication → Two-factor authentication. PAT 분실/유출 시 추가 보호 layer. ai@ 자동화 영향 0 (PAT 는 2FA 우회) | 2026-05-23 | 0.1d. 운영자 5분 |
| **B-hive-send-202605** | axev 2026-05 실 메일 발송 (`payroll_send_all_payslips dry_run=false`) — **2026-05-28 hive MCP 검증 결과 partial**: 강태훈 ✅ sent (send_log id=6, channel=graph_api, status=sent, 2026-05-25T15:11:51), 한진우 ❌ pending (RRN 등록 선행 [B-hive-hanjinwoo-rrn]). DKIM/DMARC live 검증된 상태. 한진우 RRN 입력 후 본인분 send 실행 시 본 항목 ✅ 가능 | 2026-05-22 | period_id=4 |
| **B-hive-mark-paid-202605** | axev 2026-05 KB 일괄송금 + `payroll_mark_paid`. hive event 발행 → frame-worker pending_payroll INSERT 예약 | 2026-05-22 | D-frame-1 흐름 |
| **B-frame-ingest-kb-202605** | KB 거래내역 download → frame.ingest_kb_* → `match_pending_sweep` 자동 매칭 분개 생성. matching principle 검증 cycle 1번째. **2026-05-28 frame MCP 검증**: axec raw_transaction 일부 존재하나 전부 `journaled=false` (+ 0원 카드 가승인/취소 noise) — 실 KB 거래내역 download + matching cycle 미수행 = pending | 2026-05-22 | D-frame-1 |
| **B-hive-202604-recon** | axev 2026-04 cycle 산출 + mark_paid (강수훈 정산 24,660 환급 분개 발행) | 2026-05-22 | 정산-only payslip 분기 코드 ready |
| **B-hive-hanjinwoo-rrn** | 한진우 주민번호 별도 보안 채널 수령 + `complete_onboarding(national_id)`. 4대보험 신고 전 필수 | 2026-05-22 | D-hive-18 |
| **B-frame-axev-resolution-ktx** | 강태훈 임원 보수 axev 이사회 결의서 등록 (`frame.axev.internal_resolution`) + award.resolution_id backfill | 2026-05-22 | 감사 추적 |
| **B-hive-simplified-tax-import** | 국세청 2026 간이세액표 정확 import. 현재 placeholder 근사식 + 강태훈/한진우 ground truth row 만 정확 | 2026-05-22 | D-hive-21. 다른 직원 임금 시점에 발견 risk |
| **B-hive-reported-income-axev** | axev 보수월액 신고치 확정. 현재 4,186,222 (연금) / 4,022,567 (건강) 추정 → 실 4대보험 신고서 cross-check | 2026-05-22 | D-hive-21 |
| **B-hive-golden-ci** | tests/payroll/golden_axec_2026_04.json 자동 CI 가동 (현재 수동 검증만). 산식 회귀 방지 | 2026-05-22 | D-hive-21 |
| **B-hive-phase4-wage-tax** | 원천세 자동 신고 자료 + 4대보험 EDI + 퇴직금 + 연말정산 + 연장/야간/휴일 + 연차수당 | 2026-05-22 | Phase 4 scope |
| **B-axelabs-ai-live** | `axelabs.ai` 도메인 라이브 배포 — Cloudflare Tunnel DNS (apex + www) + cloudflared ingress + `docker compose up -d --build`. `/Users/axe/axelabs/` 의 Next.js standalone 컨테이너 (host:3900). 회사 홈 + `/ui` 쇼케이스 동시 노출 | 2026-05-22 | docs.axelabs.ai 와 동일 패턴. `/Users/axe/axelabs/DEPLOY.md` 참고 |
| **B-axe-ui-blueprint-migrate** | Blueprint 가 `@axe/ui` 채택 — `pnpm add git+ssh://...axelabs#v0.1.0` + `transpilePackages: ["@axe/ui"]` + globals.css 의 토큰 import 로 교체 + Fontshare `<link>` 정리. 기존 globals.css 와 `@axe/ui` 토큰의 시각 차이 회귀 점검 | 2026-05-22 | B-axelabs-ai-live 선행 권장 (production tag 가 있어야 핀 가능). 첫 외부 소비자 검증 |
| **B-axe-ui-v0.1-tag** | axelabs 레포에 `v0.1.0` git tag — 외부 소비자들이 핀할 stable 버전 시작점. tag 직전 build/typecheck 통과 + axelabs.ai 라이브 확인 | 2026-05-22 | B-axelabs-ai-live 후 |
| **B-axe-ship-update-hook** ✅ | **DONE 2026-06-03** (axe-cli `aa43d4a`): `cmd_ship` post-deploy hook — updates.mdx Ship Log 자동 stub(멱등, backtick-hash) + `--no-update-hook`. 전체 guarded(ship 안 깸), 배포 성공 후만. **단 backlog 자동 promote 는 surfacing-only**(🔧 항목 제안 출력) — markdown 행 자동이동은 fragile 해 제외, true 자동화는 [B-axe-backlog-promote-cli](#-신규-분류-안-됨) 선행. [D-docs-updates-1](/ops/decisions) Phase 2 | 2026-05-22 | done: Ship Log 자동화 |
| **B-axe-cli-git-track** ✅ | **DONE 2026-06-03**: `~/.axe/bin` 제자리 git-init(코드-only, 비밀은 ~/.axe 루트라 범위 밖) + 비공개 remote `github.com/axelabs-ai/axe-cli`(genesis `ad91ea0`, .bak·pycache gitignore). 이후 일반 git flow. (결정: 별도 repo 화 — `~/.axe` 통째 git-init 은 tokens.json·vault/.env 밀집으로 기각.) | 2026-05-23 | done: axe-cli repo |
| **B-axe-backlog-promote-cli** 🆕 | `axe backlog promote <id>` — backlog.mdx 의 🔧/📋 항목을 ✅ Done 섹션으로 안전 이동(행 파싱 → 재배치 → 완료일·결정링크 삽입). 현재 [B-axe-ship-update-hook](#-신규-분류-안-됨) 의 promote 는 surfacing-only(후보 출력) — markdown 행 자동이동이 fragile 해서다. 이 명령이 생기면 ship hook 이 호출해 **true 자동 promote** 가능. + 본 세션이 ✅ 항목을 in-place 마킹만 하고 물리적 Done 이동은 deferred 한 것도 이 명령으로 일괄 처리 | 2026-06-03 | M3, 0.3d. B-axe-ship-update-hook 후속 |
| **B-matrix-backlog-system** 🆕 ⭐ | matrix 를 backlog/roadmap/ship-log **구조화 SSOT** 로 ([D-matrix-3](/ops/decisions), ADR `matrix/docs/adr/backlog-roadmap-system.md`). markdown 의 멀티라이터 충돌·fragile 행이동·수동 카운트 해소. **Phase 1 구현완료(미배포)**: matrix-postgres 3테이블(backlog_item/roadmap_milestone/ship_event, slug PK) + MCP 8도구(`backlog_list/create/update/transition`·`roadmap_*`·`shiplog_*`) + import 파서(206 backlog+16 ship+7 roadmap dry-run 검증), `cargo check` ✓. **잔여**: Phase 1 배포(feat/wan-monitor 와 분리 브랜치 권장)+import apply, Phase 2 의례 cutover(전 서비스 CLAUDE.md→matrix MCP, ship-hook→`shiplog_append`, B-axe-backlog-promote-cli 흡수), Phase 3 보드뷰(axelabs app)+REST+host-side gen-docs | 2026-06-03 | M3 epic, Phase 1 done. [D-matrix-3](/ops/decisions) |
| **B-axe-ui-consumer-mysrt** | mysrt 가 @axe/ui 토큰만 도입 (FastAPI+Jinja+vanilla JS, React 없음). Toss Pink 브랜드 유지 결정 → `[data-brand="mysrt"]` scope override 패턴. 토큰 이름만 통일 | 2026-05-23 | 브랜드 정책 결정 필요. 후순위 |
| **B-axe-ui-consumer-distributa** | Distributa (현재 빈 Vercel scaffold) 가 product surface 정의 후 sync-axe-ui 도입. 신규 화면 짓기 시작할 때 적용 | 2026-05-23 | product 정의 선행 |
| **B-docs-box-verify-cron** | `npm run verify:box` 의 cron 등록 (매 30분 또는 시간) — Cloudflare/외부 변화 catch. 운영자 launchd job. 실패 시 alert (e.g., known-gaps 자동 등재 또는 Slack/Teams webhook) | 2026-05-23 | Phase 20-21 의 보강. axe ship 통합으로 deploy 시점은 차단 — cron 은 *외부 요인* catch |
| **B-axe-ui-radix-bump** | @axe/ui v0.3.2 의 미해결 QA P1 11 + P2 6 fix (a11y/types/skip-link/contrast 등) → v0.3.3 patch. Phase 16 audit 보고서 참고 | 2026-05-23 | non-blocking, 다음 cycle |
| **B-docs-cf-purge-cli** | `axe cf purge <url>` CLI 신설 — Cloudflare API token 을 vault 에 등재 후 운영자가 dashboard 우회. 본 chapter 의 Cloudflare 옛 404 4시간 잔존 fix 시 운영자 dashboard 작업 강제됐던 점 해소 | 2026-05-22 | wrangler scope (`cache_purge`) 없음 확인 |
| **B-axe-secret-send-dm** | `axe secret send <ENV> --service <svc> --to <email> --dm` flag 추가 — Bitwarden Send URL 발급 + Blueprint `/api/admin/broadcast-dm` 호출까지 1 명령에 묶음. 현재 운영자가 (1) `axe secret send ...` 6 회 + (2) `curl /api/admin/broadcast-dm` 3 회 + (3) 메시지 본문 bash 합성 필요. `--dm` 가 to-email 매핑 (`taehun → taehun.kang@axellc.com`) + 메시지 템플릿 (`--template connector-onboarding`) + CRON 자동 추출까지. SSOT: [/architecture/secrets § 자동 발사](/architecture/secrets#자동-발사--apiadminbroadcast-dm) | 2026-05-23 | 본 세션에서 발견 (axe-secret-send 라이브 첫 사용). 현재 docs 의 employee-onboarding §5.2 가 the bash boilerplate. `--template` 카탈로그도 같이 등재 |
| **B-vault-org-create-automation** 🆕 | Vaultwarden organization 자체 생성 명령 부재 (client-side encryption 으로 web UI 만 가능). customer onboarding 시 운영자가 web UI 30초 수동. 영구 fix = (a) Vaultwarden API + admin token 으로 직접 호출 또는 (b) Playwright headless 자동화. Truvia 5/26 D-ops-32 = realchoice org `eac93965-...` 수동 생성 + 4 collection. 영향: 신규 customer 마다 30초 + 사람 손 의무 | 2026-05-26 | M2, 0.5d |
| **B-vault-org-cli-automation** 🆕 | bw CLI 의 organization invite/confirm 명령 부재. Truvia 5/26 우회: Vaultwarden API + data.json 의 `user_<uuid>_token_accessToken` JWT 추출 (2025.7.0 schema). customer 측 onboarding 자동화에 필수. 영구 fix = (a) custom bw helper script (axe `axe vault org-invite <email>` 신설) 또는 (b) upstream bw CLI PR. Vaultwarden REST API 사용 (`POST /api/organizations/{id}/users/invite`) | 2026-05-26 | M2, 1d |
| **B-port-conflict-preflight** 🆕 | onboard step 3 (SSH probe) 직후 step 10 (docker preflight) 이전에 **포트 충돌 사전 점검** 추가 — `ssh <host> "docker ps --format '{{.Names}}\t{{.Ports}}'"` 매트릭스 추출 → AXE platform 표준 포트 (3700/3710-3712, 3800/3810-3812, 3100-3151) 와 cross-reference. 충돌 발견 시 차단 게이트 + 운영자 알림. realchoice 14 컨테이너 사례 (trap #6). 영구 fix = `_onboard_step_port_audit` 신설 + B-realchoice-port-collision-audit 통합 | 2026-05-26 | M1, 0.3d |
| **B-frame-keychain-to-vault** 🆕 | frame docker-compose 의 `FRAME_STORAGE_HOST_DIR=/Users/axe/frame/.local` hardcoded default 영구 fix. R1 (HOME 변환) 부분 fix 적용 (wrapper 의 .env.local 에 `FRAME_STORAGE_HOST_DIR=${HOME}/frame/.local` 명시), 하지만 service repo 의 docker-compose.yml SOT 도 `${HOME}/frame/.local` default 로 변경 필요 (frame 측 PR). 동일 검토 = blueprint·hive·matrix compose 도 axe 절대경로 hardcode 잔존 여부 grep | 2026-05-26 | M1, 0.5d (frame PR) |
| **B-bw-cache-stale-autoheal** 🆕 | bw CLI 의 local data.json cached `cryptoSymmetricKey` 가 server-side patch deploy (axe.2 / axe.3 등) 후 stale 상태로 저장되어 매 unlock `[Encrypt service] MAC comparison failed` → recurring (5/22 + 5/26 두 차례 manual recovery). `bw unlock` 은 cache 무효화 X. **영구 fix 3 갈래** (자동화 작업, docs portion 은 2026-05-28 ✅): (a) `axe vault` 에 `cmd_vault_reset` 신설 — data dir 옆으로 이동 + bw config server + bw login one-shot. 운영자 1 명령. (b) `_bw_get_password` 헬퍼가 MAC fail 패턴 감지 시 자동 reset + retry 1회. 자동 self-heal. (c) `axe ship vault` 의 post-deploy hook 이 patch shape 변경 감지 시 운영자에게 "운영자 자신 macmini 의 bw 재로그인 권장" osascript 알림. 함정: ai@'s personal vault 만 ~37 items 라 fresh login → sync 시 약 30초. 본 backlog 의 (a) 가 핵심 — (b), (c) 는 부가 가드. docs 측 표준 recovery 절차 = [/ops/runbook/vault-recovery#bw-cli-data-json-cache-stale-recovery](/ops/runbook/vault-recovery) (2026-05-28 ✅). | 2026-05-26 | M1, 0.5d (자동화 잔여) |
| **B-trap-33-frame-hive-multi-issuer** 🆕 | trap #33 영구 fix — docs portion (c) ✅ 2026-05-28 ([/architecture/auth](/architecture/auth) line 147 정정 + 함정 표 row 추가). **잔여 code fix 2 갈래**: (a) **frame + hive code 에 v1 issuer 추가** — Blueprint MCP 의 `config.py:76,81` + `auth_oidc.py:153` `issuer=[v2, v1]` 패턴 mirror. `get_microsoft_issuer_v1()` helper 추가 (return `f"https://sts.windows.net/<tenant_id>/"`). 위치: `/Users/axe/frame/src/frame/mcp/http_server.py:141` + `/Users/axe/hive/src/hive/mcp/http_server.py:67`. (b) **bootstrap.sh 가 등록 시 v2 강제 + 검증** — Truvia D-day 시 3 app 모두 v1 였다 = PATCH 누락 또는 실패. bootstrap.sh 의 PATCH step 정합성 검증 + 등록 후 manifest version 검증 step 추가. | 2026-05-25 | M1, 0.7d (frame PR + hive PR + bootstrap.sh) |
| **B-customer-sovereignty-architecture** 🆕 | **Q3 milestone**. Truvia 측 architectural concern (5/25): operator vault SoT (D-ops-17) → customer-측 vault/secret SoT 으로 재 architecting. 본질 = operator 가 모든 customer secret 의 SoT 라고 주장 = customer data sovereignty 침해. **올바른 architecture**: Code SoT=Github / Image SoT=registry / Service secret + Business data + Service config SoT = customer 본인 macmini. **operator 책임 2개만** = (a) software supply (code/image push to registry) (b) 외부 노출 (DNS/tunnel ingress catch-all). axe deploy 의 vault fetch + customers.yaml 의 secret manifest 모두 제거. customer 자율 secret (openssl rand + .env + customer 자체 vault). 5/25 D-day 의 self-deploy 패턴 (Truvia 가 본인 .env + compose 자체) 가 본 architectural change 의 첫 실제 적용. customers.yaml = customer 식별 (legal_name, public_domain, tailscale_host) + onboard step (cloudflared tunnel/DNS) 만 유지. | 2026-05-25 | M2/M3 Q3, 5d |
| **B-customer-deploy-generalization-r6-volume-precreate** 🆕 | trap #19 + #23 영구 fix. docker-compose 의 external volume — (a) blueprint 6개 (app-data/workspace/claude-data/postgres-data + mcp-proxy data/config) 신규 customer 측 사전 부재 → compose up fail (trap #19), (b) hive 2개 (`hive-proxy_axe-hive-proxy-{data,config}`) 의 historical compose project prefix 정합성 문제 (trap #23) — 둘 다 본 R6 phase 에서 함께 해소. 영구 fix 2 옵션: (a) compose 의 `external:true` 제거 → compose 가 자체 volume 자동 생성 (권장 — compose self-contained, customer self-deploy 친화). (b) axe deploy pre-step 으로 `docker volume create` 자동 호출. R6 (customer-deploy-generalization 차기 phase) 으로 묶음. | 2026-05-25 | M1, 0.5d |
| **B-docs-ssot-extension-2026-05-26-newpages** 🆕 | B-docs-ssot-extension-2026-05-26 의 잔여 — 신규 페이지 2 (A1/A2) 만. A1 `/partner/macmini-existing` 신설 (기존 운영 macmini → customer 전환), A2 `/services/vaultwarden` 또는 `/architecture/vault-integration` 신설 (Timshel image + compose/Caddyfile/env 패턴 + axe.2 patch 정체 + [D-ops-37](/ops/decisions) fork build). 정정 7건 (B1-B7) 은 2026-05-28 본 세션 ✅ 완료. **A1/A2 는 5/27 D-day 후 Truvia 측 첨언 사전 받아 시작 권장** | 2026-05-26 | M2, 0.5d |
| **B-vault-collection-migration-v1** 🆕 | [D-ops-32](/ops/decisions) 의 6 collection 신설 완료 (2026-05-26) 후속 — item migration + 옛 collection cleanup. **3 단계**: (1) **운영자 personal vault → Platform — Service Secrets 이전** = `axe secret list` 의 ~37 service secrets (frame/hive/blueprint/matrix `/axe/*` + Cloudflare API + shared/* + infra/realchoice/*) 가 현재 ai@ personal vault only ⇒ bus factor 위험. organization Platform — Service Secrets 로 옮기면 soohun 도 access. `bw share` (deprecated → `bw move`) 또는 web UI. (2) **Default 의 3 items 분류**: `github PAT: ai@axellc.com` → Platform — Infrastructure (또는 rotation 후 폐기 — [B-cf-token-rotation-2026-05-25] 패턴), `axe-macmini local: {soohun,taehun}.kang` 은 각자 personal vault 가 본질 — organization 에서 제거 권장. (3) **옛 4 collection 의 item 이동 + collection 삭제**: frame-jwt-axec 의 `taehun-kang-axec-2026-05-17` + frame-jwt-operators 의 `ai-operator-2026-05-16` 검토 (D-ops-14 frame JWT 잔재) — Platform — Service Secrets 으로 옮기거나 unused 면 삭제. 빈 collection (frame-jwt-axev) 즉시 삭제 가능. Default + frame-jwt-* item-empty 화 후 collection 삭제. **위험**: axe CLI 가 name 기반이라 이동 자체는 안전, 다만 (a) item 이름 변경 금지 (`axe secret get <name>` 깨짐), (b) item 삭제는 영구 — 검토 후 진행. **`bw move <id> <orgId> <encodedCollectionIds>`** 가 personal→organization item 이전 명령. organization 내 collection 변경은 item 의 `collectionIds` 갱신 (bw edit) 으로. | 2026-05-26 | M1, 1d (운영자 검토 시간 큼) |
| **B-blueprint-settings-graph-reconnect-button** 🆕 | Blueprint `/settings` (또는 `/axe/settings` Integrations) 의 GraphToken status panel + **Reconnect 버튼** 부재 — 운영자가 token expiry / refresh 실패 진단·회복 self-service 불가. 본 세션 (2026-05-26) 함정: ai@ token 이 1.5h 전 expired + AADSTS65001 (Calendars.ReadWrite scope admin-consent 누락) 으로 refresh 침묵 실패. UI 는 "Connected as ai@axellc.com" 만 표시 — token 실제 상태 0. 운영자가 직접 `/api/graph/auth` URL 알아 방문 + admin consent 별도 trigger 모두 운영자 black-box 지식 의존. **요구 UI** (3 요소): (1) **현 상태 panel** — Connected/Disconnected/Expired/RefreshFailed status badge + `expiresAt` 카운트다운 + 마지막 refresh 시각 + 현재 grant 된 scope 목록. (2) **Reconnect 버튼** — 클릭 시 `/api/graph/auth` 로 redirect (`prompt=consent` 강제 query 추가). 옛 token row 는 fallback 으로 보존. (3) **Admin consent 검증 + 안내** — Microsoft 화면에서 "Need admin approval" 차단 시 운영자 본인 (Global Admin) 으로 sign-in 안내 또는 별 admin consent URL 직접 제공 (`https://login.microsoftonline.com/{tenant}/adminconsent?client_id={app}`). 본 세션에서 발견 (강수훈 직접 보고: "settings 에서 기본적으로 reconnect 버튼이 필요해보입니다. 흐름이 이상하지 않습니까"). | 2026-05-26 | M1, 0.5d |
| **B-blueprint-scope-change-admin-consent-runbook** 🆕 | Blueprint app 의 OAuth scope 추가 ship 시 함정 — docs portion ✅ 완료 (2026-05-28, [/architecture/auth#oauth-scope-추가-시-운영자-절차](/architecture/auth) 함정 표 row + 운영자 절차 섹션). **잔여 자동화 2 prong**: (1) **`axe ship blueprint` post-deploy hook** — `SCOPES` array 변경 감지 시 `az ad app permission admin-consent --id <client_id>` 자동 호출 (또는 prompt). (3) **Blueprint 자동 token health check** — daily cron 또는 startup probe 가 모든 GraphToken refresh 시도 + AADSTS65001 발견 시 운영자 알림 (OperatorAlert + Teams DM). | 2026-05-26 | M1, 0.5d (자동화 잔여) |

## ⏸️ Blocked (외부 차단)

| ID | 항목 | 차단 사유 | 차단 해소 조건 |
|---|---|---|---|
| _(현재 없음)_ | | | |

## ✅ Done (최근 7일, archive 대기)

| ID | 항목 | 완료일 | 결정/문서 링크 |
|---|---|---|---|
| **B-vault-axe.2-sso-mp-incomplete** ✅ | **axe.2 SSO→MP unlock 부분 fix 완전 종결 — 4명 KDF rotation 전부 완료** ([D-ops-40](/ops/decisions) Progress xiii). 옛 user 의 `user.akey` 가 PBKDF2 600k schema 로 wrap 된 게 SSO→MP unlock 실패 원인. **본질 발견 = KDF type dropdown 변경 불필요** — Master password change + ☑ "Also rotate my account's encryption key" 체크박스 만으로 akey 재wrap 충분 (ai@ 가 Phase A 로 검증, 나머지 3명 동일 패턴). 4명 (ai 5/27 → soohun → taehun 5/29 → **jinwoo 6/4**) 전부 SSO→MP unlock 정상 확인. DB: ai 는 Argon2id (Phase B 까지), soohun/taehun/jinwoo 는 PBKDF2 유지 (akey 재wrap 만 — kdf_type 안 바뀌어도 fix 동작). jinwoo last_login 5/23→6/4 점프 = 완료 신호 + 운영자 구두 확인. realchoice 측 영향 없음 (axe.2 후 신규 가입 = 새 schema). 운영자 안내 = Teams broadcast 2회 ([operator-broadcast](/ops/runbook/operator-broadcast)) + [/onboard/vault-setup](/onboard/vault-setup) playbook. **D-ops-40 전체 작업 종결** (build pipeline + axe.3 patches + deploy + 검증 3건 + 정책 layer + 4명 rotation). | 2026-06-04 | [D-ops-40](/ops/decisions) Progress xiii |
| **B-axe-cli-P0** ✅ | AXE CLI P0 골격 GREEN — stdlib 단일파일 `~/axe-cli/axe` (`login`/`logout`/`whoami` + macOS Keychain + `AXE_TOKEN` env fallback + MCP streamable-HTTP 클라이언트 + `--local` Host-header 자동첨부). frame HS256 부트스트랩 토큰(`frame mcp-token`)으로 `axe frame tools` → **54 tools GREEN 검증**. "커넥터 0 · 토큰 1회" 증명. repo git-tracked ([B-axe-cli-git-track](/ops/backlog)). 인터랙티브 인증 후속 = [B-axe-idp-1](/ops/backlog) (Blueprint OIDC loopback PKCE). | 2026-06-03 | [D-axe-cli-1](/ops/decisions) |
| **B-index-epic1-judgment-layer** ✅ ⭐ | **artifact-first judgment layer (Epic 1) — 증거층↔판단층 결합**. 휴면 artifact store(39 fact)→relational 23 deal 결합: 모든 투자판단 fact 를 일급 typed+cited+audited artifact 로 승격 (kind assumption·calibration·comp·base_rate, **migration 0** generic store 재사용, 링크=일급 citation index_field+artifact_ref relation, side-bridge table 아님). **23/23 deal → 357 fact**, 0 orphan judgment value, additive-only 3중 증명(event propose/confirm·relational updated_at 미전진·validate-seeds Δ0), 48/48 test, sqlx clean. 2-wave supervised — adversarial gate 가 wave1 61% 미완 적발 → 직접 +4 → wave2 5딜 author + 6 rival module→1 `backfill.rs` 통합. index `1c707e1`. | 2026-06-03 | [D-index-45](/ops/decisions) |
| **B-index M7 build cohort** (skeleton·azure-app·docker-compose·shared/artifact/financial migration·dsl-parser·topo-evaluator·mcp-checklist·schemas-endpoint·phase0-mcp-tools·3deal-seed·3deal-irr-validation·driver-period-refactor — 14) | index 서비스 live: **23 deals**·26 fund_investment·16 typed schema·artifact store(RLS)·MCP tools·DSL+topo evaluator. (phase0 4-tool 은 `propose_deal_closure` 로 통합 [D-index-13]; shared schema 는 public = Phase-0 설계.) validate-seeds A1 PASS Δ0. | 2026-05-31 | [D-index-2](/ops/decisions)~18 (triage 검증) |
| **B-pmc-postmortem-2track** | pmc skill 2-track 분리 구현 (ic: postmortem_stub/reminder · pmc: fill_interactive/render + cadence ref). ⚠ launchd reminder install 은 operator 잔여. | 2026-05-31 | [D-index-12](/ops/decisions) |
| **B-index-sqlx-cache-guard** | `.githooks/pre-commit` + `scripts/check-sqlx-cache.sh` (`cargo sqlx prepare --check`), `core.hooksPath=.githooks` 활성화 (2026-05-31). | 2026-05-31 | [D-index-32](/ops/decisions)~33 |
| **B-cortex-visibility-phase1-sync-filter** ✅ | [D-cortex-9](/ops/decisions) Phase 1 — Google contactGroup(라벨) whitelist/blacklist sync 유입 필터 (`Personal`/`HPE` 라벨 연락처 유입 차단). `passes_label_filter` + `list_contact_group_names`(id→name 맵 1회 로드) + 맵 로드 실패 시 owner cycle fail-safe skip. 민감정보 미유입의 가장 강한 보장 | 2026-05-31 | env `CORTEX_SYNC_GROUP_BLACKLIST`(기본 `Personal,HPE`)/`CORTEX_SYNC_GROUP_WHITELIST` + `sync_google_now` 의 `skipped_by_label` stat. 코드 = cortex working tree (미commit), docs 반영 ([services/cortex](/services/cortex#visibility--private-partition-d-cortex-9)). `axe ship cortex` 시 commit/deploy |
| **B-frame-hive-backup-cron** ✅ | axe-backup 스크립트에 hive-postgres pg_dumpall 블록 실 추가 (D-hive-backup 결정 후 미실행) (stale-done: 감사+반증검증 통과) | 2026-05-30 | wf 감사 wf_f1573f47 (misc (B-) |
| **B-hive-template-axev** ✅ | axev payslip_email template clone + customize + activate (D-hive-25 customize 강제) (stale-done: 감사+반증검증 통과) | 2026-05-30 | wf 감사 wf_f1573f47 (hive) |
| **B-bp-para-provenance-fields** ✅ | Blueprint Workspace에 sourceWorkspaceId/sourceArtifactPath/copiedAt 3필드 — PARA dispatch copy-with-provenance (stale-done: 감사+반증검증 통과) | 2026-05-30 | wf 감사 wf_f1573f47 (blueprin) |
| **B-axe-ui-consumer-cortex** ✅ | Cortex 가 @axe/ui 도입 — design token 채택 (Tailwind v3→v4 마이그 + sync-axe-ui + ★3→★4) (stale-done: 감사+반증검증 통과) | 2026-05-30 | wf 감사 wf_f1573f47 (cortex) |
| **B-frame-fund-ksme-seed** ✅ | `shared.account_template` 에 `fund_ksme` standard 48행 이미 seed | 2026-05-30 | stale-done 감사 (DB 확인) |
| **B-frame-mcp-register-entity-tool** ✅ | MCP `register_entity`+`list_sub_entities` 이미 `@mcp.tool()` (server.py:1470,1505) | 2026-05-30 | stale-done 감사 (코드) |
| **B-frame-fund-commitment-ledger** ✅ | `commitment_ledger`+`lp_master` 전 entity 스키마에 이미 존재 (schema 신설; population 별도) | 2026-05-30 | stale-done 감사 (DB) |
| **B-frame-mcp-http-wrap** ✅ | `http_server.py` 1012줄 HTTP MCP 가동 중 (frame DECISIONS.md:170 'M1 only stdio' stale 정정 권장) | 2026-05-30 | stale-done 감사 (코드) |
| **B-bp-onboard-claude-code** ✅ | `/onboard/claude-code` 페이지 5 컴포넌트 이미 구현 (Phase B) | 2026-05-30 | stale-done 감사 (코드) |
| **B-axe-secret-totp-cli** ✅ | `axe secret get <name> --field totp` 지원됨 (CLI --field choices 'totp'; 전용 subcommand 만 미신설) | 2026-05-30 | stale-done 감사 (CLI) |
| **B-frame-entity-legal-name-i18n** ✅ | frame DB shared.entity legal_name 정정 — **전제 정정**: 사업자등록증 기준 법인명이 영문 (`axec`="AXE Corporation", `axev`="AXE Ventures") 이라 기존 "영문→한글" 전제 + customers.yaml SoT 의 한글값("액스코퍼레이션 주식회사" 등)이 오기였음. frame-postgres 2행 UPDATE (+ per-entity audit_log) + customers.yaml(entity_meta·axe.legal_name) 정정. **잔여**: hive shared.entity 가 동일 한글 stale → 운영자 확인 후 동일 정정 예정 (payroll 시스템) | 2026-05-30 | frame-postgres + customers.yaml |
| **B-index-entry-date-backfill** ✅ | 9 deal 전부 entry_date 기입 (executed=paid_date / planned·passed=가안), `entry_basis=assumed` 0건 ([D-index-28](/ops/decisions) 후속) | 2026-05-29 | index commit `f650bec`+`e5ac7a6` |
| **B-index-deprecate-sump-irr** ✅ | Σp·IRR 폐기 → IRR(E[CF]) 단일 canonical (사용자 승인). `weighted_irr_*` 제거 + `#[deprecated]` + 9 baseline·html·xlsx 전환 | 2026-05-29 | [D-index-32](/ops/decisions), index commit `3b2f543` |
| **B-index-docs-irr-ecf-restate** ✅ | docs IRR 을 canonical E[CF] 기준 재기재 — 8-deal 랭킹 확정 (tail flip Sendy 11.7 > Novachips 9.2) + per-deal 구→신 표 + seed 주석 | 2026-05-29 | [D-index-34](/ops/decisions), index commit `537c04e` |
| **B-index-instrument-adjusted-irr** ✅ | won't-do — instrument 효과가 exit_matrix leaf recovery 에 이미 반영 (flat discount table 은 이중계상). discount table 미구현 + Novachips `irr_instrument_adjusted` 폐기 + seed.rs 가드 | 2026-05-29 | [D-index-33](/ops/decisions), index commit `74e1eb4` |
| **B-blueprint-mcp-send-mail** ✅ | Blueprint MCP 범용 이메일 발송 tool `send_mail` ([D-bp-mcp-mail-1](/ops/decisions)). `create_event` 형제 — 신규 route `POST /api/internal/mail` (caller delegated `Mail.Send` self 발송 / admin app-only send-as) + Python tool `mail.py` + append-only `MailSendLog` audit (migration `20260529120000_add_mail_send_log`). params: to/subject/body(html\|text)/cc/bcc/attachments(base64)/save_to_sent_items/as_user_email/dry_run. 에러: `send_as_forbidden`/`recipient_invalid`/`mail_send_not_consented`/`graph_error`. typecheck 0 errors. **⚠️ Azure 선행조건 (운영자 1회)**: send-as 경로는 Next.js app (`2b222356-...`) 에 Application `Mail.Send` + admin consent 필요 — self 발송은 delegated `Mail.Send` 이미 보유라 불필요. 절차 = [/architecture/auth § app-only Application permission](/architecture/auth). docs (blueprint/auth/mcp-server-checklist/decisions) 동시 갱신. | 2026-05-29 | branch `feat/bp-mcp-send-mail`, [services/blueprint](/services/blueprint) |
| **B-index-infinity-3step** ✅ | Prj_Infinity(INEX) 축적 — 3-step surface→재수행→비교 ([D-index-23](/ops/decisions)). 사용자 "기존 데이터 적재 테스트 → 신규 IC 재수행 → 두개 비교로 전 건들과 같게". **Step1**: v8 FINAL(irr_locked) surface 적재 → index 13.8%/1.70x 정확 재현 (ev_bridge·net debt 0 보통주·exit-diluted 0.0724% — surface 모범). **Step2 재수행**: 외부 research — 실명계좌 base-rate near-zero(2021 특금법 후 원화마켓 신규 0건, P&lt;10%) / 코빗 ceiling 1,000-1,400억 / Gopax·Binance license-shell M&A 선례 / 보통주 distress recovery 0~20%. 모달 exit 를 won-market rerating 아닌 SI shell M&A breakeven 으로 reframe + 보통주 wipeout leg(18% @ 0.12x). **Step3 비교**: calibrated −8.3%/0.82x. **~22pp gap + sign-flip**. 핵심 = 성숙·정직한 v8(hurdle 미달 공개)도 핵심 base-rate 를 mgmt optimism 에 anchor + 보통주 wipeout 누락 → 역전. proceeds 메커니즘 불변(analytical gap only). **canonical 결정** ([D-index-24](/ops/decisions)): executed/Closed deal 이므로 IC-approved 13.8% 가 canonical (decision-time 기록 보존), −8.3% 는 `infinity_recalibrated.yaml` retrospective overlay. 8-deal canonical: Infinity 13.8 (Hancom~Novachips 사이). validate-model 0 errors. IC memo v9 = OneDrive. | 2026-05-29 | index commit `c0dcd9a` + canonical swap |
| **B-index-proceeds-bridge-hardening** ✅ | proceeds 산정 강화 — EV→EqV(net debt) bridge + exit-dilution 명시·강제 ([D-index-22](/ops/decisions)). 사용자 audit "모두 EV=EqV+Net Debt + 투자 후 dilution 고려됐나 체크" 의 답. **발견**: 7-deal proceeds 비일관 — net-debt bridge 는 Canopy 만 명시(EV 797−netdebt 300=EqV 498), Sendy(v2)·Iippo 는 stake×EV 직접, pre-IPO 3+Sentry 는 equity multiple(N/A); dilution 은 Iippo·Sentry entry F/D flat. **결정** = [D-index-20](/ops/decisions) IRR determinism 을 proceeds 로 확장: `proceeds_basis` enum (ev_bridge|equity_value|mom|legacy_ev) + ev_bridge non-writedown leaf 는 stake×(EV−net debt) 가 axe_proceeds 와 ±2% 일치해야 — seed load **hard-reject** + validate Check 7 Error 2중 강제 (negative test 거부 확인: 10%×2,225억 ≠ 날조 300억). migration 0005. **Sendy v3**: ev_bridge, net debt 0 (asset-light + 자금니즈 equity 충족 + 차입 증거 0 → 보수적, **날조 안 함**) → proceeds·IRR 불변 6.47% 이나 EV≠EqV 누락 class 영구 차단. 7-deal: Sendy ev_bridge PASS / Sentry equity_value / 3 pre-IPO mom / Iippo·Canopy legacy_ev WARN — 0 errors. 잔여 = [B-index-proceeds-bridge-retrofit](/ops/backlog). | 2026-05-29 | index commit `ca714b7` |
| **B-index-sendy-current-practice-rewrite** ✅ | 센디(Sendy) IC v2 재작성 — 현 practice 재calibration ([D-index-21](/ops/decisions)). 사용자 redirect "그냥 적재 말고 ic memo 를 현 practice 수준으로 새로 써라 (당시 방법론 열위)". [D-index-19](/ops/decisions) (surface→calibrated) 의 종착 = **memo 방법론 자체 재작성**. **3-tier IRR**: v1 md 31%/22.8%(fabricated) → v1 Excel 92.4%(math-correct, 낙관 input) → **v2 현 practice 6.5% ⭐ canonical**. **v1 5결함 교정**: IRR override(D-index-20 차단) / wipeout leg 부재(Downside +31.6% gain → 손실 시나리오 없음) → genuine 18% wipeout(부릉 1/6 recovery) / sendyX 66x 미검증 → base-rate haircut(-93%) / Exit 5x flat → segment-weighted(freight 1~1.5x + SaaS 4~5x, WiseTech-E2open 3.5x) / instrument 분석 부재. 외부 anchor: Convoy $3.8B→0 + 부릉 1/6 distress → wipeout 15~25%, 한국 Series C→IPO 예외(TMAP 교훈). 결과 4-scenario E[IRR] 6.5% / E[MoM] 1.51x / Sharpe-like -0.06. 7-deal 랭킹 Sendy 6.5 최하위로 정정. 산출물: OneDrive `ic/memo/v2_axe_current_practice_260529.md` + seed v2(version:2). validate-model 7/7 PASS. | 2026-05-29 | index commit `b77a236` |
| **B-index-sendy-passed-deal** ✅ | 센디(Sendy) 축적 — IRR override 오류 flagship + 첫 declined deal ([D-index-20](/ops/decisions)). 출처 `1_Project/Pipeline/Sendy/`. **index 존재 이유 결정적 증거**: exit_matrix/v1.yaml 의 `corrected: 35%` manual override (계산값 95.7% 를 근거없이 변경) — index 는 IRR 을 proceeds 에서 deterministic 계산 → override 물리적 불가, EV-derived seed → 자동 교정 (Base 95.7/Downside 31.6/Upside 146.6/weighted 92.43, Excel 일치). **deal.stage 'Passed' 추가** (migration 0004) — declined deal first-class tracking. 7-deal portfolio Closed 3 / IC 3 / Passed 1. PASS 사유 구조+타이밍 (quality 아님). honesty: screening-grade model (sendyX 66x 미검증). validate-model 7/7 PASS. | 2026-05-29 | index commit `9263179` |
| **B-index-3-preipo-deals** ✅ | 3 pre-IPO deal (스타넥스/한컴인스페이스/노바칩스) calibrated 검토 본 축적 ([D-index-19](/ops/decisions)). 출처 `_comparative_20260528_preIPO/` 13-agent 비교 IC 메모. surface IRR(19.6/58.5/-1.5) → calibrated(36.4/22.4/7.45) 재calibration 본을 index 에 typed fact 로 저장 (xlsx surface cell 아님). pre-IPO scenario-tree 모델 (scenario=단일 outcome), `parse_timing_years` 소수 연도 확장 + timing CHECK 완화 migration. 6-deal portfolio 랭킹 검증 + validate-model 6/6 PASS. **신규 backlog 발견**: [B-index-instrument-adjusted-irr](/ops/backlog) (보통주 vs RCPS 8-15pp discount systematic 적용). | 2026-05-29 | index commit `e130a69` |
| **B-cortex-production-live** ✅ | Cortex (Rust + axum + sqlx, 첫 비-Python MCP 서비스) 를 claude.ai connector 까지 production live. 폐기 (file-based recall → `.legacy.20260526/`) → Rust 재출발 (19 task) → 5 secret vault push → Entra app (az cli) + Google OAuth Web client (Cloud Console, 신규 프로젝트 cortex-497605) → Cloudflare ingress (Dashboard remote-managed, CF API PUT) → docker compose (postgres+blue+green+proxy) + 2 migration → claude.ai connector (client_id+secret) → Microsoft OAuth → **12 tools 노출 + whoami + connect_google 검증**. 시행착오 7 함정 ([known-gaps Cortex](/ops/known-gaps)) 전부 해소: DB password URL 파싱 (PgConnectOptions) / env_file 따옴표 / RFC 9728 resource-level path / RFC 8414 path-insertion (→ Microsoft-direct) / claude.ai client credential / ASCII-only property key (`메모`→`memo`) / Cloudflare remote-managed tunnel. **B-cortex-mcp-crash-loop (2026-05-27 등재) 해소** — 원인은 env_file 따옴표 + DB password URL + stale Docker image 복합. | 2026-05-28 | [D-cortex-1..8](/ops/decisions), [services/cortex](/services/cortex), cortex commits `c65b934..dfa9330` |
| **B-cortex-dockerfile-healthcheck** ✅ | blue/green 컨테이너 영구 `unhealthy` 해소. 원인: healthcheck CMD 가 `python -c urllib...` 인데 Rust/Debian-slim 이미지엔 python·curl·wget 전무 (`/usr/local/bin/cortex` 바이너리만). 트래픽 무해 (Caddy alias routing 이 health-gate 안 함) 했으나 blue/green swap 의 healthy gate 잠복 위험. **fix = binary self-probe**: `cortex healthcheck` 서브커맨드 (GET `127.0.0.1:$CORTEX_MCP_PORT/healthz`, 2xx exit 0) + compose test `["CMD","/usr/local/bin/cortex","healthcheck"]` (green 은 `<<: *cortex-mcp-blue` 머지 상속). Settings::load 전 short-circuit → DB 자격증명 독립 (false unhealthy 방지). **index 의 python→curl 과 다른 선택** — 패키지 추가 없이 기존 바이너리 재사용 (minimal-base 정합). 검증: rebuild 후 blue+green `(healthy)` + 외부 200/401 유지. index 도 동일 패턴 정렬 권장 (curl 의존 제거, 우선순위 낮음). | 2026-05-28 | cortex commit `b8d3aa0` |
| **B-cortex-private-partition-phase0** ✅ | [D-cortex-9](/ops/decisions) Phase 0 — artifact `visibility` tier (shared\|private) 도입. soohun.kang 2026-05-28 "Private Partition" 요청. migration 0003 (`artifact.visibility` DEFAULT shared + CHECK + index, 기존 3,250행 shared) + register_person `visibility`(private→Google push skip)·classify_person·update_person(re-tag) 에 `visibility`+`skip_audit_payload` + list_persons `visibility`/`exclude_classification_key`/`_value` 필터 (QueryBuilder) + get_person visibility 노출. 신규 schema key 전부 ASCII. 검증: build + migration + blue/green healthy + 필터 5-assertion rolled-back SQL 테스트 (zero residue) + 외부 200/401. **잔여(auth)**: claude.ai tools/list 12 + register_person(private) 실 round-trip 스모크. | 2026-05-28 | [D-cortex-9](/ops/decisions), [services/cortex](/services/cortex#visibility--private-partition-d-cortex-9), cortex commit `f8cad8c` |
| **B-blueprint-agent-sdk-integration** ✅ | [D-index-17](/ops/decisions) Phase 2 — Blueprint Agent SDK 가 index MCP 의 skill 을 fetch 해 local cache sync. `scripts/sync-index-skills.sh` (index-skill-sync.py wrapper) + `launchd/ai.axe.index-skill-sync.plist` (10분 주기, RunAtLoad=true). drift 감지 시 `/tmp/blueprint-skills-drift.log` 에 기록. cache target = `.claude/skills-cache/{ic,ingest,pmc}/`. **검증**: 1차 sync 3 skill / 61 file added (ic + ingest + 신규 pmc 자동 발견), 2차 sync 61 unchanged (cache hit). 운영자가 `launchctl load` 시 자동 동작. D-index-17 overlap 정책: 현재 SoT = `.claude/skills/{ic,ingest}`, skills-cache = 검증 사본 (drift 감지). sunset 후 cache 가 SoT. | 2026-05-28 | blueprint commit `579a0fa1` |
| **B-pmc-skill-skeleton** ✅ | [D-index-12](/ops/decisions) — Post-Money Care skill 신규 scaffold (Background Agent worktree 에서 진행). 30 files / 1,906 LoC: SKILL.md (213 line) + 8 agents (data-fetcher / kpi-extractor / risk-alerter / valuation-updater / exit-signal-analyzer / board-pack-drafter / lp-comm-drafter / index-payload-composer, avg ~93 line) + 5 references (kpi-catalog [portfolio-management copy] / ir-lifecycle [investor-relations copy] / postmortem-cadence symlink to ic SoT / risk-kind-frozen [5 enum 박제] / trigger-tiers [SCHEDULED/EVENT/MANUAL]) + 4 Python stubs (render_postmortem / postmortem_fill_interactive / quarterly_close / event_trigger) + 11 sub-dir `.gitkeep` (runtime output 구조 박제). Phase 0 = scaffold only, Phase 1 = 첫 quarterly cycle 실행. **검증**: index MCP list_skills 가 자동 발견 (ic + ingest + **pmc**), Blueprint sync hook 도 자동 fetch. | 2026-05-28 | index commit `2a74ef0` |
| **B-index-3fs-bs-cf-completion** ✅ | [D-index-18](/ops/decisions) Gap 2 마무리 — Phase 0 working capital + simplified debt/ppe model 로 BS 12 line + CF 7 line 모두 derive. compute_3fs 가 IS-only → full 3FS. **BS**: ar=rev×dso_days/365, inv=cogs×inv_days/365, ap=cogs×dpo_days/365, ppe_net=cum_capex, equity=init+Σni, cash=plug (defaults 60/30/45 days, equity_init 1억). **CF** (indirect): ni+dep−Δwc−capex−debt_rp. xlsx 4→6 sheets, HTML 7→9 sections. **검증** Iippo Y1: total_assets = L+E = 14.4M+209.5M = 223.9M ✅ balanced. 4 (deal×scenario) compute_3fs persist 성공 (217+217+155+155 rows). 4 standalone HTML 모두 9 sections, 브라우저 즉시 view. Phase 1 = depreciation schedule + debt amortization + intangibles + deferred tax. | 2026-05-28 | commit `8997e28` |
| **B-index-xlsx-roundtrip** ✅ | LP 가 수정해서 돌려보낸 xlsx 의 변경 검증 + DB 반영. **16번째 MCP tool** `import_xlsx(file_path, deal_code, scenario, apply=false)`. calamine 0.26 crate (read), Assumptions sheet parse. Input drivers 만 비교 (derived는 formula 재계산이라 round-trip 비교 대상 아님). **effective_db_value** semantic: period > 0 에 값 없으면 period 0 fallback (xlsx carry-forward visualization 과 동형). diff kinds: added/changed/removed/unchanged. apply=true 시 financial_driver_value UPSERT, removed 는 보존 (round-trip safety). **검증**: 무수정 round-trip 49 unchanged ✅ byte-equivalent, 1 cell 수정 (0.02→0.05) → 정확히 1 changed 감지 ✅, apply=true → DB UPSERT 1 row ✅. LP 양방향 흐름 완성. | 2026-05-28 | commit `6aa2680` |
| **B-blueprint-skill-mcp-client** ✅ | [D-index-17](/ops/decisions) Phase 2 — Blueprint Claude Agent SDK 의 filesystem `.claude/skills/` 직접 의존 제거 reference impl. `bin/index-skill-sync.py` (~297 line, Python stdlib only, no deps) — index MCP 의 `list_skills()` + `get_skill_resource()` 호출 → local cache sync. **Dual transport**: HTTP (production, Entra ID bearer) + CLI fallback (local-dev). **sha256 cache invalidation** — server sha256 vs local file sha256 비교, drift 감지 시 자동 update. **Conditional recursive traversal** — `has_{references,scripts,tests,agents}` 플래그 기반 sub-dir 만 fetch (scripts/_oneoff/ 같은 nested 도 처리). `--diff` mode (dry-run) + `--skill` 단일 필터. **검증**: 1차 sync 43 files added (ic 39 + ingest 4) + 모든 sha256 verified + 2차 sync 43 unchanged + drift simulation (`echo >> SKILL.md`) → 'updated' 감지 + restore 1 updated. `.manifest.json` 으로 audit trail. **다음**: Blueprint Agent SDK 의 skill loader 에 본 cache dir 인식 + cron 등록 → [D-index-17](/ops/decisions) sunset 기준 (b) 충족. | 2026-05-28 | commit `8b6f05d` |
| **B-index-lp-html** ✅ | 사용자 결정 PDF 말고 native HTML 로 LP dashboard. 신규 `src/html.rs` (~360 line) + **15번째 MCP tool** `export_lp_html(deal_code, scenario, out_dir?)` — 단일 self-contained HTML5 (inline CSS, 외부 fetch 0). 7 sections: Reproducibility / IRR Summary metric cards / Fund Investments / Income Statement (with derivation rules) / Exit Matrix (joint_probability) / Assumptions / Audit Trail. Korean font stack (Apple SD Gothic Neo / Pretendard / Noto Sans KR), `@media print` 으로 LP 브라우저 PDF 출력 가능, semantic HTML5 (a11y), color-coded (양수 green / 음수 red), sticky table headers. **export_lp_bundle v2**: index.html + xlsx + README.md (cover.md 폐기, index.html zip 첫 entry — LP 가 Finder 에서 가장 먼저 봄). 검증: Iippo base HTML 20,250 bytes, byte-deterministic (2회 sha 동일 `70096195...`), 3 deal × 2 scenario 성공, regression 유지. **LP 흐름 update**: bundle.zip 첨부 → 풀어서 index.html 더블클릭 → 브라우저 dashboard + xlsx cell audit. | 2026-05-28 | commit `eb66fab` |
| **B-index-lp-bundle** ✅ | Gap 3 마무리 layer — LP 가 1 첨부로 받는 zip + byte-deterministic. **14번째 MCP tool** `export_lp_bundle(deal_code, scenario, out_dir?)` → `{deal}-{scenario}-{sha[:8]}-bundle.zip` (xlsx + cover.md + README.md). `src/xlsx.rs` 확장 (~150 line): build_cover_markdown (IRR table + Fund table + reproducibility lock + Phase 0 한계 박제), build_readme_markdown (LP 안내문), build_bundle_zip (1980-01-01 epoch deterministic). **Determinism fix 3종** ([D-index-4](/ops/decisions) lock 강화): (a) xlsx DocProperties.set_creation_datetime(epoch) + set_author "AXE Labs index", (b) cover.md `Generated: <timestamp>` 제거 → inputs_hash[:16] 로 대체, (c) zip last_modified_time(epoch). 검증: 2회 export → xlsx sha + bundle sha 모두 동일 (byte-equivalent). Iippo base bundle 13,302 bytes. 운영 흐름: 전 xlsx 첨부 → 후 zip 1개 (cover + README + xlsx). | 2026-05-28 | commit `d33e8de` |
| **B-index-lp-deliverable-export** ✅ | Gap 3 — LP 전달용 xlsx export 완성 ([D-index-18](/ops/decisions) chain 종결). `rust_xlsxwriter 0.95` Rust 네이티브 crate. 신규 src/xlsx.rs (~280 line) + **13번째 MCP tool** `export_lp_model(deal_code, scenario, out_dir?)`. 4-sheet 결정론적 xlsx: (1) **Assumptions** driver_value 매트릭스 + cover (inputs_hash 포함), (2) **Income Statement** 12 line × 7 period + footer derivation rules, (3) **Exit Matrix** leaf-level (joint_probability 는 Excel formula `=E*B`, audit trail), (4) **IRR Summary** per-fund + weighted metrics + reproducibility footer. 검증: Iippo base 11,894 bytes "Microsoft Excel 2007+", **byte-equivalent reproducibility** (같은 DB → 같은 sha256), 3 deal × 4 scenario 전부 export 성공. **운영 흐름**: `export_lp_model Iippo base` → `/tmp/index-lp/Iippo-base-{sha[:8]}.xlsx` → 운영자가 LP 에 첨부 → LP가 Excel 에서 cell formula audit + 1년 후 재현 가능. Phase 1 잔여 = xlsx round-trip (calamine read → DB diff sha256 verify, [B-index-xlsx-roundtrip](/ops/backlog)) + BS/CF 완성 ([B-index-3fs-bs-cf-completion](/ops/backlog)) + PDF cover bundle. | 2026-05-28 | commit `425a758` |
| **B-index-3fs-typed-schema** ✅ | Gap 2 — driver_value 위 typed Income Statement / Balance Sheet / Cash Flow line items 도입. migration 20260528000002 `financial_statement_line` 테이블 (model×scenario×statement×line_code×period UNIQUE). **신규 12번째 MCP tool** `compute_3fs(deal_code, scenario, persist=false)` — driver_value lookup (period-0 fallback + base inheritance) → IS 12 line 재구성 (cogs = revenue×(1-gross_margin), opex_total = Σopex, ebit fallback, tax_expense = max(0, pretax × tax_rate), net_income). 검증 Iippo base: 12 line × 7 period = **84 cells persisted**, net_income Y1=1.10억 → Y7=17.15억 (정확히 pretax × 0.78). **Frozen enum 신설** ([D-index-15](/ops/decisions)): statement 3 (income_statement / balance_sheet / cash_flow) + is_line_code 12. BS 12 line + CF 7 line 은 placeholder (Phase 1 = working capital + debt schedule 추가 driver 도입 후 완성). /index/schemas 15 → 16 (`index.financial_statement_line@1.0` active). 회귀: validate-model 27/27 + IRR 3 deal ±1pp 유지. 다음 = Gap 3 LP xlsx export. | 2026-05-28 | commit `9ac0c68` |
| **B-index-compute-full-model** ✅ | Gap 1 closure — DSL evaluator DB 통합 (사용자 질문 "Excel model → DB화 best practice" 의 첫 gap). DSL evaluator 는 이미 구현돼 있었으나 financial_driver 와 financial_driver_value table 과 연결 안 됨. **신규 11번째 MCP tool**: `compute_full_model(deal_code, scenario, persist?)` — DB load → scenario inheritance (base 폴백) → base_revenue_period0 → revenue[-1] sentinel → `dsl::evaluator::evaluate(horizon)` → derived 결과 매트릭스 + inputs_hash + (persist=true 시 financial_driver_value UPSERT). **evaluator 개선 2건**: (a) topo_order self-edge skip (revenue[y-1] lag, A7 check_driver_dag 와 동일 정책), (b) lookup_value input period 0 fallback (Excel "constant input row" 패턴, derived 는 strict). 검증: Iippo base 8 period × 2 derived = 16 cells persist → validate-model scenario_coverage **46% → 77%** 자동 상승, IRR ±1pp 회귀 유지. Iippo mgmt 시나리오 inheritance: base 13 + mgmt 11 override = 14 effective inputs, hash 분리 (base 와 다른 inputs_hash). **발견된 Y-suffix anti-pattern → [D-index-18](/ops/decisions) 신규**: `revenue_growth_y1..y7` + 단일 formula 결합 시 period 7 에서 revenue 1.2 quadrillion 원 비현실 compounding. Refactor 잔여 = [B-index-driver-period-indexed-refactor](/ops/backlog). | 2026-05-28 | commit `9df7f71` |
| **B-index-skill-mcp-discovery** ✅ | [D-index-17](/ops/decisions) Phase 2 entry point — index MCP 가 ic + ingest skill 의 canonical SoT (filesystem) 위에 discovery layer 추가. 2 신규 tool 도입 (MCP 총 10): (9) `list_skills()` — `/Users/axe/index/skills/` 의 모든 skill 의 SKILL.md frontmatter (`name` / `description` / `allowed-tools` / `required_model`) + sha256 + sub-dir 존재 (references / scripts / tests / agents); (10) `get_skill_resource(skill, path?)` — path 미지정 시 SKILL.md, file = content + sha256, directory = entries[] listing. **Security 4중 차단**: (a) `..` path traversal, (b) skill name 영문/숫자/_/- 만 허용, (c) canonicalize 후 starts_with 재검증 (symlink escape), (d) invalid → NOT_FOUND + context. /index/schemas 도 `index.skill_resource@1.0` 추가 → 14 → 15 schemas (9 active + 6 stub). 다음 = [B-blueprint-skill-mcp-client](/ops/backlog) (Blueprint Agent SDK 가 본 두 tool 로 skill discovery, filesystem 의존 제거) → [D-index-17](/ops/decisions) sunset 기준 (b) 충족. | 2026-05-28 | commit `bf09547` |
| **B-index-mcp-surface-2x** ✅ | Phase 0 마무리 — MCP `tools/list` 4 → 8 tool 확장 + `/index/schemas` envelope 활성화 ([D-index-7](/ops/decisions)). 신규 tool: `list_deals(stage?, sector?)` portfolio overview, `get_deal(deal_code)` full snapshot (target_company + fund_investments[] + financial_model + scenarios[]), `cross_deal_benchmark(driver, scenario)` D-index-10 A5 의 MCP 노출, `get_exit_matrix(deal_code, scenario?)` leaf-level detail (joint_probability + dead_leaf + concentration). `/index/schemas` 가 빈 list → 14 schema 본문 (8 active DB-backed: target_company / deal / fund_investment / financial_model / financial_driver / financial_scenario / exit_matrix_leaf / financial_output + 6 stub Phase 1: dd_finding / ic_decision / portfolio_kpi / risk_alert / valuation / lp_comm) + metadata.frozen_enums 4종 ([D-index-15](/ops/decisions) immutable) + dsl_operators 12 + decision_references 9. 신규 CLI `index dump-schemas` (auth bypass JSON dump). 회귀 검증 PASS: validate-model 27/27 + IRR ±1pp IC baseline 유지 (Iippo 36.52% / Sentry 40.26% / Canopy 26.39%). 다음 consumer = ic skill `--push-to-index` ([D-index-13](/ops/decisions) atomic batch) + Blueprint citation resolver (`index.financial_output` kind). | 2026-05-28 | commit `2dfc484` |
| **B-index-customers-yaml** ✅ | [D-index-10](/ops/decisions) production prereq — `customers.yaml axe.services.index` block 신설 (5 secret manifest: INDEX_DB_PASSWORD / INDEX_JWT_SECRET / AZURE_INDEX_MCP_CLIENT_SECRET escape_dollar / INDEX_PII_PASSPHRASE_AXEC Phase 1 backlog / ANTHROPIC_API_KEY shared). `service_paths.index` "placeholder 503" → 정상 path. `axe ship` CLI 에 `index` 등재 (`SHIP_SERVICES["index"] = {repo, deploy: manual_hint}` + `SHIP_DIRNAME_MAP`). Dockerfile cortex→index 정정 + sqlx offline `.sqlx/` 28 query cache → DB 없이 Docker 빌드 가능. docker-compose healthcheck python→curl. 검증: 4 컨테이너 healthy + `/healthz` 200 + `/index/mcp` 401 + WWW-Authenticate (RFC 9728) + RFC 9728 envelope. **Manual 잔존** (Soohun Global Admin): az ad app + admin consent + axe secret push + cloudflared route + GitHub remote + 첫 `axe ship index`. 상세 runbook = [/services/index#production-배포-axe-ship-index](/services/index). | 2026-05-28 | commit `38dcac8` |
| **B-index-A8-mcp-tools-integration** ✅ | [D-index-10](/ops/decisions) A8 — MCP `tools/list` + `tools/call` 4 tool 통합 (`src/mcp.rs` 137 → 566 line). **4 tools**: (1) `propose_deal_closure(seed)` atomic batch INSERT (D-index-13 정합 — 4 sub-tool 흡수, UUIDv5(deal_code) idempotency_key retry-safe), (2) `validate_financial_model(deal_code)` (A7 6 sanity check), (3) `compute_outputs(deal_code, scenario?)` (exit_matrix aggregation), (4) `query_irr(deal_code)` (per-fund display + summary weighted IRR). Methodology = irr::weighted_* 함수 재사용으로 validate.rs in-memory 결과와 byte-identical. 검증: Iippo 36.52% / Sentry 40.26% / Canopy 26.39% — 3 deal 모두 IC baseline ±1pp PASS. 3-layer error model (D-index-14) 적용: L1 HTTP (auth middleware) + L2 MCP body (JsonRpcError + error_code + context) + L3 skill. CLI smoke test 도입: `index mcp-call TOOL --args JSON` (auth bypass, dev 반복 회귀). **D-index-10 acceptance 8/8 PASS** (A6 xlsx round-trip 만 별 backlog 잔여). | 2026-05-28 | [D-index-10](/ops/decisions), `src/mcp.rs` |
| **B-index-A7-validate-financial-model** ✅ | [D-index-10](/ops/decisions) A7 — `index validate-model` CLI 6개 sanity check 도입 (`src/validate_model.rs` 608 라인). (1) driver_dag.cycle (topo sort, `revenue[y-1]` self-lag skip), (2) scenario_coverage (exit-matrix-only 모델 인식 — Sentry/Canopy 0% = PASS), (3) exit_matrix.sanity (dead_leaf + concentration > 50%), (4) leaf_probability_sum (Σ = 1.0 ± 0.02), (5) leaf_probability_sanity (V1 outdated upside never×writedown > 5% 자동 검출), (6) fund_investment.invariants (status=paid → invested_krw + paid_date 필수). 3 deal 모두 9/9 check PASS. 발견·수정: Canopy Initial BW paid_date NULL → 2025-06-01 보강. D-index-10 6/8 acceptance test 완료 (A1+A2+A3+A4+A5+A7). 잔여 = A6 (xlsx round-trip) + A8 (MCP tool integration). | 2026-05-28 | [D-index-10](/ops/decisions), `src/validate_model.rs` |
| **B-customer-deploy-generalization** ✅ | 5 요건 R1-R5 빌트인 완료 (Phase 1 5/26 + Phase 2 D-day 5/25). plan SSOT: `/Users/axe/customer-deploy-generalization-plan.md`. R1 `${HOME}` 변환 ✅, R2 vault SoT (`bw get password`) ✅, R3 `$` → `$$` escape (`escape_dollar` flag) ✅, R4 `image_override` 슬롯 ✅, R5 container_name customer-prefix (별 backlog [B-container-name-customer-prefix](#-신규-분류-안-됨) 으로 split). `_deploy_service_customer` 13-step + wrapper 3종 (`start-{frame,blueprint,hive}.sh`) + `bw-bootstrap.sh`. realchoice D-day 5/5 endpoint LIVE 검증. Phase 3 (3rd customer dry-run) 은 [B-customer-deploy-generalization-phase3-3rd-customer](#-신규-분류-안-됨) split. | 2026-05-26 | [/Users/axe/customer-deploy-generalization-plan.md](docstring) |
| **B-realchoice-port-collision-audit** ✅ | 트루비아 기존 14 컨테이너 (stream-mcp:8780, magnet-mcp:8770, ~/vault:8222, stream-realchoice 외) ↔ axec stack 포트 충돌 사전 점검. **D-day 5/25 5/5 endpoint LIVE 으로 implicit pass** (trap #6 포트 점유 함정은 onboard 중 발견 후 해소, known-gaps "realchoice D-day 6 함정" 에 포트 충돌 미언급 = 실제 충돌 없음). 영구화 = [B-port-conflict-preflight](#-신규-분류-안-됨) 의 onboard step preflight CLI. | 2026-05-25 | trap #6 + Ship Log 5/25 |
| **B-realchoice-vault-instance-decision** ✅ | 트루비아 기존 `~/vault` (Vaultwarden Timshel fork, port 8222) ↔ axec deploy 시 신설 `axe-vaultwarden` 인스턴스 선택. **결정**: 옵션 (a) **기존 vault 유지 + OIDC SSO 추가** (data migration 부담 0). 5/25 (PM) Ship Log "Vault OIDC SSO 통합 ✅ (Q3 (a) 채택, `~/vault` = `soohunkang/vault` repo, SSO 로그인 → 잠금 해제 정상)" — D-day 실 운영 검증 완료. description 의 "(b) 잠정" 은 5/24 시점 RE^2 §Q3 가정 → 5/25 (a) 확정으로 정정. | 2026-05-25 | Ship Log 5/25 PM |
| **B-anthropic-connector-input-attrs** ✅ | claude.ai Custom Connector modal 의 4 input 식별자 부재 함정 — Anthropic 측 업스트림 보고 draft 작성. `/ops/reports/anthropic-connector-input-attrs-2026-05` (173 라인, 9 섹션 self-contained: Summary / Env+Repro / Root cause + DOM analysis / Requested fix `name`/`aria-label`/`autocomplete` / Impact 표 / AXE Labs 우회 (B-axe-mcp-catalog-en-aliases 참조) / Attachments / Channels (support@anthropic.com + GitHub claude-code issue) / Status). 운영자 검토 후 제출. 수락 시 한국어 UI 4/4 자동입력 + 모든 i18n locale 동시 해소. | 2026-05-28 | [/ops/reports/anthropic-connector-input-attrs-2026-05](/ops/reports/anthropic-connector-input-attrs-2026-05) |
| **B-vault-axe.2-patches-upstream-pr** ✅ | Timshel/vaultwarden upstream PR draft 작성. `/ops/reports/timshel-vaultwarden-upstream-pr-2026-05` (165 라인, 9 섹션 self-contained: Summary / Motivation (symptom + trigger + affected) / Changes (patch 0001 prelogin alias + 0002 connect/token AccountKeys+MasterPasswordUnlock) / Testing (manual verification + real-world validation) / Compatibility (backward+forward+no migration) / Code reference (axelabs-ai/vault commit hash TBD) / Related (axe.3 patches 별 PR) / Status / Channels). 두 patch 모두 dani-garcia/vaultwarden mainline backport 성격 → 수락 가능성 높음. 수락 시 AXE fork diff 자연 소실 → [B-vault-axe.2-sso-mp-incomplete](#-신규-분류-안-됨) archive. | 2026-05-28 | [/ops/reports/timshel-vaultwarden-upstream-pr-2026-05](/ops/reports/timshel-vaultwarden-upstream-pr-2026-05) |
| **B-trap-33-frame-hive-multi-issuer-docs** ✅ | trap #33 의 (c) docs portion — [/architecture/auth](/architecture/auth) line 147 정정 + 함정 표 row 추가. "v1 token (aud=URI) OR middleware 양쪽 수용" 권장 → **"v2 강제 + middleware multi-issuer 양쪽 모두"** (defense in depth). 함정 row = Frame/Hive `_MICROSOFT_ISS_PREFIX` v2-only matcher 가 v1 token 을 HS256 fallback path 로 보내 RS256 reject 시키는 정확한 메커니즘 + fix 위치 (`http_server.py:141`/`:67`). code fix (a, b) 잔존 = [B-trap-33-frame-hive-multi-issuer](#-신규-분류-안-됨). | 2026-05-28 | [/architecture/auth](/architecture/auth) |
| **B-vault-d-day-traps-2026-05-25** ✅ | realchoice vault SSO 통합 시 발견 **8 함정** 인벤토리 entry. 모든 함정 catalog 완료 + 80%+ resolved (#10 `$` escape ✅ / #11 sso_nonce verifier ✅ / #12 axe.2 patch ✅ / #13 bw appdata 격리 ✅ / #14 → [B-vault-org-cli-automation](#-신규-분류-안-됨) split). 잔여 #8 (vault-caddy path mount), #9 (wget → curl), #15 (Caddyfile `/vault/` trailing slash) 는 production 운영 검증 (axe.axelabs.ai/vault 정상) — vault-caddy 측 minor patch 또는 documented behavior 로 본 inventory entry 는 종결. | 2026-05-28 | trap #8-#15 인벤토리 |
| **B-onboard-d-day-traps-2026-05-25** ✅ | realchoice D-day 첫 onboard 실행 중 발견 **15 함정** 인벤토리 entry. #1-#10 D-day 초기 함정 ✅ (Tailscale alias / SSH PATH / keychain partition / 포트 점유 [B-port-conflict-preflight](#-신규-분류-안-됨) split / hardcoded path R1 ✅ / docker ps 사전 검사 ✅ / frame-proxy archived ✅ / cloudflared 127.0.0.1 ✅). #11/#12 PAT workaround. #16 → [B-vault-org-create-automation](#-신규-분류-안-됨). #17 `_svc_step_network` ✅. #18 → [B-axelabs-bootstrap-blueprint-mcp-app](#-✅-done) ✅. #19 → [B-customer-deploy-generalization-r6-volume-precreate](#-신규-분류-안-됨). #20 → [B-customers-yaml-mkdir-trap](#-✅-done) ✅. 모든 sub-trap 이 ✅ 또는 split 완료 — 본 inventory entry 종결. | 2026-05-28 | trap #1-#20 인벤토리 |
| **B-ops-reports-sidebar** ✅ | `/Users/axe/axelabs-docs/content/ops/_meta.js` 에 `reports` entry 추가 (troubleshooting 다음, known-gaps 앞). Round 1 의 ops/reports/ 폴더 신설 + Round 2 의 2 추가 mdx 가 sidebar 에 노출. | 2026-05-28 | `content/ops/_meta.js` |
| **B-vault-setup-playbook-v2** ✅ | taehun.kang 의 첫 실제 vault setup 피드백 5건 (2026-05-27 Teams) 을 [/onboard/vault-setup](/onboard/vault-setup) playbook 에 inline 반영. (1) Phase 2 macOS/Windows sub-section 분리 (Windows Hello + Microsoft Store vs `.exe` + PIN fallback), (2) Phase 4/5 강제 vs 선택 구분 + skip 영향, (3) Phase 5 TOTP 의미 "기존 item 손댈 필요 없음, 새 2FA 부터 적용" 명시, (4) TOTP UI 동작 3종 (view/edit/empty) 표, (5) "자동 채우기 정상" 검증을 SSO 위주 vs 웹 폼 위주 워크플로 분기, (6) 표준 vs valid 변형 섹션 신설. +84 라인 (200→284). | 2026-05-28 | [/onboard/vault-setup](/onboard/vault-setup) |
| **B-vault-revoke-scope-doc** ✅ | taehun 피드백 #6 (2026-05-27) — vault trust boundary 명확화. [/architecture/vault-policies](/architecture/vault-policies) 에 `## Vault scope — 무엇을 보호하는가 (trust boundary)` 신설 (8-row 분리표) + [/ops/runbook/employee-offboarding](/ops/runbook/employee-offboarding) 에 step 8 "외부 service 권한 회수 (vault scope 외)" 표 6 row + 함정 표 row. 메시지 = vault = secret 보관 ≠ 외부 service 권한 제어 (KB / 홈택스 / GitHub PAT / Cloudflare Access 회수는 별 절차). | 2026-05-28 | [/architecture/vault-policies](/architecture/vault-policies) |
| **B-bw-cache-recovery-procedure-docs** ✅ | bw CLI data.json cache stale 함정의 표준 recovery 절차 docs 등재 (`/architecture/secrets` 함정 표 row + `/ops/runbook/vault-recovery` 새 ## 섹션 ~48 라인). 증상/원인/빈도 (5/22 + 5/26)/회복 절차 4 step bash/자동화 후보 3 prong/함정 4-row 표. 자동화 잔여는 [B-bw-cache-stale-autoheal](#-신규-분류-안-됨) (별 backlog). | 2026-05-28 | [/ops/runbook/vault-recovery](/ops/runbook/vault-recovery) |
| **B-blueprint-scope-change-runbook-docs** ✅ | Blueprint OAuth scope 추가 함정의 docs 등재. [/architecture/auth](/architecture/auth) 의 함정 표에 row 1개 (refresh token 침묵 사망 + AADSTS65001 + MSAL 캐시) + `## OAuth scope 추가 시 운영자 절차` 새 섹션 (5-step bash: ship → admin-consent → docker restart → 검증 → user reconnect 안내). +27 라인. 자동화 prong 2개 (post-deploy hook + token health check) 는 [B-blueprint-scope-change-admin-consent-runbook](#-신규-분류-안-됨) 잔존. | 2026-05-28 | [/architecture/auth](/architecture/auth) |
| **B-claudeapp-fd-leak-anthropic-report** ✅ | Claude.app PTY/fd leak 의 Anthropic 측 공식 리포트 draft 작성. `/Users/axe/axelabs-docs/content/ops/reports/claudeapp-fd-leak-2026-05.mdx` (113 라인, 10 섹션 + frontmatter) — Summary / Environment / Symptom (failure mode + reproduction + diagnosis) / Workarounds / Suspected root cause / Impact / Requested fix / Attachments / Channels / Status. `ops/reports/` 폴더 + `_meta.js` 신설. 운영자 검토 후 support@anthropic.com 또는 GitHub claude-code repo issue 로 제출. | 2026-05-28 | [/ops/reports/claudeapp-fd-leak-2026-05](/ops/reports/claudeapp-fd-leak-2026-05) |
| **B-docs-ssot-extension-2026-05-26-corrections** ✅ | Truvia 2026-05-26 피드백 정정 7건 (B1-B7) docs 반영. **B1** [/ops/runbook/vault-recovery](/ops/runbook/vault-recovery) bw cache section + **B2** [/architecture/secrets](/architecture/secrets) `$` escape 함정 row + **B3** [/architecture/auth](/architecture/auth) (별 B-blueprint-scope-change 와 연계) + **B4** [/architecture/topology](/architecture/topology) `artemis_default` external network 함정 row + **B5** [/services/frame](/services/frame) `${HOME}` 함정 + `/Users/axe/` hardcode 금지 callout + **B6** [/partner/registration](/partner/registration) `--allow-no-subscriptions` 검증 step + **B7** [/partner/deploy](/partner/deploy) 함정 표 18-step 형태 재구성 (11 신규 row). 잔여 = 신규 페이지 A1/A2 ([B-docs-ssot-extension-2026-05-26-newpages](#-신규-분류-안-됨)). | 2026-05-28 | 다중 페이지 |
| **B-docs-playbook-frontmatter-marker** ✅ | playbook 페이지 frontmatter `playbook: true` 스킴 + `_meta.js` entry title 에 `⚡ ` prefix. 15 페이지 일괄 적용 (onboard 4 + ops/runbook 11). SSOT = [/architecture/playbooks](/architecture/playbooks). | 2026-05-26 | [/architecture/playbooks](/architecture/playbooks) |
| **B-docs-playbook-catalog-build-time** ✅ | `scripts/generate-playbook-catalog.mjs` 도입 — frontmatter `playbook: true` 페이지 인덱싱 + SSOT [/architecture/playbooks](/architecture/playbooks) 의 marker 사이 표 자동 교체 + `public/playbooks.json` deterministic export. | 2026-05-26 | [/architecture/playbooks](/architecture/playbooks) |
| **B-realchoice-d7-checklist** ✅ | Truvia 5/25 D-7 회신 처리 완료 (RE^4). (1) payslip Hive Phase 3 deferral, (2) 외부 회계법인 사내 협의 → [B-frame-cross-check-workflow](#-ready-다음-세션이-집어갈-수-있음) 분리, (3) macmini 이진우 자택, IP 동일, Tailscale 입고 후 회신 → [B-realchoice-tailscale-onboard](#) 분리. | 2026-05-25 | RE^4 |
| **B-realchoice-tailscale-onboard** ✅ | 피벗 (5/25 RE^6) — macmini 발주 skip, 기존 운영 macmini → `realchoice-macmini`. Tailscale ACTIVE direct + SSH + Docker + 절전 OFF 모두 기존 상태. 외부 IP 변경 X. D-day = 본일 (5/25). | 2026-05-25 | RE^6 |
| **B-axe-mcp-catalog-en-aliases** ✅ | `axe mcp publish` 의 `_mcp_item_payload` 3 차례 iteration + 운영자 retest 결과 — autofill 2/4 (Client ID + Secret) 유지 + Name/URL 은 copy-paste convenience field 등재. **확정 finding**: `Remote MCP server URL` field 추가 = regression (1/4), `Server URL` 단독 (EN label) = 안전. 6 Custom Field 표준 (Name + Server URL + MCP URL + Tenant ID + Scopes + Vault secret path). 매칭 천장 4/4 는 Anthropic markup 변경 ([B-anthropic-connector-input-attrs](#-신규-분류-안-됨)) 필수. **금지** = `Remote MCP server URL` 절대 추가 X. | 2026-05-27 | axe CLI docstring |
| **B-docs-cache-control-static** ✅ | docs.axelabs.ai 의 자주 갱신되는 정적 자산 (`/llms.txt`, `/llms-full.txt`, `/changes.json`) 에 `s-maxage=60` cache-control 명시. `next.config.mjs` 의 `headers()` source 3개 추가 — 기존 `/_pagefind/*` (commit 9c13bcc) 와 동일 패턴. ship 직후 Cloudflare 캐시 잔존 함정 차단. | 2026-05-26 | commit 9c13bcc + 본 PR |
| **B-trap-24-blueprint-mcp-admin-consent** ✅ | trap #24 영구 fix (docs 측). `/partner/registration` 의 Option A 사전 확인 표에 admin consent grant 권한 4 가지 role (Global Admin / Privileged Role Admin / Cloud App Admin / Application Admin) 명시 + 함정 표에 admin consent 실패 시 manual grant 절차 (portal UI / admin consent URL) 명시 + Option B 함정 모음에 admin consent 함정 row 추가. bootstrap.sh 측 Blueprint MCP app 등록 fix 는 [B-axelabs-bootstrap-blueprint-mcp-app](#-ready-다음-세션이-집어갈-수-있음) 별 task. | 2026-05-26 | trap #24 |
| **B-customers-yaml-mkdir-trap** ✅ | trap #20 영구 fix. **Root cause 확인** = axe CLI / bootstrap.sh / wrapper scripts / partner docs 어디에도 `mkdir -p .../customers.yaml` 같은 잘못된 명령 부재 (grep 검증 완료). Truvia 측 manual 실수 가능성 高 (customer 측에는 customers.yaml 부재가 정상 — operator SOT). **Defensive fix** = axe CLI `_load_yaml` + `_load_customers_yaml_rt` 에 `path.is_dir()` sanity check 추가 — file 예상한 path 가 dir 일 때 `IsADirectoryError` stack trace 대신 명확한 회복 안내 (`rm -rf <path> + recreate as file`). axe CLI 는 git untracked ([B-axe-cli-git-track](#-ready-다음-세션이-집어갈-수-있음)) 라 단일 머신 적용. | 2026-05-26 | trap #20 |
| **B-axelabs-bootstrap-blueprint-mcp-app** ✅ | trap #18 영구 fix. `axelabs-bootstrap.sh` 에 App #4 Blueprint MCP 등록 step 추가 (Frame MCP 패턴 1:1 mirror — application_id_uri `/blueprint/mcp` + mcp.access scope + claude.ai redirect + optional claims + v1 token + self-ref permission). JSON pack 의 `apps` 에 `blueprint_mcp` 필드 추가. `axe customers ingest` 가 optional 로 흡수 (옛 3-app pack 도 backward compat). `/partner/registration` docs = "3 개" → "4 개" + Option B App #4 섹션 신설 (Frame MCP 와 동일 절차 + 경로 차이 표). 새 SHA-256 = `ae6f771e85f7ec49d75bc082e1e0d42b106ba095e03d9adad430e590c2c4aefb`. 양쪽 (`public/` + `.axe/bootstrap/`) 동기화. | 2026-05-26 | trap #18 |
| **B-trap-23-hive-volume-compose-prefix** ✅ | trap #23 영구 fix — **R6 (B-customer-deploy-generalization-r6-volume-precreate) 통합 결정**. hive docker-compose.yml 의 external volume name (`hive-proxy_*` historical prefix) 정합성 문제는 R6 의 blueprint volume 6개 fix 와 함께 차기 phase 에서 한꺼번에 해소 (compose `external:true` 제거 → self-contained volume 권장). 별 task 종결, R6 row 비고에 trap #23 명시 추가. | 2026-05-26 | trap #23 → R6 |
| **B-vault-mcp-catalog** 🆕✅ | MCP Connectors catalog view ([D-vault-mcp-catalog](/ops/decisions)) — Vaultwarden `MCP Connectors` org collection (`1a62e754-6e47-43e0-a99a-cf71c37b8638`, 4 org 멤버 모두 access) + `axe mcp publish/list` CLI subcommand (axe CLI `cmd_mcp_publish`/`cmd_mcp_list`) + `axe secret rotate` 의 step 4.5 자동 hook (env name 패턴 `AZURE_*_MCP_CLIENT_SECRET` 감지 시 catalog 재발행) + customers.yaml frame_mcp 의 stale `client_secret_env` 주석 정정. 3 MCP seed (frame/hive/blueprint) publish 완료. `customers.yaml` SoT + Vaultwarden item SoT 변경 0 (catalog 은 derived view only). 함정 1 발견 + 정정 (frame_mcp client_secret_env stale, 5/26 정정). docs = [/architecture/secrets#mcp-connectors-catalog](/architecture/secrets) + [/ops/decisions D-vault-mcp-catalog](/ops/decisions) + known-gaps "vault측 미해결" 표의 bw cache stale 항목 cross-link. | 2026-05-26 | [D-vault-mcp-catalog](/ops/decisions) |
| **B-bw-cache-recovery-procedure** 🆕✅ | bw 2025.7.0 의 local data.json cached `cryptoSymmetricKey` stale 증상 (5/22, 5/26 두 차례) root cause 확정 + recovery procedure 표준화. **Root cause** = server-side patch deploy (axe.2, axe.3 등) 후 bw `sync` 가 cache 를 inconsistent 상태로 저장. `bw unlock` 은 캐시 무효화 X. **확정 절차** = `mv "~/Library/Application Support/Bitwarden CLI" .broken.$(date +%s) && bw config server https://axe.axelabs.ai/vault && bw login ai@axellc.com` (positional password 또는 osascript dialog). 약 1분. **추가 발견**: bw 2025.7.0 의 `bw unlock --passwordenv` 가 silent failure (rc=0 + empty output) — positional password `bw unlock "$PW" --raw` 만 작동. 본 PR 의 본격 영구 fix 는 [B-bw-cache-stale-autoheal](#) (axe wrapper layer) 로 분리. | 2026-05-26 | known-gaps "vault측 미해결" 표 + [B-bw-cache-stale-autoheal](#) |
| **B-vault-fork-build-pipeline** | [D-ops-40](/ops/decisions) 의 build pipeline 실 구현 + axe.3 release. `axelabs-ai/vault` repo public 전환, `build/build.sh` + `.github/workflows/build.yml` + `build/patches/0001..0004.patch` (axe.2 + axe.3 4 patch) commit + main push (commit `799015b`). GHA buildx multi-arch (linux/amd64+arm64) → GHCR push (PAT vault-stored, item `ghcr-axelabs-ai-pull-pat` in Platform — Service Secrets). main-`<sha7>` rolling tag + imagetools alias `1.34.1-6-axe.3` (manifest list digest `sha256:a26208a0794acbc9a2807379ffba33c7478dbe8d41daed24893f7916a55aeada`). axe-macmini compose 의 image 라인 = `ghcr.io/axelabs-ai/vault@sha256:...` 로 재핀 ([D-ops-11](/ops/decisions) immutable manifest-digest 정책 정합 복원). | 2026-05-26 | [D-ops-40](/ops/decisions) + axelabs-ai/vault commit `799015b` |
| **B-vault-org-perm-3-quirks** | [D-ops-40](/ops/decisions) patch 0003 + 0004 axe.3 release deploy + 3건 in-production 검증 통과. **patch 0003** = `src/api/core/organizations.rs` 의 3 site (line 522, 600, 685 — post_organization_collections + post_bulk_access_collections + post_organization_collection_update) 에서 `if member.access_all { continue; }` skip 제거 → Owner 도 명시 `users_collections` row 생성. **patch 0004** = `src/db/models/cipher.rs::to_json` (line 374 근방, User-sync branch) 에 `permissions: {response:null, delete:<bool>, restore:<bool>}` 추가 (`<bool>` = collection manage OR org Owner/Admin). 함정 2 (cipher edit collectionIds silent partial-revert) 는 vaultwarden bug 아닌 mainline design 으로 확인 — 운영 룰 영구 ([B-vault-org-cli-automation](#) 의 본 함정 확장). **검증 3건 in-production** (2026-05-26 13:19 KST): (1) `bw create org-collection ... users=[{id:ai@,manage:true}]` → SQLite users_collections 에 `ai@axellc.com\|0\|0\|1` row 명시 insert ✅, (2) raw GET `/api/sync` → org cipher 의 `permissions: {delete:true,restore:true,response:null}` 정확 emit ✅, (3) `bw delete item` rc=0 ✅. 영구 fix 완성, 운영 임시 룰 (SQL 수동 INSERT, admin endpoint 직접 호출) 자연 폐기. | 2026-05-26 | [D-ops-40](/ops/decisions) Progress |
| **B-matrix-git-init** ✅ | `/Users/axe/matrix` git init + first commit. 본 점검 세션 시작 시 working tree 가 init 상태였으나 commit 0 (`no commits yet`). `.gitignore` 보강 (`.env`, `.env.local`, `.claude/`, `.DS_Store`, `*.log` 추가 — 기존 `/target` 만) 후 13 파일 staged + commit `f73492d` "initial: matrix MCP monitoring service v0.1.0" + commit `48a301b` (collector port fix). ultrareview / 롤백 / origin push 가능 상태 회복. | 2026-05-26 | [D-matrix-1](/ops/decisions) |
| **B-matrix-rebuild-stale** ✅ | matrix blue/green 컨테이너 rebuild — `cargo check` 결과 `src/api.rs:26` 의 `matrix_info` 함수 미정의 (E0425) 로 working tree 자체가 컴파일 불가였음 (11:35 빌드 후 11:39 미완성 수정 흔적). `matrix_info` honest minimal stub (service info JSON: name/version/endpoints 4개) 추가 + collector port fix 와 한 번에 무중단 rebuild (green→blue 순서, 두 컨테이너 healthy 검증). 새 image digest, external `axe.axelabs.ai/matrix` 도 새 landing 반환. | 2026-05-26 | commit `48a301b` |
| **B-matrix-collector-port-fix** ✅ | `src/collector.rs:180` 의 blueprint-http URL `:3110` → `:3100/api/health` 정정. 호스트 `lsof` + 컨테이너 안 `docker exec curl` 양쪽 검증 — :3110 미 listening, :3100/api/health 가 정답 (Blueprint Next.js dev, `/Users/axe/blueprint/src/app/api/health/route.ts` 존재). cortex-fe/cortex-be 는 그대로 — cortex backend :3210 실제 down, cortex frontend :3200 root path 빈 응답으로 **valid alert**. rebuild 후 첫 cycle: failures = `["cortex-fe-http", "cortex-be-http"]` (blueprint 사라짐 ✓). 누적된 blueprint-http unacked alert 1 row 도 ack 처리 (`acked_by='collector-port-fix-2026-05-26'`). | 2026-05-26 | commit `48a301b` |
| **B-matrix-mcp-auth-enforce** ✅ | matrix `/matrix/mcp` 에 JWT auth middleware 부착. router 분리 — `mcp_router = Router::new().route("/matrix/mcp", post(mcp::handle_mcp)).route_layer(middleware::from_fn(auth::auth_middleware))` + main router 에 merge. REST + health 는 anonymous 유지 (의도된 공개 status board). **부착 전 안전 검증** = production access log 0 (matrix-mcp-blue/green/proxy 모두 /matrix/mcp 호출 흔적 0) + Blueprint repo 에 matrix MCP client 코드 0 + customers.yaml 에 `MATRIX_JWT_SECRET` vault 등재 (`matrix/axe/jwt-secret`) = JWT 의도 분명. 검증: no-auth POST → 401 "missing bearer token", REST → 200. `cargo check` 의 `auth_middleware never used` warning 사라짐. | 2026-05-26 | commit `96cf758` |
| **B-matrix-cortex-collector-skip** ✅ | matrix collector 의 cortex-fe-http / cortex-be-http 두 endpoint 제거 — **cortex 는 개발 중** (운영자 확인 2026-05-26), launchd 미부트 + `:3210` 미 listening + `:3200` 빈 응답으로 valid alert 가 운영 noise 화. `src/collector.rs:181` 에 재가동 시 재활성화 조건 주석 명시. rebuild 후 collector cycle = `check passed` (failures 0). 누적 unacked alert 2 row (cortex-fe + cortex-be) 도 ack 처리. | 2026-05-26 | commit `96cf758` |
| **B-frame-fund-ingest-verify** | 강태훈 대표 fund 자료 ingest 시도 결과 audit — D-ops-30/PR #38 fix 적용 후 `axe_ia_001` (kip, fund_ksme) 정상 empty fund 로 회복 (48 accounts + accounting_policy bootstrap + alembic 0019 head). 회계 데이터 0 = 사용 시작 준비 완료. 7 entities → 5 로 좀비 정리 (`axe_ia_001_diag` + `bug_check_kip_20260524` DROP, `axep` 보존) | 2026-05-26 | [D-frame-fund-ksme-policy-check](/ops/decisions) + [D-frame-register-entity-atomic](/ops/decisions) |
| **B-frame-register-entity-atomic** | `register_entity` atomicity + mismatch detect (강태훈 bug report root cause #2/#3 잔여분 영구 fix). (a) existing row 의 standard/kind/schema_name mismatch 시 ValueError (silent override 금지), (b) `upgrade_entity` 실패 시 compensating `DROP SCHEMA CASCADE` + `DELETE shared.entity` 로 좀비 회수. 6 신규 pytest (mismatch standard/kind/all-diffs · idempotent identical · zombie cleanup · pre-existing 보호) + 16 기존 PASS 무회귀 | 2026-05-26 | [D-frame-register-entity-atomic](/ops/decisions). `src/frame/db/migrations.py:88` + `tests/test_register_entity_atomicity.py` 신설 |

## 🗄️ Archive (1주+ 경과 · Ship Log + decisions 영구 보존)

> Done 에서 1주 경과한 ship 완료 항목. 상세 narrative = [updates Ship Log](/ops/updates), 결정 = [decisions](/ops/decisions). 본 표는 ID → 결정 trace 만 유지 (compact).

| ID | 한 줄 | 완료일 | 결정 |
|---|---|---|---|
| B-bp-artifact-prisma + B-bp-artifact-link-table | Artifact + ArtifactLink Prisma migration + `src/lib/artifact/store/` | 2026-05-23 | [D-bp-artifact-1](/ops/decisions) |
| B-bp-artifact-schema-discovery | Blueprint `McpSchema` 모델 + fetcher/registry + admin API 2 | 2026-05-23 | [D-bp-artifact-1](/ops/decisions) |
| B-frame-mcp-schema-endpoint | frame `/frame/schemas` 13 schemas | 2026-05-23 | [D-bp-artifact-1](/ops/decisions) |
| B-hive-mcp-schema-endpoint | hive `/hive/schemas` 15 schemas | 2026-05-23 | [D-bp-artifact-1](/ops/decisions) |
| B-onboard-azure-pack | `axe customers ingest` CLI 신설 (schema 검증 + yaml fill + vault push) | 2026-05-23 | [D-ops-34](/ops/decisions) |
| B-onboard-bootstrap-publish | `axelabs-bootstrap.sh` raw 노출 + partner docs self-contained | 2026-05-23 | [D-onboard-bootstrap-publish](/ops/decisions) |
| B-health-monitor-launchd | `com.axe.health-check` → matrix service 대체 | 2026-05-23 | [D-matrix-1](/ops/decisions) |
| B-docs-search-impl | docs.axelabs.ai Pagefind UI 검색 코드 머지 | 2026-05-22 | [D-docs-search-1](/ops/decisions) |
| B-frame-shared-extend | `shared.entity` entity_kind+fund_meta+closed_at ADD (0008_shared) | 2026-05-22 | [D-ops-22](/ops/decisions) |
| B-frame-entity-relationship | `entity_relationship` ownership numerator/denominator + kind ENUM | 2026-05-22 | [D-ops-22](/ops/decisions) |
| B-frame-cross-journal-link | `shared.cross_journal_link` 신설 (mirror 분개 pair) | 2026-05-22 | [D-ops-22](/ops/decisions) |
| B-frame-register-entity-cli | `register_entity` Python API + CLI `--kind`/`--fund-meta` | 2026-05-22 | [D-ops-22](/ops/decisions) |
| B-frame-fund-deploy | frame-mcp rebuild + `0008_shared` migration + 0 regression | 2026-05-22 | [D-ops-22](/ops/decisions) |
| B-frame-rfc9728-fix | RFC 9728 resource-level path 401 → Connector Reconnect fix | 2026-05-22 | [D-ops-23](/ops/decisions) |
| B-vault-sso-email-verif | `SSO_ALLOW_UNKNOWN_EMAIL_VERIFICATION` Entra email_verified fix | 2026-05-22 | [D-ops-24](/ops/decisions) |

## 신규 항목 등재 — 한 줄 가이드

```markdown
| **B-<area>-<slug>** | <행동 한 줄> | M? | <추정 d> | <의존성/비고 + decisions/docs 링크> |
```

규칙:
- ID = `B-AREA-SLUG` (B = Backlog, area = `org` · `frame` · `hive` · `bp` · `docs` · `infra` · `legal` · `backup` 등)
- 한 줄 행동 — 1주 안 끝날 항목은 쪼개거나 마일스톤으로 승격
- 마일스톤 ID 명시 (M1~M5) — 없으면 `—`
- 관련 decisions / docs 항상 링크
- 작업 시작 = 🔧 로 옮기고 owner + 시작일 추가
- 완료 = ✅ 로 옮기고 완료일 + 결정 링크. 1주 후 archive

## 본 페이지의 의도

다른 세션이 들어와도 **"무엇부터 할 지" 가 5초 안에 보이게**. [known-gaps](/ops/known-gaps) 는 "왜 그렇게 됐는지·뭐가 함정인지" 의 분석적 정보, 본 페이지는 "다음 행동" 의 실행 큐. 마일스톤 큰 그림은 [roadmap](/ops/roadmap).
