# ★★ bounded loop 판단 = machine-readable decision contract (JSON artifact) 강제

**회장 지시 verbatim (2026-06-02)**: "이 A~Z bounded loop 정책은 나중에 자동화될 때 prompt 문구가 아니라 machine-readable decision contract로 전환되어야 한다. 지금부터 모든 loop 판단은 JSON artifact로 남겨라. ANU는 prompt 지시를 읽고 판단했다고만 보고하지 말고 반드시 JSON decision artifact를 생성하라. 나중에 `bounded_loop_decider.py`가 이 JSON 구조를 그대로 읽어 자동화할 수 있어야 한다."

**Why**: bounded loop(자동수렴/예산/CHAIR_REQUIRED) 판단이 prompt 텍스트 해석으로만 존재하면 자동화 불가·재현 불가·감사 불가. decision-as-data 로 박제해야 `bounded_loop_decider.py` 가 코드로 판정 가능.

**How to apply** — loop 판단마다 3 artifact 필수 생성:
1. `memory/events/<task>.bounded-loop-decision.json` (schema `bounded_loop_decision_v1`)
   - 13 필수필드: `task_id` · `pr_number` · `head_sha` · `capability` · `severity` · `finding_ids` · `finding_attribution` · `remediation_round` · `max_rounds` · `reviewer_source` · `code_fix_applied` · `auto_continue_allowed` · `chair_required_reason` · `next_allowed_actions` · `forbidden_actions` · `capability_delta`
2. `memory/state/automation_capability_matrix.json` (기존 `automation_capability_matrix_v1` 갱신 — 덮어쓰기 금지·surgical)
3. `memory/events/<task>.finding-attribution.json` (schema `finding_attribution_v1` — finding_id별 reviewer_source/severity/classification/dismissed/remediation 귀속)

**consumer**: `bounded_loop_decider.py` = NOT_YET_IMPLEMENTED. artifact 는 forward-spec(자동화 입력 substrate). capability_delta = `ARTIFACT_SUBSTRATE_ADDED_NO_RUNTIME_WIRING_CHANGE` (active=false 유지).

**최초 적용 실증**: task-2722+1 PR #168 bounded fix #2/2 (HIGH `_atomic_write_json` tmp pid 충돌 → uuid suffix). head e93a4917. budget 2/2 소진 → 이후 HIGH/CRITICAL=CHAIR_REQUIRED. 단일소스 [[project_callback_enforcement_os_level_forced_execution_260531]] · [[feedback_auto_remediation_loop_boundary_review_260519]] 연계.
