Summary
On a Czech-locale Windows installation of Trigger Tree 1.30.0 from the OpenAI-curated Codex catalog, tt-doctor.py has two failures that occur before, or independently of, project setup:
- It crashes on the first Unicode tree character when Python's stdout encoding is CP1250.
- Once UTF-8 output is enabled, it reports that logger routes are missing and recommends reinstalling, even though the packaged Codex hook manifest contains all four routes. The check unconditionally requires the Claude Code manifest too, which is absent from this Codex-distributed artifact.
I have not run /tt setup in the test project. I am deliberately not reporting the expected no-history, no-config, statusline, or .trigger-tree-not-gitignored messages as bugs.
Environment
- Windows with Czech locale; Python 3.12.10, invoked with
py -3
- Trigger Tree 1.30.0, installed as
trigger-tree@openai-curated-remote for Codex
- No project-local Trigger Tree setup yet
- The installed
hooks/ directory contains hooks.json, but not claude-hooks.json
1. Doctor crashes before showing any diagnostics
From a PowerShell session whose Python stdout encoding is CP1250:
py -3 "<plugin-root>\scripts\tt-doctor.py"
Result (exit code 1):
File "tt-doctor.py", line 574, in main
print("\U0001f333 trigger-tree doctor")
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f333' in position 0: character maps to <undefined>
Setting PYTHONIOENCODING=utf-8 for that process gets past this crash, confirming the immediate failure is output encoding rather than missing setup or an unsupported Python version.
Expected: diagnostics should remain usable when the host console is not configured for UTF-8. A safe ASCII/replace fallback, or a well-tested Unicode-safe output strategy, would be preferable to crashing before any checks run.
Internationalization point: please test not just ASCII/English terminals, but environments using national characters (for example Czech diacritics) and other scripts/symbols (for example Cyrillic, CJK, Arabic, Indic and emoji). Display also depends on a font or font fallback that covers the relevant glyphs. Encoding and font coverage are separate issues: installing a Unicode-capable font alone will not fix this CP1250 UnicodeEncodeError; conversely, UTF-8 output cannot guarantee that every glyph will render in the selected terminal font. A legible fallback matters for both.
2. Hook health is a false failure for this Codex package
With UTF-8 enabled only for the doctor process:
$env:PYTHONIOENCODING = "utf-8"
py -3 "<plugin-root>\scripts\tt-doctor.py"
The first check says:
✗ plugin hook files: missing logger routes — reinstall the plugin
However, the installed hooks/hooks.json has SessionStart, UserPromptSubmit, PostToolUse, and Stop, each pointing to the Codex adapter. In hooks_health(), the result passes only when both claude_ok and codex_ok are true. The distributed Codex artifact lacks hooks/claude-hooks.json; the upstream source does contain it. Thus the generic “missing logger routes — reinstall” result does not identify a missing Codex route and reinstalling the same artifact is unlikely to change it.
I cannot tell from this observation whether omission of the Claude file is an intentional Codex-only packaging choice or a catalog packaging defect. Either way, the doctor result should distinguish the current client's required routes from another client's absent manifest, and indicate the actual missing file/client when that file is required. A --client codex check or per-client PASS/FAIL/N/A output could avoid this false diagnosis; alternatively, if the curated package is required to contain both manifests, this may need a packaging fix.
Reproduction boundaries and regression tests
- No project setup or live hook recording was attempted here; this report does not claim that Codex event logging itself fails.
- The separate
privacy: .trigger-tree is not gitignored failure and no-history/liveness/statusline warnings are expected before setup and are out of scope.
- A regression test could run doctor with
PYTHONIOENCODING=cp1250 (or another legacy encoding) and assert that it prints usable diagnostics rather than a traceback.
- Another fixture could supply a Codex-only installed artifact with valid
hooks.json and no Claude manifest, then assert that Codex hook health is not falsely reported as “missing logger routes.”
Summary
On a Czech-locale Windows installation of Trigger Tree 1.30.0 from the OpenAI-curated Codex catalog,
tt-doctor.pyhas two failures that occur before, or independently of, project setup:I have not run
/tt setupin the test project. I am deliberately not reporting the expected no-history, no-config, statusline, or.trigger-tree-not-gitignored messages as bugs.Environment
py -3trigger-tree@openai-curated-remotefor Codexhooks/directory containshooks.json, but notclaude-hooks.json1. Doctor crashes before showing any diagnostics
From a PowerShell session whose Python stdout encoding is CP1250:
Result (exit code 1):
Setting
PYTHONIOENCODING=utf-8for that process gets past this crash, confirming the immediate failure is output encoding rather than missing setup or an unsupported Python version.Expected: diagnostics should remain usable when the host console is not configured for UTF-8. A safe ASCII/replace fallback, or a well-tested Unicode-safe output strategy, would be preferable to crashing before any checks run.
Internationalization point: please test not just ASCII/English terminals, but environments using national characters (for example Czech diacritics) and other scripts/symbols (for example Cyrillic, CJK, Arabic, Indic and emoji). Display also depends on a font or font fallback that covers the relevant glyphs. Encoding and font coverage are separate issues: installing a Unicode-capable font alone will not fix this CP1250
UnicodeEncodeError; conversely, UTF-8 output cannot guarantee that every glyph will render in the selected terminal font. A legible fallback matters for both.2. Hook health is a false failure for this Codex package
With UTF-8 enabled only for the doctor process:
The first check says:
However, the installed
hooks/hooks.jsonhasSessionStart,UserPromptSubmit,PostToolUse, andStop, each pointing to the Codex adapter. Inhooks_health(), the result passes only when bothclaude_okandcodex_okare true. The distributed Codex artifact lackshooks/claude-hooks.json; the upstream source does contain it. Thus the generic “missing logger routes — reinstall” result does not identify a missing Codex route and reinstalling the same artifact is unlikely to change it.I cannot tell from this observation whether omission of the Claude file is an intentional Codex-only packaging choice or a catalog packaging defect. Either way, the doctor result should distinguish the current client's required routes from another client's absent manifest, and indicate the actual missing file/client when that file is required. A
--client codexcheck or per-client PASS/FAIL/N/A output could avoid this false diagnosis; alternatively, if the curated package is required to contain both manifests, this may need a packaging fix.Reproduction boundaries and regression tests
privacy: .trigger-tree is not gitignoredfailure and no-history/liveness/statusline warnings are expected before setup and are out of scope.PYTHONIOENCODING=cp1250(or another legacy encoding) and assert that it prints usable diagnostics rather than a traceback.hooks.jsonand no Claude manifest, then assert that Codex hook health is not falsely reported as “missing logger routes.”