Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/feedback-survey-0-12-0.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"@taskless/cli": patch
---

The feedback survey is replaced for 0.12.0. Only the kind of rule the user was trying to create is required now; the user's own words, the completion verdict, what worked, what did not, the agent in use, and the most valuable rule so far are all optional. A `skip` at the invite no longer dismisses the survey: the agent sends its own account of the session and leaves the user's words out. `feedback dismiss` is reserved for a user who asks that nothing be sent. Every install is invited once more, since the new survey keeps its own cadence.
The feedback survey is replaced for 0.12.0. Only the kind of rule the user was trying to create is required now; the user's own words, the completion verdict, what worked, what did not, the agent in use, and the most valuable rule so far are all optional. A `skip` at the invite no longer dismisses the survey: the agent sends its own account of the session and leaves the user's words out. `feedback dismiss` is reserved for a user who asks that nothing be sent. Every install is invited once more, since the new survey keeps its own cadence. A user who wants to see the agent's account first can reply `review`: the agent shows every answer in the chat, shows it again after each correction, and sends only when the user is satisfied.
52 changes: 52 additions & 0 deletions openspec/changes/archive/2026-10-05-feedback-review/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
## Why

The 0.12.0 survey sends the agent's own account of the session whenever the
user replies `skip`, and its answers are written by the agent, not the user.
The user is told notes will be sent but never sees what they say. A user who
would be content to send them, after a look, has no way to take that look
short of refusing outright, which loses the account entirely.

## What Changes

- **The invite offers `review`** beside `skip`. The sentence it puts to the
user gains ", or `review` to see what I'd send before it goes."
- **A `review` reply opens a third door.** The agent fetches `agent feedback`
as for any other reply; the word `review` is the request, and anything else
the user wrote alongside it is still `verbatim`.
- **The feedback recipe gains a review step before the send.** The agent puts
every answer in the chat, labelled by key and exactly as it will be sent,
names the keys it omitted, and asks whether to correct anything. After each
round of corrections it shows the corrected payload again, and it sends only
on the user's go-ahead. It runs `feedback dismiss` if the user decides not
to send after all. `ruleKind` cannot be dropped, since
it is required, but its wording can be corrected.
- **The no-follow-up rule keeps one exception.** Showing the answers after a
`review`, and again after each correction, is not asking again: the user
asked to see them.

## Capabilities

### New Capabilities

None.

### Modified Capabilities

- `cli-feedback-survey`: "The feedback and feedback-invite recipes" is
restated in full with the `review` door, the review step, and a new
scenario. All four existing scenarios are carried unchanged.

## Impact

Two embedded recipes, `feedback` and `feedback-invite`, move to topic v3. No
schema, command, or telemetry event changes: a reviewed payload is sent by the
same `feedback send --from` call as any other.

The bump is `patch`. The survey has not shipped (`latest` is `0.11.2` and its
changeset is still pending), so the existing `feedback-survey-0-12-0`
changeset is extended rather than a second one added.

## Delivery shape

**Single PR.** Two recipe edits, their tests, and this delta are one small
diff, archived on this PR.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## MODIFIED Requirements

### Requirement: The feedback and feedback-invite recipes

The CLI SHALL embed a `feedback` recipe that tells the agent it is the respondent: it records the user's reply verbatim when there is one, fills the remaining answers from its own observation of the session, writes the payload to `.taskless/.tmp-feedback.json`, runs `feedback send --from` that path, and deletes the file afterwards. When the user replied `review`, it SHALL show every answer in the payload in the chat, labelled by key and exactly as it will be sent, name the keys it omitted, and offer to correct anything before sending; after each round of corrections it SHALL show the corrected payload in full and ask again, and it SHALL run `feedback send` only on the user's go-ahead, and SHALL run `feedback dismiss` instead if the user then decides not to send. The recipe SHALL embed the payload schema, SHALL NOT ask the agent to put the survey's questions to the user one by one, and SHALL NOT permit a follow-up question other than those correction rounds. It SHALL tell the agent to answer `ruleKind` with `none (onboarding)` when the surveyed recipe was `onboard`, to name only open-source, publicly available software in `agents`, and to omit `mostValuableRule` rather than ask the user for it.

The CLI SHALL embed a `feedback-invite` recipe carrying the text appended to surveyed recipes. Rendered header-less, it SHALL instruct the agent to ask the user exactly once, with the sentence "Taskless would like to know how this went. Anything you'd like to add in your own words? Reply `skip` if not, and I'll send my own notes on the session, or `review` to see what I'd send before it goes."; to treat a reply of `skip`, silence, or a reply unrelated to feedback as an omitted `verbatim` and still fetch `agent feedback`; to treat a reply of `review`, alone or alongside the user's words, as a request to see the answers before they are sent, with any other words in it as `verbatim`, and fetch `agent feedback`; to treat any other reply as the user's words and fetch `agent feedback`; and, only when the user explicitly asks for nothing to be sent, to run `feedback dismiss` and name the telemetry opt-out environment variables in one line. Both recipes SHALL follow the recipe conventions: a `# Topic:` header, the CLI named by its rendered invocation, and commands that exist.

#### Scenario: The appended invite carries no header

- **WHEN** the gate is open and a surveyed recipe is served
- **THEN** the appended text SHALL NOT contain a second `# Topic:` line
- **AND** SHALL name the rendered CLI invocation for both `feedback dismiss` and `agent feedback`

#### Scenario: The feedback recipe embeds the schema

- **WHEN** an agent runs `taskless agent feedback`
- **THEN** stdout SHALL open with `# Topic: feedback` and contain the JSON Schema for the payload

#### Scenario: An explicit refusal is honoured

- **WHEN** the user replies to the invite asking that nothing be sent
- **THEN** the invite SHALL direct the agent to `feedback dismiss`
- **AND** SHALL direct it to name `DO_NOT_TRACK=1` or `TASKLESS_TELEMETRY_DISABLED=1` as the switch for the rest of telemetry

#### Scenario: A skip still sends

- **WHEN** the user replies `skip` to the invite
- **THEN** the invite SHALL direct the agent to `agent feedback` rather than `feedback dismiss`
- **AND** the feedback recipe SHALL direct the agent to omit `verbatim` and send the rest

#### Scenario: A review shows the answers before they are sent

- **WHEN** the user replies `review` to the invite
- **THEN** the invite SHALL direct the agent to `agent feedback` rather than `feedback dismiss`
- **AND** the feedback recipe SHALL direct the agent to show every answer in the chat and offer to correct them before running `feedback send`
- **AND** SHALL direct the agent to show the corrected payload again after each correction, sending only on the user's go-ahead
- **AND** SHALL direct the agent to `feedback dismiss` if the user then decides not to send
27 changes: 27 additions & 0 deletions openspec/changes/archive/2026-10-05-feedback-review/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## 1. Recipes

- [x] 1.1 Add `review` to the invite sentence and a `review` door that
fetches `agent feedback` in review mode, keeping any other words as
`verbatim`.
- [x] 1.2 Add the review step to the `feedback` recipe before the send:
show every answer, name omitted keys, re-show after each correction until the user
gives the go-ahead,
dismiss on a change of heart.
- [x] 1.3 Narrow the no-follow-up rule in both recipes to allow the
correction rounds, and bump both topics to v3.

## 2. Tests

- [x] 2.1 Update the pinned invite sentence.
- [x] 2.2 Assert the invite's `review` door names `agent feedback` and not
`feedback dismiss`.
- [x] 2.3 Assert the feedback recipe's review step shows the answers, offers
correction, names `feedback dismiss`, and precedes `feedback send`.

## 3. Spec and release

- [x] 3.1 Restate "The feedback and feedback-invite recipes" in full with
the review door and a new scenario.
- [x] 3.2 Extend the unreleased `feedback-survey-0-12-0` changeset.
- [x] 3.3 Dry-run `openspec archive` and confirm every prior scenario
survives, then archive on this PR.
12 changes: 10 additions & 2 deletions openspec/specs/cli-feedback-survey/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,9 @@ The CLI SHALL own the map from these keys to the survey's question identifiers;

### Requirement: The feedback and feedback-invite recipes

The CLI SHALL embed a `feedback` recipe that tells the agent it is the respondent: it records the user's reply verbatim when there is one, fills the remaining answers from its own observation of the session, writes the payload to `.taskless/.tmp-feedback.json`, runs `feedback send --from` that path, and deletes the file afterwards. The recipe SHALL embed the payload schema, SHALL NOT ask the agent to put the survey's questions to the user one by one, and SHALL NOT permit a follow-up question. It SHALL tell the agent to answer `ruleKind` with `none (onboarding)` when the surveyed recipe was `onboard`, to name only open-source, publicly available software in `agents`, and to omit `mostValuableRule` rather than ask the user for it.
The CLI SHALL embed a `feedback` recipe that tells the agent it is the respondent: it records the user's reply verbatim when there is one, fills the remaining answers from its own observation of the session, writes the payload to `.taskless/.tmp-feedback.json`, runs `feedback send --from` that path, and deletes the file afterwards. When the user replied `review`, it SHALL show every answer in the payload in the chat, labelled by key and exactly as it will be sent, name the keys it omitted, and offer to correct anything before sending; after each round of corrections it SHALL show the corrected payload in full and ask again, and it SHALL run `feedback send` only on the user's go-ahead, and SHALL run `feedback dismiss` instead if the user then decides not to send. The recipe SHALL embed the payload schema, SHALL NOT ask the agent to put the survey's questions to the user one by one, and SHALL NOT permit a follow-up question other than those correction rounds. It SHALL tell the agent to answer `ruleKind` with `none (onboarding)` when the surveyed recipe was `onboard`, to name only open-source, publicly available software in `agents`, and to omit `mostValuableRule` rather than ask the user for it.

