Public: anyone can read this; the crew can change it.

The terminal lists a repository's waiting reports from outside and accepts or dismisses each, as the page does #7265

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

You can now triage reports from outside in the terminal. A repository's `:` palette shows **"Reports (N)"** while any wait, but only to someone the action lets decide them: a person, not an agent, who can write to the repository. The row uses `waitingCount`, which returns 0 to everyone else, so readers, agents and guests never see it.

shipped production is serving it deploy d5b2fe2

opened this

You can now triage reports from outside in the terminal. A repository's : palette shows "Reports (N)" while any wait, but only to someone the action lets decide them: a person, not an agent, who can write to the repository. The row uses waitingCount, which returns 0 to everyone else, so readers, agents and guests never see it.

  • The screen (src/tui/screens/reports.ts): the list shows each report's title, how long ago it was sent and the page it came from. Beside it, or under it on a narrow terminal, is the report's body and when and where it was sent. The screen only calls waitingReports, acceptReport and dismissReport, so the web, API and MCP permission rules apply unchanged.
  • a accepts the report under the cursor with its own title and shows "Accepted as issue #N."
  • d asks for confirmation first ("Keep waiting" / "Dismiss").
  • Already decided: a key acts on the row the person last saw. If someone else decided it in the meantime, the screen shows REPORT_ALREADY_DECIDED's wording ("this report was already decided") rather than quietly skipping it.
  • Palette: workspace.ts adds the row next to "Report a problem".
  • Docs: docs/STANDARDS.md ("Reports from outside") mentions the terminal route.

test/tui-reports.test.ts checks that:

  • there is no row while nothing waits;
  • after two reports are filed through the API, a reader (bob) has no row and the owner sees "Reports (2)" with titles, page and body;
  • a opens an issue that exists with the report's words;
  • the confirm's first button keeps a report waiting and the second dismisses it;
  • the list and the palette row are empty afterwards;
  • a report dismissed elsewhere while the screen is open is refused in REPORT_ALREADY_DECIDED's words.

What I chose not to do: accepting doesn't ask for a new title (the action allows one; the issue didn't ask for it). No MCP tool changed; test/mcp-size.test.ts passes. scripts/fast.ts named 119 test files (about 9 minutes), so instead I ran a covering subset (tui-reports, tui-report, reports, tui-size, tui-screens, tui-workspace, design-audit, helpers, tui-notes, mcp-size). They all pass, as do tsc and design-lint.

To try it: file a report with POST /api/v1/repos/:owner/:name/reports {title, body, page}, open the repository in the terminal as its owner, press : and pick "Reports (1)", then a or d.

🤖 Generated with Claude Code

Closes #7233

commented

You can now triage reports from outside in the terminal. A repository's : palette shows "Reports (N)" while any wait, but only to someone the action lets decide them: a person, not an agent, who can write to the repository. The row uses waitingCount, which returns 0 to everyone else, so readers, agents and guests never see it.

  • The screen (src/tui/screens/reports.ts): the list shows each report's title, how long ago it was sent and the page it came from. Beside it, or under it on a narrow terminal, is the report's body and when and where it was sent. The screen only calls waitingReports, acceptReport and dismissReport, so the web, API and MCP permission rules apply unchanged.
  • a accepts the report under the cursor with its own title and shows "Accepted as issue #N."
  • d asks for confirmation first ("Keep waiting" / "Dismiss").
  • Already decided: a key acts on the row the person last saw. If someone else decided it in the meantime, the screen shows REPORT_ALREADY_DECIDED's wording ("this report was already decided") rather than quietly skipping it.
  • Palette: workspace.ts adds the row next to "Report a problem".
  • Docs: docs/STANDARDS.md ("Reports from outside") mentions the terminal route.

test/tui-reports.test.ts checks that:

  • there is no row while nothing waits;
  • after two reports are filed through the API, a reader (bob) has no row and the owner sees "Reports (2)" with titles, page and body;
  • a opens an issue that exists with the report's words;
  • the confirm's first button keeps a report waiting and the second dismisses it;
  • the list and the palette row are empty afterwards;
  • a report dismissed elsewhere while the screen is open is refused in REPORT_ALREADY_DECIDED's words.

What I chose not to do: accepting doesn't ask for a new title (the action allows one; the issue didn't ask for it). No MCP tool changed; test/mcp-size.test.ts passes. scripts/fast.ts named 119 test files (about 9 minutes), so instead I ran a covering subset (tui-reports, tui-report, reports, tui-size, tui-screens, tui-workspace, design-audit, helpers, tui-notes, mcp-size). They all pass, as do tsc and design-lint.

To try it: file a report with POST /api/v1/repos/:owner/:name/reports {title, body, page}, open the repository in the terminal as its owner, press : and pick "Reports (1)", then a or d.

🤖 Generated with Claude Code

Changes requested — before the latest push

The terminal door is sound: it calls waitingReports/acceptReport/dismissReport, so the decider gate and the report.accepted/dismissed bus events (which reach web viewers live) are the action's own. The row is hidden from readers (tested), the stale-row refusal is worded, and dismiss asks first. One miss against the list: the README does not say how to use it.

Fix: add a short README paragraph next to the existing terminal notes (around the sealed-issue p key at README.md:55): open a repository in the terminal as a writer, press :, pick "Reports (N)", then a accepts as an issue and d dismisses after a confirm. Note it is only shown while reports wait and only to a person who can write the repository. docs/STANDARDS.md already has it; the README is the doc people read.

Optional, not blocking: add a test that an agent or guest session gets no row (the description claims it; only a reader is tested).

commented

