Setting the file. One moment.
Subchapter 24.6
SPEC.mdMarkdown6 KBView on GitHub
security-model writes and maintains SECURITY_MODEL.md files: per-directory policy that tells security review tools a repository’s threat model, invariants, reportable finding classes, severity context, and exclusions. Review skills that load the policy report fewer false positives on intended behaviour, miss fewer boundary violations specific to the product, and tag findings with stable invariant IDs.
The skill defines what counts as a finding. Deciding whether code contains one stays with the review tools that read the policy.
In scope:
SECURITY_MODEL.md for a repository or component.Out of scope:
security-review and the repository’s review skills do that.SECURITY.md. This skill never writes that file.list, resolve the chain with resolve, run check on existing policies and on review skills’ reference docs, read the project’s docs in full, and settle exposure before severity.Unresolved, and unresolved decisions suppress nothing.allowed-tools space-delimited.scripts/resolve_security_model.py, and references/consuming-policy.md when wiring a review tool to the policy.Authoritative sources:
define-security-policy and its resolver in openai/codex-security. Provenance, adaptation decisions, and rights are in SOURCES.md.SECURITY.md, which drives the filename choice.Useful improvement sources:
SOURCES.mdcheck outputData that must not be stored:
SOURCES.mdSKILL.md contains: the workflow, policy template, and drafting rules.references/consuming-policy.md contains: the block review skills add to load and apply a policy.scripts/resolve_security_model.py contains: a stdlib-only resolver with list, resolve, and check, plus --ref, --name, and --show-hidden.scripts/selftest_resolve_security_model.py contains: resolver tests.uv run scripts/quick_validate.py ../security-model from skills/skill-writer.uv run --with pytest pytest scripts/selftest_resolve_security_model.py from this skill’s directory.resolve --name SECURITY.md on codex-security’s evals/triage-finding/fixtures/policy-repo yields the root policy, then service/.resolve --ref <base> omits that exclusioncheck reports no false positives on a real draft whose references all existcheckreferences/consuming-policy.md; until they do, the policy is documentation only.SECURITY.md, not SECURITY_MODEL.md. Repositories that also run it need --name SECURITY.md on nested components or a duplicate file.check confirms that a named path or symbol exists somewhere, not that it is still where the policy says. A symbol that moved to another file passes.SKILL.md: a review produces a repeated false positive or miss that a policy section would have prevented, or a real run exposes a drafting rule gap.SOURCES.md: upstream define-security-policy changes, or a decision about what was kept or replaced changes.SOURCES.md, anonymized.check‘s token heuristics when it reports a false positive on real policy text, and add the case to the tests.SKILL.md, references/consuming-policy.md, and the tests together.