Skip to content

feat(tasks): replace Steps with task briefs and confidence ratings - #308

Merged
johannesjo merged 5 commits into
mainfrom
ccr-54025ca9-dhrzip
Oct 10, 2026
Merged

johannesjo merged 5 commits into
mainfrom
ccr-54025ca9-dhrzip

Conversation

@johannesjo

Copy link
Copy Markdown
Owner

Steps relied on the agent maintaining .claude/steps.json, which it often
forgot. Remove the panel, watcher, IPC channels, prompt injection and
setting.

Add a task brief instead: after each agent turn the task-naming model
rewrites a short brief (goal, headline, changed, extra, open, decided)
from the turn's prompts, the agent's last message and the branch diff.
The task header shows the headline; the full card lets the user keep a
decision or send the agent a correction, view turns, and open the
change tour.

Add a generic confidence_publish MCP tool. Ratings carry named scores
and findings, are tied to the diff they rated, and show as out of date
once the code changes. "Rate confidence" sends a configurable prompt.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu

Steps relied on the agent maintaining .claude/steps.json, which it often
forgot. Remove the panel, watcher, IPC channels, prompt injection and
setting.

Add a task brief instead: after each agent turn the task-naming model
rewrites a short brief (goal, headline, changed, extra, open, decided)
from the turn's prompts, the agent's last message and the branch diff.
The task header shows the headline; the full card lets the user keep a
decision or send the agent a correction, view turns, and open the
change tour.

Add a generic confidence_publish MCP tool. Ratings carry named scores
and findings, are tied to the diff they rated, and show as out of date
once the code changes. "Rate confidence" sends a configurable prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu
Address review findings on the task brief:
- Skip the model call when no prompt went out and the diff is unchanged,
  so agent startup and typed-input echo no longer cost a brief; "Update
  now" still forces one. Only turns with a prompt are recorded.
- Date a brief by when its prompts and diff were read, so prompts sent
  while it is written are not lost and new ratings are not marked stale.
- Treat an unreadable diff as unknown rather than empty.
- Truncate prompts before fencing them, so the fence always closes.
- Drop a queued rerun when the brief is cancelled or the watcher stops.
- Use the last chat reply for chat-mode agents.
- Keep the bar for published ratings when briefs are off; untint it.
- Restore the sidebar line's styling and keep half-typed corrections
  across brief updates; focus the card on open and tick its times.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu
Briefs send each turn's prompts, the agent's last message and the diff
to a model provider and cost a call per turn, like model task naming,
which is also off by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu
Address the second review:
- Read a brief's prompts and agent reply before awaiting the diff, so a
  prompt sent meanwhile lands in the next brief exactly once.
- Count a new end-of-turn reply as news, so answer-only turns are not
  skipped; screen snapshots still do not count.
- Prefer the selected pane's reply, then the newest, across agents.
- Always clear the "updating" status when a brief run ends.
- Compare ratings against the newest code read, and read it when the
  card opens, so ratings go out of date with briefs off too.
- Keep one draft and send state per decision, and let a finished send
  clear only its own draft.
- Keep the newest prompts within the budget and fence each one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBomevzY6LUq8GNZpBfQEu
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-10T23:42:13.753168Z 626048e PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 626048e9b6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +121 to +125
const onKeyDown = (event: KeyboardEvent) => {
if (event.key !== 'Escape') return;
event.stopPropagation();
setOpen(false);
anchor?.focus();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove document listeners when Escape closes the card

After Escape closes the brief, this handler leaves the capture-phase document listeners installed by toggle(). The stale handler then intercepts every later Escape with stopPropagation() and refocuses the brief anchor even though the card is closed, preventing dialogs and other global Escape actions from working until the bar is explicitly toggled or unmounted. Remove both listeners on every close path.

AGENTS.md reference: AGENTS.md:L29-L29

Useful? React with 👍 / 👎.

Comment thread src/store/task-brief.ts
Comment on lines +262 to +266
if (!store.taskBriefs) {
// Forget what was working, so turning briefs back on is not read as a turn ending.
for (const taskId of [...timers.keys()]) clearTimer(taskId);
working.clear();
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Cancel active brief requests when briefs are disabled

If the user turns off Write task briefs while a model request is in flight, this branch clears only scheduled timers and leaves inFlight running. Because refreshTaskBrief does not re-check the setting after awaiting the model, the subprocess continues and its response is persisted after opt-out, contrary to the stop behavior documented in PRIVACY.md. Cancel the active handles here and prevent late responses from committing once the setting is off.

Useful? React with 👍 / 👎.

@johannesjo
johannesjo merged commit 7a9c1da into main Oct 10, 2026
5 checks passed
@johannesjo
johannesjo deleted the ccr-54025ca9-dhrzip branch October 10, 2026 23:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants