# Keycloak 최종 검증 리뷰 — current remediation 재검토 - 검토일: 2026-09-20 - 대상: `docs/keycloak`, `runs/keycloak` - 기준: 현재 7단계 TechLog 하네스 계약 - 최종 판정: **아직 더 봐야댐** --- ## 1. 결론 문서 내용 자체는 이전 리뷰의 지적사항이 정상적으로 반영됐다. 다음 항목은 모두 다시 확인했고 문제를 찾지 못했다. - 기록 24개 Tree / Layout 기본 구조 - Required Content - SSOT fact 형식 검사 - Natural Prose - Voice - Command Pedagogy - Figure Text - Figure Overlap - Figure Provenance - 전체 pipeline - 전체 unittest 새로 만든 17개의 current remediation run도 `verify-pipeline-run.py` 자체는 **17/17 PASS**한다. 하지만 현재 하네스의 실제 계약과 원장 내용을 다시 대조하면 **아직 완료로 볼 수 없는 절차 문제가 남아 있다.** 핵심은 두 가지다. 1. current remediation에서 별도 subagent를 사용하지 않았다는 사실이 원장에 직접 남아 있다. 2. S3/S5/S6의 evidence gate가 계약상 필요한 `--repo` 없이 실행됐다. 추가로 SVG 2개의 SSOT context/manifest도 stale 상태다. 따라서 Keycloak은 아직 다음 프로젝트로 넘기지 않는다. > **keycloak = 아직 더 봐야댐** --- # 2. 재검증 결과 ## 2.1 Current remediation run 2026-09-19 current remediation run: ```text 17 runs 17/17 verify-pipeline-run.py PASS schemaVersion = 4 ``` 수정된 17개 Record와 17개 current run의 record mapping도 일치한다. ## 2.2 Keycloak 프로젝트 검사 ```text verify-tech-log-tree.py keycloak PASS records=24 topics=1 nodes=24 written=24 unwritten=0 verify-project-layout.py keycloak PASS error=0 audit-records.py keycloak PASS check-figure-text.py keycloak PASS check-figure-overlap.py keycloak PASS check-figure-provenance.py keycloak PASS check-required-content.py keycloak PASS check-ssot-facts.py keycloak PASS git diff --check -- docs/keycloak runs/keycloak reviews PASS ``` ## 2.3 S5 / S6 / Command Pedagogy 24개 Record 전체를 다시 검사했다. ```text Natural Prose: PASS 24/24 Voice: PASS 24/24 Command: PASS 24/24 ``` Keycloak 기록에는 shell/CLI block이 없으므로 command lane은 정상적으로 N/A다. ## 2.4 전체 회귀 ```text verify-pipeline.py exit 0 ``` 전체 테스트: ```text Ran 391 tests OK (skipped=14) ``` --- # 3. F-01 — current remediation이 실제 subagent 분리 계약을 충족하지 않음 **등급: 완료 차단** 현재 하네스는 단순히 역할 이름을 원장에 적는 것이 아니라 각 단계마다 정해진 subagent를 별도로 실행하는 구조다. `running-tech-log-pipeline/SKILL.md`와 `stage-contracts.md`는 다음을 요구한다. ```text S3 -> record-writer S4 -> diagram-maker S5 -> prose-rewriter S6 -> voice-writer technical evidence review -> fact-reviewer ``` 그리고 이 역할을 일반 세션이 대신 수행하는 것이 아니라 `Agent(subagent_type="...")` 형태로 분리하는 것이 이 하네스의 목적이다. 그런데 새 current remediation 원장의 `technicalEvidence.notes`에는 17개 모두 다음 사실이 직접 기록돼 있다. ```text 별도 Agent tool은 노출되지 않아 current remediation 세션이 fact-reviewer 계약을 직접 수행했다. ``` 즉 원장의: ```json "runBy": "fact-reviewer" ``` 와 실제 실행 설명이 일치하지 않는다. `verify-pipeline-run.py`는 `runBy` 문자열이 계약상의 에이전트 이름인지와 해당 agent 정의 파일이 존재하는지를 검사한다. 하지만 저장소 밖에서 실제로 `Agent(subagent_type="fact-reviewer")`가 실행됐는지까지 증명하지는 않는다. 따라서 **기계 검사는 PASS지만 현재 원장 자체의 notes가 subagent isolation을 수행하지 않았다고 밝히고 있다.** ### 수정 원칙 기존 2026-09-19 remediation run을 고쳐서 마치 subagent가 실행된 것처럼 만들면 안 된다. 현재 run은 현재 시점의 실행 영수증으로 그대로 둔다. 별도 Agent/subagent 실행이 가능한 환경에서 **새 current remediation run을 다시 수행**해야 한다. 최소한 S3, S5, S6, fact-review는 계약에 지정된 독립 agent가 실제로 수행해야 한다. --- # 4. F-02 — S3/S5/S6 evidence gate에 `--repo`가 빠짐 **등급: 완료 차단** 현재 stage contract의 S3 gate는 명확히 다음 명령을 요구한다. ```bash node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs <프로젝트> --repo ``` S5와 S6도 문장 수정 이후 **S3 gate를 다시 실행**하는 계약이다. 하지만 17개 current remediation run을 전부 확인하면 S3/S5/S6가 다음 형태로 기록되어 있다. ```bash node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs keycloak ``` 즉 `--repo`가 빠져 있다. 결과: ```text missing --repo: 17/17 runs S3, S5, S6 모두 ``` 이 차이는 단순 옵션 차이가 아니다. 현재 올바른 계약 명령을 직접 실행하면: ```text node .../check_evidence.mjs keycloak --repo [keycloak] 증빙 대조 (저장소 포함) ? 1 저장소 경로가 이 기계에 없다 /home/donghyeon/workspace/keycloak-pattern 불일치 0건 · 대조 불가 1건 exit=3 ``` 즉 현재 원장의 evidence gate `exit=0`은 **source repository까지 대조해서 PASS한 결과가 아니다.** 하네스 SKILL도 exit code를 다음처럼 구분한다. - 0: repo 대조 완료 - 1: 실제 불일치 - 2: 검사 대상 성립 안 함 - 3: source repository 부재 → UNVERIFIABLE 현재 source repo가 없는 상태에서 `--repo`를 빼고 exit 0을 기록하면 이 구분이 사라진다. ### 수정 원칙 가장 올바른 해결은 source repository를 현재 머신에서 실제로 접근 가능하게 만드는 것이다. 현재 정본 경로: ```text /home/donghyeon/workspace/keycloak-pattern ``` 은 존재하지 않는다. `/shared/document-haness/.run/keycloak-four-patterns`도 확인했지만 이는 Record 작업 산출물이고 source repository 대체물이 아니다. source repository를 준비한 뒤 새 remediation run에서 S3/S5/S6의 `check_evidence.mjs keycloak --repo`를 실제로 통과시켜야 한다. 기존 2026-09-19 run의 gate 명령이나 exit code를 사후 수정하지 않는다. --- # 5. F-03 — SVG 2개의 source context manifest가 stale **등급: 수정 필요** 현재 project layout은 error 0으로 PASS하지만 다음 경고가 남아 있다. ```text SSOT 문맥이 바뀐 뒤 그림을 다시 보지 않았다 - ap1-direct-architecture - login-api-phase-split ``` 현재 두 TechViz `context.json` / `spec.json`은 새 SSOT hash를 가리킨다. ```text current document/context sha256 ea10df24b892e2c57123a37a4b4f0d821e4f394353e6746f50df6a48342353e9 ``` 하지만 두 asset manifest는 이전 source context hash를 계속 갖고 있다. ```text manifest source_context.document_sha256 15e7c79412ac05ed39d6f3d0c14de8dda92abe7b402139ac2a90492dfe5e162c ``` ### 의미 Spec의 evidence line/hash는 새 SSOT에 맞게 갱신됐지만 최종 render/review 영수증인 manifest가 새 context 기준으로 닫히지 않았다. 현재 diff를 보면 도식의 node/edge 구조를 바꿔야 할 정도의 의미 변경은 확인되지 않았다. - AP1: public client 설명의 scope가 더 정확하게 바뀜 - login/API split: 도식 핵심 흐름 자체는 유지됨 따라서 새 그림을 설계할 필요는 없다. ### 필요한 조치 TechViz 정본을 기준으로 두 그림만 다시 render/review한다. 대상: ```text ap1-direct-architecture login-api-phase-split ``` 그 뒤: ```text techviz lint check-figure-text.py check-figure-overlap.py preview-figure.py check-figure-provenance.py verify-project-layout.py keycloak ``` 를 다시 돌린다. 목표는 `SSOT 문맥이 바뀐 뒤 그림을 다시 보지 않았다` 경고 2건을 없애는 것이다. SVG를 손으로 편집하지 않는다. --- # 6. 완료 차단이 아닌 항목 ## 6.1 Historical record run coverage 전체 pipeline은 현재 Keycloak 24개 중 22개가 어떤 run ledger에 덮여 있다고 보고한다. 원장이 없는 historical record: ```text concept-forward-auth-and-auth-request.md decision-federation-not-a-pattern.md ``` 이 두 기록을 위해 과거 run ledger를 소급 생성하지 않는다. 현재 하네스 원칙상 historical ledger 부재 자체를 이번 remediation의 실패로 바꾸지 않는다. ## 6.2 Source repository absence 현재 source repository가 없으므로 live source reconciliation은: ```text UNVERIFIABLE ``` 이다. 이를 PASS라고 쓰면 안 된다. 다만 문서 본문 자체의 기존 수정 사항은 SSOT / local evidence 기준으로 재검토했고 새로운 내용 오류는 찾지 못했다. --- # 7. 현재 완료 조건 ## 내용 / 문체 / SVG 구조 - [x] 기존 리뷰의 문서 내용 finding 반영 - [x] Bearer JWT validation chain SVG - [x] IdP Brokering SVG - [x] Natural Prose 24/24 PASS - [x] Voice 24/24 PASS - [x] Command 24/24 PASS - [x] Figure Text PASS - [x] Figure Overlap PASS - [x] Figure Provenance PASS - [x] Required Content PASS - [x] Tree PASS - [x] 전체 pipeline exit 0 - [x] unittest 391 PASS / 14 skipped ## 남은 완료 차단 - [ ] source repository를 실제 대조 가능한 위치에 준비 - [ ] 새 current remediation run에서 S3 evidence gate를 `--repo`로 실행 - [ ] S5 evidence gate를 `--repo`로 재실행 - [ ] S6 evidence gate를 `--repo`로 재실행 - [ ] S3/S5/S6를 실제 지정 subagent로 수행 - [ ] fact-reviewer를 실제 독립 subagent로 수행 - [ ] 새 run ledger 각각 `verify-pipeline-run.py` PASS - [ ] `ap1-direct-architecture` manifest/context 재검토 - [ ] `login-api-phase-split` manifest/context 재검토 - [ ] `verify-project-layout.py keycloak`에서 위 stale-context 경고 2건 제거 - [ ] 마지막 전체 pipeline / unittest 재실행 --- # 8. 다음 작업 지시 현재 Keycloak 본문을 다시 대규모 수정하지 않는다. 다음 실행의 범위는 **절차 증빙과 stale SVG 2개만**이다. 순서: ```text 1. keycloak-pattern source repo를 현재 머신에 준비 2. current remediation run 새로 시작 3. 지정 subagent로 S3 수행 4. check_evidence.mjs keycloak --repo 확인 5. 필요한 S4에서 stale 그림 2개만 rerender/review 6. 지정 subagent로 S5 7. --repo evidence gate 재실행 8. 지정 subagent로 S6 9. --repo evidence gate 재실행 10. 독립 fact-reviewer 11. S7은 Studio 요청이 없으므로 SKIP 12. verify-pipeline-run.py 13. keycloak project gates 14. 전체 verify-pipeline.py 15. 전체 unittest ``` --- # 9. 최종 판정 현재 결과물의 **내용 품질 자체에는 추가 리뷰 finding이 없다.** 하지만 7단계 하네스 준수를 완료 조건으로 보는 현재 프로젝트 기준에서는 다음 두 가지가 실제 완료 차단이다. 1. subagent isolation을 실제로 수행하지 않은 current remediation run 2. `--repo`가 빠진 S3/S5/S6 evidence gate 그리고 SVG 2개의 stale manifest도 정리해야 한다. 따라서 현재 상태는: > **keycloak = 아직 더 봐야댐** 이 세 범위가 닫힌 뒤에만 Keycloak을 **완료**로 바꾸고 다음 프로젝트로 넘어간다.