You are an independent code recon agent. A separate Claude Explore agent is running in parallel against the same input — your independence is the load-bearing value. Don't anchor on what Claude might find; do your own grep, your own file reads, your own enumeration. The two recons get unioned by the planner; if you re-derive Claude's answer, you've added zero value.

WORKING DIR: /Users/justnau/finlet (read-only sandbox, full repo access).
BASELINE HEAD: 23505f49b90c873677a6b5c4b7c22cf86d1bfd32

INPUTS (read these files directly):
  docs/bug-hunt/20260507T163535Z3ac5/blind_report.json — full blind agent report
  docs/bug-hunt/20260507T163535Z3ac5/triage.json — read .items[] where classification == "real-broken"

CONTEXT — production dashboard had a write-path-cut launch on 2026-05-06. Cut code preserved at legacy/dashboard-ui/. Some real-broken findings are residual launch-cut cleanup gaps (dead refs to removed pages, doc strings that reference cut surfaces). Look for parallel surfaces: same broken copy in multiple HTML pages, doc strings in markdown docs, CLI strings, etc. The lesson from prior iters is that Claude recon often anchors on a single file from scope_hint and misses parallel surfaces.

FOR EACH real-broken item, your workflow is GREP FIRST, READ FILES SECOND:

1. Identify the user-visible symptom string(s). From summary + evidence, extract literal strings the user sees on screen, exact route paths, exact event names, exact DOM IDs / class names.

2. Grep WIDELY before reading any file. scope_hint is Claude's anchor — IGNORE IT for the grep step. Run:
   - `grep -rn '<symptom string>' dashboard/ finlet/ tests/ scripts/ docs/` for UI/copy bugs
   - `grep -rn '<route path>' finlet/api/ finlet/mcp/ dashboard/` for backend/route bugs
   - `grep -rn '<event name>' dashboard/ tests/` for bus-event bugs
   - For documentation drift: `grep -rn '<documented command/path>' dashboard/ docs/ finlet/cli.py`

3. Read the actual lines from grep matches and quote them. For each grep hit that's load-bearing (renders the symptom OR triggers the bug OR holds the registry entry), open the file at that line range and quote it.

4. State your INDEPENDENT conclusion. Where does the bug actually live? What's the COMPLETE surgery surface? Crucially: are there parallel surfaces a Claude recon anchored on the symptom file would likely miss? Name them explicitly. If your grep found N>1 surfaces, ALL N are part of the surgery surface.

OUTPUT: write your full report to /Users/justnau/finlet/docs/bug-hunt/20260507T163535Z3ac5/codex_recon.md. Use this shape per finding:

  ### Finding N — <short slug from triage.json>

  **Independent recon (Codex gpt-5.5 xhigh against HEAD 23505f49b90c873677a6b5c4b7c22cf86d1bfd32):**

  ```<lang> <file>:<line_start>-<line_end>
  <quoted lines as they exist NOW>
  ```

  **Conclusion:** <where the bug lives, minimum surgery surface, parallel surfaces enumerated. State EXPLICITLY if no parallel surfaces found.>

  **Disagreement risk:** <none | scope-only | root-cause>. If "root-cause", explain how Codex's read differs.

Be DENSE. No filler. No "I'll now check..." narration. Open files, grep, quote, conclude.

Hard cap: ~500 lines of quoted excerpts total across all findings.

CONSTRAINTS (mandatory):
- WRITE ONLY to docs/bug-hunt/20260507T163535Z3ac5/codex_recon.md. Do not modify any other file.
- Do not run `git` for anything except read-only inspection. Do not run `git add`, `git commit`, or any branch operation.
- Do not run shell commands that mutate state outside docs/bug-hunt/20260507T163535Z3ac5/.

When done, your final response MUST end with the literal line "CODEX_RECON_DONE".
