ci: add Conventional Commits PR-title gate - #13
Conversation
Adopt the shared semantic-pr reusable workflow from ci-workflows as a thin pr-title caller. Repos squash-merge with the squash title set to PR_TITLE, so the PR title becomes the default-branch subject; this gates a Conventional-Commits history. Emitted required check: pr-title / pr-title. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 941c77d4c7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| # Conventional-Commits history. `edited` re-validates on a re-title. The emitted | ||
| # required-check context is `pr-title / pr-title`. | ||
| on: | ||
| pull_request: |
There was a problem hiding this comment.
Run the title gate from the base workflow
Since this check is intended to become a required ruleset gate, running it on pull_request leaves the policy controlled by the PR's merge commit: a PR that edits .github/workflows/pr-title.yml can relax or replace the pr-title / pr-title job and still satisfy the required check with a non-Conventional title. GitHub documents pull_request_target as running in the default-branch context rather than the PR merge context, and this workflow only reads PR metadata without checking out head code, so using pull_request_target would enforce the base branch's gate while avoiding this bypass.
Useful? React with 👍 / 👎.
## Summary Restores the eval/test-coverage attrition identified by the salvage sweep (tier-3: items #13, #15–#23 plus the two flagged cosmetic-severity items), recreated genericized and validated against `plugins/skill-quality/reference/evals.schema.json`. Per-plugin version bumps + CHANGELOG entries. | Plugin | Version | Restored coverage | |---|---|---| | songwriting | 0.4.0 | All 13 medley behavioral evals mapped onto the multi-skill split (workflow 3, diagnosis 3, rhyme 2, song-form 2, co-write 2, object-writing 1); zero drops | | ai-briefing | 0.4.0 | 6 engine evals + 3 synthetic fixtures via the audience-defaults seam; the legacy Grok-preload case re-derived as an unreachable-RSS visible-degrade scenario (the flag never shipped; CI contract bans the token) | | event-storming | 0.4.0 | Offline board-export eval (id 8) + 74-line fixture for `--discover-bcs` — disjoint from the live-Miro-required eval, reconciliation noted inline | | codebase-audit | 0.3.0 | Scope-boundary eval: decline settings/MCP/hooks claim-extraction, route to `/claude-config-audit:settings-audit` | | discovery | 0.5.0 | Research floor-scaling ("floors are not targets") + broad-topic doubled-minimums evals, vendor-neutral | | source-control | 0.2.0 | Readiness security-gate eval + genericized fixture, mixed-actor (bot-fix-now vs human-pause) eval, three worktree evals (dry-run report-only, invalid-name rejection, batched-gh status + graceful degrade) | | docs-hygiene | 0.4.0 | Two self-contained fixture-backed cases (compress classification-table, declutter opt-out/section-exemption) — fixtures empirically verified against `detect.sh`; rename-references "add an eval case" clauses | | review-toolkit | 0.6.0 | code-review-fanout evals 6 → 20: dedup/severity-derivation, fix-pass safety fence (correctness never routed to /simplify), run-everything null-reconciliation + priority-ordering; 2 medley cases skipped (fixed-roster counts deliberately generalized away), their surviving assertions folded in | ## Verification - All 8 plugins pass `claude plugin validate`; `scripts/validate-plugin-contracts.mjs` passes (1311 files) - Every evals.json jq-parses and validates against the schema (ajv/check-jsonschema) - markdownlint-cli2 0 errors on new fixtures + CHANGELOGs; coupling grep (medley/consumer refs) clean - Rebased onto main post-#192; per-plugin validate re-run green after rebase 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_011xHkkNc7CR98L8Xz9Mu7ZA --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ive pages (#1920) ## Summary Doc-alignment roster row 16: **Prompt caching (API)** — first captures of both the API page (152,223 B) and its harness sibling (29,721 B), with a hard surface-scoping discipline (API vs harness caching semantics are different products' claims). Seven repo surfaces stating caching facts swept; five verified clean and left alone (including boris's $12.50/$1 figures — confirmed contextually right for subagent orchestration, where the five-minute TTL governs); two carried real defects: **playbooks 0.6.15** — `orchestration.md`'s continue-an-oriented-worker rationale claimed "accumulated context is a cache read". Wrong in the chapter's own modal case: the harness page states subagents build their own cache *and* use the five-minute TTL even on subscription, so a worker resumed after a longer fan-out wave re-writes its whole context at the five-minute cache-write rate ("1.25 times the base input tokens price"), not a cache-read rate. The recommendation stands; the reason is now the re-derivation saved (a replacement pays the same tokens plus the rediscovery tool turns), with the TTL and pricing anchors cited. **docs-hygiene 0.9.5** — `extract-ssot`'s anti-pattern #9 ("Cache invalidation cascade") rested on a mechanism that is dead on the skill's own declared surface: the harness page states mid-session edits of always-loaded files keep the cache (the edit just doesn't apply), and cross-session sharing keys on the git-status snapshot, which any commit breaks. Rewritten in place as **"Always-loaded SSOT propagation lag"** — corrections ship that live sessions don't see until `/clear`/`/compact`/restart — with a scope fence for the API surface (where prefix volatility genuinely costs an Agent SDK fleet), scoped to *unscoped* rules files (path-scoped rules load lazily; pre-load edits apply), and slot 9 preserved because #10–#13 are cited by number in eight places. The dead vocabulary survives only in the changelog, quoted as removed. Routed, not acted on: the owner's dotfiles CLAUDE.md caching claim verified correct with one additive omission (fast mode is a third cache-key element) — recorded for dotfiles routing; the API page's explicit-default-effort no-invalidate row flagged as a future I17-b enrichment parallel. ## Test plan - Docs-only; markdownlint 0 errors; version/changelog parity both plugins; scripted quote fidelity 11/11 against the captured pages. - Orchestrator-commissioned Fable verifier: both live fetches (MD5s exact), both correction logics reconstructed, the slot-9 citation count independently verified, both contested calls upheld — substance PASS with 1 real defect (a surviving dead-mechanism table row in the same file) + 2 precision nits (cache-write rate; unscoped-rules scoping), all three fixed and re-checked **ALL PASS** including an independent dead-vocabulary sweep. ## Related - No linked issue. - Doc-alignment loop, roster row 16. Predecessors: #1908–#1919. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019gaVX25Txd6GXdiu9HEH3X --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
Adopt the shared semantic-pr reusable workflow from ci-workflows as a thin
pr-title.ymlcaller, pinned to ci-workflows@f82733b. This repo squash-merges with the squash title set toPR_TITLE, so the PR title becomes the default-branch subject — this gates a Conventional-Commits history.[opened, edited, reopened, synchronize](editedre-validates on re-title).pr-title / pr-title(to be required in thegithub-iacruleset only after this is merged and emitting).🤖 Generated with Claude Code