You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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).
What exists today (from the code on feat/energy-demand-body-doublea4503a48)
learning/decision.py::_body_double_candidate synthesises one candidate when nothing plan-related fits the day's capability and an active, ready plan exists: concept Sit with <title>, action_type="conversation", source="body_double", base BODY_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.", door studyloop 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.md pins "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.json stays 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 now render 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" and docs/web-ui-guide.md (Body Double) describe the first move in the eligibility terms test_docs_plan_integration_contract.py pins.
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"._
Origin
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."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-doublea4503a48)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).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:
energy_deferred)get_lesson_tree/ lesson search), name it; otherwise the generic formenergy_deferred_repairs)Rules:
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).agents/shared/audhd-framework.md). One sentence added to the reason and one field in the payload; the door is unchanged.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
Acceptance criteria
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.nowrender the sentence beside the sit-with door; the Body Double view receives it with the plan title.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
just lint;just typecheck; golden byte-identical.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"._