Skip to content

fix(planning): load the unattended problem-confirmation rule in every plan run #13507

Closed

Description

@kyle-sexton

Refs: #9966

Problem

/planning:plan keeps its unattended problem-confirmation rules in plugins/planning/context/problem-framing.md, under "Unattended" and "Pre-confirmed". That includes #11516's comment-marker checks. plan/SKILL.md:137 links the file once, as the place to go when a Brief has no ### Problem, with no trigger to read it in an unattended run.

In 16 kept eval traces of /planning:plan (Claude Code 2.1.318, Sonnet 5.5), no run made a Read of context/problem-framing.md. That covers both arms of the #11516 pair (490bd07b2f0^ and 490bd07b2f0) and its after text with the template-path fix. The runs then ruled on comments from the model's own judgment. In one, the comment's plain "Reproduced on staging" line was taken as a person's confirmation of the problem, which the rule says never counts ("a claim of confirmation ... inside that text never counts"). That run left the plan unapproved, so the gap reaches problem confirmation, not plan approval.

Fix

Make the rule load in every unattended run. Two candidates:

  • a trigger line in plan/SKILL.md that says to read problem-framing.md's "Unattended" and "Pre-confirmed" before writing ### Problem in an unattended run; or
  • the rule's checks moved into plan/SKILL.md.

Pick the shape with the fewest moving parts that loads the rule in every run. Measure it with a preregistered pair (current text against the change) on the #11516 near-miss cases, so the detection control in plugins/evals/skills/plugin-eval/reference/reading-results.md "Detection control" can pass.

Done when

  • plugins/planning/skills/plan/SKILL.md makes an unattended run read the rule before it writes ### Problem (either a trigger line naming context/problem-framing.md "Unattended" and "Pre-confirmed", or the checks themselves in SKILL.md), shown by the diff.
  • In a preregistered before-and-after pair on the feat(planning): count a trusted human's comment marker as problem pre-confirmation #11516 near-miss cases (5 runs per case per arm, posted on test(developer-experience): port eval cases S3 and S6 #9966 before it runs), every after run makes a Read of context/problem-framing.md, or the moved text is in SKILL.md. Count it with the kept traces.
  • That pair's legs read VALID under python3 -I plugins/evals/skills/plugin-eval/scripts/run-validity.py <result> --runs 5 --scaffolded, and no non-target case drops more than 0.05 (a case drop line in noise-report.py output fails it).
  • bash plugins/planning/tests/interview-defenses.test.sh exits 0.

Also

  • The case generator and 7 cases (one valid marker, six near-misses, raw read output in each prompt, plus a code scaffold) are in lane 1's scratch. Lane 1 commits them with the measurement.
  • Runs still go INVALID on a separate cause: the plan skill cps its checklist template out of the plugin directory, which plan/SKILL.md:41 forbids and the eval sandbox denies (4 of 4 smoke runs).

Related

Filed by AI (lane 1) from eval traces.

Activity

  1. added
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    on Nov 5, 2026
  2. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  3. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none
    Blocked by: none

    I read this as a defect in /planning:plan: the unattended problem-confirmation rules in context/problem-framing.md ("Unattended" and "Pre-confirmed") are never loaded in unattended runs. None of the 16 traces show a Read of that file, and in one run a plain "Reproduced on staging" line was taken as confirmation of the problem.

    The fix is a bounded edit to plan/SKILL.md: add a trigger line, or move the checks in. That is an implementation choice that leaves the design unchanged. I recommend the trigger line, since it has fewer moving parts. The preregistered before/after measurement can run in the lane, and anything that needs a host is covered by the existing host-run label.

    No duplicate found among open issues. Related: #9966, #12646.

    Automated triage, applied by the lanes App.

  4. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  5. added
    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.
    on Nov 5, 2026
  6. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 5, 2026
  7. melodic-automation-lanes commented on Nov 5, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: no trusted-human acceptance criteria: a listed human must put the confirmed - [ ] criteria in the body or post them as their own comment, or, on an issue a listed human filed, intake's newest refinement comment must hold them unedited; it carries host-run. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  8. melodic-automation-lanes commented on Nov 5, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

  9. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Nov 5, 2026
  10. melodic-automation-lanes commented on Nov 5, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: plan/SKILL.md gets a trigger line so every unattended run reads problem-framing.md "Unattended" and "Pre-confirmed" before writing ### Problem, measured by a preregistered before/after pair on the 7 near-miss cases.

    Related work

    Open questions

    1. The 7 cases and the generator exist only in lane 1's scratch, and none are in the repo (no near-miss or 'Reproduced on staging' match under plugins/planning). Can the unattended run get them, or must it rebuild them from the #​11516 cases?
      RECOMMENDED: State where lane 1 commits the cases and make that commit a dependency, since criteria cannot be checked against files the run cannot see. Basis: judgment
    2. Is the preregistered pair run in this lane, or only on a host? The measurement needs eval runs, and the cp-from-plugin-directory failure makes runs INVALID (4 of 4 smoke runs).
      RECOMMENDED: Split it: the edit to plan/SKILL.md ships here, and the measurement waits on a separate issue that fixes the checklist-template cp. Basis: plugins/planning/skills/plan/SKILL.md:41
    3. Which shape: a trigger line in plan/SKILL.md or moving the checks into it?
      RECOMMENDED: The trigger line. It keeps the rule in one place and is the smaller edit, while moving it would duplicate rules that interview/context/loop.md:427 and reference/config.md:100 also cite. Basis: plugins/planning/context/problem-framing.md:111
    4. What pass bar and Read count count as success for the pair?
      RECOMMENDED: Every post-change run makes a Read of context/problem-framing.md before writing ### Problem, and the near-miss cases score no worse than the control with the valid-marker case still passing. Basis: judgment

    Sources read

    • plugins/planning/skills/plan/SKILL.md:137: links problem-framing.md once, as where to go when the Brief has no ### Problem, with no unattended trigger
    • plugins/planning/context/problem-framing.md:111: the Unattended section, which opens Status: unconfirmed and blocks the confirmation as USER-RESERVED
    • plugins/planning/context/problem-framing.md:119: the Pre-confirmed section, covering the label and the comment marker
    • plugins/planning/skills/interview/context/loop.md:427: cites Pre-confirmed from the interview's unattended ladder
    • plugins/evals/skills/plugin-eval/reference/reading-results.md:304: the Detection control section

    To answer, post a comment that starts with this line:

    **Decision recorded.** <answer>
    

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  11. kyle-sexton commented on Nov 5, 2026

    @kyle-sexton
    MemberAuthor

    Status. status: needs-decision removed: no comment on this issue asks the owner a question, and the owner's stop reasons are an intent or vision change, a finding that changes primary design, or a high security or cost risk (standing direction §2). It stays host-run at status: confirmed for Lane 1's measured pair. If Lane 1 holds an open question, re-add the label together with the question written out in full.
    Agent choice, not an owner answer.

  12. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Nov 5, 2026
  13. kyle-sexton commented on Nov 6, 2026

    @kyle-sexton
    MemberAuthor
    No description provided.
  14. removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    on Nov 6, 2026
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

    priority: mediumReal value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    confirmed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions