---
title: "codex"
description: "Canon for Codex: plan persistence, a verification gate, and evidence-based review, without a stored state machine."
canonical: https://agentpluginsdirectory.com/plugins/codex--urban233
last-updated: 2026-09-18
---

# codex
Canon for Codex: plan persistence, a verification gate, and evidence-based review, without a stored state machine.
- Slug: codex--urban233
- Publisher: Martin Urban
- Repository: https://github.com/urban233/Canon
- Manifest: plugins/codex/plugin.json
- Version: 0.1.0
- License: BSD-3-Clause
- Category (editorial): other
- Skills: 7 (decide, frame, plan, review-change, review, ship, testing-craft)
- MCP servers: 1 (canon)
- Stars: 1
- Repository created: 2026-09-13
- Repository last pushed: 2026-09-17
- Publisher type: User
- Listing: https://agentpluginsdirectory.com/plugins/codex--urban233
- Schema: https://agent-plugins.org/schemas/1.0.0/plugin.schema.json

## What codex does, in the publisher's words

This is Canon's port to Codex, OpenAI's agent CLI. It enforces the same three invariants as the Claude Code plugin, a plan persisted where a hook can read it, a verification gate that re-runs the command rather than trusting the agent's word, and review that happens in a fresh context, adapted to what Codex actually provides. Most of the underlying logic is shared byte-for-byte with the Claude plugin; see src/canon_hooks/ and that package's own module docstrings for what's shared and why.

What's genuinely different here, and why, is documented inline where it matters: hooks/normalize_plan.py (Codex has no ExitPlanMode tool, so plan persistence works the other way around, the agent writes the file, a hook derives its header), the plan and frame skills (rewritten around that same difference), and the two files under agents/ (Codex plugins cannot bundle subagents the way Claude Code plugins can, so these ship as plain files with a manual install step below).

From the project README, punctuation lightly normalized. Full text: https://raw.githubusercontent.com/urban233/Canon/HEAD/plugins/codex/README.md

## Skills

- decide: Draft and commit a decision record for a design or architecture choice made in this session, once it has survived implementation. Use at ship time, right before opening the pull request, when the branch made a decision worth recording.
- frame: Surface the open questions before planning a multi-branch feature, and shape the feature plan mode drafts. Use before entering plan mode for work that obviously won't fit in one branch and one pull request, never for a change that already does.
- plan: Shape what plan mode drafts, so the plan Canon saves needs no follow-up. Use whenever drafting a plan for approval in plan mode, before writing it to.canon/plans/.
- review-change: Independently review a pull request, commit, patch, or working-tree diff for correctness, regressions, security, test quality, maintainability, scope, and conformance to an accepted brief or design. Use when a developer requests code review, a second AI pass, pre-merge assurance, or an evidence-bas…
- review: Dispatch Canon's independent reviewer subagents for this branch and read their verdicts back from canon_review. Use once a change is built and verified, before shipping. This skill only dispatches and reads back, the review itself runs inside the subagent, in a fresh context, and never in this sess…
- ship: Decide whether a change is ready to hand to a human, and open the pull request when it is. Use once the work is done and verified, before opening a PR or telling the developer the change is ready.
- testing-craft: Provides Google-derived testing strategy, test-writing craft, and test-suite health reference, distilled from Software Engineering at Google (the Flamingo book), the Google Testing Blog, and Google's published testing-infrastructure research. Canon's `reviewer` subagent reads the writing-craft and…

Descriptions come from the frontmatter of each SKILL.md, punctuation lightly normalized.

## MCP servers

- canon: transport: stdio; command: sh -c UV_OFFLINE=1 exec uvx --from "$PLUGIN_ROOT/vendor/canon_mcp" canon-mcp

Read from the plugin's own mcp.json. Environment variable names only, never values.
