issue-template
Skill3 starsChanged 5 days agoApache-2.0View on GitHub
Canonical issue body structure for SOVA, using the exact headings the SOVA triage quality gate scores. Auto-activates when creating, drafting, or rewriting an issue or ticket for the tracker.
In this repository44 other files it gives its agents.
- AGENTS.mdAGENTS.md
- templates/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- templates/CLAUDE.mdCLAUDE.md
- dashboard-designSkill
- database-patternsSkill
- design-systemSkill
- design-tasteSkill
- sova-address-prSkill
- sova-after-mergeSkill
- sova-agent-readinessSkill
- sova-audit-instructionsSkill
- sova-debugSkill
- sova-develop-explainSkill
- sova-develop-fullSkill
- sova-developSkill
- sova-extract-knowledgeSkill
- sova-find-taskSkill
- sova-health-auditSkill
- sova-ingest-reviewSkill
- sova-integrate-prSkill
- sova-issueSkill
- sova-new-featureSkill
- sova-optimize-knowledgeSkill
- sova-prSkill
- sova-rearrange-commitsSkill
- sova-researchSkill
- sova-review-fullSkill
- sova-review-prSkill
- sova-reviewSkill
- sova-simplifySkill
- sova-specSkill
- sova-standupSkill
- sova-statusSkill
- sova-testSkill
- sova-update-docsSkill
- testing-patternsSkill
- visual-auditSkill
- dashboard-designSkill
- database-patternsSkill
- design-tasteSkill
- issue-templateSkill
- testing-patternsSkill
- visual-auditSkill
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 0 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
When creating, drafting, or rewriting an issue for the tracker, produce the body below.
- Very specific: line 69
Start the body directly at
## Objective: No conversational framing. - Very specific: line 82
Keep every section, even when empty: Write None or To be determined by research rather than deleting a heading.
- Very specific: line 171
Put the summary in Jira's summary field.
- Very specific: line 173
Use issue keys such as PROJ-123 in ## Dependencies.
- Very specific: line 176
Use the parent field for epic membership instead of a "Part of epic" line.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Issue Body Template
When creating, drafting, or rewriting an issue for the tracker, produce the body
below. The headings are not stylistic: SOVA's triage role scores them
deterministically. A body that scores below the threshold is rewritten by an LLM
enrichment pass, or downgraded to needs_spec when enrichment is disabled or
falls short, so the issue waits instead of shipping. An issue written with this
template scores 8/8 and goes straight to the pipeline.
Canonical Body
## Objective
<One sentence: what needs to be done and why it matters.>
## Detailed Description
<The current behavior, the desired behavior, and the mechanism that gets from
one to the other. Name the functions, data, and call sites that change. Two to
six sentences beats a paragraph of background.>
## Acceptance Criteria
- [ ] <Binary, testable outcome.>
- [ ] <Second binary outcome.>
- [ ] All existing tests pass (`make check`)
- [ ] No new lint warnings (`make lint`)
## Files / Modules to Change
- [ ] `path/to/module.py`: <what changes there>
- [ ] `tests/test_module.py`: <coverage added>
## Out of Scope / Constraints
- <What must NOT be touched, and any constraint the implementation must respect.>
## Dependencies
None
## References
- Related: #<issue-number>
- Code: `path/to/module.py`Scoring Rules
compute_quality_score() in sova/roles/triage.py awards 8 points:
| Points | Requirement |
| 1 | ## Objective heading |
| 1 | ## Detailed Description heading |
| 2 | ## Acceptance Criteria heading AND a literal - [ ] somewhere in the body |
| 1 | ## Files / Modules to Change (or ## Files to Change, or ## Files) |
| 1 | ## Out of Scope / Constraints (or ## Out of Scope, ## Constraints, ## Scope Boundaries) |
| 1 | ## References heading, or any issue ref, URL, or backticked file path |
| 1 | No LLM preamble or postamble |
Non-negotiable rules, in the order they break issues:
- Every canonical section is exactly
##. The scorer's regex is^##\s+. A section written as###, or bolded as**Objective**, scores zero. - Acceptance criteria need at least one unchecked
- [ ]. A list of already-checked- [x]items fails the check, which costs 2 points and caps the body at 6/8. The check is also required independently of the total, so no threshold is low enough to let the issue through without it. Start the body directly at
## Objective. No conversational framing. Six line-initial patterns cost the LLM-leak point, matched case-insensitively against every line of the body:Here's a/an/the, and theHere is a/an/thespellingI'veorI havefollowed bycreated,written,drafted,prepared, orupdatedLet me, exceptLet me know, which is explicitly exemptSure,Certainly, orAbsolutelyfollowed by,,!, or.I'llFeel free toorDon't hesitate to
The match is anchored to the start of a line, so all of these stay safe mid-sentence.
- Keep every section, even when empty. Write
NoneorTo be determined by researchrather than deleting a heading.
## Objective, ## Detailed Description, ## Acceptance Criteria, and
## References are required. ## Files / Modules to Change,
## Out of Scope / Constraints, and ## Dependencies are recommended and may
hold a single placeholder line.
Dependencies Section Rules
parse_dependencies() in sova/supervisor/dependency_graph.py reads this
section to build the blocking graph, and it treats every #<number> it finds
as a real dependency.
- One reference per line, no prose. A phrase such as "unlike #123" in this
section creates a phantom blocking edge that stalls the issue until #123
closes. Put narrative references under
## Referencesinstead. - Exactly one
## Dependenciessection. A second one is ignored with a warning, so its entries silently do nothing. - The heading must be exactly
## Dependencieson its own line: the parser anchors on that and skips a heading with trailing text. - Write
Nonewhen there are none. Omitting the section is also valid, but keeping it makes the body uniform and prevents a stray#<number>elsewhere from being mistaken for a dependency later. Part of epic #<number>is safe here. Issues labeled as epics are skipped by the dependency gate, so an epic reference never deadlocks a child.- Self-references are dropped, so quoting the issue's own number is harmless.
Worked Example
## Objective
Cache the CodeRabbit quota lookup so the supervisor stops burning a GraphQL
call per poll cycle.
## Detailed Description
`_sync_quota()` in `sova/supervisor/coderabbit_quota.py` calls the GitHub API on
every poll, which at a 60 second interval consumes roughly 60 of the 5000 hourly
GraphQL points before any real work happens. Add a module-level cache keyed by
repo with a 300 second TTL and a single-flight lock so concurrent callers share
one request. An API failure must return `None` rather than caching an error, so
the next cycle retries instead of serving a poisoned entry.
## Acceptance Criteria
- [ ] A second `_sync_quota()` call within the TTL makes no API call
- [ ] Concurrent callers issue exactly one request
- [ ] An API failure is not cached and the next call retries
- [ ] All existing tests pass (`make check`)
## Files / Modules to Change
- [ ] `sova/supervisor/coderabbit_quota.py`: add the cache and single-flight lock
- [ ] `tests/test_coderabbit_quota.py`: TTL, concurrency, and failure cases
## Out of Scope / Constraints
- Do not change the quota thresholds or the gate that consumes them
- Do not add a persistent cache; in-memory per-process is sufficient
## Dependencies
None
## References
- Code: `sova/supervisor/coderabbit_quota.py`
- Related: the supervisor caching layer in `.claude/rules/architecture.md`Titles and Labels
- Title: imperative and specific, with no issue number and no type prefix. "Cache the CodeRabbit quota lookup" beats "Fix quota".
- Apply the labels the tracker already uses rather than inventing new ones. On
GitHub, read the existing set with
gh label list. - Multi-issue tracking containers get the epic label. They are skipped by the dependency gate and closed automatically once every child is done.
Jira-Backed Trackers
The same markdown headings apply. The Jira adapter converts the body through
_build_adf_doc(), which keeps each paragraph's text verbatim, so the headings
and checkboxes survive the round trip and the quality scorer runs on them
unchanged. Five differences:
- Every form of list survives.
_extract_text()walks the ADF tree recursively, so the editor's bullet, numbered, and checkbox controls all come back out with their items intact, a checkbox keeps its ticked or unticked state, a nested list keeps its indentation, and a- [ ]typed as plain text inside a paragraph keeps exactly one marker rather than gaining a second. An## Acceptance Criteriasection written any of those ways satisfieshas_acceptance_criteria. - Put the summary in Jira's
summaryfield. Do not repeat it as an#heading inside the body. - Use issue keys such as
PROJ-123in## Dependencies.parse_dependencies()matches GitHub's numeric#<number>syntax only, so Jira dependency lines are documentation for humans and are not machine-parsed into the blocking graph. - Use the
parentfield for epic membership instead of a "Part of epic" line. - Satisfy
## Referenceswith URLs or backticked code paths, since#<number>refs do not exist.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

