Skip to content

feat(planning): mark every direct dependent when an interview answer changes or is reopened #9714

Description

@kyle-sexton

Parent

Refs #5796

Depends on

Outcome

A changed or reopened answer reaches every question that depends on it, not only decided direct dependents
(gap G3):

  • When a counted decision changes value or is reopened, every direct dependent becomes stale (it holds a
    decision) or a new upstream-changed state (it does not). An upstream-changed question is not Accept-all
    eligible.
  • Re-answering a stale question with a different value marks its own direct dependents the same way: one hop
    per value-changing answer.
  • reopen marks dependents like a changed value.
  • upstream-changed holds until Claude revises the dependent or posts a reconfirm op; under frontierLock
    confirm or hard, Save stays locked until then. Each dependent, not only the parent, shows that the
    upstream change is not handled yet.

Decisions

  • The surface's deferred list parks "the stale cascade (automatic transitive re-staling)". This slice keeps
    that parked: propagation moves one hop only when a re-answer changes value. Update that deferred row to say
    the one-hop form is built and the automatic cascade stays parked.
  • G1 (owner, 2026-10-18): frontierLock default confirm (shipped by the blocker).

Key interfaces

  • Interview page: plugins/planning/surface/index.html; page server: plugins/planning/surface/server.py
    (record(), derive_states); round CLI: plugins/planning/surface/round.py behind round.sh;
    exporters: plugins/planning/surface/exporters.py.
  • The interview skill's surface contract, plugins/planning/skills/interview/context/surface.md, documents
    every new op, field, setting and refusal.
  • The surface's deferred list, plugins/planning/surface/deferred.md.

Done when

  • Server tests: a changed value stales a decided dependent and marks an undecided one upstream-changed; a reopen does the same; a re-answer with a different value on a stale question marks its dependents; a re-answer with the same value marks nothing.
  • A server test shows a reconfirm op clears upstream-changed, and Accept-all eligibility excludes upstream-changed questions.
  • grep -n "upstream-changed" plugins/planning/skills/interview/context/surface.md and grep -n "reconfirm" plugins/planning/skills/interview/context/surface.md print lines.
  • grep -n -i "stale cascade" plugins/planning/surface/deferred.md prints a row that names the one-hop form as built.
  • scripts/run-test-file.sh plugins/planning/surface/test_server.py exits 0.
  • scripts/run-test-file.sh plugins/planning/surface/test_round.py exits 0.
  • bash plugins/planning/surface/surface.test.sh exits 0, so a data dir without the new fields still loads, renders and exports.
  • scripts/check-changelog-fragments.sh --check-required origin/main exits 0.

Out of scope

Activity

  1. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    admission-deferredReady for the issue lane; work-unblock admits it when queued work is under the queued cap
    on Oct 24, 2026
  2. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #9709 is not closed as completed by a listed human or a merge.

  3. added
    admission-deferredReady for the issue lane; work-unblock admits it when queued work is under the queued cap
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredReady for the issue lane; work-unblock admits it when queued work is under the queued cap
    on Oct 24, 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: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions