Skip to content

perf(planning): surface digest re-pins at plan time and re-pin several labels in one repin.sh call #8756

Description

@kyle-sexton

No related issue: found while landing #8714.

Problem

plugins/planning/tests/interview-defenses.test.sh pins regions of the interview skill by digest. Only a person can re-pin them, in their own terminal, with repin.sh, and it asks y/N for each pin. On #8714 the pins surfaced only after the work was done. The owner then had to run the script, which held the PR as a draft for an extra round. repin.sh also exits non-zero while any other pin still fails, so a && chain of re-pins stops after the first one.

Fix

  • /planning:plan lists the digest pins a planned change will move, under the plan's Captured assumptions or Constraints, so the owner sees the re-pin step at approval time.
  • repin.sh accepts several labels in one call and asks once per label, so a single command re-pins all of them.

Verification

A plan that edits a pinned interview region names the pin. One repin.sh call re-pins three labels and ends PASS.

Related

#8714

Activity

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

    @github-actions
    Contributor

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

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    1. Does /planning:plan still need to list the pins a change will move? Decided: No.
    2. Does repin.sh ask once per label? Decided: No.
    3. What is the multi-label form? Decided: repin.sh [--test-file <path>] <label>... <justification>. Every label is resolved before any write; a label matching no pin, or more than one, exits 3 and leaves the file unchanged.

    [quote truncated; the full decision is at the link]
    #8756 (comment)

    The decision settles every open question. What remains is a bounded change to repin.sh and its test suite: multi-label form, an exit-3 test for an unmatched label, and an updated usage line and header.

    Automated triage, applied by the lanes App.

  3. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 21, 2026
  4. github-actions commented on Oct 26, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  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.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 26, 2026
  6. melodic-automation-lanes commented on Oct 26, 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. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  7. melodic-automation-lanes commented on Oct 26, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  8. melodic-automation-lanes commented on Oct 26, 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: /planning:plan lists the digest pins a planned change will move, and repin.sh re-pins several labels in one call and ends PASS.

    Related work

    Open questions

    1. The issue says repin.sh asks y/N per pin, but the script has no prompt. Should the ask-once-per-label requirement be dropped?
      RECOMMENDED: Drop it: accept several labels and re-pin each without prompting, since the script is already non-interactive. Basis: plugins/planning/tests/repin.sh:24-112 has no prompt; plugins/planning/tests/repin.test.sh:64 runs it with stdin from /dev/null
    2. What is the argument form for several labels, given repin.sh takes exactly one label and one justification today?
      RECOMMENDED: repin.sh [--test-file f] <label>... <justification>: the last argument is one shared justification, each earlier one is a label; print one old -> new line per label and PASS or FAIL once at the end. Basis: plugins/planning/tests/repin.sh:31-43
    3. What happens if one of several labels matches no pin, or more than one?
      RECOMMENDED: Resolve all labels first; if any matches none or several, exit 3 before changing the file. Basis: plugins/planning/tests/repin.sh:76-79
    4. Where in the plan does the pin list go? The plan template has no Constraints or Captured assumptions heading; those are Brief sections written by the interview skill.
      RECOMMENDED: Add a short step in the plan skill that lists the pins a change will move under the plan's Load-bearing assumptions or Risks and Mitigations, naming each pin label and the repin.sh command. Basis: plugins/planning/skills/plan/context/plan-template.md:41,127
    5. Does this overlap #​10087 and the re-pin change in #​10140 enough to narrow or close this issue?
      RECOMMENDED: Owner decides after reading #​10140 and #​10087; keep this issue to the planning plugin's plan skill and repin.sh, leaving the pr-pipeline to #​10087. Basis: judgment

    Sources read

    • plugins/planning/tests/repin.sh:40: requires exactly one label and one justification; no y/N prompt anywhere
    • plugins/planning/tests/repin.sh:19-22: exit codes 0, 1, 2, 3 and 4
    • plugins/planning/tests/repin.test.sh:64: tests run repin.sh with stdin from /dev/null
    • plugins/planning/skills/plan/context/plan-template.md:41: Load-bearing assumptions section, no Constraints or Captured assumptions heading

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

  9. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    No owner ledger (.work/*/interview-checklist.md, .work/gh-monitor-owner-decisions/) names this issue. Read against origin/main at a6ba1c4c18.

    The body's premise changed on main. #10140 (commit 68d3f2bd81, 2026-10-26) removed the attended-only gate. The suite now says: "Any session, a lane included, may re-pin a digest after that re-read" (plugins/planning/tests/interview-defenses.test.sh:74-75). repin.sh has no prompt or terminal check: it takes one label and one justification (plugins/planning/tests/repin.sh:3-4, :40), rewrites one sha256 literal, prints <label>: <old> -> <new>, and reruns the test (:6-16).

    1. Does /planning:plan still need to list the pins a change will move?
      Decided: No. That half existed "so the owner sees the re-pin step at approval time". The session that edits the text now re-pins it in the same change, and each failure message prints the repin.sh command (interview-defenses.test.sh:107). Nothing waits on the owner, so a plan-time list removes no round.
    2. Does repin.sh ask once per label?
      Decided: No. It has no prompt to repeat (repin.sh:1-23), and fix(planning): let any session re-pin an interview-defenses digest #10140 removed the y/N ask on purpose.
    3. What is the multi-label form?
      Decided: repin.sh [--test-file <path>] <label>... <justification>. The last argument is one justification, written above each re-pinned call. Every label is resolved before any write. A label that matches no pin, or more than one, exits 3 and leaves the file unchanged, as one label does today (:76-79). The script prints one old -> new line per label, reruns the test once, and ends PASS (exit 0) or FAIL (exit 1) (:105-112).

    Acceptance criteria:

    • One repin.sh call with three labels and one justification re-pins all three and ends PASS; a test in plugins/planning/tests/repin.test.sh covers it on a stand-in file, as that suite does for one label.
    • A call where one of several labels matches no pin exits 3 and leaves the test file byte-identical; a test covers it.
    • The existing single-label cases in repin.test.sh pass unchanged.
    • repin.sh's usage line and header name the multi-label form.
  10. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed on Oct 26, 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

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: lowNice-to-have, cosmetic, or speculative; opportunistic.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

    Fields

    No fields configured for Task.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions