diff --git a/research/hypotheses/hyp-001.md b/research/hypotheses/hyp-001.md index 3387971f2..f1da832f0 100644 --- a/research/hypotheses/hyp-001.md +++ b/research/hypotheses/hyp-001.md @@ -4,6 +4,12 @@ title: "Transformer attention heads as structural correspondences (Q/K/V ↔ cel stage: candidate created: 2026-05-23 last_verified: 2026-05-23 +blocked_by: + - id: DLW-55-56-yanase-verification + description: "柳瀬訳 DLW 55/56 の直接照合が未完了" + blocks: promotion_to_verified + condition: "verified:true かつ confirmed_reference に昇格するまで" + note: "Web経由の原文取得全滅(403)。書架での実物確認のみ有効。" promotion_history: - date: 2026-05-23 from: exploration diff --git a/research_os/tasks/mechanism_mapping.py b/research_os/tasks/mechanism_mapping.py index 63ac0b754..78fc69c70 100644 --- a/research_os/tasks/mechanism_mapping.py +++ b/research_os/tasks/mechanism_mapping.py @@ -356,6 +356,25 @@ def run(hypothesis: dict, dry_run: bool = True) -> MechanismMappingResult: hypothesis, ) + # blocked_by フィールドが promotion_to_verified をブロックしている場合、 + # candidate への到達はできても verified への昇格は抑止する。 + # blocked_by: のみ(値なし)で None になる場合と非リスト型を防御する。 + blocked_by = hypothesis.get("blocked_by") or [] + if not isinstance(blocked_by, list): + blocked_by = [] + promotion_blockers = [ + b for b in blocked_by + if isinstance(b, dict) and b.get("blocks") == "promotion_to_verified" + ] + if promotion_blockers and promotion.get("to") not in ( + PromotionTarget.STAY_EXPLORATION.value, + PromotionTarget.REJECT.value, + ): + promotion["blocked_by"] = [b.get("id") for b in promotion_blockers if b.get("id")] + promotion["block_note"] = "; ".join( + b.get("description") or b.get("id") or "unknown" for b in promotion_blockers + ) + return MechanismMappingResult( status=status, dry_run=dry_run,