Skip to content

planning: let Claude move a question to another group and set the group order #5914

Closed

Description

@kyle-sexton

Severity: med

Problem

revise can already change a question's dependsOn, with checks for unknown ids and cycles (checked_depends, round.py:816-838, used in op_revise at round.py:856 and 902-907). It cannot move a question to another group: op_revise has no group field. Groups cannot be reordered: put_group (round.py:541-556) appends a new group and leaves an existing one where it is, and the group op takes only id, title, summary and dependsOn (round.py:727-732). In the audited session Claude wrote "Questions can't be moved between groups (a page limit), so I'll gate them with dependencies instead."

Expected

Claude can move a question to another group and set the group order, each through apply with validation.

Suggested fix

  • Extend op_revise (round.py:840) and its OP_ARGS entry (round.py:1308) with group. Refuse an unknown group, and record a history line as the dependsOn change does (round.py:925-933).
  • Add an order field to the group op (round.py:1340), or a group-order op that takes the full id list and refuses missing or unknown ids.
  • Add both to schema/ops.schema.json and to the ops table in context/surface.md.

Acceptance criteria

  • revise with group moves a question, and the rail shows it in the new group without a reload.
  • A group-order op changes the rail order, and refuses a list that leaves out or invents a group.

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
    MemberAuthor

    This was generated by AI during triage.
    Decision defaulted: group order is a new group-order op that takes the full list of group ids, not an order field on the group op — veto before merge
    Basis: verified, plugins/planning/surface/index.html:687-688 (the Groups rail lists groups in doc.groups array order, so a full-list op maps directly onto it) and the issue's acceptance criterion "refuses a list that leaves out or invents a group", which only a full-list op can check. The alternative, a per-group order field, is additive and reversible.

    Routing: decision-defaulted, agent-ready, work-class: scoped (C3, feature), priority: medium (assessed default). The request is additive: one new field on revise and one new op, each validated. No existing op changes meaning.

    Verified against current code:

    • revise accepts dependsOn with unknown-id and cycle checks, but has no group field. Basis: verified, plugins/planning/surface/round.py:838 (op_revise) and round.py:1306-1324 (its argument list).
    • The group op takes only id, title, summary and dependsOn; put_group appends a new group and leaves an existing one in place, so order cannot change. Basis: verified, round.py:539-556 and round.py:1338-1341.
    • A question's group is checked against known groups when added. Basis: verified, round.py:339.
    • Group summaries record their member ids, and the page marks a summary stale when membership differs, so a move should stale both groups' summaries. Basis: verified, round.py:516-535.

    Where I looked: op_revise, op_group, put_group, the op argument table, the ops schema, the interview skill's ops table, the rail's sections(), and docs/out-of-scope/ (no match).

    Cluster check: none. #5796 covers frontier gating by dependsOn; this item does not change gating.

    Agent Brief

    Type: Feature
    Summary: Claude can move a question to another group with revise, and set the order of groups with a new group-order op, both through apply with validation.

    Current behavior:
    A question's group is fixed once added; revise cannot change it. Groups appear in the order they were first created, and no op reorders them. Sessions work around this by gating questions with dependencies instead.

    Desired behavior:

    • revise accepts group. An unknown group id is refused with a message naming it. A move records a history line on the question, as a dependsOn change does, and warns that the summaries of the old and new groups predate the move.
    • A new group-order op takes the complete list of existing group ids and reorders the groups to match. It refuses a list that leaves out a group, names an unknown group, or repeats one, and writes nothing on refusal.
    • The page shows a moved question in its new group, and the new group order, on the next state push without a reload.
    • Group order does not change group dependsOn locking; the two stay independent.
    • The ops schema and the interview skill's ops table document both.

    Key interfaces:

    • op_revise and its argument list: new group field.
    • New group-order op with an ids list, registered with the other ops and in the ops schema.
    • The interview skill's surface contract (ops table).

    Acceptance criteria:

    • revise with group moves a question, and the rail shows it in the new group without a reload.
    • revise with an unknown group is refused and changes nothing.
    • group-order changes the rail order, and refuses a list that leaves out, invents, or repeats a group.
    • Round tests cover each refusal and the history line; the schema test accepts both new shapes.
    • The planning surface test suite passes.

    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
    MemberAuthor

    This was generated by AI during work-loop.

    Approve this for autonomous dispatch (with its defaulted decision), or keep it for a human?

    Triage marked this decision-defaulted as a feature-shaped C3 (work-class: scoped). The work-loop admission gate human-gates feature-shaped C3 work, so the lane removed agent-ready and applied needs-human. To dispatch it, flip it back through /work-items:attend-queue.

    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
    MemberAuthor

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

    revise takes group (CLI --group) to move a question to an existing group in place, with a history line and stale-summary warnings; a new group-order op reorders the groups (every id once).

    Verified: New TestRegroup in test_round.py; the Python suites passed (401 tests). 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. Its label note also asks for Kyle's attend-queue approval before autonomous dispatch; that is unchanged.


    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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions