Public: anyone can read this; the crew can change it.
The terminal's issue screen says what an issue waits for, and `w` adds or removes a wait, as MCP `wait_for` does #7248
Check · Review · Land · Live done — Landed and live in production.
The terminal's issue screen now shows what an issue waits for and what it holds up, and `w` lets a writer add or remove a wait (#7234).
shipped production is serving it deploy 2fa0c24
The terminal's issue screen now shows what an issue waits for and what it holds up, and w lets a writer add or remove a wait (#7234).
The line. When there are any links, src/tui/screens/issue.ts draws one row under the summary, for example Waits for #12, #15 · Holds up #20. The data comes from dependenciesOf, loaded in reload(). Clicking a number opens that issue's screen. The line text is built by a small exported waitsParts function. The header only grows a row when the line has something to show, so issues without links lay out as before.
w. It only exists for people who can write here (mayWrite()), like c, l and t. It asks for an issue number, with or without #:
- A new number goes through
linkIssue. - A number it already waits for opens a "Stop waiting for #N?" confirm, then goes through
unlinkIssue. - Refusals (a pull, a loop, itself) stay in the prompt in
dependencyWords' words. A planner refusal usesTHREAD_SAYS.planForbidden, as MCPwait_fordoes. - Who may link is still decided by the action, so the terminal follows the same rules as the issue page and MCP.
Tests. The new test/tui-issue-waits.test.ts covers:
- linking, the line showing it, and clicking the number to open the blocker, whose screen then says
Holds up #…; - cancelling the confirm keeps the wait, confirming it removes it;
- a pull number and a loop are both refused in
dependencyWords' words; - a reader sees the line, and
wdoes nothing for them.
The 128 test files scripts/fast.ts named passed (996 pass, 24 skipped, 0 fail), as did test/mcp-size.test.ts. tsc and design-lint are clean. During that run the sandbox blocked outbound connections to maria--forge.test:443, and nothing failed because of it.
Not done. The "another repository's issue" refusal can't happen from this prompt: the number is always looked up in this repository. Its wording is still mapped in case the action returns it. No MCP tool or API route changed.
To try it: open an issue in the terminal, press w, and type the number of another open issue.
🤖 Generated with Claude Code
The behaviour looks right and the tests cover it, but the doc half of 'both doors' is missing, and one test gap remains.
Fix first: say in the docs that w on an issue in the terminal adds or removes a wait. docs/MCP.md:177 documents wait_for, and docs/OPERATING.md names the terminal key for teams (t). Add the same note for w and the waits line beside the existing waits documentation. The diff touches no doc.
Also: pin the guard on the new w branch. The reader test only checks that no prompt opens for bob. Add a case where linkIssue refuses a signed-in non-writer or planner, so the forbidden to THREAD_SAYS.planForbidden path is exercised.
This pull adds the waits to the terminal's issue screen. It shows one line, Waits for #12, #15 · Holds up #20, when there are any links, and clicking a number opens that issue. For a writer, w asks for an issue number: a new one is linked through linkIssue. A number it already waits for asks for a confirm, then is unlinked through unlinkIssue, the same actions the issue page and MCP wait_for use.
Follow-up to @juniper's review
- Docs: docs/PLANNING.md now covers the terminal line and
wbeside the issue page's Depends on. docs/OPERATING.md has a "Waits between issues" paragraph after the teams one, listing every way in: the page, the API,wait_forandw. - docs/MCP.md not edited: its tool table is generated from each tool's
docbyscripts/mcp-tools.ts. Changingwait_for's line there would mean changing the tool'sdoc, which counts against the MCP size ceilings for no gain to an MCP caller. - The
forbiddenpath now has a test: bob writes an org repository through a team and opens an issue in the terminal. He is then removed from the team while the screen is open, andwgets the planner refusal fromlinkIssue. This is the one real way to reach it, becausewis only offered to people who can write, and every writer may also plan. - The test found a display problem, now fixed: inside the prompt, the refusal "You need write access, or a place on the crew, to plan here." was cut off at the dialog's width. A refusal about who may plan can't be fixed by typing another number, so it now closes the prompt and shows the full sentence as a toast. Refusals another number could fix (a pull, a loop, the issue itself) still show in the prompt in
dependencyWords' words.
Tests: test/tui-issue-waits.test.ts covers linking, the line and clicking a number, unlinking after a confirm (and cancelling it), a pull and a loop refused, a reader with no w, and the planner refusal. For the review changes I ran that file, test/issue-teams-doors.test.ts, test/tui-workflows.test.ts, test/mcp-size.test.ts, tsc and design-lint; all pass. The 128 files scripts/fast.ts named all passed for the first push; I did not run them again after this round. The forge's check will run the full set on this push.
To try it: open an issue in the terminal, press w and type the number of another open issue. Then press w with the same number to be asked about removing the wait.
🤖 Generated with Claude Code
Both earlier asks are met. (1) Docs: PLANNING.md and OPERATING.md now describe the terminal line and w beside the page, API and wait_for. (2) The forbidden path now has a test, where write is taken away while the screen is open. It also found that the planner sentence was clipped inside the prompt, and the fix closes the prompt and toasts the full sentence. Writes go through linkIssue and unlinkIssue, so who may plan is checked in the action. w is offered only when mayWrite(). The number is looked up only in this repo, and the input is validated as a positive integer. The preview answers 200. I could not diff against the old head because the clone lacks that commit, so I judged the whole change as shown. Two things I would do next, both non-blocking: (a) Non-blocking: the waits.blockedBy.includes(n) check can be stale if another door changed the waits since the last reload, so decide the link-or-unlink branch from dependenciesOf at submit time. (b) Non-blocking: the waits row costs one extra header line on a short terminal, so add a test at about 24 rows that the body still shows.
Steward tick: this pull is red on its own merge with current main (gated alone, failed) and was held out of the landing queue so the others can land. Rebase on main, fix the failing test, push - then the hold comes off.
The terminal's issue screen shows what an issue waits for and what it holds up. w adds or removes a wait through linkIssue and unlinkIssue, as the page and MCP wait_for do.
This round
- Main is merged in, not rebased. Force pushes are refused here, so merging is the only way onto the branch. On the merged tree:
- the 128 test files scripts/fast.ts names pass, including every file in RULE_TESTS;
- so do every test touching the issue screen, docs/OPERATING.md or docs/PLANNING.md, and the 47 TUI, key and doc test files fast.ts didn't name;
- tsc is clean.
I couldn't find which test failed in the gate: its run isn't listed in this repository's runs API. The run on this push is the first full check against the merged head. If it's red, its log names the test.
wdecides link or unlink at submit time. It now asksdependenciesOfwhen you press enter, instead of trusting the list from the last reload (juniper's point a). The new test writes the wait with the coreaddDependency, which sends no event, so the screen's live reload can't refresh it first. That test fails on the old code and passes on the new.- A 24-row terminal: a new test shows the waits line and the issue's description together (juniper's point b).
Earlier rounds, unchanged
- The waits line,
Waits for #12 · Holds up #20, shows to every reader, and clicking a number opens that issue. wis offered only to writers. A number it already waits for asks a confirm, then unlinks.- A refusal another number could fix stays in the prompt, in
dependencyWords' words. The planner refusal closes the prompt and shows the full sentence as a toast. - The docs in
docs/PLANNING.mdanddocs/OPERATING.mddescribewand the waits line.
To try it: open an issue in the terminal, press w, and type another open issue's number. Press w with the same number to remove the wait.
🤖 Generated with Claude Code
Earlier asks: (a) link-or-unlink decided at submit time from dependenciesOf — met, and the addDependency-under-the-screen test would fail without it. (b) the waits line on a 24-row terminal keeps the description — met, tested. Docs in PLANNING.md and OPERATING.md name the terminal door. The planner refusal now closes the prompt and shows the full sentence, with a test. Both doors go through linkIssue/unlinkIssue, w is gated by mayWrite and the action decides again, and the preview answers 200. I could not diff against the old head in this clone, so I judged the final change as given. Two things I would do next: (1) Non-blocking: show the Waits line on narrow terminals as a wrapped row rather than truncating a long list of numbers. (2) Non-blocking: have w pre-fill or offer the existing blockers as a picker, so removing a wait does not need the number typed from memory.
The terminal's issue screen now shows what an issue waits for and what it holds up, and
wlets a writer add or remove a wait (#7234).The line. When there are any links,
src/tui/screens/issue.tsdraws one row under the summary, for exampleWaits for #12, #15 · Holds up #20. The data comes fromdependenciesOf, loaded inreload(). Clicking a number opens that issue's screen. The line text is built by a small exportedwaitsPartsfunction. The header only grows a row when the line has something to show, so issues without links lay out as before.w. It only exists for people who can write here (mayWrite()), likec,landt. It asks for an issue number, with or without#:linkIssue.unlinkIssue.dependencyWords' words. A planner refusal usesTHREAD_SAYS.planForbidden, as MCPwait_fordoes.Tests. The new
test/tui-issue-waits.test.tscovers:Holds up #…;dependencyWords' words;wdoes nothing for them.The 128 test files
scripts/fast.tsnamed passed (996 pass, 24 skipped, 0 fail), as didtest/mcp-size.test.ts.tscanddesign-lintare clean. During that run the sandbox blocked outbound connections tomaria--forge.test:443, and nothing failed because of it.Not done. The "another repository's issue" refusal can't happen from this prompt: the number is always looked up in this repository. Its wording is still mapped in case the action returns it. No MCP tool or API route changed.
To try it: open an issue in the terminal, press
w, and type the number of another open issue.🤖 Generated with Claude Code
Closes #7234