Files
EOS/docs/agents/issue-tracker.md
T
Bobby NoelteandClaude Opus 5.5 dd41e5d57c chore(ai): add agent self-review and a CI check for agent-assisted PRs
Additional changes
Agents write a task plan to .scratch/<branch>/plan.md and self-review with code-review
Agents fix hard violations, report judgement calls and rerun the self-review before every push
Agents declare the review in a Self-review section of the pull request body
Add the ai-self-review workflow and scripts/check_pr_self_review.py for pull requests into main
Detect agents by Assisted-by or Anthropic Co-Authored-By trailers, body markers or the AI box
Fail only on a missing Self-review section or a missing, malformed or stale Reviewed SHA
Note an unticked AI-assisted box and malformed optional lines without failing
Comment on the pull request how to fix a failure and update that one comment on later runs
Show the same report in the job summary and accept Windows line endings in the body
Skip dependabot and release pull requests
Run on pull_request_target with the base branch's script, never pull request code
Add the pull request template: the pr skill's sections plus Checklist and Self-review
Require always valid optimization parameters in the energy-domain skill
Require datetimeutil for date and time handling in new and changed code in AGENTS.md
Require the Assisted-by trailer on agent commits in the commit-messages skill
Add tests for the check in tests/test_ai.py
Add GLOSSARY.md and the agent tracker docs in docs/agents/
Add decision record docs/adr/0001 with an ADR index in the docs toctree
Document the workflow in docs/develop/ai.md and CONTRIBUTING.md
Exclude docs/agents from Sphinx and PyMarkdown and ignore .scratch/
Document cz check instead of make gitlint for commit messages in docs/develop/ai.md

Assisted-by: Claude Code (claude-opus-5-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 15:37:33 +01:00

5.1 KiB

Issue tracker: GitHub

Issues and specs for this repo live as GitHub issues of Akkudoktor-EOS/EOS. Use the gh CLI for all operations.

Conventions

  • Create an issue: gh issue create --title "..." --body "...". Use a heredoc for multi-line bodies.
  • Read an issue: gh issue view <number> --json number,title,body,labels,comments.
  • List issues: gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]' with appropriate --label and --state filters.
  • Make an issue a sub-issue of a parent: gh issue create --parent <parent> ..., or gh issue edit <parent> --add-sub-issue <child> afterwards (gh 2.94+). Older gh: gh api --method POST repos/<owner>/<repo>/issues/<parent>/sub_issues -F sub_issue_id=<child-db-id> (database id, as in Blocking below). Without sub-issues, put Part of #<parent> at the top of the child body.
  • Blocking: GitHub's native issue dependencies, the canonical, UI-visible representation. Add an edge with gh issue create --blocked-by <n>,<n> ... or gh issue edit <child> --add-blocked-by <blocker> (gh 2.94+). Older gh: gh api --method POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>, where <blocker-db-id> is the blocker's numeric database id (gh api repos/<owner>/<repo>/issues/<n> --jq .id, not the #number or node_id). Where dependencies aren't available, fall back to a Blocked by: #<n>, #<n> line at the top of the child body. A ticket is unblocked when every blocker is closed.
  • Count open blockers: gh api repos/<owner>/<repo>/issues/<n> --jq .issue_dependencies_summary.blocked_by (open blockers only; 0 means startable). gh issue view <n> --json blockedBy also lists closed blockers, so filter it: --jq '[.blockedBy.nodes[] | select(.state == "OPEN")] | length'.
  • Comment on an issue: gh issue comment <number> --body "..."
  • Apply / remove labels: gh issue edit <number> --add-label "..." / --remove-label "..."
  • Close: post the explanation with gh issue comment <number> --body "...", then gh issue close <number>. On an already-closed issue, gh issue close --comment drops the comment and still exits 0.

The tracker is the upstream repository Akkudoktor-EOS/EOS, not a contributor's fork. Pass --repo Akkudoktor-EOS/EOS to every gh issue command, because a clone of a fork may resolve to the fork.

Reading issues needs no confirmation. Before creating, editing, labelling, commenting on or closing an issue, show the content to the user and wait for their go: these are public actions in the upstream project. Never file into mattpocock/skills (the repo these skills come from).

Labels are created by the EOS maintainers only; do not run gh label create.

Pull requests as a triage surface

PRs as a request surface: no. (Set to yes if this repo treats external PRs as feature requests; /triage reads this flag.)

When set to yes, PRs run through the same labels and states as issues, using the gh pr equivalents:

  • Read a PR: gh pr view <number>, then gh pr view <number> --comments (off a TTY, --comments prints only the comments, not the body), and gh pr diff <number> for the diff.
  • List external PRs for triage: gh api --paginate 'repos/{owner}/{repo}/pulls?state=open' --jq '.[] | select(.author_association | IN("OWNER","MEMBER","COLLABORATOR") | not) | {number, title, author: .user.login, author_association, labels: [.labels[].name]}'.
  • Comment / label / close: gh pr comment, gh pr edit --add-label/--remove-label, gh pr close.

GitHub shares one number space across issues and PRs, so a bare #42 may be either: resolve with gh pr view 42 and fall back to gh issue view 42.

When a skill says "publish to the issue tracker"

Create a GitHub issue.

When a skill says "fetch the relevant ticket"

Read it as in Read an issue above.

Wayfinding operations

Used by /wayfinder. The map is a single issue with child issues as tickets.

  • Map: a single issue labelled wayfinder:map, holding the Notes / Decisions-so-far / Fog body. gh issue create --label wayfinder:map.
  • Child ticket: an issue linked to the map as a GitHub sub-issue (see Make an issue a sub-issue of a parent). Where sub-issues aren't enabled, add the child to a task list in the map body and put Part of #<map> at the top of the child body. Labels: wayfinder:<type> (research/prototype/grilling/task). Once claimed, the ticket is assigned to the driving dev.
  • Blocking: see Blocking under Conventions.
  • Frontier query: list the map's open children (gh issue list --state open, scoped to the map's sub-issues / task list), drop any with an open blocker (see Count open blockers, or an open issue in the Blocked by line) or an assignee; first in map order wins.
  • Claim: gh issue edit <n> --add-assignee @me, the session's first write.
  • Resolve: gh issue comment <n> --body "<answer>", then gh issue close <n>, then append a context pointer (gist + link) to the map's Decisions-so-far.