{ "schemaVersion": 1, "project": "virtualization", "reviewDate": "2026-09-20", "scope": "final/evidence/raw non-README files", "classificationContract": { "DIRECT_REPRODUCTION": "같은 절차/결함을 다시 실행해 claim 자체를 직접 관측한 원문", "FOLLOW_UP_CORROBORATION": "같은 원인·수정 경로를 후속 실행으로 보강하지만 과거 사건 자체의 직접 재현은 아닌 원문", "CURRENT_SNAPSHOT": "현재 상태/진단을 고정한 원문; 과거 사건의 직접 evidence로 자동 승격하지 않음" }, "summary": { "files": 65, "CURRENT_SNAPSHOT": 31, "FOLLOW_UP_CORROBORATION": 28, "DIRECT_REPRODUCTION": 6 }, "recordsWithExactFilenameReferences": 7, "files": [ { "path": "final/evidence/raw/lab-state-before-rebuild/01-host-before-teardown.txt", "sha256": "64023fe7adf5d104c3e0698b4b3b9c8d79672b52f6b5b2e4175d15e6275de730", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "### virsh list --all", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/02-teardown-step0.txt", "sha256": "60f2230717bab638558167a89e9a7a859b83226316d03a6dc395e6288144e2fd", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "Id Name State", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/03-teardown-step1.txt", "sha256": "ee44475f35af96bfeb5f5bc831ea62c56c7c0d348fea6ab07c47a10d4793422e", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "Domain 'kc-lab-edge' destroyed", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/04-teardown-step2.txt", "sha256": "6dd0f0385bbaa7082d61aff7976541cbe160cdac6e39871ace7cfa2c12cec3c3", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "Updated network default persistent config and live state", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/05-teardown-verify.txt", "sha256": "ffa20fdcdce506baaf0853e6e31dda4e29e0ebe94b0f2ec802a03c87e8c5035d", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "Id Name State", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/06-build-seed-as-documented.txt", "sha256": "571defef22939d92fb65b4bec599d78534c4acb6e8377572534e5cdb4b245cbf", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "xorriso 1.5.8.pl02 : RockRidge filesystem manipulator, libburnia project.", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/07-build-seed-fixed.txt", "sha256": "ed33ae4ac28571d53bb41e7ac1afaa483f8ff7dbc197b00c30de2b228a8d63b2", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "xorriso 1.5.8.pl02 : RockRidge filesystem manipulator, libburnia project.", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/08-build-seed-upload.txt", "sha256": "fbfa1c7c4bbbe6b5d7bb6a5baa36f693d0e30aeb189ed1894d9e3b6f01487354", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "Vol seed-kc-lab-1.iso created", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/09-build-dhcp.txt", "sha256": "67ce736465fdd44567fd612ec54b6ed20bfba3025c4da06d3493e10f49ef7d97", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "Updated network default persistent config and live state", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/10-build-virt-install-1.txt", "sha256": "a869e6f0a45ac30275628ad1025ef4050c65e1221d3363924f5a7732d660a642", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "Starting install...", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/11-build-virt-install-2-edge.txt", "sha256": "e4ebc56e0aa4ce70ebdb22346e60f01916dae50de4a829a91d31a638e529a63c", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "Starting install...", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/12-build-guests-up.txt", "sha256": "2e16b4000e32acd9d8f71cc3e5f8629d3023e7b2132fff1f5ad3db0816a85dea", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== virsh list --all ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/13-build-guest-ssh.txt", "sha256": "e5220b4364ede8645d53a8a76863ca60fcb2ff76f23eb0afd326b07b1a5168af", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== kc-lab-1 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/14-cloudinit-schema-check.txt", "sha256": "21ca74c58920d33273a7ef6e7715594d19d0b41779f39898bfe15edb8f3438f5", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "=== 게스트에서 sudo 가 되나 ===", "recordReferences": [ "tech-log-studio/build-completion-judgment/case/case-cloud-init-failures-all-look-like-ssh-refused.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/15-k3s-precheck.txt", "sha256": "34b11749e509a2e890978fde7ca318f97e0070e5399683eb28b688f3af1c56e7", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "Id Name State", "recordReferences": [ "tech-log-studio/build-completion-judgment/case/case-an-empty-token-installed-the-agent-anyway.md", "tech-log-studio/build-completion-judgment/case/case-cloud-init-failures-all-look-like-ssh-refused.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/16-hostkey-defect.txt", "sha256": "31138206cd0dc3a510ec50b2657184a4a3f73acb51832d73e0c358830228e6de", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "=== 별칭으로는 되나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/17-hostkey-cleared.txt", "sha256": "ff56b3759d0ce250b1fa63197c9fe3fc8d0fd67fbae3a3dde897dc5af1f2800f", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "옛 키 셋 제거", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/18-k3s-server-install.txt", "sha256": "045a4b0d4f2106ca87da8350a4393b6d0eee6419f41c8dffbc166442f94feec7", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "[INFO] Finding release for channel stable", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/19-k3s-server-verify.txt", "sha256": "8361ba7ce85bc26e83d9712f2e658705cd94db91ff375d95912389f556012aad", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "active", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/20-kubeconfig.txt", "sha256": "295aaab72493a031f1c75c0d618a829afbf6279defbbf3870bdd1f5e730bdc62", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 고치기 전 server 줄 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/21-k3s-token.txt", "sha256": "4bb3db6953686ae12f1960a9ebad54b8bf1a98222acf181b43fd2e505776cd99", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "109 node-token", "recordReferences": [ "tech-log-studio/build-completion-judgment/case/case-an-empty-token-installed-the-agent-anyway.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/22-k3s-agent-install.txt", "sha256": "66ebf2daa180c5c163ccea71b2afa02a97f5a5db41d57f8469802f468dbcfb06", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "[INFO] Finding release for channel stable", "recordReferences": [ "tech-log-studio/build-completion-judgment/case/case-an-empty-token-installed-the-agent-anyway.md", "tech-log-studio/lab-environment-build/setup/setup-install-k3s-server-and-agent.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/23-k3s-cluster-verify.txt", "sha256": "9c3d2d66550d4016bd7483df6d54e8c8a9180ea474ac7a0297ebe52273c1ad5b", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== kubectl get nodes -o wide ===", "recordReferences": [ "tech-log-studio/lab-environment-build/setup/setup-install-k3s-server-and-agent.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/24-edge-nginx-install.txt", "sha256": "107063410a1294682e991ec2d066263bff14a4c5a6f1e4b072584085bcfba2e9", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "설치 종료 0", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/25-edge-nginx-config.txt", "sha256": "dc1e96402db7c47d061563e426046037a67d01000382534e8920bf873730d6e7", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "--- sites-enabled ---", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/26-edge-nginx-verify.txt", "sha256": "af472ae1343a69211b8e42fee8092a32a979bbc2280295e0c78d36e18f038e0b", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 3-③ nginx -t (문서는 [warn] types_hash 줄이 늘 같이 나온다고 적었다) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/27-edge-doc-mismatch.txt", "sha256": "a82fb004cf41130a9121c588018a7ebb7ff9e5a7c894968c4d7b1b5fd0e21103", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "=== 엣지 응답 헤더 전체 (Server: 가 누구인가) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/28-host-state-before-dnat.txt", "sha256": "6a6475d074449b34ac9b518e9cf6a19f5ea0ef20c423615f860e2154055d9a14", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 4번 치기 전 호스트 상태 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/29-host-dnat-files.txt", "sha256": "84789e01bae30f1e7b434332a16c49de3ad194305aaa13b33b7d81b437348623", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== /etc/nftables.d/lab-edge-dnat.nft (실물) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/30-layer3-from-workstation.txt", "sha256": "7497faa4164ae3e3667789f006b048c964bd58bf09ada06cff3938876da75df7", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== [워크스테이션] auth.hyeonworks.com 이 어디로 도나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/31-cert-doc-precheck.txt", "sha256": "f0529d0dcee6e1bcf72054380928f5e92ab127125202fe445781c1489eaa4d28", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 04 확인 ① dig ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/32-cert-doc-dig-remedy.txt", "sha256": "af19c832c3ef84bc0c3609845b93ddb4e9af31a352d6b6371ae411755672bddc", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 처방 후보 A: getent (기본 설치) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/33-keycloak-precheck.txt", "sha256": "6f01978538afe9a2b9c0c06dc097199ba932ed91ac26556a69b74300958b9050", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 05 확인 ① 저장소 루트에서 매니페스트가 보이나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/34-keycloak-apply.txt", "sha256": "4a062c4e228fe280abaa4f4429aa87d71b51f6bb5802cde72fc27c29865a6862", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 05 1-② kubectl apply ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/35-keycloak-verify-1-3.txt", "sha256": "5f6dc467d7941102b2c3e27046870df4fc9632d2e8a80e0a36ba0fe82efe1613", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 05 판정 ①-① get all ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/36-keycloak-verify-4-6.txt", "sha256": "5b7f4db5ce7a5f49e595b5420ef3fe791e39058d262c21f50ed1b45688573f6c", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 판정 ③ 끝 — 환경변수가 어느 Secret 에서 왔나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/37-keycloak-cluster-size.txt", "sha256": "dad8b8e98bebaab1dc93e2343d4650e96a3e638d70dabcd502b6cdde3d4e4e91", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 판정 ⑥ 지표 — Prometheus 가 아직 없을 때의 임시 파드 형태 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/38-keycloak-verify-7-8.txt", "sha256": "6db41bfd8db718226283c2ca7b2b85a962c20e13dff627548057e07346cdb05a", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 판정 ⑦ 밖에서 (문서 기대 200) — 04 를 안 했으니 443 이 없다 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/39-observability-apply.txt", "sha256": "963fd551ac5e569858c8ffcef08d180fb45840e2f3faca12007b8042baf2c7df", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 06 1-② apply + rollout ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/40-observability-verify.txt", "sha256": "d9c16f59b2593db6e508de1abdb8c97ac723e83c6db5b381a2ddb78b67c93e2f", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 06 판정 ①-① 다시 (grafana 가 Ready 가 됐나) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/41-observability-cluster-size-retry.txt", "sha256": "7343aa0b4bf65d587cab922581aa170102a2689de50330be965543ec0b059256", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 90초 뒤 다시 — 스크레이프가 한 바퀴 더 돈 뒤 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/42-power-cycle-memory.txt", "sha256": "fe75b2d67ae68dafcdfd19297b0fafe017369e58df72d6a52cf3cf08b0f2d37a", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 07 1-① 상한을 올리고 현재 할당을 맞춘다 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/43-dominfo-vs-config.txt", "sha256": "9908bd7d59388d15221867afbff3502673210d311fed6732baa18e2ee16c3b37", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== dominfo 는 무엇을 보여 주나 (도메인이 돌고 있을 때) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/44-host-prep-checks.txt", "sha256": "9c64f5d50dae2dc16ff4442d4386213c5459fe029ea2df7b79731ba5f7d11f9c", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 00 확인 ① CPU 가 확장을 내놓나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/45-libvirt-uri-mechanism.txt", "sha256": "44afd2b9e7adb3f4a8fe89330610aea27efdbda843e987cdd176e0a1be9fef18", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== rc 파일이 비대화형 ssh 에서 읽히나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/46-layer3-now-reachable.txt", "sha256": "ba8b5c30bb506c8fe2ae1c4474d6bcf753ed91c911cf2230e809a9df9de06afa", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 03 층별 확인 — 이제 밖에서 닿는다 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/47-layer-codes-by-host-header.txt", "sha256": "88ceee1bde845e9f4d266dfdc97cae75e506aa5702f34919a0bd01e1061eba27", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 같은 엣지에 세 가지로 친다 — 무엇이 코드를 가르나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/48-cloudinit-packages.txt", "sha256": "4d098c32d50c76410bf2abbaf47edc59ad42ab40032ac8f78d3be1450e845208", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 01 의 미검증: cloud-init packages 에 certbot 이 있었나 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/49-doc01-verification.txt", "sha256": "285949e41056dfab0ffeffa171c440c33696928a20d3a395e177379e0c85e1dc", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 01 확인 ① ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/50-doc08-precheck-and-cert-location.txt", "sha256": "55c28a979e527ebe9f8161723c946ec82fbf7eb2c211fa9a122668d63666c3df", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 08 「지우기 전에 먼저 본다」 네 값 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/52-doc01-09-unknowns.txt", "sha256": "b735d1f4eed6c98ca8330b99d6e31fdef9061ad02257da4661a656868e1f68c6", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 09 · lsmod | grep kvm ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/53-doc03-sudo-answers.txt", "sha256": "e5321ab5db28c3dcaf46b68fbe6667354a4c8ec17e619c508054f56d438e20ab", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 03 ① 배포된 두 파일이 문서 판인가 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/54-who-masquerades.txt", "sha256": "fa0e44d2b90a81f36aecb9ec956db6697237057d3d34faf96037fe86fd21e4d7", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== tailscale 이 만든 체인 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/55-doc02-san-journal.txt", "sha256": "b043cdc1b0173d34cd09f6f030ac07b0b7044a9a5709a46e029cb3e82db6aed5", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 02 · API 서버 인증서 SAN ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/56-doc04-token-check.txt", "sha256": "fd91f0fa8f8705310afeab8e44cb7653cec65df3d79efe7907a3ae02bcc14c61", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 04 3단계 ④ 권한과 바이트 수 (값은 안 본다) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/57-host-certs.txt", "sha256": "b8c0ac83e41ef2b1563b9812d623b73d94d6711adac26171155fcfcb563776ab", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 랩 호스트의 인증서 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/58-authenticator-and-token.txt", "sha256": "8201332eb3a2c85383af0c017c4c62dbbcc9952dc86da2ebed5ad6cb73bf6697", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 04 의 오랜 미검증: authenticator 가 무엇인가 ===", "recordReferences": [ "tech-log-studio/lab-environment-build/question/question-is-this-lab-issuing-certificates-with-http-01-or-dns-01.md", "tech-log-studio/lab-environment-build/setup/setup-tear-down-the-lab-and-know-what-survives.md", "tech-log-studio/lab-environment-build/setup/setup-wildcard-certificate-with-dns-01-and-a-deploy-hook.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/59-cert-moved-to-edge.txt", "sha256": "8545de343d5cb388e810801bcc3b06884d5dd601fe4cf9a6845d40afd34733a1", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 호스트 → 엣지로 인증서를 옮긴다 (값은 화면에 안 나온다) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/60-doc04-step5-path-defect.txt", "sha256": "c9f4b8eaf73e71d0d7f838a29a1e7549deaa125099d46a3fab9e81ad6187fad8", "classification": "DIRECT_REPRODUCTION", "reason": "문서에 적힌 절차/결함을 같은 재구축에서 다시 실행해 실패 또는 판정을 직접 관측했다.", "firstNonEmptyLine": "=== live 아래에 무엇이 있나 ===", "recordReferences": [ "tech-log-studio/lab-environment-build/setup/setup-wildcard-certificate-with-dns-01-and-a-deploy-hook.md" ] }, { "path": "final/evidence/raw/lab-state-before-rebuild/61-tls-up.txt", "sha256": "b4abd99ac55300a5729cf391c375aadc376ea97eb0354a80a97b84a057d86cbc", "classification": "FOLLOW_UP_CORROBORATION", "reason": "2026-09-17 재구축·수정 경로의 후속 실행/검증 영수증이다. 과거 사건의 직접 재현으로 승격하지 않는다.", "firstNonEmptyLine": "=== 경로를 live/auth.hyeonworks.com 으로 고친다 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/62-https-400.txt", "sha256": "7de82592ff941c7221f9f4573c59ac63e8ef21ec0fd2e06755102df14b621cf7", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 400 의 본문과 머리 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/63-layer-400.txt", "sha256": "a9ebb083d8e4536bfe0213e236eebb777fc13991c15eed8c13c803e23e3a6727", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== 층 ① 엣지에서 Traefik 에 직접 (Host 헤더를 손으로) ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/64-tls-working.txt", "sha256": "b7addac123c17fee5dd55cae831a26fc1908fceff4d70d2cd0bd53d6018060b7", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "23:\t\tproxy_set_header Host $host;", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/65-auth-400.txt", "sha256": "0b7971b658a47bba03e74e31eda2c41ecd88af3ff24ad38bb2f34fec382019e4", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== auth 의 400 본문 ===", "recordReferences": [] }, { "path": "final/evidence/raw/lab-state-before-rebuild/65-edge-missing-pieces.txt", "sha256": "42f8d7b617a319b076c0fe77f22c6647acda77acde61b077d5cd57a762247b73", "classification": "CURRENT_SNAPSHOT", "reason": "재구축 시점의 상태·진단 조회다. 과거 사건 자체를 재현한 것은 아니다.", "firstNonEmptyLine": "=== certbot 의 진짜 종료 코드 ===", "recordReferences": [] } ] }