| 263 | |
| 264 | |
| 265 | def inspect_central_claims_plan(value: object) -> list[str]: |
| 266 | if value is None: |
| 267 | return [] |
| 268 | if not isinstance(value, list): |
| 269 | return ["planning_central_claims_invalid"] |
| 270 | |
| 271 | issues: list[str] = [] |
| 272 | required_fields = ( |
| 273 | "claim", |
| 274 | "supporting_evidence", |
| 275 | "what_it_actually_proves", |
| 276 | "what_it_does_not_prove", |
| 277 | ) |
| 278 | for item in value: |
| 279 | if not isinstance(item, dict): |
| 280 | if "planning_central_claims_invalid" not in issues: |
| 281 | issues.append("planning_central_claims_invalid") |
| 282 | continue |
| 283 | for field in required_fields: |
| 284 | field_value = item.get(field) |
| 285 | if field == "supporting_evidence": |
| 286 | if not isinstance(field_value, list) or not field_value: |
| 287 | code = "planning_central_claims_supporting_evidence_missing" |
| 288 | if code not in issues: |
| 289 | issues.append(code) |
| 290 | continue |
| 291 | if not isinstance(field_value, str) or not field_value.strip(): |
| 292 | code = f"planning_central_claims_{field}_missing" |
| 293 | if code not in issues: |
| 294 | issues.append(code) |
| 295 | return issues |
| 296 | |
| 297 | |
| 298 | def extract_headers(text: str) -> list[str]: |