diff --git a/.agents/skills/triage-issues/SKILL.md b/.agents/skills/triage-issues/SKILL.md index 91ae41a9..dac5a327 100644 --- a/.agents/skills/triage-issues/SKILL.md +++ b/.agents/skills/triage-issues/SKILL.md @@ -7,7 +7,7 @@ Turn an unbounded issue queue into a short list of maintainer decisions. Three p ## Verdicts -- **FIX-READY** — a real bug with a traced mechanism (`root-cause:found` from intake, or traced during this sweep). Ready action: a one-line fix-backlog entry (file:line, mechanism, suggested fix shape) — these accumulate into the sweep's fix list for agents to implement. +- **FIX-READY** — a real bug with a traced mechanism (`root-cause:found` from intake, or traced during this sweep) and **no open PR for it** (see *Existing PR first*). Ready action: a one-line fix-backlog entry (file:line, mechanism, suggested fix shape) — these accumulate into the sweep's fix list for agents to implement. - **NEEDS-REPORTER** — cannot proceed without the reporter. Ready action: the single unanswerable question, posted once; the issue then lives on a clock (close as stale after ~30 days of silence). - **CLOSE-FIXED** — behavior fixed by a merged change. Ready action: close comment naming the commit/PR and the release that carries it. - **CLOSE-DUPLICATE** — same failure as an existing issue. Keep the issue with the better evidence, close the other naming it. @@ -17,6 +17,8 @@ Turn an unbounded issue queue into a short list of maintainer decisions. Three p - **"ні" (declined)** → post the drafted decline comment (with ache salvage where one underlies it) and close as not planned. - A conditional answer ("так, але тільки як настройка", "ні в такому вигляді, але X — так") is folded into the posted comment verbatim in spirit — the maintainer's condition becomes the recorded scope. +**Existing PR first.** Before any verdict that sends an issue toward implementation (FIX-READY, an `accepted` feature), find out whether someone already has the fix in flight: `gh pr list --search " OR OR " --state open`, plus the issue's own timeline (linked PRs, "opened a PR" comments — the reporter's fix is easy to miss when the PR body says `fixes #N` and the issue thread stays silent). An open PR moves the issue out of the fix backlog and into the PR queue: the ready action is a verdict on that PR (apply the `pr-review` skill), never a parallel in-house fix. A contributor who reported a bug and fixed it the same day, then watched a duplicate patch land on top, is owed a public apology and a changelog credit; the check costs one command. + ## Phase 1 — Mechanical sweep Fetch all open issues with `gh issue list --limit` above the real count. Bucket cheaply before any deep reading: @@ -27,7 +29,7 @@ Fetch all open issues with `gh issue list --limit` above the real count. Bucket | Dead needs-info | `needs-info` with no reporter reply > 30 days | close as stale | | Duplicate clusters | title/error-string similarity across open issues | CLOSE-DUPLICATE | | Feature wishes | `enhancement` | FEATURE-DECISION or CLOSE-DECLINE | -| Traced bugs | `root-cause:found` | FIX-READY candidates, verify the trace still applies | +| Traced bugs | `root-cause:found` | FIX-READY candidates, verify the trace still applies and no PR is open for it | ### Silently-fixed detection diff --git a/.opencode/commands/bug-work.md b/.opencode/commands/bug-work.md index 335dbfb1..974656de 100644 --- a/.opencode/commands/bug-work.md +++ b/.opencode/commands/bug-work.md @@ -7,7 +7,8 @@ Focus, if any: $ARGUMENTS The maintainer wants to fix real bugs without touching the GitHub UI. Run this as a conversation, not a report: 1. **Gather the menu.** `gh issue list --state open --label root-cause:found --json number,title,labels,comments` — bugs whose intake comment cites a traced mechanism with file:line. -2. **Propose 3–5 candidates**, one line each: the user-visible symptom, the traced mechanism (file:line), and rough size. Order by severity: data-loss and regression first, then whatever matches the maintainer's focus (an area, a platform, "щось маленьке"). Ask which to take — batches of related small fixes in one area are welcome. -3. **Verify before fixing.** Anchors age: confirm the cited mechanism still exists on current main (main moves fast). If it is gone, say so and mark the issue for a fixed-close instead of fixing air. -4. **Fix properly.** Follow AGENTS.md instruction order (matching skills — sync bugs demand `sync-state-invariants`, hot paths `performance-engineering`); minimal fix plus a regression test per local precedent; focused validation. -5. **Close the loop.** When the maintainer confirms and asks to commit, include `fixes #<N>` per bug in the commit message so GitHub closes the issues automatically. Never commit or push without being asked. +2. **Check for a PR in flight.** Before proposing anything, look for an open PR that already fixes it (`gh pr list --state open --search "<N> OR <error string>"`, and the issue's linked PRs). A candidate with an open PR is dropped from the menu and named as such — the fix belongs to its author; the work is reviewing their PR with the `pr-review` skill, never re-implementing it. +3. **Propose 3–5 candidates**, one line each: the user-visible symptom, the traced mechanism (file:line), and rough size. Order by severity: data-loss and regression first, then whatever matches the maintainer's focus (an area, a platform, "щось маленьке"). Ask which to take — batches of related small fixes in one area are welcome. +4. **Verify before fixing.** Anchors age: confirm the cited mechanism still exists on current main (main moves fast). If it is gone, say so and mark the issue for a fixed-close instead of fixing air. +5. **Fix properly.** Follow AGENTS.md instruction order (matching skills — sync bugs demand `sync-state-invariants`, hot paths `performance-engineering`); minimal fix plus a regression test per local precedent; focused validation. +6. **Close the loop.** When the maintainer confirms and asks to commit, include `fixes #<N>` per bug in the commit message so GitHub closes the issues automatically. Never commit or push without being asked. diff --git a/.opencode/commands/feature-work.md b/.opencode/commands/feature-work.md index 83f4029c..07dda109 100644 --- a/.opencode/commands/feature-work.md +++ b/.opencode/commands/feature-work.md @@ -7,8 +7,9 @@ Focus, if any: $ARGUMENTS The maintainer wants to start feature work without touching the GitHub UI. Run this as a conversation, not a report: 1. **Gather the menu.** `gh issue list -R openchamber/openchamber --state open --label accepted --json number,title,labels,comments` — these are features the maintainer already approved; the acceptance comment on each records the approved scope ("welcome shape"), which is binding. -2. **Propose 3–5 candidates**, one line each: what the user gets, rough size (small / medium / large by mechanism, never hours), and which areas it touches. Favor small wins and anything the maintainer's focus hints at. Ask which one to take (or accept "surprise me" — then pick the best value-to-size). -3. **Build it properly.** Re-read the issue and its acceptance comment for the approved scope; follow AGENTS.md instruction order (matching skills, owning DOCUMENTATION.md); implement with tests per local precedent; run the focused validation the change class requires. -4. **Close the loop.** When the maintainer confirms it works and asks to commit, include `fixes #<N>` in the commit message so GitHub closes the issue automatically. Never commit or push without being asked. +2. **Check for a PR in flight.** Before proposing anything, look for an open PR that already implements each candidate (`gh pr list --state open --search "<N> OR <title terms>"`, and the issue's linked PRs). If one exists, the feature is taken — say so and offer to review that PR with the `pr-review` skill instead of building a duplicate. +3. **Propose 3–5 candidates**, one line each: what the user gets, rough size (small / medium / large by mechanism, never hours), and which areas it touches. Favor small wins and anything the maintainer's focus hints at. Ask which one to take (or accept "surprise me" — then pick the best value-to-size). +4. **Build it properly.** Re-read the issue and its acceptance comment for the approved scope; follow AGENTS.md instruction order (matching skills, owning DOCUMENTATION.md); implement with tests per local precedent; run the focused validation the change class requires. +5. **Close the loop.** When the maintainer confirms it works and asks to commit, include `fixes #<N>` in the commit message so GitHub closes the issue automatically. Never commit or push without being asked. If nothing carries the `accepted` label yet, say so and suggest running `/triage-issues enhancements` first to build the menu. diff --git a/CHANGELOG.md b/CHANGELOG.md index dc75d54e..7f408752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ All notable changes to this project will be documented in this file. - Chat: dismissing the agent's questions without answering and sending a new task no longer leaves the session looking frozen on the dismissed question (thanks to @bashrusakh). - Usage: GitHub Copilot now shows a single AI Credits window, matching Copilot's token-based quota, in place of the old Chat Requests and Completions windows (thanks to @jakoss). - Updates: "Update OpenCode" no longer fails with a bare "Bad Request". OpenChamber now names the release to install, which recent OpenCode versions require, and when an update is refused the reason from OpenCode is shown instead of the HTTP status. This affects setups where OpenChamber runs an OpenCode you installed yourself; the desktop app bundles OpenCode and never offered the button (thanks to @yulia-ivashko). -- Chat: a saved draft or recalled message containing Windows line endings no longer replaces the chat with a "Selection points outside of document" error — text like this reached the input from reverted messages, message history and plugin output, and once it was saved as a draft the error came back on every visit to that session (thanks to @yulia-ivashko). +- Chat: a saved draft or recalled message containing Windows line endings no longer replaces the chat with a "Selection points outside of document" error — text like this reached the input from reverted messages, message history and plugin output, and once it was saved as a draft the error came back on every visit to that session (thanks to @mattv8 and @yulia-ivashko). - Desktop: a crashed renderer window now recovers automatically, while repeated crashes stop with a visible failure page instead of entering a reload loop (thanks to @wqpan). - Desktop: "Restart to Update" no longer looks dead when the update cannot be installed. The update window now shows the reason, including when the running copy was not installed from an official signed release, and the button stays available to retry (thanks to @yulia-ivashko). - Chat: very large tool results are capped before rendering instead of exhausting the renderer's memory and crashing the app (thanks to @JSap0914). diff --git a/packages/vscode/CHANGELOG.md b/packages/vscode/CHANGELOG.md index c81bf387..a14add9f 100644 --- a/packages/vscode/CHANGELOG.md +++ b/packages/vscode/CHANGELOG.md @@ -10,7 +10,7 @@ - Chat: pressing PageUp/PageDown in the prompt box, or moving the caret through a long prompt, no longer shifts the whole panel up and hides its top edge. - GitHub Copilot usage now shows a single AI Credits window, matching Copilot's token-based quota, in place of the old Chat Requests and Completions windows (thanks to @jakoss). - Updating OpenCode no longer fails with a bare "Bad Request": the extension names the release to install, which recent OpenCode versions require, and shows OpenCode's own reason when an update is refused (thanks to @yulia-ivashko). -- A saved draft or recalled message containing Windows line endings no longer replaces the chat with a "Selection points outside of document" error, and no longer brings the error back every time you reopen that session (thanks to @yulia-ivashko). +- A saved draft or recalled message containing Windows line endings no longer replaces the chat with a "Selection points outside of document" error, and no longer brings the error back every time you reopen that session (thanks to @mattv8 and @yulia-ivashko). - "Add Project" now adds the chosen folder to the workspace instead of failing with "Failed to add project" (thanks to @bashrusakh). - Multi-Run groups can now contain more than five models (thanks to @tomzx). - Chat: very large tool results are capped before rendering instead of exhausting the webview's memory and crashing it (thanks to @JSap0914).