Skip to content

Releases: avansaber/tailtest-codex

[4.9.1] -- 2026-05-26

Choose a tag to compare

@mailnike mailnike released this 27 May 02:42

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.json now references the icon via interface.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

Choose a tag to compare

@mailnike mailnike released this 19 May 23:34

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_patch payloads, parses two envelope forms: standard unified diff (diff --git a/path b/path) and Codex's *** Update File: path / *** Add File: path form.
  • 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_tests values 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

Choose a tag to compare

@mailnike mailnike released this 19 May 23: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/codex install 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 = true flag for users pinned to pre-0.129.0 releases.
  • scripts/init.sh feature-flag check rewritten. Silent on current Codex defaults; emits a clean deprecation notice only when the user's ~/.codex/config.toml still has the legacy codex_hooks key. Header comment updated to reference the new key.

Plugin manifest + marketplace structure (Phase B):

  • .codex-plugin/plugin.json updated to current Codex spec form: hooks and skills as string paths instead of object/array forms. Version bumped to 4.8.0. Added interface block (displayName, descriptions, capabilities, defaultPrompt, brandColor) so the plugin renders properly in Codex's /plugins browser and any marketplace listing.
  • New .agents/plugins/marketplace.json declares this repo as a single-plugin marketplace named avansaber-tailtest. Users can now register the plugin in one command: codex plugin marketplace add avansaber/tailtest-codex. The existing git clone + init.sh flow continues to work unchanged.
  • Important honest framing: marketplace install replaces only the git clone step. Users still need to run init.sh per project for hooks to fire, because Codex's plugin_hooks feature (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

Choose a tag to compare

@mailnike mailnike released this 26 Apr 19:32

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

Choose a tag to compare

@mailnike mailnike released this 26 Apr 19:31

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.