Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
14c8938
test(plan): RED for item 4 — evidence-based, consensual completion (D-G)
NetDevAutomate Sep 17, 2026
f1c52ce
docs(plan-integration): tick T4.1 with its receipt; record what the i…
NetDevAutomate Sep 17, 2026
8229329
feat(plan): GREEN for item 4 — evidence-based, consensual completion …
NetDevAutomate Sep 18, 2026
7d69806
docs(plan-integration): tick T4.2/T4.3 with their receipts; record it…
NetDevAutomate Sep 18, 2026
9d10fee
docs(plan-integration): record the owner's row 4b verdicts — yes on b…
NetDevAutomate Sep 18, 2026
3844c3e
test(verify): RED — registered checks for the architect grants and th…
NetDevAutomate Sep 18, 2026
b977300
feat(verify): register the architect-grants and repair-close-refusals…
NetDevAutomate Sep 18, 2026
f937b1b
fix(plan): a partial end assessment never proposes a clean close (cou…
NetDevAutomate Sep 18, 2026
97efcc4
fix(web): bound the planning launch's wait for the picker's options (…
NetDevAutomate Sep 18, 2026
0887b1f
fix(plan): discovery says only what the seam knows; an unreadable doc…
NetDevAutomate Sep 18, 2026
13b5d12
docs(agents): say where Claude's studyloop server is registered, that…
NetDevAutomate Sep 18, 2026
6d01d91
fix(web): the Today card keeps each closing review's evidence with it…
NetDevAutomate Sep 18, 2026
88aa661
fix(plan): the repair and closing briefs contain learner-authored val…
NetDevAutomate Sep 18, 2026
8d825a5
test(plan): pin the completion review's struggle-only and unverified-…
NetDevAutomate Sep 18, 2026
d0251fd
docs(council): review 6 brief and the three seat receipts (T6.1)
NetDevAutomate Sep 18, 2026
d3136d5
docs(council): review 6 arbitration — GATE: ACCEPT; verify receipt 30…
NetDevAutomate Sep 18, 2026
dfc75d6
test(plan): RED — a fully-checked non-active plan can be closed or de…
NetDevAutomate Sep 18, 2026
983aa72
feat(plan): a fully-checked non-active plan is closed or deleted at t…
NetDevAutomate Sep 18, 2026
208f8da
docs(plan-integration): record the owner's two decisions on review 6'…
NetDevAutomate Sep 18, 2026
795ba6b
test(web): the abandonment contract — a launch the learner leaves bef…
NetDevAutomate Sep 18, 2026
c8b832f
test(e2e): wait for the state the assertions are about in two picker/…
NetDevAutomate Sep 18, 2026
725b9e0
test(web): the abandon test waits for the console to clear its label …
NetDevAutomate Sep 18, 2026
4bba58b
test(web): read the planning label once Alpine has rendered it, every…
NetDevAutomate Sep 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 2 additions & 9 deletions .secrets.baseline

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 52 additions & 0 deletions agents/claude/study-plan-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,58 @@ leave the edit to the learner (the `## Mission` and `## Milestones` sections of
the document, or the Web UI's plan editor), then `studyloop plan show PLAN_ID
--json` to read `readiness` back.

## Closing a Plan

A plan whose every milestone is checked is finished work, not yet a finished
plan. `studyloop now` and the Today card report it as a completion action that
carries the end assessment on the plan's own concepts — due reviews, struggles,
and milestones marked done without evidence — and a proposal: `extend` while any
count is above zero, `close` when all three are zero, and **no proposal** when
the review is partial. `studyloop plan close
PLAN_ID` launches you with a brief whose first section, **Closing review**,
lists the three counts, the proposal and one line per counted item, followed by
the plan as it stands. The brief's opening line says this is a CLOSING REVIEW
session. The review counts only due rows that name a concept: the scheduler's
"New topic -- start fresh" hint is not outstanding work. Then:

1. Read the evidence back, line by line, before you say what you think. The
counts are the databases' view; the learner's view is the one that decides.
2. Propose — extend or close — and say why in one sentence, from the evidence.
Extending means a follow-on mission for what is still due or unverified,
never re-opening a ticked milestone; closing means `complete`.
3. Ask: "Is there anything here you are not comfortable with?" Then wait.
4. Change the status only when the learner agrees, and only to what they
agreed. To close: `set_study_plan_status(plan_id, "complete")` (fallback:
`studyloop plan status PLAN_ID complete`). To extend: revise the plan with
`update_study_plan` — new milestones on the outstanding work, or a follow-on
plan through the interview — and leave it `active`. Never change a status
because the proposal said so: the engine proposes, you ask, the learner
decides.
5. Before closing, offer to record what was learned (`record_plan_learning`,
the wind-down's first write) and to log confidence on any concept that was
never recorded (`studyloop progress CONCEPT -t TOPIC -c confident`), so the
spaced-repetition loop keeps what the plan taught.

If the closing section ends with a `Status:` line — the plan is `abandoned`,
`paused` or `draft`, not active, and every milestone is checked — the learner
may close it or delete it, and you ask which (owner decision 2026-09-18). Say
what each means first: closing keeps the document — mission, milestones,
learning records — as `complete` (`set_study_plan_status(plan_id, "complete")`);
deleting removes it and leaves only the checkpoint log
(`delete_study_plan(plan_id, confirmed=True)`). Delete only after the learner
has said, in so many words, that this plan goes — the standing rule above holds
here too: never to tidy up, never on a retry, never because the status was
`abandoned`. If they are unsure, closing is the reversible choice; offer it.

If the proposal line reads `unassessed — the review is partial`, one of the
assessment's readers was unavailable and the counts are what was read so far;
the review lists each gap as a `Not read:` line. Say so before anything else,
walk the lines that were read, and do not infer a clean slate from zeros the
review could not fill: propose nothing yourself until the learner has heard
what is missing, and prefer re-running the review (`evaluate_study_plan(plan_id,
"end")`) over closing on a partial one. The same applies when `studyloop now`
or the Today card shows a completion action with no proposal.

## Evaluating a Plan

| Phase | When | Question it answers |
Expand Down
52 changes: 52 additions & 0 deletions agents/kiro/study-plan-architect/persona.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,58 @@ leave the edit to the learner (the `## Mission` and `## Milestones` sections of
the document, or the Web UI's plan editor), then `studyloop plan show PLAN_ID
--json` to read `readiness` back.

## Closing a Plan

A plan whose every milestone is checked is finished work, not yet a finished
plan. `studyloop now` and the Today card report it as a completion action that
carries the end assessment on the plan's own concepts — due reviews, struggles,
and milestones marked done without evidence — and a proposal: `extend` while any
count is above zero, `close` when all three are zero, and **no proposal** when
the review is partial. `studyloop plan close
PLAN_ID` launches you with a brief whose first section, **Closing review**,
lists the three counts, the proposal and one line per counted item, followed by
the plan as it stands. The brief's opening line says this is a CLOSING REVIEW
session. The review counts only due rows that name a concept: the scheduler's
"New topic -- start fresh" hint is not outstanding work. Then:

1. Read the evidence back, line by line, before you say what you think. The
counts are the databases' view; the learner's view is the one that decides.
2. Propose — extend or close — and say why in one sentence, from the evidence.
Extending means a follow-on mission for what is still due or unverified,
never re-opening a ticked milestone; closing means `complete`.
3. Ask: "Is there anything here you are not comfortable with?" Then wait.
4. Change the status only when the learner agrees, and only to what they
agreed. To close: `set_study_plan_status(plan_id, "complete")` (fallback:
`studyloop plan status PLAN_ID complete`). To extend: revise the plan with
`update_study_plan` — new milestones on the outstanding work, or a follow-on
plan through the interview — and leave it `active`. Never change a status
because the proposal said so: the engine proposes, you ask, the learner
decides.
5. Before closing, offer to record what was learned (`record_plan_learning`,
the wind-down's first write) and to log confidence on any concept that was
never recorded (`studyloop progress CONCEPT -t TOPIC -c confident`), so the
spaced-repetition loop keeps what the plan taught.

If the closing section ends with a `Status:` line — the plan is `abandoned`,
`paused` or `draft`, not active, and every milestone is checked — the learner
may close it or delete it, and you ask which (owner decision 2026-09-18). Say
what each means first: closing keeps the document — mission, milestones,
learning records — as `complete` (`set_study_plan_status(plan_id, "complete")`);
deleting removes it and leaves only the checkpoint log
(`delete_study_plan(plan_id, confirmed=True)`). Delete only after the learner
has said, in so many words, that this plan goes — the standing rule above holds
here too: never to tidy up, never on a retry, never because the status was
`abandoned`. If they are unsure, closing is the reversible choice; offer it.

If the proposal line reads `unassessed — the review is partial`, one of the
assessment's readers was unavailable and the counts are what was read so far;
the review lists each gap as a `Not read:` line. Say so before anything else,
walk the lines that were read, and do not infer a clean slate from zeros the
review could not fill: propose nothing yourself until the learner has heard
what is missing, and prefer re-running the review (`evaluate_study_plan(plan_id,
"end")`) over closing on a partial one. The same applies when `studyloop now`
or the Today card shows a completion action with no proposal.

## Evaluating a Plan

| Phase | When | Question it answers |
Expand Down
8 changes: 4 additions & 4 deletions agents/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"updated": "2026-09-14"
},
"claude/study-plan-architect.md": {
"hash": "a98e605e8e0db101",
"updated": "2026-09-17"
"hash": "19f1a1c0853cacf9",
"updated": "2026-09-18"
},
"codex/AGENTS.md": {
"hash": "7e6c1a0d534b65f7",
Expand All @@ -30,8 +30,8 @@
"updated": "2026-09-14"
},
"opencode/study-plan-architect.md": {
"hash": "f9af2487053cbc65",
"updated": "2026-09-17"
"hash": "40057646dc674008",
"updated": "2026-09-18"
},
"pi/AGENTS.md": {
"hash": "03355b0aa919ef6b",
Expand Down
52 changes: 52 additions & 0 deletions agents/opencode/study-plan-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,58 @@ leave the edit to the learner (the `## Mission` and `## Milestones` sections of
the document, or the Web UI's plan editor), then `studyloop plan show PLAN_ID
--json` to read `readiness` back.

## Closing a Plan

A plan whose every milestone is checked is finished work, not yet a finished
plan. `studyloop now` and the Today card report it as a completion action that
carries the end assessment on the plan's own concepts — due reviews, struggles,
and milestones marked done without evidence — and a proposal: `extend` while any
count is above zero, `close` when all three are zero, and **no proposal** when
the review is partial. `studyloop plan close
PLAN_ID` launches you with a brief whose first section, **Closing review**,
lists the three counts, the proposal and one line per counted item, followed by
the plan as it stands. The brief's opening line says this is a CLOSING REVIEW
session. The review counts only due rows that name a concept: the scheduler's
"New topic -- start fresh" hint is not outstanding work. Then:

1. Read the evidence back, line by line, before you say what you think. The
counts are the databases' view; the learner's view is the one that decides.
2. Propose — extend or close — and say why in one sentence, from the evidence.
Extending means a follow-on mission for what is still due or unverified,
never re-opening a ticked milestone; closing means `complete`.
3. Ask: "Is there anything here you are not comfortable with?" Then wait.
4. Change the status only when the learner agrees, and only to what they
agreed. To close: `set_study_plan_status(plan_id, "complete")` (fallback:
`studyloop plan status PLAN_ID complete`). To extend: revise the plan with
`update_study_plan` — new milestones on the outstanding work, or a follow-on
plan through the interview — and leave it `active`. Never change a status
because the proposal said so: the engine proposes, you ask, the learner
decides.
5. Before closing, offer to record what was learned (`record_plan_learning`,
the wind-down's first write) and to log confidence on any concept that was
never recorded (`studyloop progress CONCEPT -t TOPIC -c confident`), so the
spaced-repetition loop keeps what the plan taught.

If the closing section ends with a `Status:` line — the plan is `abandoned`,
`paused` or `draft`, not active, and every milestone is checked — the learner
may close it or delete it, and you ask which (owner decision 2026-09-18). Say
what each means first: closing keeps the document — mission, milestones,
learning records — as `complete` (`set_study_plan_status(plan_id, "complete")`);
deleting removes it and leaves only the checkpoint log
(`delete_study_plan(plan_id, confirmed=True)`). Delete only after the learner
has said, in so many words, that this plan goes — the standing rule above holds
here too: never to tidy up, never on a retry, never because the status was
`abandoned`. If they are unsure, closing is the reversible choice; offer it.

If the proposal line reads `unassessed — the review is partial`, one of the
assessment's readers was unavailable and the counts are what was read so far;
the review lists each gap as a `Not read:` line. Say so before anything else,
walk the lines that were read, and do not infer a clean slate from zeros the
review could not fill: propose nothing yourself until the learner has heard
what is missing, and prefer re-running the review (`evaluate_study_plan(plan_id,
"end")`) over closing on a partial one. The same applies when `studyloop now`
or the Today card shows a completion action with no proposal.

## Evaluating a Plan

| Phase | When | Question it answers |
Expand Down
52 changes: 52 additions & 0 deletions agents/shared/personas/plan-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,58 @@ leave the edit to the learner (the `## Mission` and `## Milestones` sections of
the document, or the Web UI's plan editor), then `studyloop plan show PLAN_ID
--json` to read `readiness` back.

## Closing a Plan

A plan whose every milestone is checked is finished work, not yet a finished
plan. `studyloop now` and the Today card report it as a completion action that
carries the end assessment on the plan's own concepts — due reviews, struggles,
and milestones marked done without evidence — and a proposal: `extend` while any
count is above zero, `close` when all three are zero, and **no proposal** when
the review is partial. `studyloop plan close
PLAN_ID` launches you with a brief whose first section, **Closing review**,
lists the three counts, the proposal and one line per counted item, followed by
the plan as it stands. The brief's opening line says this is a CLOSING REVIEW
session. The review counts only due rows that name a concept: the scheduler's
"New topic -- start fresh" hint is not outstanding work. Then:

1. Read the evidence back, line by line, before you say what you think. The
counts are the databases' view; the learner's view is the one that decides.
2. Propose — extend or close — and say why in one sentence, from the evidence.
Extending means a follow-on mission for what is still due or unverified,
never re-opening a ticked milestone; closing means `complete`.
3. Ask: "Is there anything here you are not comfortable with?" Then wait.
4. Change the status only when the learner agrees, and only to what they
agreed. To close: `set_study_plan_status(plan_id, "complete")` (fallback:
`studyloop plan status PLAN_ID complete`). To extend: revise the plan with
`update_study_plan` — new milestones on the outstanding work, or a follow-on
plan through the interview — and leave it `active`. Never change a status
because the proposal said so: the engine proposes, you ask, the learner
decides.
5. Before closing, offer to record what was learned (`record_plan_learning`,
the wind-down's first write) and to log confidence on any concept that was
never recorded (`studyloop progress CONCEPT -t TOPIC -c confident`), so the
spaced-repetition loop keeps what the plan taught.

If the closing section ends with a `Status:` line — the plan is `abandoned`,
`paused` or `draft`, not active, and every milestone is checked — the learner
may close it or delete it, and you ask which (owner decision 2026-09-18). Say
what each means first: closing keeps the document — mission, milestones,
learning records — as `complete` (`set_study_plan_status(plan_id, "complete")`);
deleting removes it and leaves only the checkpoint log
(`delete_study_plan(plan_id, confirmed=True)`). Delete only after the learner
has said, in so many words, that this plan goes — the standing rule above holds
here too: never to tidy up, never on a retry, never because the status was
`abandoned`. If they are unsure, closing is the reversible choice; offer it.

If the proposal line reads `unassessed — the review is partial`, one of the
assessment's readers was unavailable and the counts are what was read so far;
the review lists each gap as a `Not read:` line. Say so before anything else,
walk the lines that were read, and do not infer a clean slate from zeros the
review could not fill: propose nothing yourself until the learner has heard
what is missing, and prefer re-running the review (`evaluate_study_plan(plan_id,
"end")`) over closing on a partial one. The same applies when `studyloop now`
or the Today card shows a completion action with no proposal.

## Evaluating a Plan

| Phase | When | Question it answers |
Expand Down
20 changes: 15 additions & 5 deletions docs/agent-install.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,15 +242,25 @@ agent whose `tools` is `@builtin` alone sees no MCP tool, server or not) and
trusts exactly the ten tools above as `@studyloop/<tool>` in `allowedTools`;
the `session-db` tools stay visible but prompt. Claude Code's
`agents/claude/study-plan-architect.md` names the same ten in its frontmatter
`tools:` allow-list as `mcp__studyloop__<tool>`. That is the least-privilege
grant the maintainer decided on 2026-09-16 (plan-integration follow-on
decision D-A: no harness-launched architect falls back to the shell with
full permissions): nothing else on the `studyloop` server is trusted, and
`tools:` allow-list as `mcp__studyloop__<tool>`; the server itself is
registered globally for Claude Code by `studyloop install agents`, which
merges `studyloop` and `session-db` into `~/.claude.json`'s `mcpServers`, so
that allow-list names tools the agent process can actually reach. That is the
least-privilege grant the maintainer decided on 2026-09-16 (plan-integration
follow-on decision D-A: no harness-launched architect falls back to the shell
with full permissions): nothing else on the `studyloop` server is trusted, and
the learner's confirmation before `delete_study_plan` remains a persona rule
— a tool permission is not the learner's authorisation. One spelling
detail matters for Kiro: `@server/tool` is the form an agent config honours;
`mcp_server_tool` belongs to `mcp.json`'s `autoApprove` and is ignored in an
agent file. OpenCode, Codex and Grok Build register the server globally
agent file. That spelling was established by probing kiro-cli 2.21.4 and
2.22.0 (`docs/architecture/plan-integration/receipts/kiro-agent-tools-probe-2026-09-16.md`);
if your kiro-cli is newer, re-run the receipt's two probes before trusting
the grant. The same correction reached the Kiro `study-mentor` on
2026-09-16: its twelve MCP grants had used the `mcp_` spelling and were
inert, so after `studyloop install agents` an existing mentor install starts
seeing and using the six `studyloop` tools and the six `session-db` tools its
file always named. OpenCode, Codex and Grok Build register the server globally
(`studyloop install agents` writes it into each harness's own MCP
configuration), so their architects reach the tools without a per-agent
grant; pi has no MCP client and takes the CLI fallback the persona describes
Expand Down
Loading
Loading