Skip to content

planning: make Reconfirm on a stale question say exactly what it records #5910

Open

Description

@kyle-sexton

Severity: high (can misrecord an answer)

Problem

On a stale question whose kept decision is an accept, choice 1 reads "Reconfirm the recommendation" and sends kind: accept (reconfirmOf, index.html:1021-1029). If Claude revised the recommendation after the user accepted it, that accept records the revised text, not the text the user accepted. Choice 2 ("Rec ", choicesOf index.html:1034-1040) then records the same thing. A user who reads "Reconfirm" as "keep what I chose" accepts text they may never have read.

Expected

Reconfirm states the decision it records. When the recommendation changed after the kept accept, either remove Reconfirm (choice 2 already accepts the current text), or label it "Accept the revised recommendation" and keep the old text under Previous (the banner at index.html:1074-1075 already renders previousRecommendation).

Suggested fix

In reconfirmOf (index.html:1021), for k === "accept", compare the question's current contentRev with the contentRev on the kept decision's event. The page sends that value on every decision (index.html:1698), and the server checks and stores it (server.py:1009, 1037). If they differ, return null or relabel. Flagging such answers for re-confirmation in general is #5769 gap 4; this issue covers only the misleading label.

Acceptance criteria

  • After a revise with rec on a stale, accepted question, no choice reads "Reconfirm the recommendation" unless the recommendation is unchanged since the accept.
  • A test covers Reconfirm after a recommendation revise.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 2, 2026
  2. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    ContributorAuthor

    This was generated by AI during triage.

    Decision defaulted: when the recommendation changed after the kept accept, drop the Reconfirm row. The Rec row already records the revised text — veto before merge
    Basis: verified, plugins/planning/surface/index.html:1021-1029 (reconfirmOf returns an accept Reconfirm without checking whether the recommendation changed) and index.html:1035-1037 (choicesOf always adds Rec, which sends the same accept). The vetoable alternative: keep the row and relabel it "Accept the revised recommendation". Dropping the row adds no new wording and leaves one row per outcome. Judgment: fewer moving parts.

    Routing: decision-defaulted, agent-ready, work-class: scoped (C3, bug fix), priority: medium. The priority is the assessed default. The reporter rated it high (it can misrecord an answer), but it blocks no other work and has no deadline.

    Verified against current code:

    • On a stale question whose kept decision is accept, row 1 reads "Reconfirm the recommendation" and sends accept, which records the current recommendation text. Basis: verified, index.html:1021-1029.
    • A recommendation revise keeps the old text under Previous. Basis: verified, plugins/planning/surface/round.py (op_reply sets previousRecommendation) and index.html:1075.
    • Warning on the suggested fix: the issue suggests comparing the question's contentRev with the contentRev on the decision event. The value the page sends, and the server stores, on a decision is not q.contentRev. It is q.contentRev plus a count of that question's decision and undo events (crev, snapOf). Basis: verified, index.html:601, 1167, 1698. The two values differ on almost every answered question, so comparing them directly would drop Reconfirm everywhere. The brief states the behavior instead.

    Where I looked: reconfirmOf, choicesOf, altsOf, armKind and the shortcut help (the a key), the stale banner, context/surface.md (Upstream changed paragraph, which says "Reconfirm is choice 1"), docs/out-of-scope/ (nothing matches).

    Cluster check: no shared decision. #5769 gap 4 (flag answers whose recommendation changed for re-confirmation in general) is scoped out by this issue's body. #5815 (sibling, untriaged) changes the Rec row's text in the same choice builder, so dispatch the two one after the other.

    Agent Brief

    Type: Bug
    Summary: On a stale question, Reconfirm for a kept accept appears only when the recommendation is unchanged since that accept. Otherwise the user picks Rec (the revised text) or another choice.

    Current behavior:
    A stale question whose kept decision is an accept shows "Reconfirm the recommendation" as row 1. If Claude revised the recommendation after the accept, that row records the revised text, which the user may never have read, while it reads as "keep what I chose".

    Desired behavior:

    • For a kept accept, the Reconfirm row is offered only when the question's recommendation text is the same as it was when that accept was recorded. When the recommendation changed after the accept, no Reconfirm row is offered.
      • "Changed" means a recommendation revision recorded after the accept, from either reply with rec or revise with rec.
      • Do not compare against the rev value stored on the decision event directly: that value also counts the question's decision and undo events.
    • With no Reconfirm row:
      • The stale banner reads "Pick an answer." (the existing no-Reconfirm wording).
      • The a shortcut arms Rec.
      • The previous recommendation stays visible under Previous.
    • Reconfirm for the other kept kinds (alt, own, defer, hedged) is unchanged. So is a question that is stale only because a dependency's recommendation changed (Upstream changed), where its own recommendation did not change.
    • The page protocol's Upstream changed paragraph and the shortcut help say that Reconfirm is absent when the recommendation changed since the accept.

    Key interfaces:

    • reconfirmOf(q): returns null for a kept accept when the recommendation changed after it.
    • choicesOf(q), armKind(), the stale banner text, and the shortcut help entry for a.
    • The question's recommendation-revision history, compared with the kept decision's time or seq.

    Acceptance criteria:

    • After a revise with rec on a stale, accepted question, no row reads "Reconfirm", and Rec shows the revised recommendation.
    • A stale, accepted question whose recommendation is unchanged since the accept still shows Reconfirm as row 1.
    • A UI test in the surface UI test suite covers both cases.

    Out of scope:

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 4, 2026
  4. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    ContributorAuthor

    This was generated by AI during work-loop.

    Ratify autonomous dispatch of this C3 bug-fix item?

    Classification: work-class: scoped (C3), bug-fix-shaped (confirmed at triage this cycle). Intended dispatch: the work-loop worker lane, through /work-items:work, to a draft PR the lane never merges. Once ratified, the lane dispatches the interview-page items #5815, #5908, #5910 and #5911 one at a time, because they edit overlapping page code. First drain is not complete and no item-level ratification exists, so it is queued here. Ratify through /work-items:attend-queue and it dispatches on a later cycle.

    Lane: work-loop, instance melo-worker-1, cycle 1.

  5. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 4, 2026
  6. kyle-sexton commented on Oct 11, 2026

    @kyle-sexton
    ContributorAuthor

    Delivered on branch feat/planning-interview-page-batch in draft PR #7182, one commit for this issue (with Closes #5910).

    A kept accept offers no Reconfirm once the question's own recommendation changed after it; a arms Rec and Previous keeps the old text. The shortcut help and surface.md say so.

    Verified: ui_page phases 4 and 5 cover the unchanged (Reconfirm offered) and changed (no Reconfirm) cases. The full surface.test.sh was last run in full before the final page commits; the later commits were checked with the ui_page phases. Its one standing failure (AC34 "user name found") is an environment artifact that also fails on main.

    Left for a human: the PR stays a draft until Kyle flips it to ready, which starts the CI and review lanes.

    The needs-human label was left for Kyle to clear.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions