| No new bash scripts; Python for all new scripts | Review + .claude/rules/universal.md SHOULD 3 ("MUST NOT create new bash scripts") | ADR-042 (Accepted) |
| No logic in YAML workflows | ADR-006 + .claude/rules/universal.md MUST NOT 4 | Workflow YAML cannot be tested locally. Amendment 2026-04-28 allows pure config-data YAML under 7 conditions in templates/platforms/ and build/ only; run: block logic stays banned |
| No em or en dashes in authored text | validate_dash_prohibition (scripts/validation/checks_dash.py via pre_pr.py) + dash-guard hook; tests/hooks/fixtures/ exempt | .claude/rules/universal.md MUST NOT 5: bot reviewers open one or more threads per dash, every PR (Issue #1923) |
| SHA-pin all GitHub Actions | Pre-commit hook + workflow validation (.agents/governance/PROJECT-CONSTRAINTS.md:162) | Tags are mutable, so pinning blocks supply-chain tag-moving. Operative rule: pin everything unless a human explicitly approves the GP-006 first-party actions/* tag allowance, and disclose the tension in your PR description when you hit it. Fuller writeup in references/incident-history.md |
Generated and released hook artifacts fail closed and loud (ADR-066 D1, ADR-071). Scoped, not blanket: push guards fail open on infrastructure errors by design (.claude/hooks/PreToolUse/push_guard_base.py docstring); repo-wide audit tracked in #2271. Per-family table: ai-agents-architecture-contract Phase 3 | validate_hook_anchoring.py, runtime-contract tests, named Lefthook jobs, and CI enforcement | #2205 customer wedge; policy reversal in the incident history |
No version field in any plugin manifest or marketplace entry | pre_pr.py + validate-plugin-version-bump.yml | ADR-092: the field pins freshness to a hand-bumped string and conflicts across every concurrent PR (issue #4080 measured 14 of 22) |
| Block-style YAML arrays only in frontmatter | .agents/governance/PROJECT-CONSTRAINTS.md:224 ("Exceptions: None") | Copilot CLI frontmatter parser fails on CRLF and related formatting: github/copilot-cli#694, cited at PROJECT-CONSTRAINTS.md:220; ADR-044 |
.agents/HANDOFF.md is read-only | .claude/rules/universal.md MUST NOT 3 | ADR-014 (Accepted): the monolithic handoff file bloated and became a chronic merge-conflict magnet; distributed handoffs replaced it |
| Memory-first: retrieval precedes reasoning | AGENTS.md Retrieval section; session-start gates | ADR-007: Serena memories are canonical, Forgetful supplementary. Search before building; do not re-derive settled decisions |
| "Matches/mirrors" claims must quote the canonical source verbatim | .claude/rules/canonical-source-mirror.md; heuristic citation check in pre_pr.py | FM-9 confident-incorrectness; PR #1887 in the incident history |
| No silent defaults | FM-10 detection table (.agents/governance/FAILURE-MODES.md:315-399); taste-lints and pre-push scans | PR #1965 verdict-parser; incident history |
| Session-file merge immutability | Retro rule; session-protocol validation | Session 1187 (incident history): take --theirs for main's session file, rename yours to the next number |
No secrets, no force-push, no --no-verify, no direct commits to main | .claude/rules/universal.md MUST 1, MUST 5, MUST NOT 1, MUST NOT 2 | Hooks are the enforcement surface; skipping them is self-disarming |