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

---
title: 결정 거버넌스 — gate (결재 + e-sign + 법무)
description: gate 서비스의 결정→실행 거버넌스 아키텍처. record≠process, 서명 1-primitive, actuation ledger, Blueprint mirror, 그리고 narrowed Phase-1(gate-native 직접-build 암호 e-sign[CAdES-T]·내부검색·AXE-internal) vs Phase-2(외부 본인확인기관·flywheel·공개 SaaS·결제·멀티테넌트) 경계.
---

# 결정 거버넌스 — gate

gate 는 한국형 **내부 전자결재 + e-sign + HTML 문서 + 법무검색**을 하나의 **AI-driven 결정→실행 파이프라인**으로 묶는 신규 **Rust + Postgres** 서비스다. [para-os §7](/architecture/para-os)(결정로그 ≠ 결재워크플로)의 물질화 — 성숙한 거버넌스 Area 가 독립 서비스로 졸업한 형태.

> 본 페이지 = gate **거버넌스 아키텍처 설계** (착수 직전 설계 + e-sign 엔진 빌트, 2026-06-07). 결정 SSOT = [D-gate-1](/ops/decisions)(scope·Phase) · [D-gate-2](/ops/decisions)(record SoR) · [D-gate-3](/ops/decisions)(actuation·e-sign 경계, e-sign 부분 D-gate-5 가 supersede) · [D-gate-4](/ops/decisions)(법무) · **[D-gate-5](/ops/decisions)(e-sign 직접구현 = 암호등급 자체 서명엔진, 빌트+검증 — D-gate-3 integrator 입장 supersede)**. 마스터플랜·착수 큐 = [B-bp-decision-pipeline-esign](/ops/backlog) (service=gate, roadmap M9). 설계 전모·리서치 결론은 gate machine 메모리 2파일.

## 1. Phase 경계 — narrowed Phase-1 (경로 A)

7라운드 설계 후 7-agent red-team 이 **풀설계**(결재 + 직접 e-sign + 법무 RAG flywheel + 공개 SaaS + 결제 + 멀티테넌트 = 1인이 동시에 짓는 6~7 규제제품)에 **NO-GO**(11 P0 / 16 P1 / 8 누락) 판정했다. 결정적 사실 — **11 P0 가 전부 "야심 5종"에 거주**한다. 따라서 narrowed Phase-1 은 대부분의 P0 를 *해소가 아니라 defer 로* 회피한다 ([D-gate-1](/ops/decisions)).

> **단, e-sign 은 예외 (2026-06-07 [D-gate-5](/ops/decisions))**: 운영자가 *"모두싸인의 기능을 직접, 암호등급으로 구현"* 지시 → e-sign 은 defer 가 아니라 **직접-build 로 빌트**됐다 (§6). red-team 이 직접-build 를 막았던 P0(HSM·HTML→PDF 결정성·custody)는 이제 **해소-또는-명시**: 결정성 = canonical decision bytes 로 *지금*(typst PDF render 는 later), HSM = trait abstraction *ready*(dev = software key), custody = `esign_seal` append-only + RFC3161 TSA. **진짜 잔여 Phase-2 = 외부 서명자 본인확인기관**(정보통신망법 §23-3, 자가구축 불가) — 그 외 직접 e-sign P0 는 닫혔다.

| 영역 | **Phase-1 (확정·착수 가능)** | **Phase-2+ (각자 게이트, defer)** |
|---|---|---|
| 결정로그 | gate `decision` SoR (record≠process) | — |
| 결재워크플로 | 기안→DOA→승인/반려/보류→시행 상태기계 | — |
| 문서 | HTML spine → PDF 렌더 | — |
| e-sign | **gate-native 직접-build 암호 서명엔진** (CAdES-T server-seal + RFC3161 + esign_seal evidence + verify_seal; 모두싸인 = optional alt provider) — [D-gate-5](/ops/decisions) | 외부 서명자 **본인확인기관** 통합(정보통신망법 §23-3) · *하드닝*: HSM·PAdES 서명-PDF·prod-key |
| 실행 | actuation ledger (멱등 + reconcile) | saga 보상 (e-sign+결제+분개) |
| 가로 거버넌스 | Blueprint `gate.decision` citation mirror | visibility-gated mirror 테이블 |
| 배포 대상 | **AXE-internal only** (realchoice/Truvia table-stakes) | 공개 SaaS (+tenant_id RLS·self-IdP) |
| 법무 | **pgvector-KR 내부검색만** (결재 자동주입 X) | Pinecone+Cohere+Gemini flywheel (+PIPA 자문) |
| 결제 | 없음 | 포트원/토스/Paddle (+전자금융/전자상거래) |
| 테넌시 | 없음 (owner_id RLS) | cross-tenant 축적 (+PIPA 가명정보) |

