Releases: avansaber/tailtest-codex
Release list
[4.9.1] -- 2026-05-26
Plugin icon for the Codex marketplace display.
- Added
assets/icon.svg(512x512, rounded-square tile with the tailtest shield + checkmark mark, emerald on near-black). Reads cleanly at marketplace tile sizes (32px, 64px, 128px). .codex-plugin/plugin.jsonnow references the icon viainterface.composerIcon = "./assets/icon.svg". Per the Codex plugin manifest spec; renders in the Codex app composer / marketplace browser.- No behavioral changes. 400 tests still passing.
Triggered by tailtest-codex#5 (thanks to @internet-dot for the report and the concrete instructions).
[4.9.0] -- 2026-05-19
PostToolUse migration. Per-edit feedback alongside the existing turn-end Stop sweep. 400 tests (was 380; +20 PostToolUse tests).
New hooks/post_tool_use.py:
- Fires after every file-mutating Codex tool call (
apply_patch,patch, plus shell-style tools via mtime fallback). - For
apply_patchpayloads, parses two envelope forms: standard unified diff (diff --git a/path b/path) and Codex's*** Update File: path/*** Add File: pathform. - For shell tools or unparseable patches, falls back to an mtime sweep since the last PostToolUse fire. This catches files written via redirection, build steps, etc.
- Applies the same intelligence filter as the Stop hook (
is_filtered,detect_language, runner-required gating). - Loop guard: files that appear in
generated_testsvalues are skipped, preventing infinite test loops when the agent writes a test file. - Honors the existing pause state and silently exits on inactive sessions.
- Output uses the
{"hookSpecificOutput": {"additionalContext": "..."}}envelope so the agent sees newly queued files mid-turn without the hook blocking the turn.
Stop hook unchanged in behavior: still sweeps mtimes at end of turn as a safety net, picking up anything PostToolUse missed. The mtime walker now lives in hooks/lib/scanner.py so both hooks share the same implementation; stop.py keeps a thin back-compat wrapper named sweep_changed_files so existing tests still pass.
hooks/hooks.json updated: now registers SessionStart + PostToolUse + Stop. The PostToolUse entry uses matcher: ".*" to fire on every tool. SessionStart matcher set to "startup" to match the documented Codex hooks spec.
User-visible UX change: Codex no longer waits until the turn boundary to surface queued files. As soon as apply_patch writes a file, the agent receives an additionalContext note listing it. Per-edit responsiveness matches the Claude Code variant.
Note on Codex codex exec mode: hooks fire only in interactive codex sessions; codex exec (non-interactive batch mode) does not load hook configuration as of Codex CLI 0.130.0. This is an upstream Codex limitation, not a tailtest issue. Manual validation in real interactive sessions remains the canonical smoke test.
[4.8.0] -- 2026-05-19
Codex CLI parity refresh against Codex 0.129.0+. Docs + plugin manifest + marketplace structure. No detection / rule / hook code changes; 380 tests still passing.
Docs cleanup (Phase A):
- README and
tailtest.com/docs/codexinstall sections no longer instruct users to set[features].codex_hooks = true. Hooks reached GA in Codex 0.129.0 (default-on); the legacy alias still works but emits a deprecation warning every session. Older-version subsection added that documents the post-deprecation[features].hooks = trueflag for users pinned to pre-0.129.0 releases. scripts/init.shfeature-flag check rewritten. Silent on current Codex defaults; emits a clean deprecation notice only when the user's~/.codex/config.tomlstill has the legacycodex_hookskey. Header comment updated to reference the new key.
Plugin manifest + marketplace structure (Phase B):
.codex-plugin/plugin.jsonupdated to current Codex spec form:hooksandskillsas string paths instead of object/array forms. Version bumped to 4.8.0. Addedinterfaceblock (displayName, descriptions, capabilities, defaultPrompt, brandColor) so the plugin renders properly in Codex's/pluginsbrowser and any marketplace listing.- New
.agents/plugins/marketplace.jsondeclares this repo as a single-plugin marketplace namedavansaber-tailtest. Users can now register the plugin in one command:codex plugin marketplace add avansaber/tailtest-codex. The existinggit clone+init.shflow continues to work unchanged. - Important honest framing: marketplace install replaces only the
git clonestep. Users still need to runinit.shper project for hooks to fire, because Codex'splugin_hooksfeature (which would auto-register plugin-bundled hooks) is still in development upstream. When that ships stable, init.sh will be retired. Until then, both install paths require the per-project init step.
Skills polish (Phase D):
- All 5 skill files in
skills/tailtest/got their frontmatter descriptions rewritten to the "When the agent needs to (1)... (2)... (3)..." pattern used by marketplace-quality plugins. This improves how the skills score in Codex's@-mention picker against natural-language user phrases. File bodies are unchanged.
[4.7.0] -- 2026-04-25
Adversarial test mode (V13). 380 tests.
New depth tier adversarial: alongside simple / standard / thorough, set "depth": "adversarial" in .tailtest/config.json to bias scenario generation toward adversarial categories. Generates 8-12 scenarios per file, nearly all probing breakage paths rather than confirming correctness.
New rule R15: every SCENARIO PLAN at standard or higher depth now includes a minimum count of adversarial scenarios labelled [adversarial: <category>]. Required count per depth: simple=0, standard >=2, thorough >=4, adversarial 8-12. Skip categories that genuinely do not apply (state which were skipped and why).
8 adversarial scenario categories: boundary inputs (MAX_INT, MIN_INT, empty, single-element, unicode, null bytes, malformed UTF-8), format / injection (path traversal, regex specials, shell metacharacters, SQL fragments), type confusion (wrong type passed), concurrent state (race conditions, shared mutable state), time / locale edges (DST, leap year, timezone shifts), error handling under partial failures (network mid-call fail, disk full, EINTR), resource exhaustion (very large input, deeply nested, many file descriptors), off-by-one logic (boundary indices, fence-post errors).
New skill verb tailtest-hunt <file>: forces an adversarial pass on a specific file regardless of project depth. Writes to a separate hunt test file (tests/test_<basename>_hunt.py etc.) so the hunt does not contaminate the main test suite. R12 classification applied to any failures.
Discovery context: V13 was developed after the V13 outreach pilot 2026-04-23, where stock tailtest produced 0 real bugs from 90 passing coverage tests across 6 repos but the same plugin produced 25 distinct real bugs once an adversarial prompt was added. V13 bakes that adversarial layer into the product so every user gets bug-hunting capability without writing custom prompts.
[4.0.0] -- 2026-04-18
Initial Codex CLI port. SessionStart hook for project orientation and AGENTS.md injection.
Stop hook with mtime-based file detection per agent turn. All 8 languages (Python,
TypeScript, JavaScript, Go, Rust, Ruby, PHP, Java). Codex skill files. 288 tests.