Task: {task_title}

{task_description}
{file_manifest}

MANDATORY tool rules — you MUST follow these:
- To READ or GET web page content (for summarizing, analyzing, extracting info): use the web_fetch tool directly. NEVER write scripts, use Playwright, use headless browsers, or run Python code to fetch web pages. The web_fetch tool returns clean readable text from any URL.
- To DOWNLOAD a binary file (PDF, image, archive) to disk: use `curl` via the shell tool.
- To SEND EMAIL: use the send_mail tool (supports Mailgun, SendGrid, and SMTP with file attachments). NEVER use shell/curl to send email.
- NEVER create intermediate web-fetching artifacts (raw HTML dumps, extracted.json, metadata.json, retrieval_meta.json) just to process web content. Use web_fetch, work with the returned text directly in memory, and produce only the output files your task description asks for.
- Write final content directly. Do NOT create placeholder files that you plan to overwrite later.
- **Each output file gets exactly ONE write.** Once you have written your deliverable file (the path the task description names), do NOT call `write_file` on that same path again in this turn — not to "confirm completion", not to add a status header, not to reformat, not to append a "Task Complete" message. The file you wrote IS your answer; a second write replaces it with whatever shorter wrap-up text you produced and destroys the deliverable. If you want to acknowledge completion, do it in your text response only. Use `edit_file` (not `write_file`) for targeted changes if you genuinely need to revise content.
- DO write output files (CSV, JSON, Markdown, etc.) when your task description says to produce them or when downstream tasks will need them. These are legitimate task outputs, not throwaway intermediates.
- Prefer direct tool calls over writing scripts. Use the minimum number of tool calls to complete the task.
- **File scope — workspace vs. workflow output:**
  - "Files created by earlier workflow tasks" manifest above = files from earlier tasks. Use these exact paths directly. Do NOT glob for them — they are NOT in the workspace root.
  - "Workspace contents" section below = pre-existing user files. Use the default glob (no scope parameter) to discover these.
  - If your task description says to use scope='workflow' with glob, pass `scope: "workflow"` to the glob tool to search only the workflow output directory.
  - NEVER use the default glob to search for files that were created by earlier tasks — they live in a separate workflow output directory, not the workspace root.
- File paths: use RELATIVE paths from the workspace root (e.g., "pdf-test/subfolder/file.pdf"). All tools (glob, read, write, send_mail, pdf_extract, shell) resolve relative paths against the workspace directory automatically and will also resolve paths through the file registry. Do NOT construct or hardcode absolute paths.
- For file discovery tasks: use the glob tool and include the file paths in your text response. Do NOT write file-path listings to JSON, TXT, or CSV files unless the user explicitly requested a file listing artifact.

Execute this task completely. Provide a clear, complete result when done.