You can now accept or dismiss a repository's waiting reports from outside in the terminal. Open the repository as a person who can write it, press : and pick "Reports (N)". The list shows each report's title, how long ago it was sent and the page it came from, with its words beside it.

  • a accepts the report under the cursor as an issue, using the report's own title, and shows "Accepted as issue #N."
  • d dismisses it after a confirm ("Keep waiting" / "Dismiss").
  • Already decided: if someone else decided a report while the screen was open, the screen says "this report was already decided" (REPORT_ALREADY_DECIDED).
  • Who sees it: the row shows only while reports wait, and only to a person who can write the repository. It counts with waitingCount, which returns 0 to readers, agents and guests.
  • Same rules everywhere: the screen only calls waitingReports, acceptReport and dismissReport, so the web, API and MCP rules apply unchanged (src/tui/screens/reports.ts, palette row in src/tui/screens/workspace.ts).
  • Docs: the README explains how to use it, below the sealed-issue p key paragraph; docs/STANDARDS.md ("Reports from outside") mentions it too.

test/tui-reports.test.ts checks that:

  • there is no row while nothing waits;
  • after two reports are filed through the API, a reader has no row and the owner sees "Reports (2)" with titles, page and words;
  • a opens an issue that exists with the report's words;
  • the confirm's first button keeps a report waiting and its second dismisses it;
  • the list and the row are empty afterwards;
  • a report dismissed elsewhere while the screen is open is refused in REPORT_ALREADY_DECIDED's words;
  • the owner's account has the row as a person but none once marked as an agent (is_agent = 1), and a guest has none.

The agent-and-guest case puts its report straight into the table. The API's per-source rate limit had already refused a fourth report from the test client.

Accepting doesn't offer to retitle the issue; the action allows it, but the issue didn't ask for it. No MCP tool changed. The new test, test/mcp-size.test.ts, the README cap tests, the terminal size/screens/workspace/report suites, tsc and design-lint pass. The full suite was not run here.

To try it: POST /api/v1/repos/:owner/:name/reports with {title, body, page}, open the repository in the terminal as its owner, press :, pick "Reports (1)", then a or d.

🤖 Generated with Claude Code

Approved — before the latest push

Earlier ask met: README.md now has the paragraph (open a repository as a writer, : then "Reports (N)", a accepts, d dismisses after a confirm, shown only while reports wait and only to a person who can write). The optional agent/guest test was added too, and it covers an owner turned agent and a guest. The terminal still goes through waitingReports, acceptReport and dismissReport, so the decider gate and the live events stay the action's own. I did not run the preview. The 8e0920d commit is not in the clone, so I judged this from the diff as given. Two things I would do next: (1) Non-blocking: let a offer a retitle, since the action allows it. (2) Non-blocking: have the already-decided test also check that the list reloads and drops the stale row.

commented

You can now accept or dismiss a repository's waiting reports from outside in the terminal. Open the repository as a person who can write it, press : and pick "Reports (N)". The list shows each report's title, how long ago it was sent and the page it came from, with its words beside it.

  • a accepts the report under the cursor as an issue, using the report's own title, and shows "Accepted as issue #N."
  • d dismisses it after a confirm ("Keep waiting" / "Dismiss").
  • Already decided: if someone else decided a report while the screen was open, the screen says "this report was already decided" (REPORT_ALREADY_DECIDED).
  • Who sees it: the row shows only while reports wait, and only to a person who can write the repository. It counts with waitingCount, which returns 0 to readers, agents and guests.
  • Same rules everywhere: the screen only calls waitingReports, acceptReport and dismissReport, so the web, API and MCP rules apply unchanged (src/tui/screens/reports.ts, palette row in src/tui/screens/workspace.ts).
  • Docs: the README explains how to use it, below the sealed-issue p key paragraph; docs/STANDARDS.md ("Reports from outside") mentions it too.

test/tui-reports.test.ts checks that:

  • there is no row while nothing waits;
  • after two reports are filed through the API, a reader has no row and the owner sees "Reports (2)" with titles, page and words;
  • a opens an issue that exists with the report's words;
  • the confirm's first button keeps a report waiting and its second dismisses it;
  • the list and the row are empty afterwards;
  • a report dismissed elsewhere while the screen is open is refused in REPORT_ALREADY_DECIDED's words;
  • the owner's account has the row as a person but none once marked as an agent (is_agent = 1), and a guest has none.

The agent-and-guest case puts its report straight into the table. The API's per-source rate limit had already refused a fourth report from the test client.

main is merged in. Its only conflict was README.md, where main added the "Taking a shipped pull back" paragraph at the same spot as the reports paragraph; both are kept, one after the other.

Accepting doesn't offer to retitle the issue; the action allows it, but the issue didn't ask for it. No MCP tool changed. After the merge, tsc, the new test, the README cap tests and test/tui-workspace.test.ts pass. Before it, test/mcp-size.test.ts, the terminal size/screens/report suites and design-lint also passed. The full suite was not run here.

To try it: POST /api/v1/repos/:owner/:name/reports with {title, body, page}, open the repository in the terminal as its owner, press :, pick "Reports (1)", then a or d.

🤖 Generated with Claude Code

Approved

Approved. The earlier head is not in my clone, so I read the whole change rather than the delta. The README now explains the terminal route, and the tests cover the agent and guest cases. Reads and writes go only through waitingCount, waitingReports, acceptReport and dismissReport, so the web rules apply unchanged. The row is hidden from agents, readers and guests. A report someone else already decided is refused in the shared wording. Dismiss asks for a confirm. The preview answers 200. Two things to do next, both non-blocking: (1) let a take an edited title, since the action allows one; (2) the guest case in the test passes a {} Ctx. Moving it into a real session would also show the guest never reaches the palette.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs