Repository navigation
예비 보안 점검 결과 — ContextualWisdomLab/appguardrail #132
Description
예비 보안 점검 결과 — ContextualWisdomLab/appguardrail
공개 GitHub 리포지토리 기준의 정적 예비 점검입니다. 로컬 클론, 테스트 실행, 전체 의존성 트리 분석, 실제 패키지 배포물 검증은 수행하지 않았으므로 “감사 완료”가 아니라 우선 조치가 필요한 보안 리뷰 초안으로 보는 것이 적절합니다.
요약
appguardrail은 AI로 만든 앱을 대상으로 보안 가드레일, 스캔, 리뷰, 모니터링, 수정 지원을 제공하는 CLI/워크플로 중심 도구로 보입니다. README는 Python 3.9 이상, pip install appguardrail, appguardrail scan, Trivy/CodeGraph 연동, 시크릿·의존성·인증 누락·Firebase/Supabase/CORS/Stripe 관련 패턴 탐지를 설명하고 있습니다. pyproject.toml 기준 런타임 Python 의존성은 비어 있고, 콘솔 엔트리포인트는 scanner.cli.appguardrail:main입니다. (GitHub)
가장 우선적으로 볼 이슈는 네이티브 시크릿 탐지 결과가 매칭된 코드 라인을 그대로 출력할 수 있는 점입니다. 이 도구가 CI에서 실행될 경우 실제 시크릿이 로그나 아티팩트에 남을 가능성이 있어, 보안 도구 자체의 목적과 충돌합니다. 반면 Trivy 연동 결과에서는 시크릿 값을 억제하는 처리도 보여, 네이티브 스캐너에도 동일한 정책을 적용하는 것이 타당합니다. (GitHub)
적용 기준
이번 예비 점검에는 다음 기준을 적용했습니다.
기준 | 적용 범위 -- | -- OWASP ASVS 5.0.0 | 보안 검증 요구사항의 기준선. ASVS 최신 안정 버전은 5.0.0으로 공개되어 있습니다. (OWASP) OWASP Top 10:2025 — A03 Software Supply Chain Failures | 의존성, CI/CD, 빌드·배포 파이프라인, 패키지 무결성, SBOM, 취약점 모니터링. OWASP는 A03에서 취약·오래된 컴포넌트, 추적되지 않는 의존성, CI/CD 보안 약화, SBOM 및 CVE/NVD/OSV 모니터링을 명시합니다. (OWASP) OWASP Top 10 CI/CD Security Risks | Poisoned Pipeline Execution, Dependency Chain Abuse, Excessive Permissions, Credential Hygiene, Artifact Integrity 등. (OWASP) CWE | 확인된 취약 패턴을 약점 유형으로 매핑. CVE / GHSA / OSV 후보 확인 | 공개적으로 보이는 직접 의존성 핀을 기준으로 제한적 확인. 전체 SBOM 없이는 확정 불가.개발자 티켓 초안
Ticket 1 — Secret scan output redaction
Severity: High
Type: CWE-532 / CWE-200
Affected area: scanner/cli/appguardrail.py, scanner/rules/secrets.yml
Description:
Native secret detection can print the matched source line as a finding snippet. If real credentials are present, scan output may expose them in terminal or CI logs.
Acceptance criteria:
Secret-related findings never print the matched secret value.
Default output shows file, line, rule ID, severity, and redacted snippet only.
Unit tests confirm fake Stripe/OpenAI/JWT/DB URL values do not appear in stdout/stderr.
Trivy secret suppression behavior and native scanner behavior are consistent.
Ticket 2 — Harden AI review workflow permissions
Severity: Medium
Type: CI/CD hardening, OWASP CICD-SEC-5 / CICD-SEC-6
Description:
Review workflows use privileged contexts and external runtime tools. Existing mitigations are present, but permissions and third-party package execution should be further minimized.
Acceptance criteria:
Remove
id-token: writeunless an explicit OIDC trust relationship requires it.Document why each permission is required.
Replace runtime
npx -yinstalls with hash-locked or containerized tooling.Add workflow linting and dependency review as required checks.
Ticket 3 — Hash-lock release dependencies and generate SBOM
Severity: Medium
Type: Supply chain hardening, OWASP A03:2025
Description:
Release workflow uses pinned versions for build tooling but does not appear to enforce hash-based dependency integrity.
Acceptance criteria:
requirements-release.txtis generated with hashes.CI uses
pip install --require-hashes.Release pipeline emits SBOM.
Release job runs OSV or pip-audit against resolved dependencies.
Published artifacts include provenance or attestations.
결론
이 리포지토리는 보안 목적의 도구답게 승인 범위 문서, 책임 있는 테스트 안내, CI 권한 제한, 액션 SHA 핀, PyPI OIDC 게시 등 긍정적인 통제가 이미 보입니다. 가장 먼저 고쳐야 할 부분은 시크릿 탐지 결과의 원문 출력 방지입니다. 그 다음은 AI/CI 워크플로의 권한·외부 도구·토큰 노출면 축소, 릴리스 의존성 무결성 강화, SBOM/CVE 자동 검증 순서가 적절합니다.
다음 단계는 승인된 범위에서 로컬 appguardrail scan, pip-audit, OSV-Scanner, SBOM 결과를 함께 대조해 CVE 후보를 확정하는 것입니다.
공개 GitHub 리포지토리 기준의 정적 예비 점검입니다. 로컬 클론, 테스트 실행, 전체 의존성 트리 분석, 실제 패키지 배포물 검증은 수행하지 않았으므로 “감사 완료”가 아니라 우선 조치가 필요한 보안 리뷰 초안으로 보는 것이 적절합니다.
요약
appguardrail은 AI로 만든 앱을 대상으로 보안 가드레일, 스캔, 리뷰, 모니터링, 수정 지원을 제공하는 CLI/워크플로 중심 도구로 보입니다. README는 Python 3.9 이상, pip install appguardrail, appguardrail scan, Trivy/CodeGraph 연동, 시크릿·의존성·인증 누락·Firebase/Supabase/CORS/Stripe 관련 패턴 탐지를 설명하고 있습니다. pyproject.toml 기준 런타임 Python 의존성은 비어 있고, 콘솔 엔트리포인트는 scanner.cli.appguardrail:main입니다. ([GitHub]1)
가장 우선적으로 볼 이슈는 네이티브 시크릿 탐지 결과가 매칭된 코드 라인을 그대로 출력할 수 있는 점입니다. 이 도구가 CI에서 실행될 경우 실제 시크릿이 로그나 아티팩트에 남을 가능성이 있어, 보안 도구 자체의 목적과 충돌합니다. 반면 Trivy 연동 결과에서는 시크릿 값을 억제하는 처리도 보여, 네이티브 스캐너에도 동일한 정책을 적용하는 것이 타당합니다. ([GitHub]2)
적용 기준
이번 예비 점검에는 다음 기준을 적용했습니다.
| 기준 | 적용 범위 |
|---|---|
| OWASP ASVS 5.0.0 | 보안 검증 요구사항의 기준선. ASVS 최신 안정 버전은 5.0.0으로 공개되어 있습니다. (OWASP) |
| OWASP Top 10:2025 — A03 Software Supply Chain Failures | 의존성, CI/CD, 빌드·배포 파이프라인, 패키지 무결성, SBOM, 취약점 모니터링. OWASP는 A03에서 취약·오래된 컴포넌트, 추적되지 않는 의존성, CI/CD 보안 약화, SBOM 및 CVE/NVD/OSV 모니터링을 명시합니다. ([OWASP]4) |
| OWASP Top 10 CI/CD Security Risks | Poisoned Pipeline Execution, Dependency Chain Abuse, Excessive Permissions, Credential Hygiene, Artifact Integrity 등. (OWASP) |
| CWE | 확인된 취약 패턴을 약점 유형으로 매핑. |
| CVE / GHSA / OSV 후보 확인 | 공개적으로 보이는 직접 의존성 핀을 기준으로 제한적 확인. 전체 SBOM 없이는 확정 불가. |
주요 발견 사항
| ID | 발견 사항 | 위험도 | OWASP / CWE 매핑 | 근거 | 권고 조치 |
|---|---|---|---|---|---|
| AG-01 | 시크릿 탐지 결과가 실제 매칭 라인을 출력할 수 있음 | 높음 | OWASP A03:2025, OWASP CI/CD Credential Hygiene, CWE-532, CWE-200 | secrets.yml은 Stripe, OpenAI, JWT, DB URL, 일반 하드코딩 시크릿을 HIGH/CRITICAL로 탐지합니다. _scan_file은 매칭 라인을 snippet으로 저장하고, 출력 함수는 Code: {snippet} 형태로 표시합니다. ([GitHub]2) |
시크릿 계열 룰은 기본적으로 [REDACTED] 처리. --show-snippets 같은 명시 옵션이 있을 때만 컨텍스트를 보여주되, 매칭 값은 항상 마스킹. CI 로그에는 시크릿 원문이 남지 않도록 테스트 추가. |
| AG-02 | pull_request_target 기반 AI/리뷰 워크플로의 잔여 위험 |
중간 | OWASP A03:2025, CICD-SEC-4 PPE, CICD-SEC-5 PBAC, CICD-SEC-6 Credential Hygiene, CWE-269, CWE-829 | opencode-review.yml은 pull_request_target과 workflow_dispatch를 사용하고, 일부 경로에서 id-token: write, GITHUB_TOKEN, 모델 토큰, 런타임 npx MCP 패키지를 사용합니다. 다만 same-repo 조건, 권한 제한, 액션 SHA 핀, CLI SHA256 검증 등 완화책도 있습니다. GitHub는 pull_request_target에서 신뢰되지 않은 PR 코드를 체크아웃·실행하면 높은 권한과 시크릿 노출 위험이 있다고 경고합니다. (GitHub) |
id-token: write가 실제 필요하지 않다면 제거. MCP/npm 도구는 해시 고정 또는 사전 빌드된 신뢰 컨테이너로 격리. AI 에이전트 실행 시 egress allowlist, 최소 권한 토큰, 비밀 없는 리뷰 모드, 환경 보호 규칙 적용. |
| AG-03 | 릴리스 의존성은 버전 핀은 있으나 해시 잠금은 보이지 않음 | 중간 | OWASP A03:2025, CICD-SEC-3 Dependency Chain Abuse, CICD-SEC-9 Artifact Integrity, CWE-494, CWE-829 | PyPI 배포 워크플로는 액션 SHA 핀과 PyPI OIDC 게시를 사용합니다. 그러나 requirements-release.txt는 build==1.5.0, twine==6.2.0처럼 버전 핀만 있고 --require-hashes 기반 무결성 고정은 보이지 않습니다. OWASP A03은 SBOM, 의존성 추적, 신뢰 가능한 소스, 서명 패키지, CI/CD 및 아티팩트 무결성 강화를 권고합니다. ([GitHub]7) |
릴리스 의존성에 pip install --require-hashes 적용. pip-compile --generate-hashes, OSV/pip-audit, SBOM 생성, Sigstore/attestation, 릴리스 환경 승인 규칙 추가. |
| AG-04 | 보안 범위·책임 있는 테스트 문서는 양호 | 낮음 / 긍정 | OWASP Testing Guide 관점의 승인 범위 관리, CWE-693 보안 메커니즘 관리 관점 | responsible-testing.md는 소유하거나 명시적으로 허가받은 앱만 테스트하고, 실제 사용자 데이터·파괴적 테스트·DoS를 금지합니다. scope-and-authorization.md도 명시적 서면 승인, 범위 정의, 금지 행위를 요구합니다. GitHub 보안 정책 페이지도 비공개 보고와 재현 정보 제출을 안내합니다. (GitHub) |
배포 패키지, README, CLI 도움말에도 “승인된 범위에서만 사용” 문구를 반복 노출하면 오남용 방지에 유리합니다. |
| AG-05 | 스캐너 구현에 일부 방어적 처리 확인 | 낮음 / 긍정 | CWE-22, CWE-78, CWE-59 관련 완화 | 초기화 경로에서 심볼릭 링크를 확인하고, 스캔 시 symlink·비정규 파일·대용량 파일을 건너뛰며, Trivy/CodeGraph 실행은 shell=True가 아닌 인자 배열 기반 subprocess.run 형태로 보입니다. ([GitHub]9) |
현재 방어 로직을 회귀 테스트로 고정. symlink, path traversal, command injection, oversized file 테스트 케이스 추가. |
AG-01 상세: 시크릿 로그 노출
위험
현재 구조에서는 예를 들어 .env 또는 설정 파일에 실제 Stripe/OpenAI/JWT/DB URL이 있을 때, 스캐너가 이를 탐지하면서 해당 라인을 Code: 출력에 포함할 수 있습니다. 보안 도구가 CI에서 실행되면 GitHub Actions 로그, PR 코멘트, 저장된 아티팩트, 외부 로그 수집기로 시크릿이 유출될 수 있습니다. secrets.yml은 여러 시크릿 패턴을 CRITICAL/HIGH로 정의하고 있고, 출력 함수는 매칭 라인 snippet을 보여주는 구조입니다. (GitHub)
권장 수정 방향
시크릿 탐지 룰은 “파일명, 라인 번호, 룰 ID, 심각도, 설명”만 출력하고, 매칭 값은 항상 숨기는 방식이 안전합니다.
예시 정책:
Before:
Code: STRIPE_SECRET_KEY=sk_live_xxxxxxxxx
After:
Code: STRIPE_SECRET_KEY=[REDACTED]
구현 방향은 다음과 같습니다.
SENSITIVE_RULE_TOKENS = (
"secret",
"password",
"token",
"jwt",
"database-url",
"db-url",
"stripe",
"openai",
"supabase-service-role",
)
def is_sensitive_rule(rule_id: str) -> bool:
lowered = rule_id.lower()
return any(token in lowered for token in SENSITIVE_RULE_TOKENS)
def safe_snippet(rule_id: str, snippet: str) -> str:
if is_sensitive_rule(rule_id):
return "[REDACTED: sensitive match suppressed]"
return snippet더 나은 방식은 “라인 전체 삭제”보다 매칭된 값만 마스킹하는 것입니다. 다만 첫 패치는 보수적으로 전체 snippet을 숨기는 편이 안전합니다.
검증 방법
승인된 로컬 테스트 디렉터리에서만 다음 성격의 테스트를 추가합니다.
mkdir -p /tmp/appguardrail-redaction-test
cat > /tmp/appguardrail-redaction-test/.env <<'EOF'
OPENAI_API_KEY=sk-test-redaction-example-not-real
JWT_SECRET=example-jwt-secret-not-real
EOF
appguardrail scan /tmp/appguardrail-redaction-test 2>&1 | tee /tmp/ag.out
# 실패 조건: 원문 시크릿이 출력에 포함됨
grep -E 'sk-test-redaction-example|example-jwt-secret' /tmp/ag.out && exit 1
# 성공 조건: 룰은 탐지되지만 값은 마스킹됨
grep -E 'REDACTED|sensitive match suppressed' /tmp/ag.outCI/CD 및 AI 리뷰 워크플로 평가
opencode-review.yml은 pull_request, pull_request_target, workflow_dispatch를 모두 다루며, same-repo 조건, 신뢰 워크플로 체크아웃, persist-credentials: false, OpenCode CLI SHA256 검증, 에이전트 권한 deny 설정 등 여러 완화책을 갖고 있습니다. 이 점은 긍정적입니다. ([GitHub]6)
다만 pull_request_target은 설계상 base repository 권한·시크릿 접근과 연결될 수 있어, PR head 코드를 실행하거나 그 입력이 명령 실행에 영향을 주면 위험이 커집니다. GitHub는 pull_request_target에서 신뢰되지 않은 코드를 체크아웃·실행하는 패턴을 특히 경고하며, GITHUB_TOKEN은 워크플로 내 액션이 접근할 수 있으므로 최소 권한으로 제한하라고 안내합니다. ([The GitHub Blog]10)
권장 우선순위는 다음과 같습니다.
| 우선순위 | 조치 |
|---|---|
| 1 | opencode-review-target의 id-token: write가 실제 OIDC 연동에 필요하지 않다면 제거. |
| 2 | npx -y @...로 런타임 설치되는 MCP 패키지를 해시 고정, lockfile 기반 설치, 사전 빌드된 컨테이너, 또는 내부 미러로 전환. |
| 3 | AI 에이전트 실행 작업에 egress 제한을 적용하고, 모델 토큰·GitHub 토큰이 프롬프트 또는 분석 대상 코드에 의해 간접 노출되지 않도록 별도 샌드박스 사용. |
| 4 | pull_request_target 경로에서는 PR head 코드를 “읽기 전용 분석 대상”으로만 다루고, 그 안의 스크립트·패키지 설치·빌드 명령은 실행하지 않는 정책을 문서화. |
| 5 | actionlint, CodeQL workflow analysis, OSSF Scorecard, dependency review를 CI 필수 검사로 추가. |
CVE 후보 확인
공개 파일에 보이는 직접 핀 기준의 제한적 확인입니다. 전체 전이 의존성, 실제 설치 환경, lockfile, SBOM이 없으므로 최종 판정은 아닙니다.
| 패키지 / 버전 | CVE / Advisory 후보 | 현재 판단 | 근거 |
|---|---|---|---|
google-cloud-aiplatform==1.133.0 |
CVE-2026-2473 / GHSA-wh2j-26j7-9728 | 해당 CVE 기준 영향 가능성 낮음. Advisory는 영향을 받는 범위를 >=1.21.0, <1.133.0, 수정 버전을 1.133.0으로 표시합니다. |
requirements-strix-ci.txt에 1.133.0이 고정되어 있고, OSV/GHSA 정보상 해당 버전은 수정 버전 경계입니다. ([GitHub]11) |
python-multipart==0.0.31 |
CVE-2026-53540 / GHSA-v9pg-7xvm-68hf | 해당 CVE 기준 영향 가능성 낮음. Advisory는 수정 버전을 0.0.31로 표시합니다. |
requirements-strix-ci.txt에 0.0.31이 고정되어 있고, OSV/GHSA 정보상 해당 버전은 수정 버전입니다. ([GitHub]11) |
build==1.5.0, twine==6.2.0 |
확인 필요 | 직접 파일 기준 버전 핀은 있으나, 해시 잠금과 전이 의존성 검증 자료는 보이지 않습니다. | 릴리스 요구사항 파일에는 두 패키지가 정확 버전으로만 고정되어 있습니다. ([GitHub]12) |
cryptography==49.0.0, strix-agent==1.0.4 |
확인 필요 | 공개 파일상 직접 핀은 확인되지만, 전체 SBOM 없이 CVE 영향 여부를 확정하기 어렵습니다. | requirements-strix-ci.txt에 직접 의존성으로 표시됩니다. ([GitHub]11) |
권고 조치 우선순위
| 순위 | 조치 | 기대 효과 |
|---|---|---|
| 1 | 네이티브 스캐너 시크릿 출력 마스킹 | CI 로그·PR 코멘트·터미널 기록을 통한 실제 시크릿 유출 방지 |
| 2 | 릴리스/CI 의존성 해시 잠금 및 SBOM 생성 | 패키지 공급망 변조, typosquatting, 레지스트리 변조 위험 감소 |
| 3 | pull_request_target 워크플로 권한 재검토 |
PR 기반 권한 상승, 토큰 노출, OIDC 오용 위험 감소 |
| 4 | AI 에이전트 실행 샌드박스 강화 | 프롬프트 인젝션, 도구 호출 오남용, 외부 유출 위험 감소 |
| 5 | 보안 회귀 테스트 추가 | symlink, command injection, secret redaction, oversized file 처리의 안정성 확보 |
개발자 티켓 초안
Ticket 1 — Secret scan output redaction
Severity: High
Type: CWE-532 / CWE-200
Affected area: scanner/cli/appguardrail.py, scanner/rules/secrets.yml
Description:
Native secret detection can print the matched source line as a finding snippet. If real credentials are present, scan output may expose them in terminal or CI logs.
Acceptance criteria:
- Secret-related findings never print the matched secret value.
- Default output shows file, line, rule ID, severity, and redacted snippet only.
- Unit tests confirm fake Stripe/OpenAI/JWT/DB URL values do not appear in stdout/stderr.
- Trivy secret suppression behavior and native scanner behavior are consistent.
Ticket 2 — Harden AI review workflow permissions
Severity: Medium
Type: CI/CD hardening, OWASP CICD-SEC-5 / CICD-SEC-6
Description:
Review workflows use privileged contexts and external runtime tools. Existing mitigations are present, but permissions and third-party package execution should be further minimized.
Acceptance criteria:
- Remove
id-token: writeunless an explicit OIDC trust relationship requires it. - Document why each permission is required.
- Replace runtime
npx -yinstalls with hash-locked or containerized tooling. - Add workflow linting and dependency review as required checks.
Ticket 3 — Hash-lock release dependencies and generate SBOM
Severity: Medium
Type: Supply chain hardening, OWASP A03:2025
Description:
Release workflow uses pinned versions for build tooling but does not appear to enforce hash-based dependency integrity.
Acceptance criteria:
requirements-release.txtis generated with hashes.- CI uses
pip install --require-hashes. - Release pipeline emits SBOM.
- Release job runs OSV or pip-audit against resolved dependencies.
- Published artifacts include provenance or attestations.
결론
이 리포지토리는 보안 목적의 도구답게 승인 범위 문서, 책임 있는 테스트 안내, CI 권한 제한, 액션 SHA 핀, PyPI OIDC 게시 등 긍정적인 통제가 이미 보입니다. 가장 먼저 고쳐야 할 부분은 시크릿 탐지 결과의 원문 출력 방지입니다. 그 다음은 AI/CI 워크플로의 권한·외부 도구·토큰 노출면 축소, 릴리스 의존성 무결성 강화, SBOM/CVE 자동 검증 순서가 적절합니다.
다음 단계는 승인된 범위에서 로컬 appguardrail scan, pip-audit, OSV-Scanner, SBOM 결과를 함께 대조해 CVE 후보를 확정하는 것입니다.
Activity
seonghobae commentedon Jun 29, 2026
재확인 결과 (2026-06-29)
현재
develop기준으로 이슈 내용을 다시 대조했습니다.scanner/cli/appguardrail.py에_SENSITIVE_RULE_TOKENS,_is_sensitive_rule(),_safe_snippet()가 있고, secret category 또는 secret-like rule id는[REDACTED: sensitive match suppressed]로 출력됩니다.tests/test_appguardrail.py에도 Stripe/OpenAI/JWT/DB URL 원문이 stdout/stderr에 나오지 않는 회귀 테스트가 있습니다.develop에는.github/workflows/opencode-review.yml이 없습니다. 해당 AI review workflow는 중앙.githubworkflow 계열 사안으로 보이며, 관련 중앙 PRContextualWisdomLab/.github#132는 이미 merge되어 있습니다. appguardrail 로컬 코드 이슈로 바로 닫기는 어렵습니다.requirements-release.txt는build==1.5.0,twine==6.2.0버전 핀만 있고, release workflows는pip install --require-hashes를 사용하지 않으며 SBOM artifact도 생성하지 않습니다.따라서 이 이슈는 전체 close 대상은 아니고, 남은 실질 작업은 release dependency hash locking + SBOM emission으로 좁혀서 별도 PR로 처리하는 것이 맞습니다.
seonghobae commentedon Oct 9, 2026
Regression linkage update: Draft #1424 at exact head
3a79d830a495bb87a7affedb9c09eb5506425786converts this incident class into the packaged HIGH/CWE-829 rulegithub-actions-runtime-package-without-integrity.The retained corpus covers direct
npx -y/--yesandnpm exec -y/--yesworkflow execution, with explicit FP/FN boundaries. The repository's reproduced CodeGraph path is repaired with a committed SHA-512 lock,npm ci --ignore-scripts, local binary execution, andCODEGRAPH_NO_DOWNLOAD=1. Local exact-tree verification is 1,101/1,101 plus focused 35/35; hosted exact-head jobs failed before any step materialized, so #1424 remains Draft/Proposed and unmerged.seonghobae commentedon Oct 9, 2026
Detector review repair and owner boundary
Draft detector PR #1424 is now at exact head
1a923ea9659462f95e6e8d333acb4186f6e6e80c, tree9143b1291b1cdb455bc6f48cda54e161d0faa011.Independent review rejected the predecessor's PR-owned lock/workflow repair as an untrusted bootstrap boundary and found three further detector-scope/coverage issues. All four Important findings were repaired through additive commits. The effective PR diff is now detector/test/docs only; the protected workflow remains exactly one positive HIGH regression incident.
Local exact-tree evidence is 1,103/1,103 full tests, 37/37 focused tests, and clean diff check. Hosted current-head jobs failed before steps materialized, so the PR remains Draft.
Central #532 repaired central internal use but did not release a reusable immutable consumer contract. That remaining canonical owner prerequisite is now tracked by ContextualWisdomLab/.github#2610. This issue must remain open until the owner contract is protected, released, and consumed; no leaf lockfile workaround or finding suppression is treated as completion.
seonghobae commentedon Oct 9, 2026
Final detector candidate
Draft #1424 is now exact
a0fab92ab9f854e641b2f7de46a3e39fea2562e3, tree0c7c7f5b0705ca9d5c30625ac0ebb5591a2c5513.Successive independent reviews converted the initial proximity regex into a deterministic step/run and heredoc-state analyzer. It now covers compact/expanded env mappings, intervening YAML comments, block-scalar blank lines, exact package-selector and variable boundaries, heredoc delimiter resumption, and exact-target executable-wrapper materialization. The retained protected workflow remains exactly one expected HIGH incident.
Evidence: 1,115/1,115 full tests, 69/69 GitHub Actions focused, Critical 0 / Important 0 final read-only review, clean diff check, and no protected workflow/package/lock/bootstrap change. Hosted current-head jobs still fail before steps materialize, so #1424 remains Draft.
The actual consumer repair remains open at canonical owner ContextualWisdomLab/.github#2610; this issue is not complete until that immutable release is consumed.