Skip to content

feat(work-items): read issue-body skeletons from the org issue-body contract - #15453

Merged
kyle-sexton merged 8 commits into
mainfrom
feat/issue-body-contract-skills
Nov 12, 2026
Merged

kyle-sexton merged 8 commits into
mainfrom
feat/issue-body-contract-skills

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

No related issue: owner-approved design (org issue and PR template interview, Q34 and Q36-Q38, 2026-11-11)

Summary

The org issue forms are now generated in melodic-software/standards from one issue-body contract, and the standards sync delivers that contract here at docs/contracts/issue-body/contract.json (#15429). This PR makes the skills that write or check issue bodies read their skeletons from it, so a skill-filed issue and a form-filed issue carry the same headings.

Fix

  • Fan-out: scripts/sync-shared-copies.sh copies a JSON canonical byte for byte (JSON has no comment syntax for a generated-file header) and generates plugins/bugs/reference/issue-body-contract.json and plugins/work-items/reference/issue-body-contract.json; shared-copies.txt and cross-plugin-source-registry.txt register the cluster. Tests cover the JSON copy and drift.
  • /work-items:track add: the body's sections come from the contract type matching the resolved issue type (bug, feature, task), or agent-ready; the inline Context / Proposed work / Acceptance criteria / References skeleton is gone. Metadata and Recurring stay as appended sections.
  • Agent brief (reference/agent-brief.md): fields are the contract's agent-ready type, written as ### headings under ## Agent Brief, the same level the agent-ready form renders.
  • /work-items:decompose: its required sections are the contract's decomposed-item type; the contract wins where they disagree.
  • /work-items:triage: step 1 checks an issue body against the contract with the new scripts/check-body.mjs (accepts ## and ###, treats a form's _No response_ as empty, ignores fenced code and HTML comments); steps in context/body-check.md.
  • /bugs:write: the template's sections are the contract's bug fields in order (Severity and Suggested fix location become sections, matching the form).
  • /code-tidying:tidy: the deferred-item body follows the task type's required headings.
  • reference/dogfood-filing.md points at the contract instead of restating the skeleton.

Verification

  • node --test plugins/work-items/skills/triage/scripts/check-body.test.mjs: 8 pass; the CLI on a form-shaped bug body against the real contract returns no gaps for bug and names the three missing task fields.
  • bash scripts/sync-shared-copies.test.sh: 99 pass; sync-shared-copies.sh --check: all 804 copies match.
  • scripts/check-cross-plugin-source-drift.sh --check: no unregistered or drifted clusters.
  • scripts/check-changed-skills.sh: 5 skills pass (triage held under its 500-line cap by moving the steps to a context file).
  • Pre-push scripts/check-affected.sh: passes.

Related

🤖 Generated with Claude Code

https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe

kyle-sexton and others added 5 commits November 11, 2026 11:46
…ontract

track add, decompose, the agent brief and bugs:write now take their
issue-body headings from the issue-body contract the standards sync
delivers into each plugin's reference/ directory, the same record the
org issue forms are generated from. triage checks an issue body against
the contract with scripts/check-body.mjs, which accepts a field under a
## or ### heading and treats a form's skipped answer as empty. The tidy
deferred-item body follows the task type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
Spoke files are read as raw bytes, so the contract link in track add's
action file and the bugs:write template uses a relative path instead of
${CLAUDE_PLUGIN_ROOT}. The changelog fragments no longer start a line
with a heading marker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
Keeps the triage SKILL.md under its line cap: the hub names the script
and points at context/body-check.md for the steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
The standards sync delivers the contract once, to
docs/contracts/issue-body/contract.json. sync-shared-copies.sh now
copies a JSON canonical byte for byte (JSON has no comment syntax for a
header) and generates plugins/bugs and plugins/work-items
reference/issue-body-contract.json from it; the cross-plugin registry
records the cluster.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
@kyle-sexton
kyle-sexton marked this pull request as ready for review November 11, 2026 22:48
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-11T22:50:37.550031Z 0c789af Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0c789afd8b

ℹ️ 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".

@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 1afd90696ff567d2d313e01893532900afa8ab64: read 4 of 4 changed file(s); 0 finding(s), 0 as inline comments.

Security review: PR #15453 (incremental, cb3a459 → 1afd906)

I found no security issues.

critical-findings: 0

Scope: I read every hunk of the 4 files in the incremental scope. None of them matches a TRUSTED PATHS glob. The trusted plugins/work-items/scripts/charge-words.json is not touched.

Blocking only: this lane already reviewed an earlier head, so this review would have reported only CRITICAL or IMPORTANT findings. There were none.

What I checked

  • plugins/work-items/reference/agent-brief.md and plugins/work-items/skills/track/actions/add.md: "contract order" / "the contract's" now read "issue-body contract order" / "the issue-body contract's". This only names the contract. It removes, narrows or softens no instruction, so the instruction-surface lens has nothing to judge.
  • scripts/vocabulary-senses.json: adds one exemption phrase, \bissue-body contract\b, to the vocabulary checker's contract sense. That checker is a wording lint. It is not a trust control, a merge hold or a gate on credentials. The regex is a fixed literal with word boundaries, so it brings no ReDoS risk.
  • scripts/test_check_vocabulary.py: adds one test row for the new exemption. It is test-only code and takes no outside input.
  • Trust controls, tokens and manifests: the change touches no workflow, token request, kill switch, trusted-actor list or plugin manifest.
  • Spend: none.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on 0c789afd8ba8227ce5b976d398de62e2e111e52e; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 1afd90696ff567d2d313e01893532900afa8ab64: read 4 of 4 changed file(s); 0 finding(s), 0 as inline comments.

Code review (incremental, blocking only): cb3a4598..1afd9069

This lane already reviewed earlier heads of this PR, so this pass reports blocking findings only. I read every hunk of the 4 files in .claude-lane/incremental-files.txt. No blocking findings.

What the push changes. It adds a vocabulary-check exemption for the phrase "issue-body contract" and rewrites two prose lines to use that name:

  • scripts/vocabulary-senses.json adds the exemption to the contract-brief sense.
  • scripts/test_check_vocabulary.py adds a matching phrase(...) test row. Its regex is the same as the JSON entry's, and its sample line matches it.
  • plugins/work-items/reference/agent-brief.md:34 and plugins/work-items/skills/track/actions/add.md:55 now say "issue-body contract" where they said "contract".

Does the exemption clear the lines it targets? I read scripts/check-vocabulary.py:190-197. A phrase exemption clears the whole line it appears on, not only the matched words. So:

  • add.md:55 keeps several bare uses of "contract": "in contract order", "the contract type" and "the contract does not hold". It also matches the near rule's \bbrief\b through agent-brief.md. The one new "issue-body contract" on the line clears it all.
  • The other lines of agent-brief.md that mention "contract" either already contain the exempt phrase (line 31) or have no "brief" on them (line 32, issue-body-contract.json).

Prior findings and settled threads. The ### sub-heading thread on check-body.mjs is settled (lines changed since resolution: no), and this push doesn't touch that file. There is nothing to post again.

Closing issue: the PR context names none, so there are no acceptance criteria to check.

Manifests: this push changes no plugin.json or marketplace.json.

Verification: this run had no shell, so I did not run scripts/test_check_vocabulary.py or the vocabulary gate. The checks above come from reading the code only.

check-body.mjs replaced the open ## section when a ### heading appeared,
so a field answered under a sub-heading read as empty. Keep a stack of
open sections and give each prose line to every section still open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
kyle-sexton and others added 2 commits November 11, 2026 19:04
plan-test-lanes.sh failed select-tests because check-body.test.mjs had
no sibling .test.sh and no Node package in the test-node lane holds it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
check-vocabulary read "contract" near "brief" as the retired planning
Brief sense. Allow the named issue-body contract, and name it on the two
lines that said only "contract".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQb9Q2ceZLXhTR4d1vkTCe
@kyle-sexton
kyle-sexton added this pull request to the merge queue Nov 12, 2026
Merged via the queue into main with commit bee316e Nov 12, 2026
62 checks passed
@kyle-sexton
kyle-sexton deleted the feat/issue-body-contract-skills branch November 12, 2026 00:54
@github-actions github-actions Bot added the merge-path: owner-agent Post-merge accounting record (README.md, Merge paths) label Nov 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-path: owner-agent Post-merge accounting record (README.md, Merge paths)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant