feat(skills): /issue — file GitHub issues from arbitrary input#35
feat(skills): /issue — file GitHub issues from arbitrary input#35samtuckerdavis merged 3 commits intomainfrom
Conversation
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 4 minutes and 40 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughAdds operator-facing tooling docs: defines Changes
Sequence Diagram(s)sequenceDiagram
participant Operator as Operator
participant IssueSkill as /issue Skill
participant RepoContext as Repo Context
participant Deduper as Deduplicator
participant Sanitizer as Sensitivity Sanitizer
participant GH as gh CLI
Operator->>IssueSkill: invoke `/issue` (input + flags)
IssueSkill->>IssueSkill: startup gate (gh auth status) / refuse if bot identity
IssueSkill->>IssueSkill: parse mode (A/B/C) & repo inference
Note right of IssueSkill: Mode A → single draft\nMode B → decompose candidates
IssueSkill->>Deduper: run dedup classification per candidate
IssueSkill->>Sanitizer: sanitize bodies by repo tier
IssueSkill->>Operator: show approval table / previews
Operator->>IssueSkill: approve selection (or --no-confirm)
IssueSkill->>GH: `gh issue create` for approved items (unless dry-run)
GH-->>IssueSkill: return create result
IssueSkill->>Operator: report success/failure and partial state
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 8✅ Passed checks (8 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/rules/tooling-reference.md:
- Line 98: Remove the embedded calibration detail from the `/merge [--risky]
[--repo <name>]` reference line—specifically drop the phrase describing MED/HIGH
calibration (e.g., "the calibration is built so MED is the median outcome, not
HIGH")—and leave only the concise tool description; move or ensure the full
calibration specifics live only in the `/merge` skill spec (SKILL.md) so this
reference doc stays DRY and minimal.
- Line 97: Update the /run command documentation to specify the exact UTC
timestamp filename format used for reports so downstream tools can parse
filenames reliably; explicitly state the pattern for the placeholder in
"~/.claude/orchestrator-log/run-<UTC-timestamp>.md" (for example an ISO-like,
filename-safe pattern such as YYYY-MM-DDTHHMMSSZ or YYYY-MM-DD_HHMMSSZ) and note
it is UTC, and mention any separators or timezone marker expected so consumers
of the /run report can implement matching parsing logic for the /run report
files.
In `@claude-code/.claude/skills/issue/SKILL.md`:
- Around line 203-239: The sentence under "STEP 4 — Sensitivity sanitization"
that reads "Private Open-Paws repos (if any) → `private` → no strip required,
but never copy verbatim from a confidential origin." is ambiguous; change it to
an explicit clarification so readers know private-tier repos do not require
public redaction but verbatim pasting of confidential transcripts/emails is
still forbidden. Edit that bullet (referencing the exact phrase) to something
like: "Private Open-Paws repos (if any) → `private` → no public-strip required,
but do NOT paste raw/confidential transcripts or emails verbatim — paraphrase or
summarize instead." Ensure the new wording aligns with "Verbatim is forbidden"
and the strict-strip/mild-strip rules in STEP 4.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 897cb9fd-2058-4a99-9880-2d9de1f0e5ae
📒 Files selected for processing (2)
.claude/rules/tooling-reference.mdclaude-code/.claude/skills/issue/SKILL.md
|
STAGE 7 implementation complete — addressed all 3 CodeRabbit findings. Pushed b3c53f6. |
|
@coderabbitai full review please — all 3 actionable findings addressed in b3c53f6. |
|
🧠 Learnings used✅ Actions performedFull review triggered. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@claude-code/.claude/skills/issue/SKILL.md`:
- Line 34: Several fenced code blocks in SKILL.md are missing language
specifiers; update each fenced block by adding an appropriate language
identifier (e.g., text or markdown) so screen readers and plain-text editors
handle them correctly. Specifically, find the block containing "/issue refuses
to run under bot identity (active: OpenGaryBot)." and add `text`; update the
blocks that begin with "**Observed:** <what's happening..." and "## /issue —
Mode A (direct file) → Open-Paws/<repo>" and "## /issue — Mode B → extracted N
candidates from input" and the lone "Filed:" and the quoted line starting with
"> from:" to use `markdown` as the fence language. Ensure each triple-backtick
fence is changed from ``` to ```text or ```markdown accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 204d431f-29af-49c4-9382-d4913b7af57d
📒 Files selected for processing (2)
.claude/rules/tooling-reference.mdclaude-code/.claude/skills/issue/SKILL.md
|
|
||
| Parse the active account. If it is `OpenGaryBot` (or any other bot identity matching `*Bot` / `*-bot`), refuse: | ||
|
|
||
| ``` |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Add language specifiers to fenced code blocks for accessibility.
Six fenced code blocks lack language specifiers, affecting screen readers and plain-text terminals. Coding guidelines require instruction files to work in editors with no syntax highlighting and screen readers.
♻️ Proposed fixes
Line 34: Add text or markdown identifier
-```
+```text
/issue refuses to run under bot identity (active: OpenGaryBot).Line 89: Add markdown identifier
-```
+```markdown
**Observed:** <what's happening or what the operator noticed; one paragraph max>Line 106: Add markdown identifier
-```
+```markdown
## /issue — Mode A (direct file) → Open-Paws/<repo>Line 155: Add markdown identifier
-```
+```markdown
## /issue — Mode B → extracted N candidates from inputLine 178: Add markdown identifier
-```
+```markdown
Filed:Line 226: Add markdown identifier
-```
+```markdown
> from: <one-sentence paraphrase or sanitized quote of the source>As per coding guidelines: "Instruction files must work in editors with no syntax highlighting, screen readers, and plain-text terminals (Accessibility)".
Also applies to: 89-89, 106-106, 155-155, 178-178, 226-226
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 34-34: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@claude-code/.claude/skills/issue/SKILL.md` at line 34, Several fenced code
blocks in SKILL.md are missing language specifiers; update each fenced block by
adding an appropriate language identifier (e.g., text or markdown) so screen
readers and plain-text editors handle them correctly. Specifically, find the
block containing "/issue refuses to run under bot identity (active:
OpenGaryBot)." and add `text`; update the blocks that begin with "**Observed:**
<what's happening..." and "## /issue — Mode A (direct file) → Open-Paws/<repo>"
and "## /issue — Mode B → extracted N candidates from input" and the lone
"Filed:" and the quoted line starting with "> from:" to use `markdown` as the
fence language. Ensure each triple-backtick fence is changed from ``` to ```text
or ```markdown accordingly.
…y input
Operator-only slash command. Takes anything from a one-sentence note to a
pasted meeting transcript and turns it into well-formed GitHub issues that
scout/triage would themselves accept. Auto-detects single-vs-batch — the
operator never declares a mode.
Three modes, deterministic detection:
- Mode A (≤3 sentences + resolvable repo): draft + sanitize + dedup-probe +
confirm + file. One issue, one prompt.
- Mode B (>3 sentences OR multi-item markers): decompose into candidates,
classify each as NEW / DUPLICATE_OF / ALREADY_RESOLVED / OUT_OF_SCOPE,
render approval table, file only the rows the operator approves. Never
silently drops a candidate.
- Mode C (ambiguous short input): exactly one clarifying question, no second.
Sensitivity sanitization (every body, both modes) per context-repo.md:
- public tier (most repos): strict strip — external individuals/orgs replaced
with role descriptors ("the funder", "a partner org rep"); internal URLs,
credentials, secrets removed; verbatim transcript/email content forbidden;
STAGE 13 confidentiality-leak self-check before emit.
- staff-ok tier (context repo): mild strip — internal staff names may stay,
external still stripped.
- private tier: no strip required, but never copy verbatim from a
confidential origin.
Hard rules (per pipeline-nevers.md):
- Never applies auto:approved, auto:auto-fixable, auto:requires-human, or
any override:* label — those are gates triage and humans own
- Never files a body containing raw transcript or email content
- Never silently drops a Mode B candidate
- Never infers repo from content keywords alone (explicit token / alias
whole-word match only — "there's an auth bug" does NOT become ai-security)
- --no-confirm is forbidden in Mode B (batch always requires approval)
- gh errors stop the run (no inline retry, no half-filed batches)
Bot-identity startup gate: refuses to run when gh auth status shows the
OpenGaryBot account active. The bot triages, the operator files. Mixing
creates a confusing audit trail per git-identity.md.
Repo aliases: bootstrap map for slingshot, platform, gary, no-animal-violence,
context, desloppify, graze, where-they-stand, ai-security, c4c-bootcamp,
mobius, avs, protein-research, ace, cryptpad-pm, n8n, privatemode-proxy,
api-gateway, project-compassionate-code, documentation, structured-coding,
.github. Operator extends over time.
Args: --repo overrides inference; --dry-run computes the full plan but never
files; --no-confirm skips the Mode A prompt (forbidden in Mode B).
Model: opus (mode detection, sensitivity reasoning, and candidate
extraction all benefit from frontier judgment; not mechanical enough for
Sonnet).
disable-model-invocation: true — operator-only.
Plus: extends .claude/rules/tooling-reference.md "Operator commands" section
with the /issue paragraph alongside /run /merge /unblock.
…zation, document run filename format, trim merge calibration cross-ref
b3c53f6 to
6b4739f
Compare
The startup gate manufactured an approval gate the pipeline doesn't need — `/issue` should run under whichever identity is active. Per auto-memory `feedback_issue_allows_bot_identity.md` and the new pipeline-nevers hard rule against manufactured gates, this section was re-introduced incorrectly. Drop it. Issue authorship under the bot is fine; the bot/operator split governs commits and automation only. Side effect: the only remaining unlabeled fence blocks were inside the deleted refusal text, so CodeRabbit's MD040 fence-language nits on this file are also resolved.
Summary
Adds
/issue, an operator-only slash command that takes anything from a one-sentence note to a pasted meeting transcript and turns it into well-formed GitHub issues thatscout/triagewould themselves accept. Auto-detects single-vs-batch — the operator never declares a mode.Same operator-command pattern as
/run//merge//unblock. Refuses to run under bot identity (the bot triages, the operator files).What it does
Mode A — input is ≤3 sentences AND a repo can be resolved → draft + sanitize + dedup-probe + confirm + file. One issue, one prompt.
Mode B — input is >3 sentences OR contains multi-item markers (bullets,
and also, paragraph breaks with topic shifts) → decompose into candidates, classify each as NEW / DUPLICATE_OF / ALREADY_RESOLVED / OUT_OF_SCOPE, render approval table, file only the rows the operator approves. Never silently drops a candidate —OUT_OF_SCOPErows show with a one-line reason.Mode C — ambiguous short input → exactly one clarifying question, no second.
Sensitivity sanitization (every body, both modes)
Per
~/.claude/rules/context-repo.md:the funder,a partner org rep); internal URLs, credentials, secrets removed; verbatim transcript/email content forbidden; STAGE 13 confidentiality-leak self-check before emit.Hard rules (per pipeline-nevers.md + context-repo.md)
auto:approved,auto:auto-fixable,auto:requires-human, or anyoverride:*label — those are gates triage and humans own; filing only setsstage:triagedplus type/severity/componentai-security. Misfiling is worse than asking--no-confirmis forbidden in Mode B (batch filing always requires explicit approval)gherrors stop the run (no inline retry, no half-filed batches; if the firstgh issue createin a batch fails, abort the rest and surface partial state explicitly)--force, no env-var override.Why bot-identity refusal
Issues filed by
/issuemust carry the operator's identity. Mixing operator-driven issue creation with bot identity creates a confusing audit trail (per~/.claude/rules/git-identity.mdthe bot is for commits/automation, not operator-driven issue creation). The bot triages; the operator files. Keep that line clean.Args
--repo <name>— explicit target repo. Overrides any inferred repo. In Mode B, applied as a default to all extracted candidates.--dry-run— compute the full plan (mode detection, repo inference, classification, draft) but never callgh issue create. Outputs everything that would be filed.--no-confirm— Mode A only: skip the confirm prompt and file immediately. Forbidden in Mode B.Repo aliases
Bootstrap map covering 24 nicknames (slingshot → slingshot-uk-phase1, platform, bot/gary, no-animal-violence, context, desloppify, graze, where-they-stand/wts, ai-security, c4c-bootcamp, mobius, avs, protein-research, ace, cryptpad-pm, n8n, privatemode-proxy, api-gateway, compassionate-code, documentation, structured-coding-with-ai, .github). Whole-word case-insensitive match. Operator extends over time.
Model
opus— mode detection, sensitivity reasoning, and candidate extraction all benefit from frontier judgment; not mechanical enough for Sonnet.disable-model-invocation: true— operator-only.Files changed
claude-code/.claude/skills/issue/SKILL.md— new skill (294 lines).claude/rules/tooling-reference.md— adds the ""Operator commands"" section with all four operator commands (/run, /merge, /unblock, /issue). Note: this section is also added by the open/run,/merge,/unblockPRs (feat(skills): /run — on-demand operator drive of the 14-stage pipeline #32, feat(skills): /merge — ranked merge queue with honest confidence scoring #33, feat(skills): /unblock — operator decisions queue, sensitivity-leak-safe #34); whichever merges first will require the others to rebase. This PR's version covers the full set.Test plan
The skill cannot be live-fired from the bot session that built it (the startup gate refuses, by design). Algorithm traces validated against the prompt's five test inputs:
'README links to a 404 on line 12' --repo .github→ drafts 3-section body, confirms, files. Title ≤80 chars; onlystage:triaged+type:docs+severity:trivial.--dry-run→ renders draft, appends(dry-run; nothing filed), nogh issue createcall.--no-confirmwould error out.'something's broken'→ one combined repo+intent question, no second question.'Dave from FoundationX said the dashboard is slow' --repo platform→ external individual + org name stripped, body uses ""a funder"" / ""the funder"".Closes nothing — there's no upstream issue for this work;
/issuewas specced directly.Summary by CodeRabbit
/run,/merge,/unblock, and/issuefor structured workflow control./issueskill for converting inputs into GitHub issues with mode-based drafting, approval workflows, repo inference, sanitization by sensitivity tier, and dry-run/confirmation safeguards.