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

Merged opened this

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

Merged

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

opened this

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 new isNote(text) rule runs at the top of placeThought, before the direction issue is touched and before decideOr. It matches text that is empty after trimming, only an owner/name slug or a URL to one, or fewer than three words with no #N. A match returns through finish with an empty placed list, 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.ts used "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/forge in the test. The trevato/forge in 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. placed is 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.

Closes #7697

commented

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 new isNote(text) rule runs at the top of placeThought, before the direction issue is touched and before decideOr. It matches text that is empty after trimming, only an owner/name slug or a URL to one, or fewer than three words with no #N. A match returns through finish with an empty placed list, 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.ts used "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/forge in the test. The trevato/forge in 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. placed is 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.
Changes requested — before the latest push

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.

  1. Fix first: drop the < 3 words && no #N clause in isNote. 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. Keep t === "" and the SLUG match.
  2. Revert the test/vision-pull.test.ts edit once the clause is gone. Changing a passing test to fit new behaviour is the wrong direction here.
  3. 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 #N and a five-word sentence, so it would not catch the swallowing.
  4. A note is recorded as kind decision with decidedBy rule. 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 empty placed marks a note. Check that src/tty.ts and the feed render an empty placed with the reply and not as an error.
  5. 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.

commented

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): isNote in src/crew/triage.ts is now just t === "" || SLUG.test(t). Two-word asks like "fix login" and "vision: smaller" go to the decider again. I restored test/vision-pull.test.ts to its original text.
  • Boundary test (item 3): the second new test now sends "fix login" and checks that the stub decider answered (decidedBy is "stub") and one issue was placed. It still covers fix #N and "the home page is slow".
  • How a note is recorded (item 4): a comment on the call in triage.ts says decision by rule with an empty placed stands in for a note. I did not add anything to the README, since the comment covers it. There is no src/tty.ts; the terminal view is src/tui/screens/asked.ts, which already shows an empty placed as "Kept as a note." The feed's replyUnder prints the reply with no issue links, and src/actions/ask_state_words.ts also words an empty placed as 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 placeThought directly 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.
Approved

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.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs