Repository navigation
Plan integration follow-on: the body double proposes one tiny, concrete first move on the deferred material #30
Copy link
Copy link
Closed
Labels
ready-for-agentImplementation-ready specification with settled requirements and test seamsImplementation-ready specification with settled requirements and test seams
Milestone
Description
Origin
- Owner verdict on rubric row 3b reading (a) (
docs/architecture/plan-integration/receipts/now-rubric-2026-09-16.md, interactive walkthrough 2026-09-20): yes to sitting with the plan rather than repairing a live struggle at low energy, with this note recorded beside the yes as a 0.5.x finding, not a blocker: "the sit-with session must not be a blank page — the body double should propose one tiny, concrete first move on the deferred material (e.g. "open the Frames lesson and read it, nothing more", or ten minutes of passive video on the next milestone). A goal-less session is the hardest ADHD start; sharpening the replacement beats restoring the rejected repair." - Owner's framing across (a), (b), (c) and (d) of the same row: at 3/10 the first task must be light enough to give confidence; that is what makes a step-up possible (see the sibling ladder issue).
- Item 5 (D-F) of
openspec/changes/plan-integration-followonsshipped the body-doubling floor on PR feat(now): item 5 (D-F) — energy demand for repair and the body-doubling floor #28; design §5 decisions 4 and 9 fix the candidate's shape and its reason's wording.
What exists today (from the code on feat/energy-demand-body-double a4503a48)
learning/decision.py::_body_double_candidatesynthesises one candidate when nothing plan-related fits the day's capability and an active, ready plan exists: conceptSit with <title>,action_type="conversation",source="body_double", baseBODY_DOUBLE_BASE_SCORE = 30(+12 plan bias), reason "N of M milestones of done. Nothing plan-related fits low energy today — deferred: milestone k "<title>" of ; repair of "". Sit with instead: a body-double session — you drive; the companion stays quiet unless you ask.", doorstudyloop study "<title>" --mode co-study(the Today card starts it in the Body Double view and hands the plan title over —body-double-request).- The reason names the deferred material (D-F asked for it by name) but proposes no action on it: the session opens with the plan title and nothing else.
agents/shared/personas/co-study.mdpins "The student drives" / "Stay quiet by default", so the persona will not fill the blank either — by design.
What to build
The body-double proposal carries one tiny, concrete, passive first move on the deferred material, derived deterministically from what the engine already holds, and hands it to the session the same way the plan title is handed over today:
| Deferred item named in the reason | First move proposed |
|---|---|
a deferred milestone (energy_deferred) |
"Open the material and read for ten minutes, nothing more" — when the milestone's concepts resolve to a lesson in the indexed content (get_lesson_tree / lesson search), name it; otherwise the generic form |
a deferred repair (energy_deferred_repairs) |
"Re-read your own notes or the last worked example on ; do not attempt the exercise" — passive re-exposure, never the hands-on repair the deferral just refused |
Rules:
- Passive, not productive struggle. The move must be consumable at the capability the day carries (design §5:
ENERGY_CAPABILITY["low"] = 3). Reading, watching, re-reading own notes — never an exercise, never a Socratic round. If no passive move can be derived, the proposal stays as it is today (a blank is better than a demand). - A proposal, not a requirement. The learner may ignore it; the co-study persona must not turn it into questioning (PDA sensitivity,
agents/shared/audhd-framework.md). One sentence added to the reason and one field in the payload; the door is unchanged. - Deterministic and rubric-testable. Every input is a stored fact (plan milestones, deferred lists, the content index). A new D-16 rubric row plants row 3's world and expects the first move to name Frames; the owner scores it before it ships.
- Additive only. The no-plan golden
now_plan_no_active.jsonstays byte-identical (the body double requires an active plan); the existing body-double pins stay green (test_body_double_candidate_is_synthesised_when_nothing_plan_related_fits,test_body_double_reason_leads_with_recorded_progress_and_describes_the_door_truthfully,test_body_double_reason_never_fabricates_progress,test_co_study_persona_pins_the_promise_the_body_double_reason_makes).
Out of scope
- Restoring the deferred repair as the primary (the row-3 "no" stands; rubric 3b (a), (d), (e) yes).
- Re-planning after the move is done — that is the sibling ladder issue.
- Any model call in ranking or in deriving the move.
Acceptance criteria
- RED tests: the body-double payload carries a
first_move(name to be settled in design) naming the deferred milestone's material when it resolves, the generic passive form when it does not, and a passive re-exposure line for a deferred repair; a world with nothing derivable carries no field. - The Today card and CLI
nowrender the sentence beside the sit-with door; the Body Double view receives it with the plan title. - Rubric row added and scored yes by the owner (D-16).
- Docs:
docs/study-plans.md"Plan-aware now" anddocs/web-ui-guide.md(Body Double) describe the first move in the eligibility termstest_docs_plan_integration_contract.pypins.
Definition of Done
- Full unit suite green;
just lint;just typecheck; golden byte-identical. - Council review of the RED and the arbitration before merge (one commit per accepted finding).
- Spec delta (
openspec/specs/active-learning-decisions) and design updated in the same change.
_Milestone renamed 0.6.0 → 0.5.x on 2026-09-21 (owner rule): follow-on work ships as 0.5.N patch releases until every issue outstanding at v0.5.0 is resolved. Where the linked receipt says "0.6.0", read "the follow-on milestone"._
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ready-for-agentImplementation-ready specification with settled requirements and test seamsImplementation-ready specification with settled requirements and test seams
Activity
docs(rubric-3b): the two 0.6.0 findings are issues #30 (concrete firs…
docs(changelog): [Unreleased] — the first move (#30), one entry for t…
docs(openspec): archive body-double-first-move; its deltas join the m…
NetDevAutomate commentedon Sep 22, 2026
Shipped in #32, merged 2026-09-22 as a pure fast-forward of
mainto a620a85.What landed: the body double's sit-with proposal carries one passive first move — a deliberate lesson named with its evidence (course and matched concept) when the deferred milestone's own concepts resolve one, otherwise the milestone named with why no lesson matched — with an Open the lesson control on the Today card, the Body Double picker and the live session strip. The same move follows Start into the Study view, and a plan-related active primary carries a warm-up into its own material at medium and high energy (owner verdict on rubric row 3c (e), against the coordinator's steer). Council review 8: GATE ACCEPT, findings landed one commit each.
Evidence:
docs/architecture/plan-integration/receipts/now-rubric-2026-09-16.mdrow 3c (scored (a)–(e2) interactively, 2026-09-21);docs/architecture/plan-integration/council/review-8-arbitration-2026-09-21.md; archived changeopenspec/changes/archive/2026-09-22-body-double-first-move/.Left open on purpose: #33 (read-along mode, filed from this walk); the frozen-clock test gap in
history/progress.py(recorded in the receipt, its own small change); design decision 10's high-energy ramp stands unless the owner reverses it. Ships in 0.5.1.