agentleFS
xsovad06xsovad06/sova/.agents/skills/issue-template/SKILL.md

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.

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
  1. Very specific:

    When creating, drafting, or rewriting an issue for the tracker, produce the body below.

    line 8
  2. Very specific:

    Start the body directly at ## Objective: No conversational framing.

    line 69
  3. Very specific:

    Keep every section, even when empty: Write None or To be determined by research rather than deleting a heading.

    line 82
  4. Very specific:

    Put the summary in Jira's summary field.

    line 171
  5. Very specific:

    Use issue keys such as PROJ-123 in ## Dependencies.

    line 173
  6. Very specific:

    Use the parent field for epic membership instead of a "Part of epic" line.

    line 176

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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:

PointsRequirement
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
1No 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 the Here is a/an/the spelling
    • I've or I have followed by created, written, drafted, prepared, or updated
    • Let me , except Let me know, which is explicitly exempt
    • Sure, Certainly, or Absolutely followed by ,, !, or .
    • I'll
    • Feel free to or Don'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 None or To be determined by research rather 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 ## References instead.
  • Exactly one ## Dependencies section. A second one is ignored with a warning, so its entries silently do nothing.
  • The heading must be exactly ## Dependencies on its own line: the parser anchors on that and skips a heading with trailing text.
  • Write None when 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 Criteria section written any of those ways satisfies has_acceptance_criteria.
  • Put the summary in Jira's summary field. Do not repeat it as an # heading inside the body.
  • Use issue keys such as PROJ-123 in ## 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 parent field for epic membership instead of a "Part of epic" line.
  • Satisfy ## References with URLs or backticked code paths, since #<number> refs do not exist.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.