Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .github/ISSUE_TEMPLATE/1-bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: 🐛 Bug
description: Something behaves incorrectly and you can show it.
title: "bug: "
labels: ["type:bug", "needs:triage"]
body:
- type: markdown
attributes:
value: |
Lead with the error. A worked example lives in
[EXAMPLE.md](../blob/HEAD/.github/ISSUE_TEMPLATE/EXAMPLE.md).

- type: textarea
id: problem
attributes:
label: Problem
description: The symptom you observed, in one or two sentences. Not your theory.
placeholder: Agent runs abort at ~70% of the context limit with BudgetExceeded.
validations:
required: true

- type: textarea
id: evidence
attributes:
label: Error output
description: Full traceback, failing assertion, alert, or log line. Redact secrets.
render: shell
validations:
required: true

- type: textarea
id: reproduce
attributes:
label: Reproduction
description: Exact commands from a clean checkout. A failing test is ideal.
value: |
1. `git clone … && cd …`
2. `uv sync`
3. `pytest tests/test_x.py::test_y`
render: shell
validations:
required: true

- type: input
id: expected
attributes:
label: Expected behavior
placeholder: Budget reports the actual measured token count.
validations:
required: true

- type: input
id: version
attributes:
label: Version / commit
description: Release tag or full commit SHA. "latest" is not a version.
placeholder: v0.9.3 or 4f2a1c9
validations:
required: true

- type: dropdown
id: severity
attributes:
label: Severity
description: This routes triage. Be honest; inflation gets ignored.
options:
- S4 — cosmetic or minor annoyance
- S3 — degraded, workaround exists
- S2 — major function broken, no workaround
- S1 — production down, data loss, or security exposure
validations:
required: true

- type: dropdown
id: env
attributes:
label: Environment
multiple: true
options: [local (macOS), local (Linux), CI (GitHub Actions), dev, staging, prod]
validations:
required: true

- type: input
id: regression
attributes:
label: Last known good version
description: Leave blank if it never worked. If set, a bisect range is implied.
placeholder: v0.9.1

- type: textarea
id: context
attributes:
label: Anything else
description: Suspected cause, related issues, screenshots, workaround in use.

- type: checkboxes
id: gates
attributes:
label: Before submitting
options:
- label: I searched open and closed issues for a duplicate.
required: true
- label: I reproduced this on the latest release or main.
required: true
- label: No secrets, tokens, or customer data appear anywhere above.
required: true
79 changes: 79 additions & 0 deletions .github/ISSUE_TEMPLATE/2-feature.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: ✨ Feature
description: Propose a capability that does not exist yet.
title: "feat: "
labels: ["type:feature", "needs:triage"]
body:
- type: textarea
id: problem
attributes:
label: Problem
description: The user-facing pain, not the solution. Who is blocked, and on what?
placeholder: Operators cannot tell which agent consumed a token budget, so cost overruns are diagnosed by guesswork.
validations:
required: true

- type: textarea
id: today
attributes:
label: What you do today
description: The current workaround and its cost in time, money, or risk.
validations:
required: true

- type: textarea
id: proposal
attributes:
label: Proposed behavior
description: What should exist. Include the interface — CLI flag, API shape, config key.
render: shell
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Options you rejected and why. "None" usually means the problem is underexplored.
validations:
required: true

- type: textarea
id: done
attributes:
label: Definition of done
description: Observable, checkable outcomes. This becomes the acceptance criteria.
value: |
- [ ]
- [ ]
validations:
required: true

- type: dropdown
id: scope
attributes:
label: Scope
options:
- S — under a day, one file or module
- M — a few days, one repo
- L — multi-repo or migration required
- XL — needs a design doc first
validations:
required: true

- type: dropdown
id: breaking
attributes:
label: Breaking change?
options: ["No", "Yes — behind a flag", "Yes — requires a major bump"]
validations:
required: true

- type: checkboxes
id: gates
attributes:
label: Before submitting
options:
- label: I searched for an existing request covering this.
required: true
- label: This is a concrete capability, not an open-ended question (those go to Discussions).
required: true
45 changes: 45 additions & 0 deletions .github/ISSUE_TEMPLATE/3-task.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: 🔧 Task
description: Known work with a known solution — chore, refactor, infra, docs.
title: "chore: "
labels: ["type:task"]
body:
- type: textarea
id: problem
attributes:
label: Problem
description: Why this work exists. What breaks or degrades if it is never done?
validations:
required: true

- type: textarea
id: work
attributes:
label: Work
description: The steps. Each line should be independently verifiable.
value: |
- [ ]
- [ ]
validations:
required: true

- type: dropdown
id: kind
attributes:
label: Kind
options: [chore, refactor, infra / IaC, CI / CD, docs, dependency bump, test coverage]
validations:
required: true

- type: textarea
id: risk
attributes:
label: Risk and rollback
description: Blast radius if this goes wrong, and how to undo it.
validations:
required: true

- type: input
id: blocks
attributes:
label: Blocks / blocked by
placeholder: "blocked by #1191, blocks #1204"
90 changes: 90 additions & 0 deletions .github/ISSUE_TEMPLATE/4-incident.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: 🚨 Incident
description: Production is degraded or down. File first, investigate second.
title: "incident: "
labels: ["type:incident", "sev:untriaged", "priority:P0"]
assignees: []
body:
- type: markdown
attributes:
value: |
**Page first, file second.** If customers are affected and nobody is paged,
stop and page on-call. This issue is the written record, not the alarm.
If this is a security compromise, use a private advisory instead — not this form.

- type: input
id: started
attributes:
label: Detected at (UTC)
placeholder: "2026-07-28T15:04:00Z"
validations:
required: true

- type: textarea
id: problem
attributes:
label: Problem
description: Customer-visible symptom. What is broken, for whom, since when?
validations:
required: true

- type: dropdown
id: severity
attributes:
label: Severity
options:
- S1 — full outage, data loss, or security exposure
- S2 — major degradation, no workaround
- S3 — partial degradation, workaround in place
validations:
required: true

- type: textarea
id: evidence
attributes:
label: Signal
description: Alert name, dashboard link, error rate, sample traceback.
render: shell
validations:
required: true

- type: textarea
id: impact
attributes:
label: Blast radius
description: Services, regions, tenants, and estimated request or user count.
validations:
required: true

- type: textarea
id: mitigation
attributes:
label: Mitigation in progress
description: What is being done right now. Update this field as it evolves.
validations:
required: true

- type: input
id: suspect
attributes:
label: Suspected trigger
description: Deploy, PR, config change, or upstream provider. Link it.
placeholder: "#1184, deployed 14:52Z"

- type: input
id: commander
attributes:
label: Incident commander
placeholder: "@handle"
validations:
required: true

- type: checkboxes
id: gates
attributes:
label: Response checklist
options:
- label: On-call paged.
required: true
- label: Status page or stakeholder comms updated, or explicitly not needed.
- label: Timeline is being kept in the comments below.
- label: Postmortem issue will be opened within 48h of resolution.
54 changes: 54 additions & 0 deletions .github/ISSUE_TEMPLATE/EXAMPLE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<!-- WORKED EXAMPLE — the standard for a bug report in this org.
This is what the 🐛 Bug form looks like when filled in well. Reference it. -->

# bug: token budget aborts runs at ~70% of the real context limit

**Problem**
Long agent runs abort well before the context limit. Operators see `BudgetExceeded`
at roughly 122k actual tokens against a 200k limit, so ~40% of usable context is
unreachable.

**Error output**
```
agentkit.budget.BudgetExceeded: 198,004 / 200,000 tokens at turn 42
at agentkit/budget.py:88 in BudgetTracker.check
(independently measured context via tiktoken: 122,311 tokens)
```

**Reproduction**
```
1. git clone git@github.com:acme/agentkit && cd agentkit && git checkout v0.9.3
2. uv sync
3. pytest tests/replay/test_long_run.py::test_42_turns -> fails at turn 42
```

**Expected behavior**
The tracker reports the actual measured token count, so runs continue to the real limit.

**Version / commit** — v0.9.3 (`4f2a1c9`)
**Severity** — S2 — major function broken, no workaround
**Environment** — local (macOS), CI (GitHub Actions), prod
**Last known good version** — v0.8.7, so the regression is in the 0.9.0 reducer rewrite

**Anything else**
Reported usage is consistently ~1.45x measured, and the ratio tracks the count of
tool-result messages — suggesting those are counted twice. `BudgetTracker.add()`
appears to be called from both `transport.py:212` and `reducer.py:96`. Workaround in
use: `AGENTKIT_BUDGET_LIMIT=290000` on the four affected agents, which is unsafe
because the real ceiling is then unenforced.

**Before submitting** — searched (#902 is related but closed as fixed), reproduced on
main at `4f2a1c9`, trace excerpts scrubbed by `scripts/scrub_trace.py`.

---

## Why this is a good report

- The **problem** is the symptom an operator saw, not a theory about the cause.
- The traceback is complete, and it includes an **independent measurement** that
proves the number is wrong rather than merely surprising.
- Reproduction starts from a clean clone at a pinned SHA.
- **Last known good** turns a vague bug into a bisect range.
- The theory is present but quarantined in "anything else", below the facts.
- The workaround is stated **along with why it is unsafe**, which is what makes this
urgent rather than merely annoying.
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: 🔐 Report a security vulnerability
url: https://github.com/Quantum-L9/.github/security/advisories/new
about: Do NOT open a public issue. Use a private security advisory.
- name: 💬 Question or design discussion
url: https://github.com/orgs/Quantum-L9/discussions
about: Open-ended questions, architecture debate, and "how do I…" belong in Discussions.
- name: 📕 Documentation
url: https://github.com/Quantum-L9/Cursor-Governance/blob/main/CANONICAL_LAW.md
about: Check the runbooks and reference before filing.
Loading