feat(source-control): configurable pr_body_required_sections scaffold + gate (#975)#1029
Conversation
… + gate (#975) The PR-body section scaffold (Summary/Test plan/Related) was hardcoded into create.md's template, forcing a Related section — and its issue-tracker assumption — on every consumer regardless of whether their convention wants it. Externalize it as `pr_body_required_sections` on the layered source-control.md config (per-key, whole-list override, same seam as every other key), ship a portable default of Summary + Test plan only (Related presumes an issue tracker, so it moves to configuration), and extend the §2.4.2 pre-create gate to verify every resolved required section is present and non-empty, naming the exact missing section and its resolved config source on failure. A genuine `Refs #Y` reference still gets a `## Related` section ad hoc even when not configured as required — real content is never dropped, but the gate never comes to require a section the resolved config doesn't list. docs/conventions/pr-body-convention/README.md is the marketplace-level owner doc for the key, pointing at config-resolution.md for resolution mechanics rather than restating them, and recording the richer-schema deferral (conditional sections, placeholder-text rejection, min-content) pending standards#173. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Claude finished @kyle-sexton's task in 4m 24s —— View job PR Review
This is well-designed and internally consistent. No blocking defects. Three items worth addressing before merge, one of which is a genuine functional gap: Notable gap:
|
|
Claude finished @kyle-sexton's task in 3m 1s —— View job Security Review — PR #1029
FindingsNo security vulnerabilities found. The eight changed files span markdown docs, a JSON manifest version bump, eval fixtures, and instruction prose. There is no new executable code (no shell scripts, no GitHub Actions workflows, no server-side logic). The security-relevant portions are the shell snippets embedded in AWK
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b1c9eecb78
ℹ️ 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".
|
🔒 merge-drive lane claiming this PR for on-branch fix work this cycle (amendment-round: 16, worker tier). Will fix clear branch-owned CI/bot findings, defer non-DEFER-FORBIDDEN items with reply+resolve, push, then re-check the merge gate. |
|
Claude finished @kyle-sexton's task in 3m 25s —— View job PR Review — feat/975-required-body-sections
Sync note: The synchronize event was a merge-from-main that only touched Confirmed bug:
|
|
Claude finished @kyle-sexton's task in 2m 34s —— View job Security Review — PR #1029
FindingsNo security vulnerabilities found. The synchronize event adds a single merge commit ( New path 1 —
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e1204ade88
ℹ️ 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".
…body scaffold Two bugs codex flagged in review (both P2, both blocking merge under required_review_thread_resolution): - source-control: the required-section template loop emitted a generic placeholder for every heading, including Related, so a repo that DOES configure Related as required silently lost REFS_LINES content instead of carrying it forward (only the ad hoc not-required path consumed REFS_LINES). Factor Related's content resolution into one helper (content_for_section) reused by both the required loop and the ad hoc append, so there is exactly one place Related's content is decided. - work-items: `work`'s dispatch brief listed `## Related` as a standing PR obligation alongside Closes #N, matching the OLD pull-request behavior this PR replaces. Now pull-request's default scaffold omits Related, so the brief drops it from the standing-obligations list and points at pull-request's configurable pr_body_required_sections instead of restating its shape. The post-green deferred-finding step now explicitly ensures a `## Related` section exists (gh pr edit) before citing a follow-up issue there, since it can no longer assume pull-request already created one. Eval 3 updated to match; work-items bumped 0.21.2 -> 0.21.3 with a CHANGELOG entry. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
… into feat/975-required-body-sections
|
Claude finished @kyle-sexton's task in 3m 12s —— View job PR Review — feat/975-required-body-sections (post-amendment re-review)
The amendment commit ( Fixed:
|
|
Claude finished @kyle-sexton's task in 3m 10s —— View job Security Review — PR #1029 (HEAD
|
|
Classification of the three items in the review above. Freshen-merge to current
No blocking defects. Security Review (separate claude[bot] comment) passed clean with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0a75d72284
ℹ️ 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".
…ion gate scan A third review finding on #975's PR: §2.4.2.2's required-section gate scans from each "## <heading>" to the next "## " heading or end of body. Because the attribution line was appended to $BODY before the gate ran, an empty LAST required section's scan ran off the template and into the attribution footer text (no "## " prefix of its own), which the gate misread as that section's real content — defeating the emptiness check for exactly the last section whenever attribution was active (the common case, since it's on by default). Fix: build $BODY without the attribution footer, run both §2.4.2 gates against that, and splice the footer in only in §2.4.3, right before `gh pr create`. Closes the hole structurally rather than teaching the gate to special-case footer shape. New eval 14 covers the regression. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Claude finished @kyle-sexton's task in 3m 3s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 2m 25s —— View job Security Review — PR #1029 (HEAD
|
|
Addressed all four findings from this review pass:
Good catches on 2 and 4 — real correctness bugs, not just doc drift. |
… gate Fourth review finding on #975's PR: the §2.4.2.2 required-section gate matched "## <heading>" literally anywhere in $BODY, including inside a fenced code sample. A Summary that documents a PR-body template containing the literal line "## Related" would satisfy a required Related section that doesn't actually exist as real Markdown structure, and would also incorrectly truncate Summary's own captured content at that in-fence line. Fix: the awk state machine now tracks fence state (``` or ~~~ toggles it) and only treats a heading match, or an exit-boundary heading, as real when outside a fence. A fence delimiter encountered while already inside the target section's content is preserved as that section's real content, not treated as an exit. New eval 15 covers the regression. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Claude finished @kyle-sexton's task in 1m 46s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 2m 36s —— View job Security Review — PR #1029 (HEAD
|
|
Ignore fenced-code headings when validating sections — real bug, fixed (commit 6eefd41). The §2.4.2.2 gate's awk heading scan is now fence-aware: a Configure this repository's required That's a decision for @kyle-sexton, not something I should resolve unilaterally by either reverting the portable default or unilaterally writing this repo's config in this PR. Flagging it to them now; leaving this thread open until it's decided. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6eefd4186d
ℹ️ 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".
…tion gate Fifth review finding on #975's PR, mirroring the fenced-code fix: a multi-line HTML comment (<!-- on its own line, then a heading-shaped line, then --> closing it) hid a "## <heading>" line the awk scan still exact-matched, letting a commented-out (GitHub-invisible) section satisfy the required-section check. Generalized the fence-aware state machine to also track HTML-comment state, and rewrote it as one action block (rather than several pattern-action rules) so exactly one branch fires per line -- awk otherwise runs every matching rule per line, which risked double-toggling state on a line matching more than one pattern. New eval 16 covers the regression. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Ignore HTML-comment headings during section validation — real bug, fixed (commit a7cf2a0), mirroring the fenced-code fix. Generalized the awk state machine to track HTML-comment state ( |
|
Claude finished @kyle-sexton's task in 3m 51s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 2m 43s —— View job Security Review — PR #1029 (HEAD
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a7cf2a0673
ℹ️ 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".
…n CI green This repo has no .claude/source-control.md, so the new portable default (Summary, Test plan only) would make every ordinary future /pull-request create omit ## Related -- but this repo's own .github/workflows/pr-issue-linkage.yml requires a non-empty Related section. Self-regression atomicity: a change that would break this repo's own CI ships with its own remedy in the same PR, not a follow-up. Adds the team-tracked .claude/source-control.md (repo root) setting only pr_body_required_sections (Summary, Test plan, Related) -- every other key falls through to inference per config-resolution.md's per-key fallthrough, so no other key is set. Adds the recursive .claude/**/*.local.* gitignore line (the personal-overlay layer this file's own convention supports), which the repo did not carry yet. This is repo-local configuration DATA at the seam the mechanism defines, not plugin content -- the plugin itself ships nothing melodic-specific. First fleet-adoption instance of the key; every other consuming repo adopts it the ordinary way, via /source-control:setup apply, not a hand-edit. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Claude finished @kyle-sexton's task in 6m 0s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 2m 15s —— View job Security Review — PR #1029 (HEAD
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ecc9bf6c63
ℹ️ 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".
|
Configure this repository's required Rationale: instruction #8's original premise (keep this PR mechanism + docs only, no repo dogfooding) was overtaken by this exact finding — the review exposed that this PR changes this repo's own effective PR-body behavior, and a change that would break the repo's own CI must carry its own remedy in the same PR (self-regression atomicity), not a follow-up. Agnosticity is intact: Added (commit ecc9bf6): team-layer Sanity-checked per your ask: eval 12's "no source-control.md config file exists in this repo" scenario is unaffected — |
…e body edit Sixth and seventh review findings on #975's PR: - source-control: the fence-aware heading scan only recognized a column-zero, unindented ``` or ~~~ delimiter, and treated ANY fence character as closing regardless of which one opened it. GFM permits up to 3 leading spaces before a fence opener, and a fence closes only on a matching delimiter character -- a ~~~ line never closes an open ``` fence. A Summary documenting a template in an indented fence, or containing a stray ~~~ line before a literal "## Related", could still fool the required-section gate. Rewrote fence detection to strip up to 3 leading spaces and track the opening delimiter character, closing only on a match. Verified locally against a body with an indented fence, a tilde-inside-backtick-fence line, and an HTML comment -- all three lookalikes correctly excluded. Eval 15 extended to cover both new cases. - work-items: the "ensure ## Related exists" guidance told the orchestrator to add it "via gh pr edit --body", which reads as a bare write -- but gh pr edit --body/--body-file REPLACES the whole body (the same identity note the GitHub adapter's own PR closing-keyword mechanics document), so following that literally would silently drop Closes #N, Summary, and Test plan. Now explicitly a read-modify-write: read the current body (gh pr view --json body), extend it with ## Related, write the combined result back via --body-file -. Eval 3 updated to match. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c00aa434a0
ℹ️ 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".
…y-sections # Conflicts: # plugins/source-control/.claude-plugin/plugin.json # plugins/source-control/CHANGELOG.md
|
Claude finished @kyle-sexton's task in 4m 2s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 3m 14s —— View job Security Review — PR #1029 (HEAD
|
Eighth review finding on #975's PR: a required section whose heading was real but whose entire body was an unfilled HTML-comment placeholder (<!-- fill this in -->) still read as non-empty, because the fence/ comment-aware scan printed comment text into the captured section body whenever already inside a found section -- correct for a fence (real, rendered content) but wrong for a comment (never rendered at all, either way). This repo's own PR-body validator strips comments before checking, so a comment-only section is exactly the unfilled-template state the gate exists to catch, and the old behavior let it through. Fix: comment text is now never printed into SECTION_BODY, regardless of whether the scan is inside a found section -- the fence/comment asymmetry (fences render, comments do not) is now reflected in the scan. New eval 17 covers the regression; eval 16's now-incorrect "preserved inside a found section" expectation for comments corrected to match. Refs #975 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
|
Claude finished @kyle-sexton's task in 3m 1s —— View job PR Review — feat/975-required-body-sections (HEAD
|
|
Claude finished @kyle-sexton's task in 3m 39s —— View job Security Review — PR #1029 (HEAD
|
|
Preserve the existing PR body when adding Related — real bug, fixed (commit c00aa43). The guidance now explicitly documents this as a read-modify-write ( |
|
Match GitHub's fenced-code rules — real bug, fixed (commit c00aa43). The fence detection now matches GFM's actual rules: up to 3 leading spaces before the opener, and a fence closes only on a matching delimiter character (a |
|
Strip comments before section emptiness checks — real bug, fixed (commit 8228d6f). Comment text is now never counted as section content, even inside a genuinely matched section — the fence/comment asymmetry (a fence is rendered content and legitimately counts; a comment is never rendered at all, so it never counts) is now reflected in the scan. A required section whose entire body is an unfilled |
Third freshness merge. Resolve source-control plugin.json + CHANGELOG conflicts by composing both sides: keep #1029's [0.18.0] required-sections-scaffold entry, move the worktree-convention SSOT entry to a new [0.18.1] heading, re-bump plugin.json 0.18.0 -> 0.18.1 (one increment past main's current value).
…1032) Completes #975's adoption path: /source-control:setup was the last mechanism-owning surface that didn't know about the new pr_body_required_sections key, so a team using the sanctioned guided setup flow couldn't configure the required-section scaffold or see which layer supplies it -- the only path was hand-editing .claude/source-control.md directly. - check reports a pr_body_required_sections row on the effective-configuration table, resolving to the plugin's portable default (Summary, Test plan) with "won by: plugin default" when no layer sets it, rather than a blank row -- the only key whose "unset" state is itself a reportable, named value. - apply's interview offers setting it, deliberately recommending only the plugin's own portable default and never proposing a Related/linked-issue section or any other org-specific list as a universal default -- it asks what the repo's actual convention requires instead of inventing one, per the Two-lane convention posture. - The written-config template gains the matching ## pr_body_required_sections section, at parity with every other per-key surface. New evals 13-14 cover the check-report default and the agnostic-interview behavior. Version bumped 0.18.0 -> 0.19.0 with a matching CHANGELOG entry. Closes #1032 Refs #975 Refs #1029 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYvF6bWGqemS9aYFfWJRiW
…1032) (#1059) Closes #1032 ## Summary Completes #975's adoption path: `/source-control:setup` was the last mechanism-owning surface that didn't know about `pr_body_required_sections` (added in #1029), so a team using the sanctioned guided setup flow couldn't configure the required-section scaffold or see which layer supplies it — the only path was hand-editing `.claude/source-control.md` directly. - **`check` reports a `pr_body_required_sections` row** on the effective-configuration table, resolving to the plugin's portable default (`Summary`, `Test plan`) with `won by: plugin default` when no layer sets it — a named, reportable value rather than a blank row, since "unset" is itself a meaningful state for this key. - **`apply`'s interview offers setting it**, deliberately recommending only the plugin's own portable default and never proposing a `Related`/linked-issue section (or any other org-specific list) as a universal default — it asks what the repo's actual convention requires (a PR template, a CI gate like `pr-issue-linkage`, team practice) rather than inventing one, per the plugin's Two-lane convention posture. - **The written-config template** gains the matching `## pr_body_required_sections` section, at parity with every other per-key surface (`subject_pattern`, `pr_title_pattern`, `trailer_policy`, `pr_body_attribution`). - New evals 13-14 cover the check-report default and the agnostic-interview behavior. - Plugin version bumped `0.18.0` → `0.19.0` with a matching `CHANGELOG.md` entry. This branch was rebased onto `feat/975-required-body-sections` (then onto `main` after #1029 merged) so it includes #1029's `pr_body_required_sections` key and #1055's setup-template preamble together — verified both coexist correctly in the write template (preamble header, then the per-key section list ending with the new `## pr_body_required_sections` section). ## Test plan - `npx markdownlint-cli2` over the changed skill doc and CHANGELOG: 0 errors. - `node -e "JSON.parse(...)"` over the updated `evals/evals.json`: valid JSON. - `bash scripts/check-changelog-parity.sh --check-bump origin/main`: PASS. - `bash scripts/validate-plugins.sh`: every plugin manifest and the marketplace catalog validate. - Manually verified the merged write template renders correctly end to end (preamble + `pr_body_required_sections` section both present, no duplication) after rebasing onto `main`. ## Related - #975 / #1029 — the mechanism and portable-default key this PR completes the adoption path for. - #1055 — the setup-template self-describing-preamble change this branch was rebased across; both changes touch the same "Write the config" template step and coexist without conflict. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Closes #975
Summary
Externalizes the PR-body section scaffold (
## Summary/## Test plan/## Related) that waspreviously hardcoded into
create.md's template, so thepull-requestskill no longer imposes the## Relatedsection — and the issue-tracker convention it presumes — on every consumer.pr_body_required_sectionson.claude/source-control.md, resolved across thesame three layers as every other key on that surface (per-key, whole-list override) —
plugins/source-control/reference/config-resolution.md.SummaryandTest planonly (noRelated) —research-grounded (GitHub's own guidance, Google's CL-description doc, GitLab's dogfooded default
template, a cross-section of OSS PR templates); a
Related/linked-issue section presumes anissue-tracker convention, so it moved from a hardcoded default to configuration.
the new check verifies every resolved required section is present and non-empty in the assembled
body, naming the exact missing section and the resolved config source (winning layer's file + the
key) on failure, so an actor who never saw the convention learns where it lives from the failure
itself. The scan runs BEFORE the attribution footer is appended (an empty last section can't be
masked by footer text) and is fence- and HTML-comment-aware (a heading-shaped line inside a code
sample or a commented-out draft never counts as a real section boundary) — both review-caught.
Refs #Yreferences are never dropped — a## Relatedsection is still emitted ad hocto carry them even when
Relatedis not configured as required, but that ad hoc section is neveradded to the gate's required list.
Related's content resolution (REFS_LINES vs. theN/Adefault) is factored into one helper reused by both the required and ad hoc paths, so they can't
disagree — also review-caught.
docs/conventions/pr-body-convention/README.md, modeled on thecommit-conventionseam's two-reads pattern (drafting today, a future CI/enforcement consumerlater) and pointing at
config-resolution.mdfor resolution mechanics rather than restating them.work-items'workskill dispatch brief listed## Relatedas astanding PR obligation, matching the OLD always-present behavior this PR replaces. Updated to point
at the new configurable scaffold instead of restating it, and to ensure the section exists (via
gh pr edit) before citing a deferred-finding follow-up issue, since it can no longer assumepull-request already created one.
work-itemsbumped0.21.2→0.21.3with a matching entry.wanting
Related(or any other section) declares it in its ownpr_body_required_sections. Thisrepo (
claude-code-plugins) itself now does exactly that — see "Dogfooding" below — as repo-localconfiguration DATA at the seam the mechanism defines, not plugin content.
placeholder-text rejection, min-content rules — pending
melodic-software/standards#173.Plugin version bumped
0.17.0→0.18.0with a matchingCHANGELOG.mdentry.Dogfooding (first fleet-adoption instance)
This repo has no
.github/workflows/pr-issue-linkage.yml-satisfying config today, and the newportable default would make every ordinary future
/pull-request createhere omit## Related—breaking this repo's own required linkage gate. Self-regression atomicity: a change that would break
this repo's own CI ships with its own remedy in the same PR. Added
.claude/source-control.md(teamlayer, root) setting only
pr_body_required_sections(Summary, Test plan, Related, matching thisrepo's actual gate) — every other key still falls through to inference. Also added the recursive
.claude/**/*.local.*gitignore line this file's own convention needs, which the repo did not carryyet. This is the first fleet-adoption instance of the key by hand; every other consuming repo adopts
it the ordinary way, via
/source-control:setup apply.Test plan
npx markdownlint-cli2over every changed/added Markdown file: 0 errors.node -e "JSON.parse(...)"over the updatedevals/evals.json: valid JSON; added evals 12-16covering the portable default, the config-driven gate blocking a missing required section, the
attribution-footer-masking regression, and the fenced-code/HTML-comment heading-lookalike
regressions — plus a new fixture
evals/fixtures/source-control-required-related.md.bash scripts/check-changelog-parity.sh --check-bump origin/main: PASS (both version bumps —source-controlandwork-items— have matching entries).bash scripts/check-orphaned-fixtures.sh: the new eval fixture showsCONSUMED, not orphaned.bash scripts/check-skill-portability.sh origin/main: no unexcused coupling tokens introduced.bash scripts/check-silent-skips.sh origin/mainandbash scripts/check-cross-plugin-source-drift.sh:clean; no new drift.
bash scripts/validate-plugins.sh: every plugin manifest and the marketplace catalog validate.grep(whole repo, not justplugins/source-control) that## Relatedappearedonly in
create.md,work-items'workskill, and historicalCHANGELOG.mdentries beforeediting — caught and fixed the
work-itemscross-plugin coupling the first grep pass (scoped toplugins/source-controlonly) missed; this pass was widened after review.skill-quality:check's eval schema validation (the only CI-run eval check) never executeseval prompts against live repo state — it is schema-only (
check-jsonschemaagainstevals.schema.json) — so eval 12's "no source-control.md config file exists in this repo" scenarioframing is unaffected by this repo now carrying a real one; the two never interact.
create.md(.test.shfiles coverscripts/only) —prose consistency and intact §-numbering are the deliverable here; reviewed the full file end to
end after every edit.
would have: a real routing bug, an attribution-masking bug, two heading-lookalike bugs, the
cross-plugin contract break, the setup-skill gap (tracked separately, setup skill: offer pr_body_required_sections in interview/write template #1032), and this dogfooding
gap.
Related
portable default, gate-must-teach requirement, and the
standards#173convergence trigger.melodic-software/standards#173— PR convention policy-as-data; the deferred richer-schema triggerfor this seam.
docs/conventions/commit-convention/README.md— the two-reads (drafting/enforcement) prior art thisPR's new owner doc follows.
/source-control:setupgainscheck/applysupport forpr_body_required_sections, completing the key's adoption path for every consumer that isn't thisrepo.
🤖 Generated with Claude Code