2 lines
319 KiB
JSON
2 lines
319 KiB
JSON
{"audit_request":{"assertions":[{"assertion_id":"AST-001","condition":"본 branch 완료 선언 시","line_end":40,"line_start":40,"modality":"must","object":"완료 조건: 4패턴 비교표의 모든 cell 이 구현 WI evidence 를 가리킨다","predicate":"requires","quote":"- **완료 조건**: 4패턴 비교표의 모든 cell이 구현 WI evidence를 가리킨다","scope":"branch-completion","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"feature-keycloak-four-pattern-tradeoff-matrix branch"},{"assertion_id":"AST-002","condition":"always","line_end":39,"line_start":39,"modality":"observed","object":"contract_packet: 1","predicate":"has_schema","quote":"- **패킷 스키마**: `contract_packet: 1`","scope":"contract-packet","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"branch contract packet"},{"assertion_id":"AST-003","condition":"always","line_end":38,"line_start":38,"modality":"observed","object":"생성 시 프로젝트 개정 1 — packet 이 프로젝트 개정 @1 에 고정","predicate":"uses","quote":"- **생성 시 프로젝트 개정**: `1`","scope":"contract-packet","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"branch contract packet"},{"assertion_id":"AST-004","condition":"WI-KEYCLOAK-PATTERNS-OVERVIEW-019 완료 조건에 적용","line_end":47,"line_start":47,"modality":"must","object":"DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1 — done-bar 는 E2E success 와 signature security failure 재현·해결 evidence","predicate":"consumes","quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |","scope":"contract-packet","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"feature-keycloak-four-pattern-tradeoff-matrix branch"},{"assertion_id":"AST-005","condition":"WI-KEYCLOAK-PATTERNS-OVERVIEW-019 완료 조건에 적용","line_end":48,"line_start":48,"modality":"must","object":"DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1 — canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형","predicate":"consumes","quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |","scope":"contract-packet","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"feature-keycloak-four-pattern-tradeoff-matrix branch"},{"assertion_id":"AST-006","condition":"always","line_end":54,"line_start":53,"modality":"observed","object":"등록된 branch-local decision row 없음 (테이블 헤더만 존재)","predicate":"other","quote":"| Decision ID | Decision | Relation | Supporting Claims | Status |\n|---|---|---|---|---|","scope":"contract-packet","source_surface":"SURF-07CBDC1E85758BC7B374","subject":"브랜치 지역 결정 테이블"},{"assertion_id":"AST-007","condition":"분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 (배포 토폴로지·federation 축 비교 시 구 6패턴 표로 회귀)","line_end":155,"line_start":155,"modality":"must","object":"행 4개(AP1~AP4)로 구성, Google IdP brokering 은 행이 아닌 비고 1줄 (D1)","predicate":"has_cardinality","quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |","scope":"matrix-structure","source_surface":"SURF-C3078D724BB13CB500B4","subject":"4패턴 트레이드오프 매트릭스"},{"assertion_id":"AST-008","condition":"always","line_end":155,"line_start":155,"modality":"observed","object":"project DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1 소비 (재정의 아님)","predicate":"consumes","quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |","scope":"matrix-structure","source_surface":"SURF-C3078D724BB13CB500B4","subject":"D1 행 정의"},{"assertion_id":"AST-009","condition":"always","line_end":155,"line_start":155,"modality":"observed","object":"Supporting Claims = OAUTH-BBA-C1·C2·C3 + OAUTH2PROXY-C4·C5; Evidence Strength 상 AP4 vendor C1 은 소스 재확인 실패로 needs-confirmation, 앵커 제외","predicate":"uses","quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |","scope":"decision-D1-evidence","source_surface":"SURF-C3078D724BB13CB500B4","subject":"D1"},{"assertion_id":"AST-010","condition":"always","line_end":155,"line_start":155,"modality":"observed","object":"IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source \"Does not prove\" 명시), AP4 행 각주로 경계 유지, 검증은 검증해야 할 주장 #1 (D1 Open Risk)","predicate":"other","quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |","scope":"matrix-row-AP4","source_surface":"SURF-C3078D724BB13CB500B4","subject":"AP4 행"},{"assertion_id":"AST-011","condition":"완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 (이론 비교표만이면 5열로 충분하나 본 WI 완료 조건 미충족)","line_end":156,"line_start":156,"modality":"must","object":"열 6개 = project §5 가 정한 5열{토큰 위치·검증 주체·XSS/CSRF surface·선택 기준·keycloak 설정} + Evidence 열 1개 (D2)","predicate":"has_cardinality","quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |","scope":"matrix-structure","source_surface":"SURF-C3078D724BB13CB500B4","subject":"4패턴 트레이드오프 매트릭스"},{"assertion_id":"AST-012","condition":"always","line_end":156,"line_start":156,"modality":"observed","object":"매트릭스 기본 5열 정의 — 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer, 비차단 전파 대상)","predicate":"owns","quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |","scope":"matrix-structure","source_surface":"SURF-C3078D724BB13CB500B4","subject":"raw/project-notes/keycloak-patterns-overview §5"},{"assertion_id":"AST-013","condition":"Evidence cell 에 적힌 WI 가 하나라도 planned/미검증인 동안","line_end":157,"line_start":157,"modality":"must","object":"planned(WI-NNN) placeholder 로 시작하고 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 [[raw/branch-notes/<wi-slug>]] · locally-verified 형태로 교체 (D3)","predicate":"requires","quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |","scope":"evidence-cell","source_surface":"SURF-C3078D724BB13CB500B4","subject":"Evidence cell"},{"assertion_id":"AST-014","condition":"always","line_end":157,"line_start":157,"modality":"must_not","object":"documented-only 링크로 완료 조건 충족 (D3)","predicate":"forbids","quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |","scope":"evidence-cell","source_surface":"SURF-C3078D724BB13CB500B4","subject":"Evidence cell"},{"assertion_id":"AST-015","condition":"Evidence cell 에 적힌 모든 WI 가 locally-verified 도달 시","line_end":157,"line_start":157,"modality":"must","object":"Evidence cell 에 적힌 모든 WI(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)의 locally-verified 도달 + 전 cell 교체 (D3 선택 조건)","predicate":"requires","quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |","scope":"branch-completion","source_surface":"SURF-C3078D724BB13CB500B4","subject":"본 branch 완료 선언"},{"assertion_id":"AST-016","condition":"always","line_end":157,"line_start":157,"modality":"observed","object":"NO_GROUND_TRUTH(2026-07-23) — 구현 repo 자체가 미존재, 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 (Open Risk)","predicate":"other","quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |","scope":"evidence-cell","source_surface":"SURF-C3078D724BB13CB500B4","subject":"D3 등급 판정 기준"},{"assertion_id":"AST-017","condition":"벤더 중립 서열이 필요한 동안 (특정 벤더 스택 고정 시 벤더 권고를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선)","line_end":158,"line_start":158,"modality":"must","object":"IETF 보안 내림차순(최상 AP3 BFF, 다음 AP2 TMB, 최하 AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고 상황 분기(AP3/AP2/AP4[heuristic]/AP1+PKCE) 병기 (D4)","predicate":"uses","quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |","scope":"selection-criterion-column","source_surface":"SURF-C3078D724BB13CB500B4","subject":"'선택 기준' 열"},{"assertion_id":"AST-018","condition":"curity C1(\"유일한 방법\")의 vendor 과장 가능성","line_end":158,"line_start":158,"modality":"must","object":"IETF C4 와 결합해서만 인용 (검증해야 할 주장 #4)","predicate":"requires","quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |","scope":"selection-criterion-column","source_surface":"SURF-C3078D724BB13CB500B4","subject":"CURITY-BFF-C1 인용"},{"assertion_id":"AST-019","condition":"always","line_end":158,"line_start":158,"modality":"observed","object":"claim 미보유 heuristic — UNSUPPORTED_IMPL_DECISION(§구현 가이드 1 라벨) (D4 Open Risk)","predicate":"other","quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |","scope":"selection-criterion-column","source_surface":"SURF-C3078D724BB13CB500B4","subject":"polyglot 다수 백엔드→AP4 분기"},{"assertion_id":"AST-020","condition":"always","line_end":167,"line_start":167,"modality":"observed","object":"행 구성=D1(OAUTH-BBA-C1~C3, OAUTH2PROXY-C1) · 열 구성=D2(ACCEPTANCE-001@1) · '선택 기준' cell 내용=D4(OAUTH-BBA-C4·C5, CURITY-BFF-C1·C6, OWASP-HTML5-C1·C2) · Evidence cell=D3","predicate":"uses","quote":"> **Trace**: 행 구성=D1(OAUTH-BBA-C1~C3, OAUTH2PROXY-C1) · 열 구성=D2(ACCEPTANCE-001@1) · '선택 기준' cell 내용=D4(OAUTH-BBA-C4·C5, CURITY-BFF-C1·C6, OWASP-HTML5-C1·C2) · Evidence cell=D3","scope":"matrix-structure","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"4패턴 트레이드오프 매트릭스 Trace"},{"assertion_id":"AST-021","condition":"always","line_end":169,"line_start":169,"modality":"must","object":"planned(WI-NNN) 텍스트로 통일 — UNSUPPORTED_IMPL_DECISION ①, trade-off: planned( prefix 로 미완 cell grep 가능","predicate":"has_schema","quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출.","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence placeholder 표기"},{"assertion_id":"AST-022","condition":"always","line_end":169,"line_start":169,"modality":"observed","object":"\"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정 (UNSUPPORTED_IMPL_DECISION ②)","predicate":"other","quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출.","scope":"matrix-row-AP4","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP4 토큰 위치 cell"},{"assertion_id":"AST-023","condition":"always","line_end":169,"line_start":169,"modality":"observed","object":"claim 미보유 heuristic, 운영 상식 도출 (UNSUPPORTED_IMPL_DECISION ③)","predicate":"other","quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출.","scope":"selection-criterion-column","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"D4 의 polyglot 다수 백엔드→AP4 분기"},{"assertion_id":"AST-024","condition":"always","line_end":173,"line_start":173,"modality":"must_not","object":"localStorage 세션 보관 (OWASP-HTML5-C1·C2; XSS 1건 = 저장 토큰 전체 탈취)","predicate":"forbids","quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |","scope":"matrix-row-AP1","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP1 (SPA-direct + RS)"},{"assertion_id":"AST-025","condition":"refresh 보관 위치 문언은 draft §6.2 서술 — 실측은 검증 #2·WI-009","line_end":174,"line_start":174,"modality":"observed","object":"토큰 위치: access→브라우저, refresh→백엔드만 (OAUTH-BBA-C2)","predicate":"other","quote":"| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |","scope":"matrix-row-AP2","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP2 (Token-Mediating Backend)"},{"assertion_id":"AST-026","condition":"always","line_end":175,"line_start":175,"modality":"observed","object":"cookie 자동첨부 CSRF surface 방어 → WI-011 소유 (CURITY-BFF-C4)","predicate":"delegates","quote":"| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |","scope":"matrix-row-AP3","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP3 (BFF)"},{"assertion_id":"AST-027","condition":"--pass-access-token 미사용 기본 구성 시 (OAUTH2PROXY-C2 옵션 활성 시 access 가 upstream 헤더로 전달됨)","line_end":176,"line_start":176,"modality":"observed","object":"토큰 위치: 프록시 세션, 백엔드·브라우저 토큰 0 — project §2.1 AP4 행 소비 (UNSUPPORTED_IMPL_DECISION ②)","predicate":"other","quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |","scope":"matrix-row-AP4","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP4 (Edge forward-auth)"},{"assertion_id":"AST-028","condition":"always","line_end":176,"line_start":176,"modality":"observed","object":"X-Forwarded-User 위조 위협 재현·차단 → WI-014 완료 조건 소유 (project §8.0)","predicate":"delegates","quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |","scope":"matrix-row-AP4","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"AP4 (Edge forward-auth)"},{"assertion_id":"AST-029","condition":"always","line_end":176,"line_start":173,"modality":"observed","object":"전 cell planned 상태 — AP1: WI-003·004·005·006 / AP2: WI-008·009 / AP3: WI-010·011 / AP4: WI-012·013·014","predicate":"other","quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"4패턴 트레이드오프 매트릭스 Evidence cells"},{"assertion_id":"AST-030","condition":"always","line_end":178,"line_start":178,"modality":"observed","object":"Google IdP brokering 정의·함정 — 어느 AP 에도 realm 설정만으로 얹히는 cross-cutting 변형, 본 표에는 비고(행 아님)","predicate":"owns","quote":"- 비고(행 아님): **Google IdP brokering** 은 어느 AP 에도 realm 설정만으로 얹히는 cross-cutting 변형 — 정의·함정은 [[raw/project-notes/keycloak-patterns-overview]] §2.2 소유.","scope":"matrix-structure","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"raw/project-notes/keycloak-patterns-overview §2.2"},{"assertion_id":"AST-031","condition":"always","line_end":179,"line_start":179,"modality":"must","object":"각 cell 의 세부 방어 구현(SameSite 값, NetworkPolicy 명세, audience validator 코드) → Evidence 에 적힌 구현 WI branch — 본 표는 pointer 만 유지 (R3 정제)","predicate":"delegates","quote":"- R3 정제: 각 cell 의 세부 방어 구현(SameSite 값, NetworkPolicy 명세, audience validator 코드)은 Evidence 에 적힌 구현 WI branch 소유 — 본 표는 pointer 만 유지.","scope":"matrix-structure","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"4패턴 트레이드오프 매트릭스"},{"assertion_id":"AST-032","condition":"always","line_end":183,"line_start":183,"modality":"observed","object":"D3 (ACCEPTANCE-001@1 도출) — 절차만 정의, 실행은 각 WI 완료 시점","predicate":"uses","quote":"> **Trace**: D3 (ACCEPTANCE-001@1 도출). 절차만 정의 — 실행은 각 WI 완료 시점.","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence cell 채움 절차"},{"assertion_id":"AST-033","condition":"always","line_end":185,"line_start":185,"modality":"must","object":"\"anchor WI 묶음\"이 아니라 개별 WI — 근거 raw 없음 (UNSUPPORTED_IMPL_DECISION), trade-off: 부분 진행 즉시 반영, 다중-WI cell 혼합 상태 표기 예 제공","predicate":"other","quote":"> - **UNSUPPORTED_IMPL_DECISION**: cell 교체 단위를 \"anchor WI 묶음\"이 아니라 **개별 WI**로 함 — 근거 raw 없음. trade-off: 부분 진행을 표에 즉시 반영(전량 대기 시 표가 오래 stale). 다중-WI cell 의 혼합 상태 표기 예: `[[raw/branch-notes/feature-keycloak-vanilla-js-spa-pkce]] · locally-verified + planned(WI-004·005·006)`.","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence cell 교체 단위"},{"assertion_id":"AST-034","condition":"구현 WI 완료 시","line_end":187,"line_start":187,"modality":"must","object":"해당 WI branch 의 ## 완료 후 정리 에서 E2E 증거(200 OK 로그/스크린샷) + signature 함정 before/after 확인","predicate":"requires","quote":"1. 해당 WI branch 의 `## 완료 후 정리` 에서 E2E 증거(200 OK 로그/스크린샷) + signature 함정 before/after 확인.","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence cell 채움 절차"},{"assertion_id":"AST-035","condition":"구현 WI 완료 시","line_end":188,"line_start":188,"modality":"must","object":"locally-verified 이상 증거 등급만 인정 — documented-only 는 완료 조건 미충족 (D3)","predicate":"requires","quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3).","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence cell 채움 절차"},{"assertion_id":"AST-036","condition":"증거 등급 locally-verified 이상 판정 후","line_end":189,"line_start":189,"modality":"must","object":"planned(WI-NNN) → [[raw/branch-notes/<wi-slug>]] · locally-verified","predicate":"has_schema","quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체.","scope":"evidence-cell","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"Evidence cell 교체"},{"assertion_id":"AST-037","condition":"전 cell 교체 완료 시","line_end":190,"line_start":190,"modality":"must","object":"전 cell 교체 완료","predicate":"runs_after","quote":"4. 전 cell 교체 완료 시 본 branch TODO 최종 항목 체크 → `/ingest` 로 `wiki/projects/` 추출 후보.","scope":"branch-completion","source_surface":"SURF-7E2D2F9039A56F64F546","subject":"본 branch TODO 최종 항목 체크 + /ingest 로 wiki/projects/ 추출 후보 승격"},{"assertion_id":"AST-038","condition":"의존 WI 부분 완료 시","line_end":196,"line_start":196,"modality":"must","object":"cell 단위 독립 교체(§구현 가이드 2), 미완 cell 은 planned(...) 유지 — 표 전체를 블록하지 않음","predicate":"has_failure_behavior","quote":" - 의존 WI 부분 완료 — cell 단위 독립 교체(§구현 가이드 2), 미완 cell 은 `planned(...)` 유지. 표 전체를 블록하지 않음.","scope":"evidence-cell","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"4패턴 트레이드오프 매트릭스"},{"assertion_id":"AST-039","condition":"project taxonomy 개정(AUTH-TAXONOMY-001 @2 발행) 시","line_end":197,"line_start":197,"modality":"must","object":"packet 이 @1 고정이므로 preflight 가 STALE_INHERITANCE_REVISION 으로 차단 → 행 구성 재검토 후 packet 재생성","predicate":"has_failure_behavior","quote":" - project taxonomy 개정(`AUTH-TAXONOMY-001` @2 발행) — packet 이 @1 고정이므로 preflight 가 `STALE_INHERITANCE_REVISION` 으로 차단 → 행 구성 재검토 후 packet 재생성.","scope":"contract-packet","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"branch contract packet"},{"assertion_id":"AST-040","condition":"AP4↔IETF-BFF 매핑 드리프트 발견(검증 #1 실패) 시","line_end":198,"line_start":198,"modality":"must","object":"AP4 행 각주 갱신 + D1 Open Risk 재판정 — 표 삭제 아님","predicate":"has_failure_behavior","quote":" - AP4↔IETF-BFF 매핑 드리프트 발견(검증 #1 실패) — 매트릭스 AP4 행 각주 갱신 + D1 Open Risk 재판정. 표 삭제 아님.","scope":"matrix-row-AP4","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"매트릭스 AP4 행"},{"assertion_id":"AST-041","condition":"always","line_end":199,"line_start":199,"modality":"observed","object":"anchor 4개: WI-KEYCLOAK-PATTERNS-OVERVIEW-003(AP1)·008(AP2)·010(AP3)·012(AP4) — project registry row 소유","predicate":"uses","quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토.","scope":"branch-dependency","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"branch frontmatter depends_on"},{"assertion_id":"AST-042","condition":"본 branch 완료 선언 시","line_end":199,"line_start":199,"modality":"must","object":"cell 에 적힌 모든 WI 기준 — anchor 4개 + 자식 WI(004·005·006·009·011·013·014) (D3 선택 조건)","predicate":"requires","quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토.","scope":"branch-completion","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"본 branch 완료 선언"},{"assertion_id":"AST-043","condition":"anchor 완료 조건이 바뀌면","line_end":199,"line_start":199,"modality":"must","object":"재검토","predicate":"requires","quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토.","scope":"evidence-cell","source_surface":"SURF-42CE75C9DDA0A3A3CBD9","subject":"§구현 가이드 2 의 판정 기준"},{"assertion_id":"AST-044","condition":"검증 전 (needs-confirmation)","line_end":206,"line_start":206,"modality":"unknown","object":"어디서 갈라지는지 미확정 — source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary), WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조로 검증 (needs-confirmation)","predicate":"other","quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |","scope":"verification-backlog","source_surface":"SURF-46B4D74CA05FBC460435","subject":"AP4(oauth2-proxy)↔IETF BFF 요건(draft §6.1.3) 매핑"},{"assertion_id":"AST-045","condition":"검증 전 (planned)","line_end":207,"line_start":207,"modality":"unknown","object":"브라우저 network 응답에 나타나지 않는다 — IETF 정의일 뿐 우리 구현의 실측 아님, WI-009 완료 조건(network 탭/response body 검사)으로 검증 (planned)","predicate":"other","quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |","scope":"verification-backlog","source_surface":"SURF-46B4D74CA05FBC460435","subject":"AP2 refresh token"},{"assertion_id":"AST-046","condition":"검증 전 (planned)","line_end":208,"line_start":208,"modality":"unknown","object":"single-EC2 실구현 재현 미검증 — NO_GROUND_TRUTH(구현 repo 미존재, anchor WI 전부 planned), 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 (planned)","predicate":"other","quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |","scope":"verification-backlog","source_surface":"SURF-46B4D74CA05FBC460435","subject":"매트릭스 각 행의 이론 서술"},{"assertion_id":"AST-047","condition":"vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4)","line_end":209,"line_start":209,"modality":"must","object":"IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지","predicate":"requires","quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |","scope":"selection-criterion-column","source_surface":"SURF-46B4D74CA05FBC460435","subject":"curity C1(\"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\") 일반화"},{"assertion_id":"AST-048","condition":"always","line_end":102,"line_start":102,"modality":"must","object":"Work Item 완료 조건 (포함 범위)","predicate":"produces","quote":"- Work Item 완료 조건","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch"},{"assertion_id":"AST-049","condition":"always","line_end":103,"line_start":103,"modality":"must","object":"매트릭스 스켈레톤(행·열·이론 근거 cell) — 행 정의는 project AUTH-TAXONOMY 결정 소비, cell 근거는 raw source claim 직접 인용 (D1·D2·D4)","predicate":"produces","quote":"- 매트릭스 스켈레톤(행·열·이론 근거 cell) 작성 — 행 정의는 project `AUTH-TAXONOMY` 결정 소비, cell 근거는 raw source claim 직접 인용 (D1·D2·D4)","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch"},{"assertion_id":"AST-050","condition":"always","line_end":104,"line_start":104,"modality":"must","object":"Evidence cell 채움 규칙 정의 — 의존 WI 완료 시 어떤 증거를 어떤 등급으로 링크하는지 (D3)","predicate":"produces","quote":"- Evidence cell 채움 규칙 정의 — 의존 WI 완료 시 어떤 증거를 어떤 등급으로 링크하는지 (D3)","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch"},{"assertion_id":"AST-051","condition":"always","line_end":110,"line_start":110,"modality":"must_not","object":"project decision registry 변경","predicate":"forbids","quote":"- project decision registry 변경","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch 범위"},{"assertion_id":"AST-052","condition":"always","line_end":111,"line_start":111,"modality":"must_not","object":"각 패턴의 실 구현·함정 재현 — 의존 WI(003·008·010·012 및 그 자식들) 소유 (OUT_OF_BRANCH_SCOPE)","predicate":"forbids","quote":"- 각 패턴의 실 구현·함정 재현 — 의존 WI(003·008·010·012 및 그 자식들) 소유 (`OUT_OF_BRANCH_SCOPE`)","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch 범위"},{"assertion_id":"AST-053","condition":"always","line_end":112,"line_start":112,"modality":"must_not","object":"Google IdP brokering 을 별도 행으로 다루는 것 — cross-cutting 변형은 project §2.2 소유, 본 표에는 비고 1줄만 (D1)","predicate":"forbids","quote":"- Google IdP brokering 을 별도 행으로 다루는 것 — cross-cutting 변형은 project §2.2 소유, 본 표에는 비고 1줄만 (D1)","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch 범위"},{"assertion_id":"AST-054","condition":"always","line_end":113,"line_start":113,"modality":"must_not","object":"패턴별 세부 설정값(SameSite 값, NetworkPolicy 명세 등) — 해당 구현 WI branch 소유 (OUT_OF_BRANCH_SCOPE)","predicate":"forbids","quote":"- 패턴별 세부 설정값(SameSite 값, NetworkPolicy 명세 등) — 해당 구현 WI branch 소유 (`OUT_OF_BRANCH_SCOPE`)","scope":"branch-scope","source_surface":"SURF-3F018328D3C26F7D441C","subject":"본 branch 범위"}],"candidate_manifest_sha256":"1fcb9c2d48ffe29582b36bfdfa60f1e9f903d6804d6a41202efd1fcce02d0f8f","candidates":[{"assertion_a":"AST-004","assertion_b":"AST-005","candidate_id":"SEM-8C0AE8CF45AD186DFA3D","grouping_key":{"condition":"WI-KEYCLOAK-PATTERNS-OVERVIEW-019 완료 조건에 적용","predicate":"consumes","scope":"contract-packet","subject":"feature-keycloak-four-pattern-tradeoff-matrix branch"},"rule_ids":["BASE","C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-011","candidate_id":"SEM-BBD6DB2C9A897CAF35DB","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-012","candidate_id":"SEM-457A724CF2276B5AEC1D","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-013","candidate_id":"SEM-42403D5D5E4461BF5BDB","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-014","candidate_id":"SEM-EC13F04A6095A3FB6AA6","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-015","candidate_id":"SEM-73D7423B8A1CD248F1EF","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-004","assertion_b":"AST-016","candidate_id":"SEM-79CDAD707E473D6D4079","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-005","assertion_b":"AST-007","candidate_id":"SEM-26E68082BFFDD2FE1DB0","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-005","assertion_b":"AST-008","candidate_id":"SEM-742E627EE0D6A19851B7","grouping_key":{"condition":"","predicate":"consumes","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-005","assertion_b":"AST-009","candidate_id":"SEM-9F9A23882F27E3C5C639","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-005","assertion_b":"AST-010","candidate_id":"SEM-A3D6DF1098784F7F4B2E","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-007","assertion_b":"AST-008","candidate_id":"SEM-D8F1D0AB56A2871C64F4","grouping_key":{"condition":"","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-007","assertion_b":"AST-009","candidate_id":"SEM-E7677EC363A6C36FAAD3","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-007","assertion_b":"AST-010","candidate_id":"SEM-0D38E24CB322E75E8F33","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-007","assertion_b":"AST-011","candidate_id":"SEM-A0118454002B3E1CD02A","grouping_key":{"condition":"","predicate":"has_cardinality","scope":"matrix-structure","subject":"4패턴 트레이드오프 매트릭스"},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-012","candidate_id":"SEM-0A1066AC4E4784C967C5","grouping_key":{"condition":"","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-017","candidate_id":"SEM-4407B8A86D9BE5A53489","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-018","candidate_id":"SEM-3A4D07BD2866E0318122","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-019","candidate_id":"SEM-AA70402B60DD519AAA05","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-044","candidate_id":"SEM-577F576188976C7695C8","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-007","assertion_b":"AST-047","candidate_id":"SEM-2BC0716601B8CF550445","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-009","candidate_id":"SEM-9F280B215DDBCA082192","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-008","assertion_b":"AST-010","candidate_id":"SEM-C200CB39546535C87D20","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-008","assertion_b":"AST-011","candidate_id":"SEM-770B18BD960494FA58A3","grouping_key":{"condition":"","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-012","candidate_id":"SEM-D4ECA58B0DB5D55A0C97","grouping_key":{"condition":"always","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-017","candidate_id":"SEM-255DF8BDD9ADA3140BD8","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-018","candidate_id":"SEM-9C2A711BBC951A021375","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-019","candidate_id":"SEM-ED607C5A4E14A2DEB05A","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-044","candidate_id":"SEM-00B06488386C4248CB3A","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-008","assertion_b":"AST-047","candidate_id":"SEM-3D6B2A7B057FA51EFD65","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-010","candidate_id":"SEM-FA62CEEB9E8F1159C210","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-009","assertion_b":"AST-011","candidate_id":"SEM-D087E67BD6909EEFE755","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-012","candidate_id":"SEM-EC1252EE1462281BC95B","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-017","candidate_id":"SEM-E061BECDD8F7CE0C3A33","grouping_key":{"condition":"","predicate":"uses","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-018","candidate_id":"SEM-41C905CDCF8AE0E5296C","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-019","candidate_id":"SEM-AA64AED1F55A31FACB02","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-044","candidate_id":"SEM-F63885A4024FA66BF25F","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-009","assertion_b":"AST-047","candidate_id":"SEM-4E7976A028F2532DDEC9","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-011","candidate_id":"SEM-F700AEF872C6C378FC7F","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-012","candidate_id":"SEM-EEFAC2E2B3C1DEA0F564","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-017","candidate_id":"SEM-C575505D0A0A792AC0DC","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-018","candidate_id":"SEM-3013184C979094BA9CE1","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-019","candidate_id":"SEM-8F77A1B10A61D35ABC4C","grouping_key":{"condition":"always","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-044","candidate_id":"SEM-40CAED8898D186D1CD1C","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-010","assertion_b":"AST-047","candidate_id":"SEM-3F47564E27460A02CF4E","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-011","assertion_b":"AST-012","candidate_id":"SEM-1AB04F0DEA438C23B89E","grouping_key":{"condition":"","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-011","assertion_b":"AST-013","candidate_id":"SEM-8A1149CC440E42C49F84","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-011","assertion_b":"AST-014","candidate_id":"SEM-695710B83FD5DB11816F","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-011","assertion_b":"AST-015","candidate_id":"SEM-8AE4096E07A6EE6010B2","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-011","assertion_b":"AST-016","candidate_id":"SEM-FF4E60684FCDBDCA3894","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-011","assertion_b":"AST-017","candidate_id":"SEM-76AA19B1298CDEF16B5B","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-011","assertion_b":"AST-018","candidate_id":"SEM-B108474C4B5F7C44AC19","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-011","assertion_b":"AST-019","candidate_id":"SEM-363773D650770ACA279A","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-011","assertion_b":"AST-030","candidate_id":"SEM-CC5A8D80EC7BE78D85F9","grouping_key":{"condition":"","predicate":"","scope":"matrix-structure","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-012","assertion_b":"AST-013","candidate_id":"SEM-087764AC4E1F0FA26F35","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-012","assertion_b":"AST-014","candidate_id":"SEM-C21235D0C1E48466B80C","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-012","assertion_b":"AST-015","candidate_id":"SEM-019C85FE54666CB919F2","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-012","assertion_b":"AST-016","candidate_id":"SEM-7F33E0FCA24A7C486786","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-012","assertion_b":"AST-017","candidate_id":"SEM-3C8893D4B69D90A0FCBB","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-012","assertion_b":"AST-018","candidate_id":"SEM-4D262556C47333C08A81","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-012","assertion_b":"AST-019","candidate_id":"SEM-5F93184CA4263C8B37E0","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-012","assertion_b":"AST-030","candidate_id":"SEM-59D14816F12A94A2D19D","grouping_key":{"condition":"always","predicate":"owns","scope":"matrix-structure","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-014","candidate_id":"SEM-D7BD6CB80BB2EC379814","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":"Evidence cell"},"rule_ids":["C6","C7"]},{"assertion_a":"AST-013","assertion_b":"AST-015","candidate_id":"SEM-B3AE765837D8ADF9DB38","grouping_key":{"condition":"","predicate":"requires","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-013","assertion_b":"AST-016","candidate_id":"SEM-C6DA49BC2B9719F84A48","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-013","assertion_b":"AST-021","candidate_id":"SEM-BAC7B44761877FF65BDA","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-022","candidate_id":"SEM-5374EA30FD8717FF340F","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-023","candidate_id":"SEM-D97AC9ABB29A57C5BF9D","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-035","candidate_id":"SEM-0ACA8E6BFBAF31C8B972","grouping_key":{"condition":"","predicate":"requires","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-036","candidate_id":"SEM-9CCF803D7084AAECDF26","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-045","candidate_id":"SEM-9044D2AA3CDA9321C76F","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-013","assertion_b":"AST-046","candidate_id":"SEM-591280A7E40F57AE2B8B","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-015","candidate_id":"SEM-0DC2194F1CB6A2829D61","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-014","assertion_b":"AST-016","candidate_id":"SEM-AA4C9607820468D8FB52","grouping_key":{"condition":"always","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-014","assertion_b":"AST-021","candidate_id":"SEM-4FAD0A1387ED7D72D2A8","grouping_key":{"condition":"always","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-022","candidate_id":"SEM-8DC07E1CE067C6CC1845","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-023","candidate_id":"SEM-D45ED46F5F3CBCCA4947","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-035","candidate_id":"SEM-8A16ADD59FB834C04FEC","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-036","candidate_id":"SEM-6652F69A7D25270C2780","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-045","candidate_id":"SEM-D1A9BC1068BE8E3B714A","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-014","assertion_b":"AST-046","candidate_id":"SEM-B726FCED674E7074B437","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-016","candidate_id":"SEM-50EB52263AA53C0A2F27","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-015","assertion_b":"AST-021","candidate_id":"SEM-03F13322F2BAFE9A559C","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-022","candidate_id":"SEM-A10863638631234620A6","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-023","candidate_id":"SEM-A9238B3755667895D813","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-035","candidate_id":"SEM-3904159E578E78283A42","grouping_key":{"condition":"","predicate":"requires","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-036","candidate_id":"SEM-8D926739A8CEF12294C0","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-045","candidate_id":"SEM-E267B1BC98FAAF2D3740","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-015","assertion_b":"AST-046","candidate_id":"SEM-EE5250F28A3E3FC099DD","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-021","candidate_id":"SEM-EF2AC8A853A40AAD819C","grouping_key":{"condition":"always","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-022","candidate_id":"SEM-60E3F15DC025BAA5BA7D","grouping_key":{"condition":"always","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-023","candidate_id":"SEM-365617815DAF835D3B55","grouping_key":{"condition":"always","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-035","candidate_id":"SEM-F2D40412FA9FE291F7A0","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-036","candidate_id":"SEM-4B30A88C226FC4B8BCB9","grouping_key":{"condition":"","predicate":"","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-045","candidate_id":"SEM-7873F41370A3C254EB7D","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-016","assertion_b":"AST-046","candidate_id":"SEM-DFF0F737C602D705EA4E","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-017","assertion_b":"AST-018","candidate_id":"SEM-DFDCCB14204EA18FF01A","grouping_key":{"condition":"","predicate":"","scope":"selection-criterion-column","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-017","assertion_b":"AST-019","candidate_id":"SEM-E272177FE6DCD2EA7276","grouping_key":{"condition":"","predicate":"","scope":"selection-criterion-column","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-017","assertion_b":"AST-027","candidate_id":"SEM-AC68EF41704044EA1353","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-017","assertion_b":"AST-028","candidate_id":"SEM-5243A33D6E51CA40FD7E","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-017","assertion_b":"AST-029","candidate_id":"SEM-1564784DCDBB1EA65640","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-018","assertion_b":"AST-019","candidate_id":"SEM-5A104DBD675F21C58A08","grouping_key":{"condition":"","predicate":"","scope":"selection-criterion-column","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-018","assertion_b":"AST-027","candidate_id":"SEM-ADEBFF84426EE6655C31","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-018","assertion_b":"AST-028","candidate_id":"SEM-906FAB0DD0C69526D9DE","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-018","assertion_b":"AST-029","candidate_id":"SEM-06ED6724C6AA51C57F85","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-019","assertion_b":"AST-027","candidate_id":"SEM-2ADF9DC702D91D1EB6B6","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-019","assertion_b":"AST-028","candidate_id":"SEM-A7B904F4BED22A7215DF","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-019","assertion_b":"AST-029","candidate_id":"SEM-FC99039310C71CFE3F64","grouping_key":{"condition":"always","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-021","assertion_b":"AST-022","candidate_id":"SEM-C30CDBF91AF2A90F45FF","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-021","assertion_b":"AST-023","candidate_id":"SEM-95F14D7C109F0776EC67","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-021","assertion_b":"AST-036","candidate_id":"SEM-C6D246EDEBF480C50B5A","grouping_key":{"condition":"","predicate":"has_schema","scope":"evidence-cell","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-022","assertion_b":"AST-023","candidate_id":"SEM-31216B90D7D89D79A2B8","grouping_key":{"condition":"always","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-022","assertion_b":"AST-036","candidate_id":"SEM-EFD4E9123772665F0848","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-023","assertion_b":"AST-036","candidate_id":"SEM-492022E9EF6F748A0944","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-024","assertion_b":"AST-026","candidate_id":"SEM-884985E3CEBEAE80F7FC","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-024","assertion_b":"AST-029","candidate_id":"SEM-6CBAF0467CCC4EFEB1B2","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-025","assertion_b":"AST-029","candidate_id":"SEM-854B6497AB21C88EDC3C","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-026","assertion_b":"AST-029","candidate_id":"SEM-600F21EC1224BCD4C40A","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-027","assertion_b":"AST-028","candidate_id":"SEM-C2D1F27AEED73049D9A8","grouping_key":{"condition":"","predicate":"","scope":"matrix-row-AP4","subject":"AP4 (Edge forward-auth)"},"rule_ids":["C6"]},{"assertion_a":"AST-027","assertion_b":"AST-029","candidate_id":"SEM-30B9E7D33FFA545C5948","grouping_key":{"condition":"","predicate":"other","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-028","assertion_b":"AST-029","candidate_id":"SEM-5AB1CBA83B8686FA2EAF","grouping_key":{"condition":"always","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-034","assertion_b":"AST-035","candidate_id":"SEM-DE8AF50DF128395BA6A4","grouping_key":{"condition":"구현 WI 완료 시","predicate":"requires","scope":"evidence-cell","subject":"Evidence cell 채움 절차"},"rule_ids":["BASE"]},{"assertion_a":"AST-041","assertion_b":"AST-042","candidate_id":"SEM-4F5B02F8ABBFF8267DDF","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-041","assertion_b":"AST-043","candidate_id":"SEM-573F81783E8A6B26C4F5","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-042","assertion_b":"AST-043","candidate_id":"SEM-5B6A15B5AB438AAB7EAD","grouping_key":{"condition":"","predicate":"requires","scope":"","subject":""},"rule_ids":["C6","C7"]},{"assertion_a":"AST-044","assertion_b":"AST-047","candidate_id":"SEM-373290D0CC8A29BC6B34","grouping_key":{"condition":"","predicate":"","scope":"","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-045","assertion_b":"AST-046","candidate_id":"SEM-49C5D5981D4DCA1BCB87","grouping_key":{"condition":"검증 전 (planned)","predicate":"other","scope":"verification-backlog","subject":""},"rule_ids":["C6"]},{"assertion_a":"AST-048","assertion_b":"AST-049","candidate_id":"SEM-05FECA418F7553DDAB02","grouping_key":{"condition":"always","predicate":"produces","scope":"branch-scope","subject":"본 branch"},"rule_ids":["BASE"]},{"assertion_a":"AST-048","assertion_b":"AST-050","candidate_id":"SEM-BFE44DC4E092D52AD618","grouping_key":{"condition":"always","predicate":"produces","scope":"branch-scope","subject":"본 branch"},"rule_ids":["BASE"]},{"assertion_a":"AST-049","assertion_b":"AST-050","candidate_id":"SEM-610A11D5628FA0FE9F25","grouping_key":{"condition":"always","predicate":"produces","scope":"branch-scope","subject":"본 branch"},"rule_ids":["BASE"]},{"assertion_a":"AST-051","assertion_b":"AST-052","candidate_id":"SEM-11036B2A5BAFACEB69B7","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE"]},{"assertion_a":"AST-051","assertion_b":"AST-053","candidate_id":"SEM-EC3921AB6AC41B22E1A7","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE"]},{"assertion_a":"AST-051","assertion_b":"AST-054","candidate_id":"SEM-43BFBDD6AE73EFF6EC5C","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE"]},{"assertion_a":"AST-052","assertion_b":"AST-053","candidate_id":"SEM-05271764F7C3AB2B5D02","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE"]},{"assertion_a":"AST-052","assertion_b":"AST-054","candidate_id":"SEM-7F5CF5DD6AD4FBAAB7EB","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE","C6"]},{"assertion_a":"AST-053","assertion_b":"AST-054","candidate_id":"SEM-A75C6085E4E458EE88A0","grouping_key":{"condition":"always","predicate":"forbids","scope":"branch-scope","subject":"본 branch 범위"},"rule_ids":["BASE"]}],"coverage":{"assertions":54,"candidate_pairs":136,"eligible_surfaces":6,"processed_surfaces":6},"document_sha256":"ff70c5f51e1d62900fe66452673109f8fe4f1bc0329ea492e961d447119fd9b6","explicit_blocking":[],"mode":"local","ontology_sha256":"76d41a29233c830e1940ebb3244263e2b9bfb8dd6a01f2a1d1c51ce5a1b10468","output_schema":"semantic-audit-result/v1","schema_version":"semantic-verdict-request/v1","subject":"raw/branch-notes/feature-keycloak-four-pattern-tradeoff-matrix.md"},"audit_request_sha256":"3eb24d97d48645060e5d79427e3a917b05b6b7db15120334bfa79320c4491dbd","audit_result":{"auditor":{"contract_version":"semantic-coherence/v1","model_id":"claude-opus-4-8","run_id":"branch-spec-2026-07-23-cand2"},"mode":"local","request_sha256":"3eb24d97d48645060e5d79427e3a917b05b6b7db15120334bfa79320c4491dbd","schema_version":"semantic-audit-result/v1","subject":"raw/branch-notes/feature-keycloak-four-pattern-tradeoff-matrix.md","verdicts":[{"candidate_id":"SEM-8C0AE8CF45AD186DFA3D","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":48,"line_start":48,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"proof_manifest":null,"rationale":"Two sibling consumption claims of different inherited project decisions; independent and mutually compatible.","verdict":"CONSISTENT"},{"candidate_id":"SEM-BBD6DB2C9A897CAF35DB","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"D2's Evidence column requirement applies the consumed ACCEPTANCE-001@1 done-bar without altering it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-457A724CF2276B5AEC1D","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"Done-bar consumption and project §5 column ownership address unrelated contract properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-42403D5D5E4461BF5BDB","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"D3 operationalizes the consumed done-bar (E2E + signature evidence) at Evidence-cell level.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-EC13F04A6095A3FB6AA6","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"The documented-only prohibition enforces the consumed done-bar rather than competing with it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-73D7423B8A1CD248F1EF","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"The branch completion criterion applies the consumed done-bar across all cell WIs.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-79CDAD707E473D6D4079","evidence_a":{"line_end":47,"line_start":47,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` | done-bar는 E2E success와 signature security failure 재현·해결 evidence다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"NO_GROUND_TRUTH adds a compatible risk constraint on applying the consumed done-bar today.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-26E68082BFFDD2FE1DB0","evidence_a":{"line_end":48,"line_start":48,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"D1's 4-row cardinality applies the consumed AP1~AP4 taxonomy decision without redefining it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-742E627EE0D6A19851B7","evidence_a":{"line_end":48,"line_start":48,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"Both assert the same consumption of AUTH-TAXONOMY-001@1 with no drift.","verdict":"CONSISTENT"},{"candidate_id":"SEM-9F9A23882F27E3C5C639","evidence_a":{"line_end":48,"line_start":48,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"D1's raw supporting claims supplement the consumed taxonomy decision as a second evidence base.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-A3D6DF1098784F7F4B2E","evidence_a":{"line_end":48,"line_start":48,"quote":"| `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` | canonical 분류축은 AP1~AP4 인증 통합 아키텍처와 cross-cutting 변형이다 | `WI-KEYCLOAK-PATTERNS-OVERVIEW-019` 완료 조건에 적용 | `[[raw/project-notes/keycloak-patterns-overview]]` |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"The AP4 boundary caveat details one row inside the consumed taxonomy without contesting it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-D8F1D0AB56A2871C64F4","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"AST-008 supplies the provenance (project decision consumption) for the row definition AST-007 fixes.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-E7677EC363A6C36FAAD3","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"AST-009 supplies the raw claim evidence base for the 4-row structure AST-007 fixes.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-0D38E24CB322E75E8F33","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"AST-010 adds the AP4 out-of-IETF footnote to the row set AST-007 defines.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-A0118454002B3E1CD02A","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"D1 fixes row cardinality and D2 fixes column cardinality; different structural dimensions of the same matrix.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-0A1066AC4E4784C967C5","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"Row cardinality and §5 column-definition ownership are unrelated properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-4407B8A86D9BE5A53489","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D4 supplies the ordering over the same AP1~AP4 rows D1 defines.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-3A4D07BD2866E0318122","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Row structure and the curity citation constraint do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-AA70402B60DD519AAA05","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Row structure and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-577F576188976C7695C8","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":206,"line_start":206,"quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"Backlog item #1 supplies the verification stage for the AP4 boundary risk in D1.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-2BC0716601B8CF550445","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":209,"line_start":209,"quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"Row structure and the curity C1 qualification requirement are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-9F280B215DDBCA082192","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"Project-decision consumption and raw claims form dual compatible evidence bases for D1.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-C200CB39546535C87D20","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"The AP4 boundary caveat details the consumed taxonomy's AP4 row without redefining it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-770B18BD960494FA58A3","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"Taxonomy consumption and column cardinality are unrelated properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-D4ECA58B0DB5D55A0C97","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"Both defer to project ownership for different matrix dimensions; no tension.","verdict":"CONSISTENT"},{"candidate_id":"SEM-255DF8BDD9ADA3140BD8","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Taxonomy consumption and selection-column ordering do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-9C2A711BBC951A021375","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Taxonomy consumption and the curity citation constraint do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-ED607C5A4E14A2DEB05A","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Taxonomy consumption and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-00B06488386C4248CB3A","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":206,"line_start":206,"quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"The consumption claim and the AP4-mapping verification backlog coexist without overlap.","verdict":"CONSISTENT"},{"candidate_id":"SEM-3D6B2A7B057FA51EFD65","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":209,"line_start":209,"quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"Taxonomy consumption and the curity C1 qualification are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-FA62CEEB9E8F1159C210","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"proof_manifest":null,"rationale":"AST-010's 'Does not prove' boundary explains the evidence-strength caveat AST-009 records.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-D087E67BD6909EEFE755","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"D1 evidence listing and D2 column cardinality are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EC1252EE1462281BC95B","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"D1 evidence listing and §5 column ownership are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-E061BECDD8F7CE0C3A33","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D1 and D4 cite different claim sets for different matrix properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-41C905CDCF8AE0E5296C","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D1's claim list and the curity citation constraint (a D4 claim) do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-AA64AED1F55A31FACB02","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D1's claim list and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-F63885A4024FA66BF25F","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":206,"line_start":206,"quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"Source re-verification caveat and mapping verification backlog are separate coexisting risk notes.","verdict":"CONSISTENT"},{"candidate_id":"SEM-4E7976A028F2532DDEC9","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":209,"line_start":209,"quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"D1's claim list does not include curity C1, so AST-047's qualification does not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-F700AEF872C6C378FC7F","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"AP4 boundary caveat and column cardinality are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EEFAC2E2B3C1DEA0F564","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"AP4 boundary caveat and §5 column ownership are unrelated.","verdict":"CONSISTENT"},{"candidate_id":"SEM-C575505D0A0A792AC0DC","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Both state AP4 sits outside the IETF pattern set/ranking; same fact with no drift.","verdict":"CONSISTENT"},{"candidate_id":"SEM-3013184C979094BA9CE1","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"AP4 boundary caveat and the curity citation constraint do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-8F77A1B10A61D35ABC4C","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D1 and D4 carry separate open risks that coexist without conflict.","verdict":"CONSISTENT"},{"candidate_id":"SEM-40CAED8898D186D1CD1C","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":206,"line_start":206,"quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"AST-044 is the 검증 #1 backlog item that AST-010 designates for verifying the AP4 boundary.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-3F47564E27460A02CF4E","evidence_a":{"line_end":155,"line_start":155,"quote":"| D1 | 매트릭스 행은 AP1~AP4 4행으로 구성하고, Google IdP brokering 은 행이 아니라 비고 1줄로 둔다. 행 정의 자체는 project `DEC-KEYCLOAK-PATTERNS-OVERVIEW-AUTH-TAXONOMY-001@1` 소비(재정의 아님). | 분류 축이 \"누가 토큰을 쥐고 누가 인증을 강제하나\"인 동안 이 결정 / 배포 토폴로지·federation 축으로 비교하려면 구 6패턴 표(project 가 2026-07-14 §2.3 으로 강등)로 회귀 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C1`, `#OAUTH-BBA-C2`, `#OAUTH-BBA-C3`, `raw/official-docs/oauth2-proxy-overview-config-official.md#OAUTH2PROXY-C4`, `#OAUTH2PROXY-C5` | `official-standard` (IETF 3패턴) + `official-vendor-doc` (AP4 — 검증된 C4·C5; C1 은 소스 재확인 실패로 `needs-confirmation`, 앵커 제외) | AP4 는 IETF 3종 밖 — oauth2-proxy 가 draft 의 BFF 정의와 1:1 이라는 증거 없음(source 의 \"Does not prove\" 명시). AP4 행 각주로 경계 유지, 검증은 `검증해야 할 주장` #1 |"},"evidence_b":{"line_end":209,"line_start":209,"quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"AP4 boundary caveat and curity C1 qualification address different claims.","verdict":"CONSISTENT"},{"candidate_id":"SEM-1AB04F0DEA438C23B89E","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"proof_manifest":null,"rationale":"AST-012 supplies the ownership basis for the 5 columns that D2 extends with one Evidence column.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-8A1149CC440E42C49F84","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"D3 governs the content lifecycle of the Evidence column D2 adds.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-695710B83FD5DB11816F","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-014 constrains what may satisfy the Evidence column D2 mandates.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-8AE4096E07A6EE6010B2","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"The completion criterion consumes the Evidence column D2 mandates.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-FF4E60684FCDBDCA3894","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"Column cardinality is unaffected by the grading ground-truth risk.","verdict":"CONSISTENT"},{"candidate_id":"SEM-76AA19B1298CDEF16B5B","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"D4 fills the 선택 기준 column that D2's column set includes.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-B108474C4B5F7C44AC19","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Column cardinality and the curity citation constraint do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-363773D650770ACA279A","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Column cardinality and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-CC5A8D80EC7BE78D85F9","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":178,"line_start":178,"quote":"- 비고(행 아님): **Google IdP brokering** 은 어느 AP 에도 realm 설정만으로 얹히는 cross-cutting 변형 — 정의·함정은 [[raw/project-notes/keycloak-patterns-overview]] §2.2 소유."},"proof_manifest":null,"rationale":"Column definition and §2.2 brokering ownership are unrelated matrix-structure properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-087764AC4E1F0FA26F35","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"§5 column ownership and D3 evidence rules address different properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-C21235D0C1E48466B80C","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"§5 column ownership and the documented-only prohibition do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-019C85FE54666CB919F2","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"§5 column ownership and the branch completion criterion do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-7F33E0FCA24A7C486786","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"§5 column ownership and the ground-truth risk note do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-3C8893D4B69D90A0FCBB","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"§5 owns the column schema while D4 fills that column's cell content; compatible division of responsibility.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-4D262556C47333C08A81","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"§5 column ownership and the curity citation constraint do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-5F93184CA4263C8B37E0","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"§5 column ownership and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-59D14816F12A94A2D19D","evidence_a":{"line_end":156,"line_start":156,"quote":"| D2 | 매트릭스 열은 project §5 가 정한 {토큰 위치 · 검증 주체 · XSS/CSRF surface · 선택 기준 · keycloak 설정}([[raw/project-notes/keycloak-patterns-overview]] 소유)에 **Evidence 열 1개를 추가**한 6열로 한다. | 완료 조건이 \"모든 cell 이 구현 WI evidence 를 가리킨다\"인 동안 Evidence 열 필수 / 이론 비교표만 필요하면 5열로 충분하나 그 경우 본 WI 완료 조건 미충족 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1`, `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4` (선택 기준 열의 서열 축) | `project-decision` + `official-standard` | 열 이름·순서는 project §5 문구 개정 시 함께 갱신 필요(pointer 이므로 비차단 전파 대상) |"},"evidence_b":{"line_end":178,"line_start":178,"quote":"- 비고(행 아님): **Google IdP brokering** 은 어느 AP 에도 realm 설정만으로 얹히는 cross-cutting 변형 — 정의·함정은 [[raw/project-notes/keycloak-patterns-overview]] §2.2 소유."},"proof_manifest":null,"rationale":"Two ownership claims over distinct objects (§5 columns vs §2.2 brokering); no authority overlap.","verdict":"CONSISTENT"},{"candidate_id":"SEM-D7BD6CB80BB2EC379814","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-014 states the negative side (documented-only insufficient) of AST-013's replacement rule.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-B3AE765837D8ADF9DB38","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-013 governs the per-cell lifecycle that AST-015 aggregates into the branch completion criterion.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-C6DA49BC2B9719F84A48","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-016 adds a NO_GROUND_TRUTH risk constraint on AST-013's grading rule.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-BAC7B44761877FF65BDA","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Both fix the same planned(WI-NNN) placeholder format; AST-021 only annotates its provenance.","verdict":"CONSISTENT"},{"candidate_id":"SEM-5374EA30FD8717FF340F","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Evidence-cell lifecycle rule and the AP4 token-cell provenance note do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-D97AC9ABB29A57C5BF9D","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Evidence-cell lifecycle rule and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-0ACA8E6BFBAF31C8B972","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":188,"line_start":188,"quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3)."},"proof_manifest":null,"rationale":"Procedure step 2 restates D3's locally-verified bar with no drift.","verdict":"CONSISTENT"},{"candidate_id":"SEM-9CCF803D7084AAECDF26","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"Procedure step 3 restates D3's replacement schema identically.","verdict":"CONSISTENT"},{"candidate_id":"SEM-9044D2AA3CDA9321C76F","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":207,"line_start":207,"quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |"},"proof_manifest":null,"rationale":"The AP2 verification backlog item is compatible with the placeholder-until-verified rule.","verdict":"CONSISTENT"},{"candidate_id":"SEM-591280A7E40F57AE2B8B","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":208,"line_start":208,"quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |"},"proof_manifest":null,"rationale":"The all-cells-planned status in AST-046 matches AST-013's placeholder-start rule.","verdict":"CONSISTENT"},{"candidate_id":"SEM-0DC2194F1CB6A2829D61","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"Prohibition (documented-only) and positive requirement (locally-verified) are two sides of the same bar.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-AA4C9607820468D8FB52","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-016 risk-qualifies the grading distinction AST-014 enforces.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-4FAD0A1387ED7D72D2A8","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"The prohibition and the placeholder notation address different cell properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-8DC07E1CE067C6CC1845","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"The prohibition and the AP4 token-cell provenance note do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-D45ED46F5F3CBCCA4947","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"The prohibition and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-8A16ADD59FB834C04FEC","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":188,"line_start":188,"quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3)."},"proof_manifest":null,"rationale":"AST-035 restates the same documented-only insufficiency without drift.","verdict":"CONSISTENT"},{"candidate_id":"SEM-6652F69A7D25270C2780","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"Replacement to a locally-verified form agrees with the documented-only prohibition.","verdict":"CONSISTENT"},{"candidate_id":"SEM-D1A9BC1068BE8E3B714A","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":207,"line_start":207,"quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |"},"proof_manifest":null,"rationale":"The prohibition and the AP2 backlog item do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-B726FCED674E7074B437","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":208,"line_start":208,"quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |"},"proof_manifest":null,"rationale":"The prohibition and the reproduction backlog item do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-50EB52263AA53C0A2F27","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"proof_manifest":null,"rationale":"AST-016 constrains when AST-015's completion judgment can be grounded in real evidence.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-03F13322F2BAFE9A559C","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Completion criterion and placeholder notation address different properties.","verdict":"CONSISTENT"},{"candidate_id":"SEM-A10863638631234620A6","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Completion criterion and the AP4 token-cell provenance note do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-A9238B3755667895D813","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Completion criterion and the polyglot-heuristic label do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-3904159E578E78283A42","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":188,"line_start":188,"quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3)."},"proof_manifest":null,"rationale":"AST-035 applies the same locally-verified bar per WI; AST-015 aggregates it across all cells.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-8D926739A8CEF12294C0","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"Per-cell replacement is the mechanism feeding AST-015's all-cells completion criterion.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-E267B1BC98FAAF2D3740","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":207,"line_start":207,"quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |"},"proof_manifest":null,"rationale":"WI-009 planned status is compatible with completion still pending.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EE5250F28A3E3FC099DD","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":208,"line_start":208,"quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |"},"proof_manifest":null,"rationale":"All-planned WI status matches completion not yet being declarable.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EF2AC8A853A40AAD819C","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Ground-truth risk and placeholder notation are separate coexisting annotations.","verdict":"CONSISTENT"},{"candidate_id":"SEM-60E3F15DC025BAA5BA7D","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Ground-truth risk and the AP4 token-cell provenance note are separate annotations.","verdict":"CONSISTENT"},{"candidate_id":"SEM-365617815DAF835D3B55","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Ground-truth risk and the polyglot-heuristic label are separate annotations.","verdict":"CONSISTENT"},{"candidate_id":"SEM-F2D40412FA9FE291F7A0","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":188,"line_start":188,"quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3)."},"proof_manifest":null,"rationale":"AST-016 risk-qualifies the grading step AST-035 defines.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-4B30A88C226FC4B8BCB9","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"AST-016 flags that AST-036's replacement grading currently lacks a measurement target.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-7873F41370A3C254EB7D","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":207,"line_start":207,"quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |"},"proof_manifest":null,"rationale":"Both note absent implementation measurement; compatible risk records.","verdict":"CONSISTENT"},{"candidate_id":"SEM-DFF0F737C602D705EA4E","evidence_a":{"line_end":157,"line_start":157,"quote":"| D3 | Evidence cell 은 `planned(WI-NNN)` placeholder 로 시작하고, 해당 WI 의 E2E + signature 함정 재현·해결 증거 확보 후에만 `[[raw/branch-notes/<wi-slug>]] · locally-verified` 형태로 교체한다. `documented-only` 링크로는 완료 조건 미충족. | Evidence cell 에 적힌 WI 가 하나라도 `planned`/미검증인 동안 이 규칙 / **Evidence cell 에 적힌 모든 WI**(anchor 4개 + 각 행의 자식 WI: 004·005·006·009·011·013·014)가 `locally-verified` 도달 시 전 cell 교체 후 본 branch 완료 선언 | 상속 `DEC-KEYCLOAK-PATTERNS-OVERVIEW-ACCEPTANCE-001@1` (done-bar = E2E + 함정 재현·해결 evidence) | `project-decision` | `NO_GROUND_TRUTH`(2026-07-23): 구현 repo 자체가 미존재 — 등급 판정 기준이 실측 대상 없이 문서 규칙으로만 존재 |"},"evidence_b":{"line_end":208,"line_start":208,"quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |"},"proof_manifest":null,"rationale":"The same NO_GROUND_TRUTH fact is restated in the backlog without drift.","verdict":"CONSISTENT"},{"candidate_id":"SEM-DFDCCB14204EA18FF01A","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"AST-018 constrains citation of curity C1, one of D4's supporting claims.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-E272177FE6DCD2EA7276","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"AST-019 annotates D4's polyglot branch as an unsupported heuristic without removing it.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-AC68EF41704044EA1353","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Selection ordering and AP4 token location describe different columns compatibly.","verdict":"CONSISTENT"},{"candidate_id":"SEM-5243A33D6E51CA40FD7E","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Selection ordering and the AP4 threat delegation do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-1564784DCDBB1EA65640","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Selection ordering and the planned Evidence-cell status do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-5A104DBD675F21C58A08","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"proof_manifest":null,"rationale":"Two separate D4 caveats (curity citation, polyglot heuristic) coexist.","verdict":"CONSISTENT"},{"candidate_id":"SEM-ADEBFF84426EE6655C31","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Curity citation constraint and AP4 token location do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-906FAB0DD0C69526D9DE","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Curity citation constraint and the AP4 threat delegation do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-06ED6724C6AA51C57F85","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Curity citation constraint and the planned Evidence-cell status do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-2ADF9DC702D91D1EB6B6","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"UNSUPPORTED ③ (selection branch) and ② (token cell) are distinct coexisting annotations.","verdict":"CONSISTENT"},{"candidate_id":"SEM-A7B904F4BED22A7215DF","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Polyglot-heuristic label and the AP4 threat delegation do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-FC99039310C71CFE3F64","evidence_a":{"line_end":158,"line_start":158,"quote":"| D4 | '선택 기준' 열은 IETF 보안 내림차순(AP3 BFF > AP2 TMB > AP1 Browser-client; AP4 는 서열 밖 — 백엔드 인증코드 0줄 + 네트워크 격리 의존)을 기본 서열로 하고, 상황 분기(토큰 브라우저 노출 금지→AP3 / 프록시 전량 경유 부담→AP2 / polyglot 다수 백엔드 균일 인증→AP4[heuristic] / 학습·최단 셋업→AP1+PKCE)를 병기한다. | 벤더 중립 서열이 필요한 동안 IETF 서열 채택 / 특정 벤더 스택 고정 상황이면 해당 벤더 권고(예: curity)를 1차 근거로 쓸 수 있으나 본 프로젝트는 표준 우선 | `raw/official-docs/oauth2-browser-based-apps-ietf-draft.md#OAUTH-BBA-C4`, `#OAUTH-BBA-C5`, `raw/company-tech-blogs/curity-bff-pattern-spa.md#CURITY-BFF-C1`, `#CURITY-BFF-C6`, `raw/official-docs/owasp-html5-storage-xss-spa.md#OWASP-HTML5-C1`, `#OWASP-HTML5-C2` | `official-standard` 주도 + `company-case-study` 보조 | IETF 서열은 정성적(\"decreasing order of security\") — 정량 근거 아님. curity C1(\"유일한 방법\")은 vendor 과장 가능성 → IETF C4 와 결합해서만 인용 (`검증해야 할 주장` #4). polyglot→AP4 분기는 claim 미보유 heuristic — `UNSUPPORTED_IMPL_DECISION`(§구현 가이드 1 라벨) |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Polyglot-heuristic label and the planned Evidence-cell status do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-C30CDBF91AF2A90F45FF","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Sibling UNSUPPORTED items ① and ② annotate different cells.","verdict":"CONSISTENT"},{"candidate_id":"SEM-95F14D7C109F0776EC67","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Sibling UNSUPPORTED items ① and ③ annotate different decisions.","verdict":"CONSISTENT"},{"candidate_id":"SEM-C6D246EDEBF480C50B5A","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"AST-021 fixes the initial placeholder notation and AST-036 the replacement transition of the same cell schema.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-31216B90D7D89D79A2B8","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"proof_manifest":null,"rationale":"Sibling UNSUPPORTED items ② and ③ annotate different cells.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EFD4E9123772665F0848","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"AP4 token-cell provenance and the replacement schema do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-492022E9EF6F748A0944","evidence_a":{"line_end":169,"line_start":169,"quote":"> - **UNSUPPORTED_IMPL_DECISION**: ① Evidence placeholder 표기를 `planned(WI-NNN)` 텍스트로 통일 — 근거 raw 는 표기 형식을 권고하지 않음. trade-off: 후속 스크립트/사람이 `planned(` prefix 로 미완 cell 을 grep 가능. ② AP4 토큰 위치 cell 의 \"세션은 프록시, 백엔드·브라우저 토큰 0\" — 세션 저장 위치를 진술하는 official claim 미보유, project §2.1 AP4 행(project-decision) 소비 + 기본 구성 가정. ③ D4 의 polyglot 다수 백엔드→AP4 분기 — claim 미보유 heuristic, 운영 상식 도출."},"evidence_b":{"line_end":189,"line_start":189,"quote":"3. cell 의 `planned(WI-NNN)` → `[[raw/branch-notes/<wi-slug>]] · locally-verified` 로 교체."},"proof_manifest":null,"rationale":"Polyglot-heuristic label and the replacement schema do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-884985E3CEBEAE80F7FC","evidence_a":{"line_end":173,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |"},"evidence_b":{"line_end":175,"line_start":175,"quote":"| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |"},"proof_manifest":null,"rationale":"AP1 and AP3 row claims address different patterns with no shared property.","verdict":"CONSISTENT"},{"candidate_id":"SEM-6CBAF0467CCC4EFEB1B2","evidence_a":{"line_end":173,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"AP1's localStorage prohibition and the planned Evidence-cell status do not interact.","verdict":"CONSISTENT"},{"candidate_id":"SEM-854B6497AB21C88EDC3C","evidence_a":{"line_end":174,"line_start":174,"quote":"| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"AP2 token placement (theory) is compatible with its Evidence cell remaining planned.","verdict":"CONSISTENT"},{"candidate_id":"SEM-600F21EC1224BCD4C40A","evidence_a":{"line_end":175,"line_start":175,"quote":"| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"AP3's CSRF delegation to WI-011 is compatible with that WI being planned in the cell.","verdict":"CONSISTENT"},{"candidate_id":"SEM-C2D1F27AEED73049D9A8","evidence_a":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"evidence_b":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Token location and threat delegation are two compatible facets of the same AP4 row.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-30B9E7D33FFA545C5948","evidence_a":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"AP4 token location (theory) is compatible with its Evidence cell remaining planned.","verdict":"CONSISTENT"},{"candidate_id":"SEM-5AB1CBA83B8686FA2EAF","evidence_a":{"line_end":176,"line_start":176,"quote":"| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"evidence_b":{"line_end":176,"line_start":173,"quote":"| **AP1** SPA-direct + RS | 브라우저(JS) — `OAUTH-BBA-C3` | SPA(public client+PKCE)가 토큰 획득, RS 가 JWT `iss`/`aud` 검증 — `SSRS-JWT-C1`·`C6` | XSS 1건 = 저장 토큰 전체 탈취; localStorage 세션 보관 금지 — `OWASP-HTML5-C1`·`C2` | 학습·최단 셋업, 프론트가 OIDC 완전 제어; 보안 서열 최하 — `OAUTH-BBA-C4` | public client + PKCE, RS `issuer-uri`/`audiences` — `SSRS-JWT-C1`·`C6` | `planned(WI-003·004·005·006)` |\n| **AP2** Token-Mediating Backend | access→브라우저, refresh→백엔드만 — `OAUTH-BBA-C2` (refresh 보관 위치 문언은 draft §6.2 서술, 실측은 검증 #2·WI-009) | 백엔드(confidential client)가 토큰 획득, 브라우저가 RS 직접 호출 — `OAUTH-BBA-C2` | refresh 는 보호되나 access 는 브라우저 노출 — `OAUTH-BBA-C5`, `CURITY-BFF-C6` | BFF 전량 프록시 부담 없는 경량 절충(BFF 보다 덜 안전, browser-client 보다 안전) — `OAUTH-BBA-C5` | confidential client(+secret), 브라우저에 access 만 전달 — `OAUTH-BBA-C2` | `planned(WI-008·009)` |\n| **AP3** BFF | 백엔드 세션(브라우저 토큰 0개) — `OAUTH-BBA-C1`, `CURITY-BFF-C3` | 백엔드(confidential client)가 인증+전량 프록시 — `OAUTH-BBA-C1` | 토큰 XSS 면역; cookie 자동첨부 → CSRF surface(방어는 WI-011 소유) — `CURITY-BFF-C4` | 토큰 브라우저 노출 금지 요건일 때; 보안 서열 최상 — `OAUTH-BBA-C4`, `CURITY-BFF-C1` | confidential client + httpOnly session cookie — `CURITY-BFF-C4` | `planned(WI-010·011)` |\n| **AP4** Edge forward-auth | 프록시 세션(백엔드·브라우저 토큰 0 — `--pass-access-token` 미사용 기본 구성 시, `OAUTH2PROXY-C2` 옵션 활성 시 access 가 upstream 헤더로 전달됨) — project §2.1 AP4 행 소비, `UNSUPPORTED_IMPL_DECISION` ② | 별도 reverse proxy 가 OIDC 수행, 백엔드는 전달 헤더 신뢰(인증코드 0줄) — `OAUTH2PROXY-C4`·`C5` | `X-Forwarded-User` 위조 — 헤더 신뢰 모델에서 논리 도출(위협 재현·차단은 WI-014 완료 조건 소유, project §8.0) | polyglot 다수 백엔드에 균일 인증[heuristic — UNSUPPORTED ③]; IETF 3종 밖 실무 패턴 — D1 Open Risk 참조 | proxy `--oidc-issuer-url` (discovery), `--pass-user-headers` — `OAUTH2PROXY-C4`·`C5` | `planned(WI-012·013·014)` |"},"proof_manifest":null,"rationale":"Delegation to WI-014 is compatible with WI-014 being planned in the AP4 cell.","verdict":"CONSISTENT"},{"candidate_id":"SEM-DE8AF50DF128395BA6A4","evidence_a":{"line_end":187,"line_start":187,"quote":"1. 해당 WI branch 의 `## 완료 후 정리` 에서 E2E 증거(200 OK 로그/스크린샷) + signature 함정 before/after 확인."},"evidence_b":{"line_end":188,"line_start":188,"quote":"2. 증거 등급 판정 — `locally-verified` 이상만 인정 (`documented-only` 는 완료 조건 미충족, D3)."},"proof_manifest":null,"rationale":"Sequential steps of the same fill procedure: evidence check then grade judgment.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-4F5B02F8ABBFF8267DDF","evidence_a":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"evidence_b":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"proof_manifest":null,"rationale":"depends_on stays the 4 anchors while completion widens to all cited WIs; the quoted text reconciles both explicitly.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-573F81783E8A6B26C4F5","evidence_a":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"evidence_b":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"proof_manifest":null,"rationale":"AST-043 adds the change-propagation duty for the anchors AST-041 declares.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-5B6A15B5AB438AAB7EAD","evidence_a":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"evidence_b":{"line_end":199,"line_start":199,"quote":"- **다른 계약 의존**: `WI-KEYCLOAK-PATTERNS-OVERVIEW-003`(AP1 anchor), `WI-KEYCLOAK-PATTERNS-OVERVIEW-008`(AP2), `WI-KEYCLOAK-PATTERNS-OVERVIEW-010`(AP3), `WI-KEYCLOAK-PATTERNS-OVERVIEW-012`(AP4) — frontmatter `depends_on` 은 이 anchor 4개(project registry row 소유). Evidence cell 은 anchor 의 자식 WI(004·005·006·009·011·013·014)도 인용하므로 **완료 선언은 cell 에 적힌 모든 WI 기준**(D3 선택 조건). anchor 완료 조건이 바뀌면 §구현 가이드 2 의 판정 기준도 재검토."},"proof_manifest":null,"rationale":"AST-043 supplies the maintenance trigger for the completion criterion in AST-042.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-373290D0CC8A29BC6B34","evidence_a":{"line_end":206,"line_start":206,"quote":"| AP4(oauth2-proxy)가 IETF BFF 요건(draft §6.1.3)과 어디서 갈라지는지 | source 가 \"1:1 매핑 미증명\"을 명시(OAUTH-BBA usage boundary) | WI-012 구현 후 draft §6.1.3 MUST 항목 체크리스트 대조 | `needs-confirmation` |"},"evidence_b":{"line_end":209,"line_start":209,"quote":"| \"토큰을 브라우저 밖에 두는 것이 유일한 보호 방법\"(curity C1)의 일반화 | vendor 블로그 표현 — IETF 는 3패턴 모두 trade-off 로 허용(C4) | IETF draft §6.3.2 방어 요건과 대조해 한정 서술(AP3 선택 조건)로만 유지 | `needs-confirmation` |"},"proof_manifest":null,"rationale":"Two distinct verification-backlog items coexist without overlap.","verdict":"CONSISTENT"},{"candidate_id":"SEM-49C5D5981D4DCA1BCB87","evidence_a":{"line_end":207,"line_start":207,"quote":"| AP2 에서 refresh token 이 브라우저 network 응답에 나타나지 않는다 | IETF 정의일 뿐 우리 구현의 실측 아님 | WI-009 완료 조건(network 탭/response body 검사)으로 검증 | `planned` |"},"evidence_b":{"line_end":208,"line_start":208,"quote":"| 매트릭스 각 행의 이론 서술이 single-EC2 실구현에서 재현된다 | `NO_GROUND_TRUTH` — 구현 repo 미존재, anchor WI 전부 planned | 의존 WI 4개의 E2E + 함정 재현 evidence 로 cell 단위 검증 | `planned` |"},"proof_manifest":null,"rationale":"AST-045 details the AP2-specific check within AST-046's broader cell-level verification program.","verdict":"COMPLEMENTARY"},{"candidate_id":"SEM-05FECA418F7553DDAB02","evidence_a":{"line_end":102,"line_start":102,"quote":"- Work Item 완료 조건"},"evidence_b":{"line_end":103,"line_start":103,"quote":"- 매트릭스 스켈레톤(행·열·이론 근거 cell) 작성 — 행 정의는 project `AUTH-TAXONOMY` 결정 소비, cell 근거는 raw source claim 직접 인용 (D1·D2·D4)"},"proof_manifest":null,"rationale":"Sibling deliverables in the branch scope list; independent and compatible.","verdict":"CONSISTENT"},{"candidate_id":"SEM-BFE44DC4E092D52AD618","evidence_a":{"line_end":102,"line_start":102,"quote":"- Work Item 완료 조건"},"evidence_b":{"line_end":104,"line_start":104,"quote":"- Evidence cell 채움 규칙 정의 — 의존 WI 완료 시 어떤 증거를 어떤 등급으로 링크하는지 (D3)"},"proof_manifest":null,"rationale":"Sibling deliverables in the branch scope list; independent and compatible.","verdict":"CONSISTENT"},{"candidate_id":"SEM-610A11D5628FA0FE9F25","evidence_a":{"line_end":103,"line_start":103,"quote":"- 매트릭스 스켈레톤(행·열·이론 근거 cell) 작성 — 행 정의는 project `AUTH-TAXONOMY` 결정 소비, cell 근거는 raw source claim 직접 인용 (D1·D2·D4)"},"evidence_b":{"line_end":104,"line_start":104,"quote":"- Evidence cell 채움 규칙 정의 — 의존 WI 완료 시 어떤 증거를 어떤 등급으로 링크하는지 (D3)"},"proof_manifest":null,"rationale":"Sibling deliverables in the branch scope list; independent and compatible.","verdict":"CONSISTENT"},{"candidate_id":"SEM-11036B2A5BAFACEB69B7","evidence_a":{"line_end":110,"line_start":110,"quote":"- project decision registry 변경"},"evidence_b":{"line_end":111,"line_start":111,"quote":"- 각 패턴의 실 구현·함정 재현 — 의존 WI(003·008·010·012 및 그 자식들) 소유 (`OUT_OF_BRANCH_SCOPE`)"},"proof_manifest":null,"rationale":"Sibling scope exclusions over different objects; no tension.","verdict":"CONSISTENT"},{"candidate_id":"SEM-EC3921AB6AC41B22E1A7","evidence_a":{"line_end":110,"line_start":110,"quote":"- project decision registry 변경"},"evidence_b":{"line_end":112,"line_start":112,"quote":"- Google IdP brokering 을 별도 행으로 다루는 것 — cross-cutting 변형은 project §2.2 소유, 본 표에는 비고 1줄만 (D1)"},"proof_manifest":null,"rationale":"Sibling scope exclusions over different objects; no tension.","verdict":"CONSISTENT"},{"candidate_id":"SEM-43BFBDD6AE73EFF6EC5C","evidence_a":{"line_end":110,"line_start":110,"quote":"- project decision registry 변경"},"evidence_b":{"line_end":113,"line_start":113,"quote":"- 패턴별 세부 설정값(SameSite 값, NetworkPolicy 명세 등) — 해당 구현 WI branch 소유 (`OUT_OF_BRANCH_SCOPE`)"},"proof_manifest":null,"rationale":"Sibling scope exclusions over different objects; no tension.","verdict":"CONSISTENT"},{"candidate_id":"SEM-05271764F7C3AB2B5D02","evidence_a":{"line_end":111,"line_start":111,"quote":"- 각 패턴의 실 구현·함정 재현 — 의존 WI(003·008·010·012 및 그 자식들) 소유 (`OUT_OF_BRANCH_SCOPE`)"},"evidence_b":{"line_end":112,"line_start":112,"quote":"- Google IdP brokering 을 별도 행으로 다루는 것 — cross-cutting 변형은 project §2.2 소유, 본 표에는 비고 1줄만 (D1)"},"proof_manifest":null,"rationale":"Sibling scope exclusions over different objects; no tension.","verdict":"CONSISTENT"},{"candidate_id":"SEM-7F5CF5DD6AD4FBAAB7EB","evidence_a":{"line_end":111,"line_start":111,"quote":"- 각 패턴의 실 구현·함정 재현 — 의존 WI(003·008·010·012 및 그 자식들) 소유 (`OUT_OF_BRANCH_SCOPE`)"},"evidence_b":{"line_end":113,"line_start":113,"quote":"- 패턴별 세부 설정값(SameSite 값, NetworkPolicy 명세 등) — 해당 구현 WI branch 소유 (`OUT_OF_BRANCH_SCOPE`)"},"proof_manifest":null,"rationale":"Both exclusions delegate work to implementation WI branches; distinct objects, no conflict.","verdict":"CONSISTENT"},{"candidate_id":"SEM-A75C6085E4E458EE88A0","evidence_a":{"line_end":112,"line_start":112,"quote":"- Google IdP brokering 을 별도 행으로 다루는 것 — cross-cutting 변형은 project §2.2 소유, 본 표에는 비고 1줄만 (D1)"},"evidence_b":{"line_end":113,"line_start":113,"quote":"- 패턴별 세부 설정값(SameSite 값, NetworkPolicy 명세 등) — 해당 구현 WI branch 소유 (`OUT_OF_BRANCH_SCOPE`)"},"proof_manifest":null,"rationale":"Sibling scope exclusions over different objects; no tension.","verdict":"CONSISTENT"}]},"auditor":{"contract_version":"semantic-coherence/v1","model_id":"claude-opus-4-8","run_id":"branch-spec-2026-07-23-cand2"},"auditor_contract_sha256":"1cbc67c27e5183a272687f635e3682a26d56785a1cf144da562eb7edd8f6cbce","coverage":{"candidate_pairs":136,"dropped_pairs":0,"eligible_surfaces":6,"processed_pairs":136,"processed_surfaces":6},"document_id":"02cf9d284c76fcdb39ec8a0c60121584eedd71a0e94367a5fb119e583eab369b","document_sha256":"ff70c5f51e1d62900fe66452673109f8fe4f1bc0329ea492e961d447119fd9b6","findings":{"blocking":0,"readiness_blocking":0,"verified":0},"mode":"local","ontology_sha256":"5d601b96f0ca4d75eea89e9086c38e3acf2c4f0c7833846ef58c6a5719603126","policy_sha256":"0465598e9c1c4f2c3400ba51bf4719aa4890d60d56dc83304fb2224e660562b7","proof_manifest_sha256":"37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570","schema_version":"semantic-certificate/v1","semantic_audit_sha256":"c57c8373063e81847b43c3f4bc7e40167cba2b36f07981cccc8254acecec4016","subject":"raw/branch-notes/feature-keycloak-four-pattern-tradeoff-matrix.md","typed_contract_graph_sha256":"481fc3335a494c454ab13ad1d6a6ddccdec99aa8e083f6720ff8886bfa19cc89","verdict":"PASS"}
|