From 33b64a4c58e3a2bc71cb82ae5767e964e14c25cd Mon Sep 17 00:00:00 2001 From: dancinlife Date: Mon, 13 Apr 2026 18:40:20 +0900 Subject: [PATCH] =?UTF-8?q?feat(l0=5Fguard):=20section=204=20=E2=80=94=20L?= =?UTF-8?q?0=20.hexa=20=ED=8C=8C=EC=9D=BC=20=ED=8C=8C=EC=8B=B1=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=EC=84=B1=20=EA=B2=80=EC=A6=9D=20(phantom=20=EC=B0=A8?= =?UTF-8?q?=EB=8B=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: - 기존 verify 는 "파일 존재" 만 검증 → dead/broken .hexa 도 L0 자격 유지 - airgenome rebuild v2 의 도화선: src/core.hexa, modules/load_balancer.hexa 등 파싱 실패 상태로 L0 47 PASS 였음 - 신규 module 작성 시 자동 parse 검증 → 같은 phantom 재발 차단 Implementation: - 각 L0 path 가 .hexa 확장자면 hexa run 실행 - "Parse error" 출력 카운트 0건 = PASS, 1건 이상 = FAIL - stdin 차단 (< /dev/null) 으로 입력 대기 회피 Side effect: - 파일이 top-level 에서 무거운 작업 (시스템 호출 등) 을 하면 매 verify 마다 실행 - 완화: env gating 권장 (예: CORE_SELF_TEST=1 패턴, airgenome core/core.hexa 참조) 검증: - airgenome verify → 21 PASS / 0 FAIL (core.hexa, core_test.hexa 둘 다 parse PASS) - nexus self-verify → 9 FAIL parse phantom 즉시 발견 (예상 효과 입증) milestone: airgenome roadmap M1_l0_strict --- shared/lockdown/l0_guard.hexa | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/shared/lockdown/l0_guard.hexa b/shared/lockdown/l0_guard.hexa index c82a6099..0095b076 100644 --- a/shared/lockdown/l0_guard.hexa +++ b/shared/lockdown/l0_guard.hexa @@ -191,6 +191,41 @@ fn cmd_verify(project, repo) { if fp { println(" PASS force_push_blocked"); pass = pass + 1 } else { println(" FAIL force_push_blocked"); fail = fail + 1 } if dl { println(" PASS branch_delete_blocked"); pass = pass + 1 } else { println(" FAIL branch_delete_blocked"); fail = fail + 1 } + // 4. L0 .hexa 파일 파싱 가능성 (phantom 차단) + // M1_l0_strict — airgenome rebuild v2 진입의 핵심. + // "파일 존재" 만 검증하면 dead code 가 L0 자격 유지하는 상태가 발생. + // 각 .hexa L0 파일을 hexa 로 실행, "Parse error" 출력 0건 = PASS. + // 부수 효과: 파일이 top-level 에서 무거운 작업을 하면 매 verify 마다 실행됨. + // 완화: env gating (CORE_SELF_TEST=1 등) 권장. + println("") + println("── 4. L0 .hexa 파일 파싱 가능성 ──") + if paths_str != "" { + let plines = paths_str.split("\n") + let mut k = 0 + while k < len(plines) { + let p = plines[k].trim() + if p != "" { + let n = len(p) + if n >= 5 { + let suffix_check = exec("echo '" + p + "' | grep -c '\\.hexa$'").trim() + if suffix_check == "1" { + let abs = root + "/" + p + let perr_count = exec(HEXA + " '" + abs + "' 2>&1 < /dev/null | grep -c 'Parse error'").trim() + let pe = to_int(perr_count) + if pe == 0 { + println(" PASS parse: " + p) + pass = pass + 1 + } else { + println(" FAIL parse: " + p + " (" + to_string(pe) + " parse errors)") + fail = fail + 1 + } + } + } + } + k = k + 1 + } + } + println("") println("═══ 결과: " + to_string(pass) + " PASS / " + to_string(fail) + " FAIL ═══") if fail == 0 {