Skip to content

fix(planning): hand-written plan-approval reconfirm row does not round-trip through ledger import #5534

Closed

Description

@kyle-sexton

Follow-up to #4611 (PR #5470 leaves it out of scope).

Problem

On the terminal path, /planning:plan tells the session to hand-write the reconfirm resolution of a superseded-by-plan row as reconfirmed at plan approval: <new>; was: <old>:

  • plugins/planning/skills/plan/SKILL.md:275
  • plugins/planning/skills/interview/context/loop.md:238

Before PR #5470, export-ledger wrote that text for a page accept on a superseded row; the named-field grammar replaces it, so only the hand-written path still produces it. import-ledger has no reader for it and treats the whole string as the row's own text, so the new and old answers do not come back as a structured pair. Pinned by the superseded-accept fixture in plugins/planning/surface/tests/fixtures/ledger-legacy/: the imported terminal decision is own with text equal to the full string, commits empty, and no was.

Scenario (c) of #4611 (a superseded row reconfirmed by an accept keeps its was answer as structure) therefore round-trips on the page path once #5470 merges and is still lost on the hand-written terminal path.

Options for triage

  1. Change both skill texts to hand-write the named-field form the exporter writes for the same state, so import restores it.
  2. Teach the importer to read the hand-written reconfirmed at plan approval: <new>; was: <old> form into the same structured state as option 1.
  3. Both, with the importer reader kept as a legacy grammar.

The importer must keep accepting the current text either way, because ledgers with it already exist.

Acceptance criteria

  • A ledger row a session hand-writes for a reconfirmed superseded row imports to the same question state as the page path's accept on a superseded row (decision, was, proposal pair).
  • The superseded-accept legacy fixture still imports unchanged, or its expected state is updated with the reason stated in the PR.
  • plan/SKILL.md and interview/context/loop.md describe one form; interview-defenses.test.sh digest re-pinned if loop.md changes.
  • A test round-trips the hand-written form.

Out of scope

The page export grammar itself (#4611) and the two held-row losses named in PR #5470.

Activity

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

    @kyle-sexton
    ContributorAuthor

    Owner decision (2026-10-01): approved the recommendation ("go with recommended", the owner's reply to the batch decision page that listed this question and its recommendation).

    Question: how should #5534 be finished? Chosen option A: an agent finishes PR #5627 (change both skill texts to hand-write the named-field row the exporter writes), with the PR brought current with main, the failing test fixed, Closes #5534 in the body, ci-status green, then merged through the normal gate. No legacy-form importer reader (option C is not adopted; file it as a follow-up only if wanted).

    Next: the issue is labeled agent-ready; an agent takes PR #5627 to a green ci-status and merges it.

  3. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 1, 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.needs-triageNot yet classified. Floor until a type and one priority tier are set.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions