{"record":{"id":"7e912f5fe08bf423","repo":"HKUDS/DeepTutor","slug":"code-repair-attempt-attempt-1-timed-out-after","errorCode":null,"errorMessage":"Code repair attempt #{attempt + 1} timed out after {int(self.repair_timeout_seconds)}s.","messagePattern":"Code repair attempt #(.+?) timed out after (.+?)s\\.","errorType":"exception","errorClass":"ManimRenderError","httpStatus":null,"severity":"error","filePath":"deeptutor/agents/math_animator/retry_manager.py","lineNumber":116,"sourceCode":"                                    if review_result.suggested_fix\n                                    else \"\"\n                                )\n                            ),\n                        )\n                        retry_history.append(retry_attempt)\n                        if self.on_retry is not None:\n                            await self.on_retry(retry_attempt)\n                        if self.on_status is not None:\n                            await self.on_status(\n                                f\"Generating repaired code for retry #{attempt + 1} from visual review feedback.\"\n                            )\n                        try:\n                            repaired = await asyncio.wait_for(\n                                self.repair_callback(code, retry_attempt.error, attempt + 1),\n                                timeout=self.repair_timeout_seconds,\n                            )\n                        except asyncio.TimeoutError as timeout_exc:\n                            raise ManimRenderError(\n                                f\"Code repair attempt #{attempt + 1} timed out after \"\n                                f\"{int(self.repair_timeout_seconds)}s.\"\n                            ) from timeout_exc\n                        code = repaired.code.strip() or code\n                        if self.on_status is not None:\n                            await self.on_status(\n                                f\"Retry #{attempt + 1} code generated from visual review. Re-rendering now.\"\n                            )\n                        continue\n                render_result.retry_attempts = len(retry_history)\n                render_result.retry_history = retry_history\n                return code, render_result\n            except ManimRenderError as exc:\n                if _is_non_retriable_environment_error(str(exc)):\n                    raise ManimRenderError(\n                        \"Render failed because local LaTeX is missing. \"\n                        \"Please avoid Tex/MathTex in generated code or install a LaTeX distribution.\"\n                    ) from exc","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/agents/math_animator/retry_manager.py#L98-L134","documentation":"Raised by _parse_xml_member when DefusedElementTree.fromstring fails on an OOXML/EPUB XML member (ParseError or defusedxml exception). The member name and parse error are included; the exception is chained. This indicates malformed or unsafe XML inside an otherwise valid zip package.","triggerScenarios":"A DOCX/XLSX/PPTX/EPUB zip containing a member whose XML is truncated, invalid, or contains entity-expansion attacks (defusedxml rejects those explicitly).","commonSituations":"Half-written Office files from crashed saves; hand-edited OOXML; XXE/billion-laughs payloads aimed at XML parsers.","solutions":["Re-save the document from its native application to regenerate clean XML","If defusedxml rejected entity expansion, treat the file as untrusted and quarantine it","Skip the unparseable member: call the reader-of-member APIs that return None on KeyError-style absence instead of full-file abort"],"exampleFix":"// before\nroot = _parse_xml_member(zf, \"word/document.xml\", \"bad.docx\")  # raises\n\n// after\nfrom deeptutor.utils.document_extractor import CorruptDocumentError\ntry:\n    root = _parse_xml_member(zf, \"word/document.xml\", \"bad.docx\")\nexcept CorruptDocumentError:\n    root = None  # degrade gracefully, skip member","handlingStrategy":"try-catch","validationCode":"# pre-validate with a lenient parser is usually overkill; prefer member-level skip\npass","typeGuard":null,"tryCatchPattern":"from deeptutor.utils.document_extractor import CorruptDocumentError\nexcept CorruptDocumentError as e:\n    if \"failed to parse\" in str(e):\n        log.warning(\"skipping bad XML member\", error=e)\n        # continue extraction without that member","preventionTips":["Re-save documents from native apps to fix malformed XML","Treat defusedxml rejections as a sign of hostile content"],"tags":["xml","defusedxml","ooxml","epub","parse-error"],"backgroundTag":"xml-parse-error","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}