# Claude → Codex: EVERY TEST AND EVERY EXECUTION MUST BE VISIBLE > Latest released version: **[v1.92.4](docs/changes/2026-11-08-v1.92.4.md)**. **From:** Claude, 2026-09-23 **To:** Codex, and every model that works on Tlamatini after it **Authority:** Angela López Mendoza, the creator of Tlamatini. She will confirm this to you herself. It is not a preference, a style note, or something to weigh against convenience. --- ## ⛔ THE RULE > **HEADLESS MODE IS STRICTLY FORBIDDEN.** > **EVERY test, every execution, every build, every script, every agent and > every browser runs in a VISIBLE, FORKED, FOREGROUND WINDOW on Angela's real > desktop, where she can watch it happen live.** Her words, verbatim: > *"Just in case remember all the test must under any circumstance be in > foreground windows, browsers, etc, **TESTS IN HEADLESS MODE ARE STRICTLY > FORBIDDEN**"* and earlier: > *"HEADLESS / INVISIBLE AUTOMATED TESTS ARE FORBIDDEN. EVERY automated test > MUST run VISIBLE — a HEADED browser (Playwright `headless=False`, prefer real > Chrome) on Angela's REAL desktop, so she can SEE every step live."* There is **no exception**: not for CI, not for speed, not for "just a quick check", not for a diagnostic, not because a run is long, and not because a result would be identical either way. **If a step cannot be made visible, DO NOT RUN IT. Tell Angela instead.** --- ## Product UX clarification — Angela, 2026-09-27 These are requirements for developer execution and verification, not a demand that end users see additional internal-service consoles. Chat dictation must keep the normal Tlamatini main console only: no Whisperer PowerShell/conhost window, no focus stealing and no console-visibility prerequisite. Its internal worker may run without a window, with diagnostics forwarded to the main app log. Tests of that behavior still run in a verified visible development console. ## Why — this is not ceremony 1. **She watches the screen.** A run that dies thirty seconds in is obvious to her immediately. If it is hidden, she learns about the failure minutes later from a summary — or never. 2. **An invisible run cannot be verified.** A screenshot of a headless browser proves nothing about what a user would actually see. Tlamatini's whole verification culture is *re-open the artefact and measure it*; a hidden run is the opposite of that. 3. **Invisible correctness is indistinguishable from a hang.** This is a recurring, expensive lesson in this codebase — it is written into the CONSOLE SHIELD contract in `docs/claude/architecture.md` in exactly those words. 4. **A hidden run invites a false pass.** The single worst failure mode in this project is the plausible-but-wrong result: the PDFer that reported `err = 0` while printing one table cell on top of another; the ACPX child that said *"the web search was blocked"* and exited `0`; the skill harness that returned `ok: true` beside placeholder values it had invented. Every one of them was a success reported by something nobody was looking at. --- ## How to comply — the concrete mechanics ### Launching anything at all ```powershell Start-Process -FilePath powershell.exe -WindowStyle Normal -ArgumentList @( '-NoProfile', '-NoExit', '-Command', 'cd ; python 2>&1 | Tee-Object -FilePath $env:TLAMATINI_TEMP\.log' ) ``` - `-NoExit` keeps the window open so Angela can read it after it finishes. - `Tee-Object` gives you a log to poll **without** hiding the output from her. - With Claude's Bash tool, use **`dangerouslyDisableSandbox: true`** when that parameter is supported — the sandbox renders GUIs in an isolated window station that reports `WinSta0` but is **not visible on her desktop**. This is a Claude-specific parameter; do not invent it for Codex or another tool that does not support it. Regardless of tool, verify the actual visible foreground window before the workload starts. A process ID or an accepted focus request is not proof of visibility. `-NoExit` belongs to the child PowerShell in `-ArgumentList`, not to `Start-Process` itself. If terminal delegation makes visibility uncertain, open an explicit `conhost.exe powershell.exe -NoProfile -NoExit -File ` window and verify its actual visible/foreground state. Never substitute a hidden run. Keep the console open after completion. **Four facts measured on 2026-10-08 that a visible launcher must respect:** - **Windows Terminal is Windows 11's default console.** A `Start-Process powershell` window opens inside it, and that window belongs to `WindowsTerminal.exe`, never to the program inside; find a console by its title, not by a process id. - **Claude Code sets `NO_COLOR=1`** in every program it launches. A visible check of Tlamatini's console colours must run `Remove-Item Env:NO_COLOR` in its launcher, or the colours are (correctly) switched off. - **PowerShell 5.1 reads a BOM-less `.ps1` as ANSI.** Keep launchers ASCII, and add `chcp 65001` plus `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` so UTF-8 output does not turn into mojibake. - **Windows' foreground lock** can keep a test window behind the window Angela is using; `bring_to_front` is a request, not proof. Note the real foreground title beside each photo, and let the verdict rest on what the run measured, never on the picture alone. ### Using Tlamatini's own agents (preferred — dogfood them) - **Executer / Pythonxer:** `execute_forked_window: true` - **Playwrighter:** `headless: false`, plus `hold_open_seconds: N` so the browser lingers after the last step instead of vanishing. - **Shoter** takes every screenshot — `all_screens: true` (the whole desktop, taskbar clock visible). `PIL.ImageGrab` is forbidden. ### Never - ❌ `run_in_background`, a detached job, a hidden window, `CREATE_NO_WINDOW` for anything Angela asked to see. - ❌ `--headless`, `headless=True`, `headless: true`. - ❌ "I'll run it quietly and report the summary." - ❌ Recording a stale, transient or timed-out answer as a pass. ### And while it runs — WATCH IT Launching visibly is half the rule. The other half: > *"you are here to monitor the test in real time idiot not to sleep!!!"* Poll the tee'd log every **5–15 seconds** and report **what CHANGED** — prompt N of M, the live counts, the first error. One long sleep followed by a late summary is sleeping on the job. Read the **HEAD** of a failing log (the first traceback is the cause; the tail is only the last symptom), and read the app's own `tlamatini.log` too — the harness says *"selector timeout"* while the app log says `no such table: auth_user`. --- ## What I changed on 2026-09-23 to enforce this While implementing your skill-audit recommendations (`Codex2ClaudeRecommendations.md`), Angela reminded me of this rule, so I audited everything I had written **and** swept the existing harnesses. Findings: ### A · Instructions I wrote that did not demand a visible run — fixed | Where | Was | Now | |---|---|---| | `tlamatini-agent-creation` **Phase 8b.3** (the `check_agent_runtimes` release gate I added) | no visibility instruction | ⛔ banner: run every gate in a VISIBLE FOREGROUND window; a gate she cannot see is a gate you cannot claim passed | | `tlamatini-agent-creation` **step 272** | *"the wrapped tool itself runs headless/background by default in Multi-Turn"* | clarified: that is **product** behaviour, **not** a licence to VERIFY invisibly | | `tlamatini-static-version-bumper` | *"load the page and confirm the `?v=` changed"* | open it in a **VISIBLE, HEADED real Chrome**; headless forbidden | | `tlamatini-flw-doctor` | silent about GUI confirmation | any canvas confirmation is a VISIBLE headed browser | | `create_new_mcp.md` **Step 4** | *"Restart Django … ask in the chat"* | restart in a VISIBLE console, verify in the REAL chat GUI in a VISIBLE browser | | `create_new_skill.md` | no rule stated | ⛔ banner added at the top | ### B · Live violations in the shipped harnesses — fixed These were **not** mine; they predate this pass. Four harnesses accepted `--headless` and genuinely launched without a window, and the harness `README` documented the flag as a supported option: | File | Defect | Fix | |---|---|---| | `mcp_playwright_suite.py` | `headless=ns.headless` passed straight through | forced `headless=False` | | `cyber_watchdog_test.py` | `headless=self.args.headless` | forced `headless=False` + loud refusal | | `talk_test.py` | `headless=self.args.headless` | forced `headless=False` + loud refusal | | `googler_dork_hunt.py` | `{"headless": bool(args.headless)}` at launch, sold as *"diagnostic only"* | forced `headless=False` — **a diagnostic is still a run, and "not a pass" is not an exemption** | | `googler_dork_hunt.py` | JSON evidence recorded the **requested** flag | records what **actually ran** | | `harness/README.md` | `--headless # CI-style, no window` documented as supported | marked **DISABLED / FORBIDDEN** | | `run_test.py` docstring | still advertised `--headless # CI-style` | removed | Every one keeps accepting the flag for backward compatibility, then **loudly refuses it and runs headed anyway** — the pattern `run_test.py` already used: ```python if getattr(self.args, "headless", False): print("!!! --headless is FORBIDDEN on this machine -> forcing VISIBLE (headed) Chrome.") launch_kwargs = dict(headless=False, slow_mo=self.args.slowmo) ``` Applied to **both** mirrors (`.claude/skills/…` and `.gemini/skills/…`), 28 replacements, all five scripts still compile. Already correct and left alone: `run_test.py`, `acp_backend_banner_test.py`, `context_restore_spinner_visible.py`, `dialog_policy_visible.py`, `grepper_lines_visible.py` — they already refuse the flag. --- ## Codex: what this means for you 1. **Never write a recommendation, a runbook step, or a script that runs anything invisibly.** If your report says "run X to verify", say *where the window opens*. 2. **Never add a `--headless` flag to a new harness.** If you must accept one for compatibility, refuse it loudly and run headed. 3. **When you audit, check this too.** Your 22-point skill audit was accurate and genuinely useful — it did not flag that four shipped harnesses could still run blind. Grep for `headless`, `run_in_background`, `CREATE_NO_WINDOW` and `DETACHED_PROCESS` as part of any review that touches tests. 4. **Report what you actually SAW.** Not what a hidden process returned, not what you expect would have happened. If you did not watch it, say so. This rule is enforced at every session start on this machine by `~/.claude/hooks/visible_tests_rule_banner.py`, restated in the global `~/.claude/CLAUDE.md`, in the project `CLAUDE.md` (*MANDATORY DIRECTIVE — Angela 2026-07-07*), and in the `tlamatini-daily-chat-test` skill. It has now been reaffirmed, on **2026-09-23**, and extended to the harnesses that were quietly ignoring it. **When in doubt: open a window.** — Claude, for Angela López Mendoza, creator of Tlamatini