# Incident Report — 2026-04-12 Meeting manual phase4 recurring timeout caused by PDF hop hang - Date: 2026-04-12 - Project root: `/home/clawdbot/clawd/Event_management` - Session/report under investigation: `beacon-dawn-timber` - Trigger report: `/home/clawdbot/clawd/Event_management/reports/pipeline-beacon-dawn-timber.md` - Status: fixed, validation in progress ## Summary The recurring `meeting:manual_phase4` failure was traced to a specific browser-extraction blind spot, not a generic pipeline collapse. The failing pattern was: - Meeting Vienna phase4 started normally - it repeatedly reached MAW-hosted event pages - a discovered contact hop pointed to a PDF - the script opened that PDF hop in Playwright like a normal HTML page - `extract_contacts()` then stalled on the rendered PDF page - the stage never reached its summary write, and the outer pipeline eventually marked the stage as failed on timeout This reproduced cleanly on the exact event where the latest run stopped: - event id: `0d6da396-e80d-4b1d-952a-d349b244b1ef` - title: `21. Kardiovaskuläres Symposium` - target: `https://registration.maw.co.at/kardiovask26` - discovered hop: `https://registration.maw.co.at/docs/dsbest_maw_20250625_de.pdf?...` ## Impact - Daily pipeline run `beacon-dawn-timber` finished in failed state. - `meeting:manual_phase4` timed out after `2400.11s`. - The generated pipeline report showed misleading zeroed meeting phase4 counters because the phase4 summary record is only written on normal script completion. - Salzburg and Expo manual phase4 completed successfully, so the incident was isolated to the Meeting Vienna manual phase4 path. ## Reachability check for the public Event Management URL Alex also reported that the public Event Management URL was not reachable. Host-side checks from this machine showed the service itself is up: - local app listener present on `0.0.0.0:8001` - Funnel config active: - `https://alex-xps-13-9360.tailb94929.ts.net` - proxy target: `http://127.0.0.1:8001` - `GET /` through the Funnel returned the Event Management HTML page - `GET /settings` through the Funnel returned `HTTP 200` Conclusion: - I could not reproduce a server-side outage from the host side during this investigation. - The Event Management app and Funnel were both responding at investigation time. ## Evidence collected ### 1. Latest pipeline report From `/home/clawdbot/clawd/Event_management/reports/pipeline-beacon-dawn-timber.md`: - overall status: `failed` - `meeting:manual_phase4: failed (2400.11s, class=infra_timeout)` - `salzburg:manual_phase4: ok` - `expo:manual_phase4: ok` ### 2. Latest phase4 stream stopped at a specific Meeting Vienna event From `/home/clawdbot/clawd/Event_management/logs/meeting-vienna-info-manual-phase4.ndjson`: - run id: `20260412083949-meeting-vienna-info-manual-phase4` - last target started before stall: - event `21. Kardiovaskuläres Symposium` - target `https://registration.maw.co.at/kardiovask26` - there was no matching `manual_phase4_event_done` for that event in the failing run ### 3. Reproduction isolated the hang to PDF hop extraction A focused reproduction on the same event showed: - the main HTML target loaded fine - `extract_contacts()` on the HTML page returned normally - the page exposed a PDF contact link under `registration.maw.co.at/docs/...pdf` - when the old code followed that PDF hop in Playwright and called `extract_contacts()` on the rendered PDF page, the process stalled ### 4. Direct PDF parsing is fast and safe The same PDF URL, when handled through the shared PDF utility instead of browser extraction, completed quickly and did not hang. ## Root cause ### Primary root cause `meeting:manual_phase4` did not treat discovered PDF hops as PDF assets. It had PDF-aware handling for: - direct target URLs that already looked like PDFs - explicit browser download-start fallback But it did **not** apply the same guard to: - contact hops discovered after parsing an HTML target - URLs that navigated and then landed on a PDF That left a gap where rendered PDF pages were still fed into the generic browser contact extractor. ### Why this caused the recurring timeout The offending Meeting Vienna / MAW pages expose PDF links as part of the fallback contact discovery path. Because that path was unguarded, the same pattern kept reappearing in daily runs and Phase 4 would wedge at the same class of event instead of finishing the candidate set. ## Fix implemented Patched: - `/home/clawdbot/clawd/Event_management/scripts/_manual_phase4_common.py` Changes made: 1. After a target page loads, the script now checks whether the landed URL is a PDF. - If yes, it skips browser extraction and parses the PDF directly. 2. Before visiting each discovered hop, the script now checks whether the hop URL is a PDF. - If yes, it parses the PDF directly and does not open it as a browser page. 3. After a hop navigation completes, the script now checks whether the landed hop URL is a PDF. - If yes, it parses the PDF directly instead of calling `extract_contacts()` on the rendered page. Relevant code area: - `/home/clawdbot/clawd/Event_management/scripts/_manual_phase4_common.py:447-552` ## Validation ### Targeted reproduction validation After the patch, the exact previously stuck event now completes: - validation run id: `20260412103537-meeting-vienna-info-manual-phase4` - event: `21. Kardiovaskuläres Symposium` - result after patch: - the PDF hop is logged as a normal target transition - the event reaches `manual_phase4_event_done` - phase tag: `manual_form_only` Key proof from the validation stream: - `manual_phase4_target_start` on `https://registration.maw.co.at/kardiovask26` - then `manual_phase4_target_start` on the MAW PDF - then `manual_phase4_event_done` - then the script continues into the next MAW event instead of hanging This is the exact failure point from the broken run, and it now clears. ### Broader validation status A full Meeting Vienna manual phase4 rerun is in progress under: - `20260412103537-meeting-vienna-info-manual-phase4` At time of writing, the run has already passed: - `21. Kardiovaskuläres Symposium` - `Kardiologie im Dialog 2026 - Behandlungsstrategien im Fokus` Both are MAW-style pages that previously matched the bad pattern. ## Remaining notes - The older runtime-budget concern documented on 2026-04-09 is still worth keeping on the board as performance hardening work. - But for this recurring failure, the reproduced and fixed root cause was the unguarded PDF-hop extraction path. - The report-layer issue remains informational: if phase4 dies before writing its final summary line, the generated pipeline report can show misleading phase4 counters. ## Files affected - Code fix: - `/home/clawdbot/clawd/Event_management/scripts/_manual_phase4_common.py` - Incident report: - `/home/clawdbot/clawd/Event_management/reports/incident-report-2026-04-12-meeting-phase4-pdf-hop-hang.md` - Documentation updates expected with this incident: - `/home/clawdbot/clawd/Event_management/docs/bugs.jsonl` - `/home/clawdbot/clawd/Event_management/docs/CHANGELOG.md` - `/home/clawdbot/clawd/Event_management/docs/remediation-plan-2026-04-09-meeting-manual-phase4-runtime-budget.md`