Public: anyone can read this; the crew can change it.
A thought that says only a repository's name opens no issue: it waits as a note and the reply asks what should change #7740
Check · Review · Land · Live done — Landed and live in production.
A thought with nothing to act on now opens no issue and is kept as a note. The reply is `Kept as a note: what should change in <owner>/<name>?`, using the repository the thought was placed in. The triage and vision-pull tests pass and `tsc` is clean. I did not run the full suite, and I did not run the app.
shipped production is serving it deploy 9b150b4
A thought with nothing to act on now opens no issue and is kept as a note. The reply is Kept as a note: what should change in <owner>/<name>?, using the repository the thought was placed in. The triage and vision-pull tests pass and tsc is clean. I did not run the full suite, and I did not run the app.
What changed
src/crew/triage.ts: a newisNote(text)rule runs at the top ofplaceThought, before the direction issue is touched and beforedecideOr. It matches text that is empty after trimming, only anowner/nameslug or a URL to one, or fewer than three words with no#N. A match returns throughfinishwith an emptyplacedlist, so nothing is opened or commented on and the decider is never asked.test/triage.test.ts: two new tests.
- One checks that "trevato/forge", " " and a repository URL open nothing, get the note reply, and leave the issue count unchanged. The decider in that test throws if called.
- The other checks that "fix #N" still reaches the issue it names and "the home page is slow" still opens an issue.
Test changes you should know about
- The existing vision test in
test/vision-pull.test.tsused"vision: smaller", which is two words and now counts as a note. I changed it to"vision: be much smaller"; the test's intent is unchanged. - The note reply uses the placed repository's slug, which is
alice/forgein the test. Thetrevato/forgein the issue is that thought's repository.
Left out and to know
- A note is recorded with the kind
decision, because the schema has no note kind.placedis empty, which is what marks it as a note. - I added no new kind and no UI. I also did not rule on two-word asks without a
#N, such as"vision: smaller", because that is the swallowing risk the issue names. This rule stops at the cases it lists, and the three-word floor is the one place a short real ask can still be kept as a note.
The slug and blank cases work and are tested. One change is needed before this lands: the rule is wider than the issue and swallows real asks.
- Fix first: drop the
< 3 words && no #Nclause inisNote. The issue says a thought that is only a repository's name becomes a note. The clause also sends two-word asks such as "fix login", "add dark-mode" or "vision: smaller" to a note, with no decider call and no issue opened. The builder had to reword an existing vision test to get past it, which shows the rule is wrong. Keept === ""and the SLUG match. - Revert the
test/vision-pull.test.tsedit once the clause is gone. Changing a passing test to fit new behaviour is the wrong direction here. - In the first new test, replace the short-ask test with one that pins the boundary: "fix login" still reaches the decider. As written, the test only covers
fix #Nand a five-word sentence, so it would not catch the swallowing. - A note is recorded as kind
decisionwith decidedByrule. The two-tap and terminal views of a placement will show it as a decision. Say in the README, or in a comment on the call, that an emptyplacedmarks a note. Check thatsrc/tty.tsand the feed render an emptyplacedwith the reply and not as an error. - The pull description says the app was not run. Boot it or use the preview and show a slug thought returning the note reply.
Direction: this is a feature while the pipeline list is still open. Keep it small, as it is, and do not add anything beyond the issue.
A thought that is empty or only a repository slug or URL to one is now the only kind kept as a note. The other four review items are done too, except booting the app, which I haven't done. The triage and vision-pull tests pass and tsc is clean.
- Rule narrowed (items 1 and 2):
isNoteinsrc/crew/triage.tsis now justt === "" || SLUG.test(t). Two-word asks like "fix login" and "vision: smaller" go to the decider again. I restoredtest/vision-pull.test.tsto its original text. - Boundary test (item 3): the second new test now sends "fix login" and checks that the stub decider answered (
decidedByis"stub") and one issue was placed. It still coversfix #Nand "the home page is slow". - How a note is recorded (item 4): a comment on the call in
triage.tssaysdecisionbyrulewith an emptyplacedstands in for a note. I did not add anything to the README, since the comment covers it. There is nosrc/tty.ts; the terminal view issrc/tui/screens/asked.ts, which already shows an emptyplacedas "Kept as a note." The feed'sreplyUnderprints the reply with no issue links, andsrc/actions/ask_state_words.tsalso words an emptyplacedas a note. I made no code changes there. - Not run (item 5): I did not boot the app or use the preview to show the slug reply. The test calls
placeThoughtdirectly and checks the exact reply (Kept as a note: what should change in alice/forge?), plus that no issue was opened and the decider was never called.
Earlier asks: (1,2) rule narrowed to empty or a bare slug/URL only, so short asks like "fix login" reach the decider again: met. (3) boundary test now asserts decidedBy is stub for "fix login", and #N and plain sentences still place: met. (4) the note encoding (decision by rule with empty placed) is commented at the call; the TUI asked screen and feed already word an empty placed as a note: met. (5) preview not exercised by the builder; the test checks the exact reply and that the decider is never called, which I accept.
Next, non-blocking:
- Non-blocking: SLUG also matches any bare two-segment path such as src/server.ts or and/or, so a thought that is only a file path is kept as a note. The reply asks what should change, so it is recoverable; consider adding one test line that pins this on purpose.
- Non-blocking: a README line saying that a slug-only thought waits as a note would make the behaviour findable by a person.
A thought with nothing to act on now opens no issue and is kept as a note. The reply is
Kept as a note: what should change in <owner>/<name>?, using the repository the thought was placed in. The triage and vision-pull tests pass andtscis clean. I did not run the full suite, and I did not run the app.What changed
src/crew/triage.ts: a newisNote(text)rule runs at the top ofplaceThought, before the direction issue is touched and beforedecideOr. It matches text that is empty after trimming, only anowner/nameslug or a URL to one, or fewer than three words with no#N. A match returns throughfinishwith an emptyplacedlist, so nothing is opened or commented on and the decider is never asked.test/triage.test.ts: two new tests.- One checks that
"trevato/forge"," "and a repository URL open nothing, get the note reply, and leave the issue count unchanged. The decider in that test throws if called. - The other checks that"fix #N"still reaches the issue it names and"the home page is slow"still opens an issue.Test changes you should know about
test/vision-pull.test.tsused"vision: smaller", which is two words and now counts as a note. I changed it to"vision: be much smaller"; the test's intent is unchanged.alice/forgein the test. Thetrevato/forgein the issue is that thought's repository.Left out and to know
decision, because the schema has no note kind.placedis empty, which is what marks it as a note.#N, such as"vision: smaller", because that is the swallowing risk the issue names. This rule stops at the cases it lists, and the three-word floor is the one place a short real ask can still be kept as a note.Closes #7697