빌드게이트(코드보다 먼저) = [B-gate-bonin-id-contract](/ops/backlog)(본인확인기관 계약, 수주~수개월) · [B-gate-legal-counsel](/ops/backlog)(변호사법 §109 + PIPA 의견서) · [B-gate-phase2-gates](/ops/backlog).

## 2. record ≠ process — SoR = gate, Blueprint = mirror

- **결정 로그 (record)** — 무엇이·누가·언제·무슨 권한으로·뭘 근거로 결정됐나. append-only, 불변(수정 아닌 **supersede**). **SoR = gate `decision` 테이블** (서비스가 SoR 소유, [D-gate-2](/ops/decisions)).
- **결재 워크플로 (process)** — 기안 → 결재선(DOA) → 승인/반려/보류 → 시행. 그 위 policy-driven·agent-assisted 레이어. 워크플로 완료 → 결정로그 한 줄 방출.

**왜 gate 가 SoR 인가**: round-1 은 결정로그를 *Blueprint core primitive(가로)* 로 뒀으나 = AXE-internal 전제. standalone 외부제품 요구가 refine — record 의 집을 gate 로 옮겼다. 근거(grounded): [/architecture/artifacts](/architecture/artifacts) "MCP backend = sole owner, data 중복 0" · [/architecture/data](/architecture/data) "cross-service = 직접 DB read 금지, 명시적 신호채널(pg_notify/outbox)만" · [D-cortex-9](/ops/decisions) = service-owns-SoR + Blueprint visibility-gated mirror 가 이미 빌트(template 기성). Blueprint = `gate.decision` citation mirror(optional consumer 1종, 외부고객 = OFF, gate 단독 완결).

## 3. 핵심 테이블 (Blueprint-agnostic)

| 테이블 | 역할 |
|---|---|
| `document` | **HTML 작성 스파인**(풍성한 포맷) + 변수(AI/템플릿 fill) + rendered_pdf_ref(서명용) + version + kind(기안/계약/통지). 내부결재 + e-sign = 같은 document 의 두 phase. |
| `workflow` | 내부결재 상태기계: draft→상신→in_review(결재선 step)→승인/반려/보류→시행→done. |
| `approval_step` | 결재선 (kind: 승인/전결/협조/합의/대결 · state: pending/approved/rejected/held/skipped). **반려·철회·서명거절 역흐름 = 1급 시민**(red-team 누락 #8). |
| `doa_policy` | 전결규정 (entity · decision_type · amount_min/max → line jsonb). |
| `signature` | 내부+외부 서명 통합 primitive (provider ∈ `{internal, gate, modusign}` · signers · envelope_id · cert_ref · status). §4. |
| `esign_seal` | **암호 봉인 evidence** (append-only, 전자문서법 §5 custodian) — decision_id · sealed_bytes_hash · **CMS/CAdES-T DER**(detached 서명 + RFC3161 토큰) · signer_cert_ref · tsa_url · sealed_at. 시행 시 `esign.gate` actuator 가 1행 append, `verify_seal` 가 읽음. §4·§6. |
| `actuation` | 실행 ledger (actuator_kind · payload · idempotency_key · state · result_ref · reconciled_at). §5. |
| `event` | append-only audit. |
| `decision` | gate SoR terminal record (authority · actor · decided_at · basis citations · supersedes). canonical bytes = `esign_seal` 봉인 대상. |

## 4. 서명 = 한 primitive

내부 sign-off = 외부 e-sign = 같은 primitive `signature`. 누가·법적무게만 다르다. `provider ∈ {internal, gate, modusign}`:

- **`internal`** — 결재선 step 의 인증된 결재 승인 (UI sign-off). gate identity = 실지명의.
- **`gate`** (Phase-1, [D-gate-5](/ops/decisions)) — **gate-native 암호 봉인**. 시행 시 승인된 결정의 canonical bytes 를 단일 서버 서명 identity 로 **CAdES-T server-seal** → `esign_seal` 에 evidence 저장. 봉인 1건 = `signature(provider=gate)` + `esign_seal` 1행. §6.
- **`modusign`** (optional alt provider) — 외부 카운터파티 라운드트립이 필요할 때의 대체 경로 (`esign.send`/EsignStub). Phase-1 의 *대안*이지 기본 아님.

내부 결재 승인도, gate 서버 봉인도, 외부 모두싸인 e-sign 도 "행위자가 결정을 시점에 (법적으로) 확정"하는 한 종류의 행위 — [para-os §84](/architecture/para-os) 와 정합.

## 5. actuation ledger + reconcile (분산 일관성)

승인된 결정 → **actuator 호출** (`frame.post_journal` / `index.register_deal` 등; Area 서비스 = 결정 파이프라인의 actuator). 결정→실행은 분산 트랜잭션이므로:

- `actuation.idempotency_key = uuidv5(workflow + seq + actuator + payload_hash)` — gate 측 재시도 멱등.
- **reconcile 워커** (frame-worker 패턴, pg_notify) — inflight→done/failed 정합.
- ⚠️ **gate idempotency_key 는 *외부* 이중실행을 못 막는다** (red-team P0 #5) — `esign.gate` 봉인은 gate 내부 actuator라 `esign_seal`(decision_id 유일) append 가 멱등이지만, *외부* provider 경로(모두싸인 alt) 는 **provider-side idempotency 토큰** 필요. saga 보상(e-sign+결제+분개)은 결제 도입 Phase-2.

## 6. e-sign 경계 — Phase-1 = gate-native 직접-build 암호 서명엔진

> **2026-06-07 pivot ([D-gate-5](/ops/decisions), [D-gate-3](/ops/decisions) e-sign 경계 supersede)**: [D-gate-3](/ops/decisions) 은 e-sign 을 모두싸인 integrator 로 두고 직접-build 를 Phase-2 로 defer 했으나, 운영자가 *"모두싸인의 기능을 직접, 암호등급으로 구현"* 지시 → **Phase-1 이 직접-build 엔진**이다. 빌트+검증 완료 (이 세션).

**Phase-1 = BUILD (직접 구현, 작동·검증됨)** — gate 가 자체 암호 서명엔진을 갖는다 ([para-os §84](/architecture/para-os) 와 정합: gate = 결정 파이프라인의 actuator, 봉인은 `esign.gate` actuator):

- **① CMS/PKCS#7 CAdES-BES detached 서명** (RSA-2048 + SHA-256). `DocumentSigner` trait(**HSM-ready** abstraction) + `SoftwareSigner`(self-signed X.509). 적대적 리뷰(위조 도달경로 없음) + **openssl 양방향 interop**, 7 tests.
- **② RFC3161 신뢰 타임스탬프 → CAdES-T** (hand-rolled ASN.1, 단일 clean dep line). default = DigiCert RSA TSA; 한국 prod = **Koscom/CrossCert** config-swap. 9 tests + live round-trip.
- **⑤ 워크플로 배선**: **시행(execute)** 시 `esign.gate` actuator 가 승인된 결정을 **server-seal** — canonical decision bytes → CAdES-T → append-only **`esign_seal`** evidence 테이블 저장 (**전자문서법 §5 custodian**). 신규 **`verify_seal` MCP tool** = 서명 + 무결성 + 타임스탬프 검증. e2e: 결재→seal→verify valid · 저장 CMS openssl cross-verify 통과 · DB tamper→integrity fail.

**법적 근거 — 전자서명법 (2020, 공인 폐지)**: 사서명(private/internal e-sign)은 **실지명의 + 서명의사**면 유효, 운영 라이선스 불요. gate 매핑 = **실지명의 = 인증된 gate identity**(내부 서명자) · **서명의사 = 결재 승인 행위**. → 내부/사내 e-sign 은 본 엔진으로 **합법 완결**.

**모두싸인 = optional alternative provider** (기본 아님): 외부 카운터파티 라운드트립이 필요할 때 `signature.provider=modusign` 경로 (`esign.send`/EsignStub) 가 여전히 존재. gate-native 봉인이 Phase-1 기본, 모두싸인은 *대안*.

**잔여 하드닝 / Phase-2**:
- **외부 서명자 본인확인 = 진짜 Phase-2** — 방통위 지정 **본인확인기관** 통합([B-gate-bonin-id-contract](/ops/backlog), 정보통신망법 §23-3 자가구축 불가). 내부 서명자는 gate auth = 실지명의라 불요; 외부 신원 강증명만 게이트.
- **HSM** (cryptoki/PKCS#11) — `DocumentSigner` trait 가 이미 **abstraction-ready**, dev 는 software key. prod = HSM-backed `DocumentSigner` 구현 + **서명키 DR/escrow**(분실 = 전 과거서명 검증불가).
- **PAdES 서명-PDF 컨테이너** (③④) — typst **deterministic render** + pyHanko PAdES. 현재 봉인 대상 = decision canonical bytes(결정적); 사람이 읽는 sealed-PDF 는 later.
- **production 키관리** — dev 는 ephemeral key. prod = 영속 서버 서명 identity + 회전·백업.

**MUST NOT (Phase 무관, 불변)**: 자체 CA · per-user cert · 자체 TSA · "공인/인증" 주장. gate 는 **단일 서버 서명 identity** 로 봉인한다 (per-user cert 발급 없음) — 이것이 **ModuSign-recipe 모델**(provider 가 서버 서명으로 봉인, 사용자별 인증서 없이). 자체 TSA 도 안 만든다 — 외부 RFC3161 TSA(DigiCert/Koscom/CrossCert)에 위임.

**환경 변수** (signing identity + TSA): `GATE_ESIGN_KEY_PEM` / `GATE_ESIGN_CERT_PEM` (서버 서명 키·인증서 PEM, 또는 `GATE_ESIGN_KEY_DIR` 로 디렉터리 지정) · `GATE_TSA_URL` (RFC3161 TSA 엔드포인트, default DigiCert / 한국 prod Koscom·CrossCert). prod 의 `GATE_ESIGN_KEY_PEM` = **비밀** → `customers.yaml services.gate.secrets[]` 에 등재(blueprint OIDC 서명키 `blueprint/axe/oidc-signing-key` 패턴, [/architecture/secrets](/architecture/secrets)).

## 7. 법무 모듈 가드레일

gate 법무모듈 = **검색·요약·번역·템플릿(로폼: user-blank, 기계적)만** ([D-gate-4](/ops/decisions)).

**하드룰 — 변호사법 §109(형사)·§34(5)**: 법률상담/사안별 자문/대리/결과예측-as-advice **금지**. **공개 "AI 법률상담" 금지**(AI대륙아주 7개월 폐쇄·징계 선례). 변호사 노출 시 정액광고만(로톡 모델 — 알선료/성공보수/광고수익배분 금지). 모든 출력 "**법률 정보, 자문 아님**" disclaimer. cite = **retrieval-verified**(존재 + 시행일/선고일 temporal 강제). **결재 자동주입 차단** — AI 기안이 법령/판례를 auto-approve 경로에 주입하지 않음(red-team P0 #2).

**Phase-1 data**: 국가법령정보 OPEN API(open.law.go.kr, 이용제한없음·무료) + data.go.kr 판례(상용 OK) + HF `korean_law_open_data_precedents`(openrail). 대법원/헌재 + 법령 grade(하급심 = 엘박스/케이스노트 상용 walled 라 제외). SoR = gate Postgres, index = **pgvector-KR**(Pinecone 아님). `lbox_open`/`kcl` = CC BY-NC = 유료제품 금지.

**Phase-2 gate**: Pinecone + Cohere rerank + Gemini embed flywheel(LLM비용 사용자부과·DB 복리) + cross-tenant 축적 = **PIPA 처리근거·가명정보·국외이전(§28-8) 자문**([B-gate-legal-counsel](/ops/backlog)) 선결. B2B/internal-use 유지 = 최저위험.

## 8. 규제 경계 요약

| 법령 | 무엇을 강제하나 | Phase |
|---|---|---|
| 전자서명법 (2020, 공인폐지) | 사서명도 실지명의 + 서명의사면 유효 — 직접구현 합법, 운영 라이선스 불요. gate: 실지명의 = gate auth · 서명의사 = 결재 승인 | **Phase-1** (직접 e-sign 빌트, [D-gate-5](/ops/decisions)) |
| 전자문서법 §5 | 서명문서 + 메타 무결성 보관 (gate = evidence custodian via `esign_seal` append-only + RFC3161 TSA) | **Phase-1** (gate-native 봉인) |
| 정보통신망법 §23-3 | 본인확인 자가구축 불가 → 방통위 지정 본인확인기관 통합 필수 | Phase-2 (**외부 서명자 신원** 한정; 내부 서명자는 gate auth = 실지명의라 불요) |
| 변호사법 §109/§34 | 법률사무 무면허 금지 — 검색·정보 한정, 자문/대리/auto-주입 금지 | **Phase-1** (법무 활성 시) |
| 개인정보보호법 (PIPA) | cross-tenant 축적·국외이전·CI/DI = 처리근거·가명정보·DPIA | Phase-2 (flywheel/SaaS 전제) |
| 전자상거래법 (2025 개정) | 정기결제 명시동의·셀프해지·사전고지·다크패턴 금지 | Phase-2 (결제 전제) |

대법원 2017도13263(해시 무결성 → 서명시점 해시 + custody chain) · 민사소송법 §358(실제 서명행위 → 진정성립)이 증거능력 타깃. 제외문서 = 유언·부동산등기·공정증서·일부보증(민법 §428-2).

## 9. Phase-2 게이트 (deferred)

각 야심은 자기 P0/규제 게이트를 동반한다 ([B-gate-phase2-gates](/ops/backlog)):

1. **e-sign — 엔진은 Phase-1 빌트 ([D-gate-5](/ops/decisions)), 잔여만 Phase-2/하드닝**: (Phase-2) 외부 서명자 **본인확인기관** 통합(정보통신망법 §23-3) · (하드닝) HSM/KMS `DocumentSigner`(trait ready) + 서명키 DR/escrow · PAdES 서명-PDF(typst deterministic render + pyHanko) · production 키관리. *닫힌 항목*: 자체 PKI 서버서명·CAdES-T·RFC3161 타임스탬프·custody(`esign_seal`)·canonical-bytes 결정성·para-os §84 재결정 = §6 참조.
2. **Pinecone 법무 flywheel** — PIPA 자문 · 비식별/가명정보 · namespace 테넌트격리 · PII 임베딩 전 제거 코드강제.
3. **공개 SaaS** — tenant_id RLS substrate(owner_id RLS 재설계, red-team P0 #8) · self-IdP tenant바인딩/iss/aud/per-tenant 시크릿/MFA(P0 #9) · rate-limit·abuse · 서브도메인 격리.
4. **결제** — 전자금융/전자상거래법(동의·셀프해지·사전고지·다크패턴) · LLM 미터링 과금 · Paddle MoR 영세율. (Stripe = 한국법인 불가.)
5. **cross-tenant 축적** — PIPA 근거 확정 후.

## 10. 착수 순서

docs-first(본 페이지 + D-gate-1~5) → `cp -R cortex gate` scaffold(auth 3-branch ladder[HS256 / Blueprint OIDC / Entra] · `gate_app` NOSUPERUSER + `gate.actor` GUC RLS · append-only audit · blue/green caddy 상속, index 도메인 미상속) → 포트 41xx 배선(pg4100 / blue4110 / green4111 / proxy4112) → 7테이블 migration(6 + `esign_seal`) → 상태기계 → **`esign.gate` actuator**(gate-native CAdES-T server-seal + `esign_seal` + `verify_seal`, [D-gate-5](/ops/decisions) — 빌트) + 모두싸인 alt-provider actuator(Actuator trait + EsignStub → 모두싸인 sandbox, optional) → `customers.yaml services.gate.secrets[]`(+ `GATE_ESIGN_KEY_PEM` 서명키) · cloudflared · pre-push guard.

## 관련

- [/architecture/para-os](/architecture/para-os) §7 — 결정로그 ≠ 결재워크플로 (본 페이지의 상위 철학)
- [/architecture/artifacts](/architecture/artifacts) — Artifact · Citation 저장/스키마 (Blueprint mirror 토대)
- [/architecture/data](/architecture/data) — 데이터 격리 · cross-service 신호채널 규율
- [D-gate-1](/ops/decisions) · [D-gate-2](/ops/decisions) · [D-gate-3](/ops/decisions) · [D-gate-4](/ops/decisions) · [D-gate-5](/ops/decisions)(e-sign 직접구현) — 본 페이지의 결정 등재
- [B-bp-decision-pipeline-esign](/ops/backlog) — 마스터플랜 + 착수 큐 (service=gate, M9)