The CLI SHALL embed a `feedback-invite` recipe carrying the text appended to surveyed recipes. Rendered header-less, it SHALL instruct the agent to ask the user exactly once, with the sentence "Taskless would like to know how this went. Anything you'd like to add in your own words? Reply `skip` if not, and I'll send my own notes on the session."; to treat a reply of `skip`, silence, or a reply unrelated to feedback as an omitted `verbatim` and still fetch `agent feedback`; to treat any other reply as the user's words and fetch `agent feedback`; and, only when the user explicitly asks for nothing to be sent, to run `feedback dismiss` and name the telemetry opt-out environment variables in one line. Both recipes SHALL follow the recipe conventions: a `# Topic:` header, the CLI named by its rendered invocation, and commands that exist.
The CLI SHALL embed a `feedback-invite` recipe carrying the text appended to surveyed recipes. Rendered header-less, it SHALL instruct the agent to ask the user exactly once, with the sentence "Taskless would like to know how this went. Anything you'd like to add in your own words? Reply `skip` if not, and I'll send my own notes on the session, or `review` to see what I'd send before it goes."; to treat a reply of `skip`, silence, or a reply unrelated to feedback as an omitted `verbatim` and still fetch `agent feedback`; to treat a reply of `review`, alone or alongside the user's words, as a request to see the answers before they are sent, with any other words in it as `verbatim`, and fetch `agent feedback`; to treat any other reply as the user's words and fetch `agent feedback`; and, only when the user explicitly asks for nothing to be sent, to run `feedback dismiss` and name the telemetry opt-out environment variables in one line. Both recipes SHALL follow the recipe conventions: a `# Topic:` header, the CLI named by its rendered invocation, and commands that exist.

#### Scenario: The appended invite carries no header

Expand All @@ -178,3 +178,11 @@ The CLI SHALL embed a `feedback-invite` recipe carrying the text appended to sur
- **WHEN** the user replies `skip` to the invite
- **THEN** the invite SHALL direct the agent to `agent feedback` rather than `feedback dismiss`
- **AND** the feedback recipe SHALL direct the agent to omit `verbatim` and send the rest

#### Scenario: A review shows the answers before they are sent

- **WHEN** the user replies `review` to the invite
- **THEN** the invite SHALL direct the agent to `agent feedback` rather than `feedback dismiss`
- **AND** the feedback recipe SHALL direct the agent to show every answer in the chat and offer to correct them before running `feedback send`
- **AND** SHALL direct the agent to show the corrected payload again after each correction, sending only on the user's go-ahead
- **AND** SHALL direct the agent to `feedback dismiss` if the user then decides not to send
18 changes: 13 additions & 5 deletions packages/cli/src/agent/feedback-invite.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Topic: feedback-invite (CLI v%(CLI_VERSION)s / topic v2)
# Topic: feedback-invite (CLI v%(CLI_VERSION)s / topic v3)

## Before you finish: one question for the user

Expand All @@ -7,12 +7,19 @@ and only then, put this to the user exactly once, in these words:

> Taskless would like to know how this went. Anything you'd like to add
> in your own words? Reply `skip` if not, and I'll send my own notes on
> the session.
> the session, or `review` to see what I'd send before it goes.

Then act on the reply:

- **They gave feedback.** Fetch `%(TASKLESS_CLI)s agent feedback` and follow it.
It takes their words as they are and asks you, not them, for the rest.
- **They said `review`**, alone or alongside their own words. Fetch
`%(TASKLESS_CLI)s agent feedback` and follow it in review mode: the
words they wrote besides `review`, if any, are `verbatim`, and you
show them every answer in the chat, and take their corrections,
before anything is sent. Check for this first: a reply that asks for
a review and also gives feedback is a review, not plain feedback.
- **They gave feedback** without asking for a review. Fetch
`%(TASKLESS_CLI)s agent feedback` and follow it. It takes their words as
they are and asks you, not them, for the rest.
- **They said `skip`, said nothing, or replied about something else.**
Fetch `%(TASKLESS_CLI)s agent feedback` all the same and follow it with
no `verbatim`. The rest of the survey is your account of the session,
Expand All @@ -29,4 +36,5 @@ Then act on the reply:

Ask once. Do not repeat the question later in this session, do not ask
before the task is finished, and do not run `feedback send` without
having asked.
having asked. Showing the answers after a `review` is not asking again:
the user asked to see them.
Loading
Loading