Skip to content

Security: mzored/SkipHow

SECURITY.md

Security policy

Supported versions

Version Supported
4.4.x Yes
4.3.x, 4.2.x, 4.1.x, and 4.0.x No; upgrade to 4.4.x without changing existing authorization
3.0.x and earlier No

Security review covers the packaged owner skill, its linked playbooks, host manifests, marketplace metadata, release checks, and documented authority boundaries. Codex, Claude Code, GitHub, Git, operating systems, and third-party services keep their own security policies.

Package validation, 2026-09-06

Version 4.4.0 is validated per capability in evals/host-smoke.json; Claude Code 2.1.263 clean install and uninstall carry one receipt on the exact 4.4.0 package in evals/receipts/host-validation-440-20260906/, and every other row is UNVERIFIED until a receipt made on 4.4.0 is recorded. The 4.3.0 receipts, Claude Code 2.1.263 clean install and uninstall and Codex CLI 0.153.0 clean install from the approved Git source and uninstall, remain in evals/receipts/host-validation-430-20260906/ and at the immutable 4.3.0 ledger, and the 4.2.0 receipts, including persistent setup, explicit fallback, and playbook load, remain at their immutable source. The dated support summary states what each host has shown for each package it names. The previous 4.1.1 receipts remain in evals/receipts/host-validation-411-20260905/; the September 5 isolated Codex diagnostics remain 4.1.0 observations, and the September 6 diagnostics are separate 4.2.0 observations.

The historical 4.1.0 candidate passed both host schema validators. Claude Code 2.1.261 installed all fifteen regular files byte for byte and uninstalled them in a clean host configuration. Codex CLI 0.153.0 clean installation remains UNVERIFIED because managed marketplace-source policy refused the local source. The candidate receipts and per-capability matrix retain the exact package identity and scope. Clean installation does not establish model loading.

An isolated Codex profile authenticated natively on 2026-09-05; an isolated Claude Code profile still cannot. Ordinary-language loading, delivery to a synthetic remote, and native resume were observed once each on the exact 4.1.0 package in the isolated Codex diagnostics; nothing comparable exists for Claude Code, and no activation mode has a measured reliability on either host. Claude's documented plugin subagents ignore permissionMode; a declared field alone must not be described as an enforced read-only boundary. Actual tool restrictions and workspace identity need their own evidence. See Claude subagents.

Host support, as of 2026-09-06

Host behavior changes. Each row below is only as current as its verification date, and each row cites the first-party page it was read from. Check that page again before relying on the row.

Only capabilities on which shipped rules depend are tracked: skill loading, persistent instruction loading, per-agent read-only controls, worktree isolation, plugin validation, and clean installation. This is not a host feature database.

The rows are separate claims and must not be read as one. Schema validation shows that a host accepts the package's shape; it never establishes that the host activates the skill, that persistent instructions select it, that a delegate is isolated, or how a model behaves once the text reaches it. A PASS is a run that happened on the named host version; a documentation-only row is UNVERIFIED however clearly the page describes the feature.

Three evidence scopes stay separate. evals/host-smoke.json is the candidate ledger for external host receipts tied to exact package bytes and a committed package tree. A release's generated matrix reports only what its release runner performed. Model activation and behavior belong in docs/evidence.md with their session receipts. A skipped release-runner row does not erase an external candidate receipt, and a successful install does not imply activation.

Tested host versions, where a run exists, are Claude Code 2.1.259 for schema validation, Claude Code 2.1.260 for clean installation, and Codex CLI 0.153.0. These are the versions the host commands reported on 2026-09-04, not a tested range.

Where a row cites developers.openai.com, that address redirected on 2026-09-04 to a page under learn.chatgpt.com; the redirect target is the page actually read.

Claude Code

Capability What the source says Source Verified Tested version Status
Skill loading Plugin skills are discovered at <plugin>/skills/<name>/SKILL.md and namespaced /<plugin>:<skill>. The description sits in context and the body loads on invocation; description plus when_to_use is truncated at 1,536 characters in the listing. Both explicit /name and automatic invocation are available unless disable-model-invocation or user-invocable restricts them. Skills 2026-09-04 2.1.260 PASS for explicit invocation of exact 4.0.1 in the retained pilots; automatic selection remains UNVERIFIED and did not occur in one bare-prompt pilot
Persistent instruction loading User CLAUDE.md and rules/*.md in the configuration directory apply to every project and load before project instructions; CLAUDE_CONFIG_DIR relocates that directory; managed policy CLAUDE.md loads first and cannot be excluded. The packaged helper writes its owned block to that CLAUDE.md, treats an unconditional rule as read, consolidates duplicate copies it can edit, and never writes through a symbolic link. The page says the file is context, not enforcement. Memory 2026-09-06 none UNVERIFIED (documented loading; the isolated Claude profile still cannot authenticate, so no persistent-setup run exists)
Per-agent read-only controls Subagent frontmatter takes a tools allowlist, disallowedTools, and permissionMode, whose values include plan for read-only exploration. permissionMode is ignored for plugin subagents and overridden by a parent in bypass, accept-edits, or auto mode, so only a tools allowlist checked to have applied is a read-only boundary. Subagents 2026-09-06 none UNVERIFIED (documented)
Worktree isolation isolation: worktree runs a subagent in a temporary git worktree. Subagents 2026-09-04 none UNVERIFIED (documented)
Plugin validation Manifest .claude-plugin/plugin.json; claude plugin validate <path> validates it and --strict treats warnings as errors. Plugins 2026-09-04 2.1.259 PASS (scripts/check_hosts.py, 2026-09-04)
Clean installation claude plugin marketplace add, claude plugin install --scope user, claude plugin uninstall --scope user; CLAUDE_CONFIG_DIR points the host at a scratch home. Discover plugins, Skills 2026-09-06 2.1.263 PASS (scripts/check_hosts.py --smoke: clean home, install, 17 regular files matching exact 4.4.0 payload 5163a3c6…, uninstall verified; ledger)

Codex CLI

Capability What the source says Source Verified Tested version Status
Skill loading Skills are discovered from .agents/skills in the current, parent, and repository-root directories, the user-level .agents/skills directory in the home directory, /etc/codex/skills, and system skills. Progressive disclosure lists name and description within 2 per cent of the context window, or 8,000 characters where that is unknown; the full file loads on selection. Explicit $skill invocation and implicit invocation are both available; allow_implicit_invocation in agents/openai.yaml defaults to true. Skills 2026-09-06 0.153.0 PASS for explicit $skiphow invocation of exact 4.2.0 in the isolated enable and disable sessions, where the first read used a stale path before the installed copy was located; implicit selection without the activation block remains UNVERIFIED
Persistent instruction loading Codex reads AGENTS.override.md in its home when that file exists and is not empty, and AGENTS.md otherwise, then layers project files with the same precedence per directory; CODEX_HOME relocates the home; empty files are skipped; project_doc_max_bytes (32 KiB by default) caps the project-directory files, while the home file is read without a byte limit (codex-home/src/instructions/mod.rs against core/src/agents_md.rs at rust-v0.153.0). The packaged helper targets the file this rule makes effective and moves a block left in the shadowed file. AGENTS.md 2026-09-06 0.153.0 Observed twice: on exact 4.1.0 with the block in AGENTS.md and no override present, and on exact 4.2.0 with the block the agent itself wrote into a non-empty AGENTS.override.md, the kernel loading before edits each time (4.2.0 receipts)
Per-agent read-only controls Custom agents are TOML files in the Codex home agents/ directory or the project .codex/agents/ and the page says they may set sandbox_mode per agent, naming a read-only agent as the example, and that subagents otherwise inherit the parent's sandbox policy and permission mode. In the rust-v0.153.0 source, core/src/agent/role.rs applies developer instructions, model, reasoning effort and summary, verbosity, personality, service tier, features, and skills, and not sandbox_mode; role_tests.rs asserts a role cannot expand the parent's permissions. Subagents, openai/codex role.rs 2026-09-06 none UNVERIFIED (documented; not applied in source as of 2026-09-06, so a subagent inherits the parent's sandbox)
Worktree isolation The subagents page documents no worktree or separate-checkout option for a subagent, and spawn_agent takes an agent type, the message, and where exposed model and reasoning_effort, with no working directory, worktree, or sandbox parameter. Subagents, openai/codex multi_agents_spec.rs 2026-09-06 none UNVERIFIED (no per-delegate directory or sandbox exists in this version; a separate-checkout writer lane is untried)
Plugin validation Manifest .codex-plugin/plugin.json. There is no codex plugin validate subcommand; validation runs the validate_plugin.py script shipped with the plugin-creator system skill in the Codex repository, which CI checks out at a pinned commit. openai/codex plugin-creator scripts 2026-09-04 none locally UNVERIFIED locally (validator not on this machine); required to PASS in CI
Clean installation codex plugin marketplace add, codex plugin add, codex plugin list --json, codex plugin remove exist in codex plugin --help; CODEX_HOME relocates the host home. The plugins page documents the plugin browser and uninstall but none of these commands. Plugins, codex plugin --help 0.153.0 2026-09-06 0.153.0 UNVERIFIED for exact 4.4.0: the release runner's local marketplace is refused by the managed /etc/codex/requirements.toml source policy; exact 4.3.0 was installed from the approved Git source in an isolated home, 17 regular files byte-identical to the committed package, then removed (4.3.0 ledger)

Codex surfaces

Codex is more than one product surface, and only the CLI has rows above. On 2026-09-04 the first-party plugins page (Plugins, redirecting to learn.chatgpt.com/docs/plugins) said that plugins work in Codex in the ChatGPT desktop app and that Codex CLI has a plugin browser, and that the IDE extension does not support plugins. No run on this project has been made on any surface other than the CLI.

Surface What the source says Verified Status
Codex CLI Plugin browser and codex plugin commands; rows above. 2026-09-04 UNVERIFIED activation; see rows above
ChatGPT desktop app (Codex) Plugins supported. 2026-09-04 UNVERIFIED (documented only; no run)
IDE extension Does not support plugins. Whether the same skill loads there as a standalone .agents/skills entry is not stated. 2026-09-04 UNVERIFIED (unsupported as a plugin per the page)
Cloud and web Codex Not mentioned on the page read. 2026-09-04 UNVERIFIED

Behavioral coverage is UNVERIFIED on both hosts and is a separate claim from every row above. Eight Claude run records remain useful for diagnosis, but none retained both the verified pre-session manifest and concrete end-state artifact required for an eligible receipt. No host documents that identical instruction text produces equivalent behavior, and the two loading models differ materially: one keeps every description in context, the other lists a capped inventory and loads the file on selection. What runs have and have not shown is in current evidence.

Each release publishes the compact matrix that scripts/check_hosts.py prints, with one row per capability. A skipped or unavailable check stays UNVERIFIED there; it is never folded into a passing aggregate. The release runner neither starts nor ingests model sessions, so explicit, implicit, and persistent-instruction activation always stay UNVERIFIED in that matrix. External model-session evidence is retained separately in the behavioral ledger.

This repository's continuous integration is not dual-host behavioral support and does not claim to be. It requires the pinned Codex validator, validates the Claude package only where that executable is present, and skips isolated installation entirely.

Untrusted repository profile

SkipHow is policy, not enforcement. When a repository, branch, pull request, download, or incident snapshot is not yet trusted, use the host's controls before reading its instructions as procedure or running its code. Start from a disposable checkout, use synthetic or redacted data, inherit no unrelated credentials, deny network access unless the task requires named destinations, and keep writing delegates disabled. Do not run project hooks, build scripts, tests, or project-supplied skills until their effects fit the request's authority and the repository's provenance is established.

On Codex, start the root session under a read-only sandbox and approval policy; subagents inherit it. The custom-agent sandbox_mode field documented for 0.153.0 is not applied by that version, so it cannot narrow one delegate, and the AGENTS.md chain remains behavioral context rather than an enforcement boundary. On Claude Code, use plan or equivalent read-only permissions plus the OS-enforced filesystem and network sandbox; set sandbox unavailability to fail closed when the review depends on it, and disable the unsandboxed-command escape. In either host, a requested repair moves to a fresh bounded write environment only after the source and effects are understood.

Report a vulnerability

Do not open a public Issue for a suspected vulnerability. Submit a private GitHub security advisory. Include the affected SkipHow version, host and version, smallest safe reproduction, impact, and any proposed mitigation.

Use synthetic data. Remove credentials, tokens, private repository names, customer data, personal paths, and production payloads. Do not test against a system you do not own or lack permission to assess.

If private reporting is unavailable, contact the maintainer through the GitHub profile without sending vulnerability details over a public channel. Wait for a private route.

The maintainer will acknowledge a valid report, investigate it, and coordinate a fix before disclosure when practical.

Read the design for the boundary between SkipHow policy and host enforcement.

There aren't any published security advisories