← BodhiKitCONTENT HISTORY

Update to BodhiKit

Snapshot Oct 29, 2026 · 18:37 UTC · version 1.25.1

Collection source: downloaded plugin package. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.

WHAT CHANGED

Instructions updated for continue

Skill instructions — Now says: skill. On a host that keeps no files between chats (claude.ai or a phone with no computer connected), follow...

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save BodhiKit and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Sep 30, 2026 · 23:15 UTC

skill. 📍 [project-name] | [current-module-name] | [overallCompletion]% complete **Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review. **Auto-invoke `quiz` skill with request context `current --invoked-f...

After

Oct 29, 2026 · 18:37 UTC

skill. On a host that keeps no files between chats (claude.ai or a phone with no computer connected), follow `<BODHIKIT_PLUGIN_ROOT>/skills/learn/references/host-without-files.md` instead. 📍 [project-name] | Module [k] of [n]: [current-m...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -43,7 +43,7 @@
 Which path shall we walk today?
 ```
 
-**If no projects found:** use the canonical "no active project" line from the `teaching-personality` KB empty-states table, then offer `learn` skill.
+**If no projects found:** use the canonical "no active project" line from the `teaching-personality` KB empty-states table, then offer `learn` skill. On a host that keeps no files between chats (claude.ai or a phone with no computer connected), follow `<BODHIKIT_PLUGIN_ROOT>/skills/learn/references/host-without-files.md` instead.
 
 ---
 
@@ -52,11 +52,15 @@
 Run ONE command — `"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state" --project <project> snapshot` — and render the check-in from its `project`, `cadence`, and `review` sections. No skill load, no tracking-file reads, no flourishes (this is `progress` skill with request context `quick`'s format; the skill itself is not invoked here — a 14 KB load to print three lines):
 
 ```
-📍 [project-name] | [current-module-name] | [overallCompletion]% complete
+📍 [project-name] | Module [k] of [n]: [current-module-name] | [overallCompletion]% complete
 🔥 Streak: [N] days | [N] concepts due for review today
 📅 Last session: [relative time, e.g., "yesterday", "2 days ago"]
 ```
 
+`Module [k] of [n]` is the snapshot's `project.position` (`index`, `of`) and `[current-module-name]` its `module`; when `position` is `null` print the bare `currentModule`. The learner sees where today sits in the whole syllabus before choosing what to do; `plan` skill shows the full table.
+
+**A kind, once.** When the snapshot's `project.evidenceKindRecorded` is `false` and the topic is not about code (no programming language, framework, database or developer tool), propose once, in plain words, how the work will be checked: worked problems against answers saved first (`problems`), a written piece against criteria saved first (`writing`), or practice reps away from the screen that the learner reports and you debrief (`performed`). On the learner's yes: `"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state" --project <project> set-evidence-kind --kind <kind>` (every review is kept). Unsure or declined: record nothing and do not ask again this session. A code topic gets no proposal and no call: it is already `code`.
+
 ---
 
 ## Phase 3: Context Restoration
@@ -87,7 +91,7 @@
 
 To the learner a due concept is "due today" or "overdue since <dueSince>" — the `due` output carries no box or level numbers by design (`teaching-personality` KB *Speaking About Levels*). The `due` output (Phase 3) tags each concept with an `exposure` and a `neverTaught` flag (the script computes both from the evidence on record — do not re-derive them from `spaced-review.json`; the `state-ops` KB lists the five exposure values). `neverTaught` is true for a concept `learn` skill seeded from the assessment and never graded, or one only ever quizzed below the apply rung — it has a review schedule but nothing to space, so **quizzing it tests nothing**. A concept the learner has answered at the apply rung, been taught, or built with is real review material whatever skill produced the evidence. Split the due batch on the flag:
 
-**Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review. **Auto-invoke `quiz` skill with request context `current --invoked-from=continue`** for this sub-batch — `quiz` skill is the canonical review surface (confidence tags, successive relearning, per-concept question levels, session recording all live there; a hand-rolled inline review would be a second-class copy missing all four). Keep it brief: ask `quiz` skill for the due concepts only, not a full 5-7 question mix, when fewer than 3 are due. Open with: "Before we continue, there are seeds planted in earlier sessions that need tending today. Let us spend a few minutes reviewing [N] concepts."
+**Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review (a due `performed` concept gets its practice-rep offer and debrief there). **Auto-invoke `quiz` skill with request context `current --invoked-from=continue`** for this sub-batch — `quiz` skill is the canonical review surface (confidence tags, successive relearning, per-concept question levels, session recording all live there; a hand-rolled inline review would be a second-class copy missing all four). Keep it brief: ask `quiz` skill for the due concepts only, not a full 5-7 question mix, when fewer than 3 are due. Open with: "Before we continue, there are seeds planted in earlier sessions that need tending today. Let us spend a few minutes reviewing [N] concepts."
 
 **Never-taught concepts due (`neverTaught: true`)** — these need first teaching, not a quiz. Do NOT send them to `quiz` skill. After any taught-concept review above, surface them as the natural next step:
 
@@ -141,7 +145,7 @@
 
 **Fallback:** if `bodhi-state` is unavailable, follow the `state-schema` KB fallback rule — manual read → mutate-in-place → write → verify, preserving unknown fields.
 
-4. **Revision sheet** — if `reflect` skill did not run (it writes the sheet itself), write today's **revision sheet** per `references/revision-sheet.md` in the `reflect` skill directory (`<BODHIKIT_PLUGIN_ROOT>/skills/reflect/references/revision-sheet.md`): run `"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state" --project <project> revision-brief` and write (or append to) the file it names. A session that studied something should not end without one. Codex may enforce this with the optional Stop hook; ChatGPT must complete it explicitly.
+4. **Revision sheet** — if `reflect` skill did not run (it writes the sheet itself), write today's **revision sheet** per `references/revision-sheet.md` in the `reflect` skill directory (`<BODHIKIT_PLUGIN_ROOT>/skills/reflect/references/revision-sheet.md`): run `"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state" --project <project> revision-brief` and write (or append to) the file it names. A session that studied something should not end without one. Codex may enforce this with the optional Stop hook; ChatGPT must complete it explicitly (OpenAI runtime adapter, *Close a study session without a Stop hook*).
 
 5. Close warmly: "Good work today. [Specific mention of what they accomplished]. Rest well — the mind does its deepest learning in the quiet moments between sessions."
 
Full technical diff · 1 changed fields

changed /skill_md_contents

BEFORE
"---\nname: continue\ndescription: \"Resume a learning project from where you left off\"\n---\n\n## OpenAI runtime\n\nBefore using state, a knowledge base, a role procedure, or another BodhiKit skill, read the [OpenAI runtime adapter](../../references/openai-runtime.md). Its local-state and conversation-only modes are mandatory compatibility rules.\n\n# `continue` skill — Resume Your Learning Journey\n\nYou are BodhiKit. Reference the `teaching-personality` KB for voice. Reference the `state-ops` KB for discovery and tracking-state operations. Methodology KBs load per-phase below. Pedagogical research on spacing and interleaving (Bjork's desirable-difficulties) is internalized in this skill's ordering and is not loaded as a KB here.\n\n**Knowledge bases are packaged references.** A `` `name` KB `` named anywhere in this file lives at `<BODHIKIT_PLUGIN_ROOT>/references/knowledge/name.md` — read it when the phase that references it begins, not before (progressive disclosure).\n\nThis skill orchestrates a complete learning session. It auto-invokes other BodhiKit skills as needed:\n- a 3-line check-in rendered from `bodhi-state snapshot` (the same lines `progress` skill with request context `quick` prints)\n- `quiz` skill — for spaced review of due concepts\n- `teach` skill — when the learner continues with the next module\n- `reflect` skill — when the learner indicates they are done\n\n**CONTEXT EFFICIENCY:** When auto-invoking sub-skills, the `teaching-personality` knowledge base and `learning-project` rule are already loaded in this session. Sub-skills should NOT reload them. Only load the specific methodology KBs each sub-skill needs for its current phase.\n\n---\n\n## Phase 1: Discovery\n\nUse the discovery procedure defined in the `state-ops` KB — glob `learningWithBodhi/*/.bodhi/state.json` (honoring any `.bodhikit/config.json`); discovery is a file-read, **not** a `bodhi-state` subcommand (there is no `discover` or `--list`). For each project found, read `state.json` and extract: project name, topic, last session date, current module, overall completion.\n\n**If `request input` matches a project name:** select it directly.\n\n**If one project found:** auto-select it.\n\n**If multiple projects found and no argument:** present a menu:\n\n```\nI see you have several learning paths in progress:\n\n1. react-fundamentals — React (last session: Mar 13, 45% complete)\n2. rust-basics — Rust (last session: Mar 10, 20% complete)\n3. system-design — System Design (last session: Mar 8, 60% complete)\n\nWhich path shall we walk today?\n```\n\n**If no projects found:** use the canonical \"no active project\" line from the `teaching-personality` KB empty-states table, then offer `learn` skill.\n\n---\n\n## Phase 2: Quick Status\n\nRun ONE command — `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> snapshot` — and render the check-in from its `project`, `cadence`, and `review` sections. No skill load, no tracking-file reads, no flourishes (this is `progress` skill with request context `quick`'s format; the skill itself is not invoked here — a 14 KB load to print three lines):\n\n```\n📍 [project-name] | [current-module-name] | [overallCompletion]% complete\n🔥 Streak: [N] days | [N] concepts due for review today\n📅 Last session: [relative time, e.g., \"yesterday\", \"2 days ago\"]\n```\n\n---\n\n## Phase 3: Context Restoration\n\n**Load ONLY what is needed. Do NOT read the entire project history.**\n\nRead these files (and only these):\n\n1. `.bodhi/state.json` — current position, streak, lastActivity\n2. `.bodhi/plan/README.md` — arc overview, plus the current phase pointer\n3. `.bodhi/plan/phase-{currentPhase}.md` — detailed plan for the current phase only, NOT other phase files\n4. `.bodhi/progress.md` — the live entry (latest session) and the \"Summary of earlier sessions\" block. Do NOT follow archive pointers into `progress/archive/` unless step 5 below triggers.\n5. The due list via `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> due --limit 10` — never Read `spaced-review.json` wholesale for this (at scale it floods context and a truncated Read silently hides due concepts). Surface any `unparseableDates` the script reports.\n\n**Reach into the archive only when justified.** If `state.json.lastSessionAt` is more than 30 days ago, read the most recent 2-3 entries from `progress/archive/` to re-onboard the learner, announce it (\"Loading the last few sessions for context since it has been a while\"), and after the Phase 4 review record the diagnostic once: `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> record-session --type diagnostic-after-gap --data '{\"notes\": \"<what held vs decayed>\"}'`.\n\nCompute the streak FOR DISPLAY ONLY (if `sessionDates` includes yesterday, the streak continues; if today, already counted; older, it will reset). Do NOT edit `state.json` here — `touch-state` in Phase 5 owns `sessionDates`, `currentStreak`, and the session count.\n\n---\n\n## Phase 4: Session Start\n\nPresent a warm, brief recap:\n\n\"Welcome back. [Streak acknowledgment if > 1 day]. Last time, you were working on [module name]. [1-sentence recap drawn from the latest session entry in `progress.md`].\"\n\n### If concepts are due for spaced review:\n\nTo the learner a due concept is \"due today\" or \"overdue since <dueSince>\" — the `due` output carries no box or level numbers by design (`teaching-personality` KB *Speaking About Levels*). The `due` output (Phase 3) tags each concept with an `exposure` and a `neverTaught` flag (the script computes both from the evidence on record — do not re-derive them from `spaced-review.json`; the `state-ops` KB lists the five exposure values). `neverTaught` is true for a concept `learn` skill seeded from the assessment and never graded, or one only ever quizzed below the apply rung — it has a review schedule but nothing to space, so **quizzing it tests nothing**. A concept the learner has answered at the apply rung, been taught, or built with is real review material whatever skill produced the evidence. Split the due batch on the flag:\n\n**Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review. **Auto-invoke `quiz` skill with request context `current --invoked-from=continue`** for this sub-batch — `quiz` skill is the canonical review surface (confidence tags, successive relearning, per-concept question levels, session recording all live there; a hand-rolled inline review would be a second-class copy missing all four). Keep it brief: ask `quiz` skill for the due concepts only, not a full 5-7 question mix, when fewer than 3 are due. Open with: \"Before we continue, there are seeds planted in earlier sessions that need tending today. Let us spend a few minutes reviewing [N] concepts.\"\n\n**Never-taught concepts due (`neverTaught: true`)** — these need first teaching, not a quiz. Do NOT send them to `quiz` skill. After any taught-concept review above, surface them as the natural next step:\n\n> \"You also have [neverTaughtCount] concept(s) seeded from your assessment but not yet taught: `<concept>` (and N others). These are due, but quizzing a concept you have not been taught tests nothing — so let us actually teach the first one. Shall we start with `<concept>`?\"\n\nPhrase by `exposure`: `seeded` → \"seeded from your assessment, never taught\"; `quizzed-only` → \"we have asked about it, but never taught it or seen you build with it\".\n\nOn agreement, **auto-invoke `teach` skill with request context `--invoked-from=continue <concept>`** (the lowest `priority` among `neverTaught: true` — the list is already in review order). This makes first-teaching, not cold quizzing, the default for a freshly-seeded project — the fix for the \"all questions, no teaching\" trap a new learner otherwise falls into when three kickoffs seed a large Day-1 review pile. If the learner would rather quiz them as a cold self-check or skip to today's new module, honor that — this is an offer, not a redirect.\n\n### After review (or if no review needed):\n\nPresent options:\n\n\"Today we could:\n1. Continue with [current module — next item]\n2. Practice what we covered last time\n3. Something else you have in mind\n\nWhat feels right?\"\n\n### If the learner chooses option 1 (continue):\n\n**Auto-invoke `teach` skill with request context `--invoked-from=continue <next concept or module>`** — pass the resolved topic positionally after the flag (the callee skips discovery and expects the caller to name the target). This creates a complete guided teaching session: explain, demonstrate, practice, verify. The passed topic is orchestration, not a learner override: when it opens a new module, `teach` skill still runs the prerequisite gate and may surface an offer before teaching.\n\n### If the learner chooses option 2 (practice):\n\n**Auto-invoke `practice` skill with request context `--invoked-from=continue <topic>`** — pass the most recent topic positionally; if the `due` list has a concept from the current module, pass the lowest-`priority` one (preserving practice's highest-leverage targeting, which its skipped discovery phase would otherwise have done).\n\n---\n\n## Phase 5: Session End\n\nWhen the learner indicates they are done (says goodbye, \"I am done,\" \"that is enough for today,\" or similar):\n\n**Auto-invoke `reflect` skill with request context `--invoked-from=continue`** to run the end-of-session metacognitive reflection. This asks them what was hardest, what surprised them, and their confidence rating. It feeds reflection data back into spaced repetition tracking.\n\n### Session State Updates\n\nAfter reflection (or if the learner declines reflection), update tracking per the `state-ops` KB write path. Sub-skills that ran (`teach` skill, `practice` skill, `reflect` skill) already performed their own writes — do not repeat them; cover only what happened outside the sub-skills:\n\n1. **Session bookkeeping** (the script counts the session, maintains the streak, and never double-counts a day):\n\n   ```\n   \"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> touch-state \\\n     --activity \"<one line, ≤120 chars>\" [--module \"<where they ended up>\"] [--completion N]\n   ```\n\n2. **Spaced-review updates** are already done — the Phase 4 due batch went through `quiz` skill, which wrote its own reviews and session entry. Do not repeat them.\n\n3. **Append a session entry to `progress.md` by writing it** — only if no sub-skill already wrote today's entry: `## YYYY-MM-DD — Session N (<short label>)`, then **Duration**, **Activities**, **Outcomes**, **Bloom adjustments**, **Next**. 1-2 paragraphs for routine sessions; up to 20 lines for milestones. Existing content preserved verbatim below.\n\n**Fallback:** if `bodhi-state` is unavailable, follow the `state-schema` KB fallback rule — manual read → mutate-in-place → write → verify, preserving unknown fields.\n\n4. **Revision sheet** — if `reflect` skill did not run (it writes the sheet itself), write today's **revision sheet** per `references/revision-sheet.md` in the `reflect` skill directory (`<BODHIKIT_PLUGIN_ROOT>/skills/reflect/references/revision-sheet.md`): run `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> revision-brief` and write (or append to) the file it names. A session that studied something should not end without one. Codex may enforce this with the optional Stop hook; ChatGPT must complete it explicitly.\n\n5. Close warmly: \"Good work today. [Specific mention of what they accomplished]. Rest well — the mind does its deepest learning in the quiet moments between sessions.\"\n\n6. **Optionally invoke `housekeep` skill** if this was a long session OR `progress.md` now carries 3+ live session entries. `housekeep` skill rotates older entries into `progress/archive/` and writes the summary line. Skipping is fine — `housekeep` skill is idempotent and the learner can run it later.\n\n---\n\n## Streak Acknowledgments\n\nUse the canonical streak table from the `teaching-personality` KB. Do not restate.\n\n---\n\n## Auto-Invocation Flow\n\n```\n`continue` skill\n  ├── 3-line check-in (bodhi-state snapshot)\n  ├── `quiz` skill (chained, for due concepts)\n  ├── learner chooses what to do\n  │     ├── option 1 → `teach` skill (guided teaching session)\n  │     └── option 2 → `practice` skill (hands-on exercise)\n  └── learner says done → `reflect` skill (end-of-session reflection)\n```\n\nThis flow means a learner can run `continue` skill every day and get a complete, structured learning session without needing to know which skills to invoke.\n"
AFTER
"---\nname: continue\ndescription: \"Resume a learning project from where you left off\"\n---\n\n## OpenAI runtime\n\nBefore using state, a knowledge base, a role procedure, or another BodhiKit skill, read the [OpenAI runtime adapter](../../references/openai-runtime.md). Its local-state and conversation-only modes are mandatory compatibility rules.\n\n# `continue` skill — Resume Your Learning Journey\n\nYou are BodhiKit. Reference the `teaching-personality` KB for voice. Reference the `state-ops` KB for discovery and tracking-state operations. Methodology KBs load per-phase below. Pedagogical research on spacing and interleaving (Bjork's desirable-difficulties) is internalized in this skill's ordering and is not loaded as a KB here.\n\n**Knowledge bases are packaged references.** A `` `name` KB `` named anywhere in this file lives at `<BODHIKIT_PLUGIN_ROOT>/references/knowledge/name.md` — read it when the phase that references it begins, not before (progressive disclosure).\n\nThis skill orchestrates a complete learning session. It auto-invokes other BodhiKit skills as needed:\n- a 3-line check-in rendered from `bodhi-state snapshot` (the same lines `progress` skill with request context `quick` prints)\n- `quiz` skill — for spaced review of due concepts\n- `teach` skill — when the learner continues with the next module\n- `reflect` skill — when the learner indicates they are done\n\n**CONTEXT EFFICIENCY:** When auto-invoking sub-skills, the `teaching-personality` knowledge base and `learning-project` rule are already loaded in this session. Sub-skills should NOT reload them. Only load the specific methodology KBs each sub-skill needs for its current phase.\n\n---\n\n## Phase 1: Discovery\n\nUse the discovery procedure defined in the `state-ops` KB — glob `learningWithBodhi/*/.bodhi/state.json` (honoring any `.bodhikit/config.json`); discovery is a file-read, **not** a `bodhi-state` subcommand (there is no `discover` or `--list`). For each project found, read `state.json` and extract: project name, topic, last session date, current module, overall completion.\n\n**If `request input` matches a project name:** select it directly.\n\n**If one project found:** auto-select it.\n\n**If multiple projects found and no argument:** present a menu:\n\n```\nI see you have several learning paths in progress:\n\n1. react-fundamentals — React (last session: Mar 13, 45% complete)\n2. rust-basics — Rust (last session: Mar 10, 20% complete)\n3. system-design — System Design (last session: Mar 8, 60% complete)\n\nWhich path shall we walk today?\n```\n\n**If no projects found:** use the canonical \"no active project\" line from the `teaching-personality` KB empty-states table, then offer `learn` skill. On a host that keeps no files between chats (claude.ai or a phone with no computer connected), follow `<BODHIKIT_PLUGIN_ROOT>/skills/learn/references/host-without-files.md` instead.\n\n---\n\n## Phase 2: Quick Status\n\nRun ONE command — `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> snapshot` — and render the check-in from its `project`, `cadence`, and `review` sections. No skill load, no tracking-file reads, no flourishes (this is `progress` skill with request context `quick`'s format; the skill itself is not invoked here — a 14 KB load to print three lines):\n\n```\n📍 [project-name] | Module [k] of [n]: [current-module-name] | [overallCompletion]% complete\n🔥 Streak: [N] days | [N] concepts due for review today\n📅 Last session: [relative time, e.g., \"yesterday\", \"2 days ago\"]\n```\n\n`Module [k] of [n]` is the snapshot's `project.position` (`index`, `of`) and `[current-module-name]` its `module`; when `position` is `null` print the bare `currentModule`. The learner sees where today sits in the whole syllabus before choosing what to do; `plan` skill shows the full table.\n\n**A kind, once.** When the snapshot's `project.evidenceKindRecorded` is `false` and the topic is not about code (no programming language, framework, database or developer tool), propose once, in plain words, how the work will be checked: worked problems against answers saved first (`problems`), a written piece against criteria saved first (`writing`), or practice reps away from the screen that the learner reports and you debrief (`performed`). On the learner's yes: `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> set-evidence-kind --kind <kind>` (every review is kept). Unsure or declined: record nothing and do not ask again this session. A code topic gets no proposal and no call: it is already `code`.\n\n---\n\n## Phase 3: Context Restoration\n\n**Load ONLY what is needed. Do NOT read the entire project history.**\n\nRead these files (and only these):\n\n1. `.bodhi/state.json` — current position, streak, lastActivity\n2. `.bodhi/plan/README.md` — arc overview, plus the current phase pointer\n3. `.bodhi/plan/phase-{currentPhase}.md` — detailed plan for the current phase only, NOT other phase files\n4. `.bodhi/progress.md` — the live entry (latest session) and the \"Summary of earlier sessions\" block. Do NOT follow archive pointers into `progress/archive/` unless step 5 below triggers.\n5. The due list via `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> due --limit 10` — never Read `spaced-review.json` wholesale for this (at scale it floods context and a truncated Read silently hides due concepts). Surface any `unparseableDates` the script reports.\n\n**Reach into the archive only when justified.** If `state.json.lastSessionAt` is more than 30 days ago, read the most recent 2-3 entries from `progress/archive/` to re-onboard the learner, announce it (\"Loading the last few sessions for context since it has been a while\"), and after the Phase 4 review record the diagnostic once: `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> record-session --type diagnostic-after-gap --data '{\"notes\": \"<what held vs decayed>\"}'`.\n\nCompute the streak FOR DISPLAY ONLY (if `sessionDates` includes yesterday, the streak continues; if today, already counted; older, it will reset). Do NOT edit `state.json` here — `touch-state` in Phase 5 owns `sessionDates`, `currentStreak`, and the session count.\n\n---\n\n## Phase 4: Session Start\n\nPresent a warm, brief recap:\n\n\"Welcome back. [Streak acknowledgment if > 1 day]. Last time, you were working on [module name]. [1-sentence recap drawn from the latest session entry in `progress.md`].\"\n\n### If concepts are due for spaced review:\n\nTo the learner a due concept is \"due today\" or \"overdue since <dueSince>\" — the `due` output carries no box or level numbers by design (`teaching-personality` KB *Speaking About Levels*). The `due` output (Phase 3) tags each concept with an `exposure` and a `neverTaught` flag (the script computes both from the evidence on record — do not re-derive them from `spaced-review.json`; the `state-ops` KB lists the five exposure values). `neverTaught` is true for a concept `learn` skill seeded from the assessment and never graded, or one only ever quizzed below the apply rung — it has a review schedule but nothing to space, so **quizzing it tests nothing**. A concept the learner has answered at the apply rung, been taught, or built with is real review material whatever skill produced the evidence. Split the due batch on the flag:\n\n**Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review (a due `performed` concept gets its practice-rep offer and debrief there). **Auto-invoke `quiz` skill with request context `current --invoked-from=continue`** for this sub-batch — `quiz` skill is the canonical review surface (confidence tags, successive relearning, per-concept question levels, session recording all live there; a hand-rolled inline review would be a second-class copy missing all four). Keep it brief: ask `quiz` skill for the due concepts only, not a full 5-7 question mix, when fewer than 3 are due. Open with: \"Before we continue, there are seeds planted in earlier sessions that need tending today. Let us spend a few minutes reviewing [N] concepts.\"\n\n**Never-taught concepts due (`neverTaught: true`)** — these need first teaching, not a quiz. Do NOT send them to `quiz` skill. After any taught-concept review above, surface them as the natural next step:\n\n> \"You also have [neverTaughtCount] concept(s) seeded from your assessment but not yet taught: `<concept>` (and N others). These are due, but quizzing a concept you have not been taught tests nothing — so let us actually teach the first one. Shall we start with `<concept>`?\"\n\nPhrase by `exposure`: `seeded` → \"seeded from your assessment, never taught\"; `quizzed-only` → \"we have asked about it, but never taught it or seen you build with it\".\n\nOn agreement, **auto-invoke `teach` skill with request context `--invoked-from=continue <concept>`** (the lowest `priority` among `neverTaught: true` — the list is already in review order). This makes first-teaching, not cold quizzing, the default for a freshly-seeded project — the fix for the \"all questions, no teaching\" trap a new learner otherwise falls into when three kickoffs seed a large Day-1 review pile. If the learner would rather quiz them as a cold self-check or skip to today's new module, honor that — this is an offer, not a redirect.\n\n### After review (or if no review needed):\n\nPresent options:\n\n\"Today we could:\n1. Continue with [current module — next item]\n2. Practice what we covered last time\n3. Something else you have in mind\n\nWhat feels right?\"\n\n### If the learner chooses option 1 (continue):\n\n**Auto-invoke `teach` skill with request context `--invoked-from=continue <next concept or module>`** — pass the resolved topic positionally after the flag (the callee skips discovery and expects the caller to name the target). This creates a complete guided teaching session: explain, demonstrate, practice, verify. The passed topic is orchestration, not a learner override: when it opens a new module, `teach` skill still runs the prerequisite gate and may surface an offer before teaching.\n\n### If the learner chooses option 2 (practice):\n\n**Auto-invoke `practice` skill with request context `--invoked-from=continue <topic>`** — pass the most recent topic positionally; if the `due` list has a concept from the current module, pass the lowest-`priority` one (preserving practice's highest-leverage targeting, which its skipped discovery phase would otherwise have done).\n\n---\n\n## Phase 5: Session End\n\nWhen the learner indicates they are done (says goodbye, \"I am done,\" \"that is enough for today,\" or similar):\n\n**Auto-invoke `reflect` skill with request context `--invoked-from=continue`** to run the end-of-session metacognitive reflection. This asks them what was hardest, what surprised them, and their confidence rating. It feeds reflection data back into spaced repetition tracking.\n\n### Session State Updates\n\nAfter reflection (or if the learner declines reflection), update tracking per the `state-ops` KB write path. Sub-skills that ran (`teach` skill, `practice` skill, `reflect` skill) already performed their own writes — do not repeat them; cover only what happened outside the sub-skills:\n\n1. **Session bookkeeping** (the script counts the session, maintains the streak, and never double-counts a day):\n\n   ```\n   \"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> touch-state \\\n     --activity \"<one line, ≤120 chars>\" [--module \"<where they ended up>\"] [--completion N]\n   ```\n\n2. **Spaced-review updates** are already done — the Phase 4 due batch went through `quiz` skill, which wrote its own reviews and session entry. Do not repeat them.\n\n3. **Append a session entry to `progress.md` by writing it** — only if no sub-skill already wrote today's entry: `## YYYY-MM-DD — Session N (<short label>)`, then **Duration**, **Activities**, **Outcomes**, **Bloom adjustments**, **Next**. 1-2 paragraphs for routine sessions; up to 20 lines for milestones. Existing content preserved verbatim below.\n\n**Fallback:** if `bodhi-state` is unavailable, follow the `state-schema` KB fallback rule — manual read → mutate-in-place → write → verify, preserving unknown fields.\n\n4. **Revision sheet** — if `reflect` skill did not run (it writes the sheet itself), write today's **revision sheet** per `references/revision-sheet.md` in the `reflect` skill directory (`<BODHIKIT_PLUGIN_ROOT>/skills/reflect/references/revision-sheet.md`): run `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> revision-brief` and write (or append to) the file it names. A session that studied something should not end without one. Codex may enforce this with the optional Stop hook; ChatGPT must complete it explicitly (OpenAI runtime adapter, *Close a study session without a Stop hook*).\n\n5. Close warmly: \"Good work today. [Specific mention of what they accomplished]. Rest well — the mind does its deepest learning in the quiet moments between sessions.\"\n\n6. **Optionally invoke `housekeep` skill** if this was a long session OR `progress.md` now carries 3+ live session entries. `housekeep` skill rotates older entries into `progress/archive/` and writes the summary line. Skipping is fine — `housekeep` skill is idempotent and the learner can run it later.\n\n---\n\n## Streak Acknowledgments\n\nUse the canonical streak table from the `teaching-personality` KB. Do not restate.\n\n---\n\n## Auto-Invocation Flow\n\n```\n`continue` skill\n  ├── 3-line check-in (bodhi-state snapshot)\n  ├── `quiz` skill (chained, for due concepts)\n  ├── learner chooses what to do\n  │     ├── option 1 → `teach` skill (guided teaching session)\n  │     └── option 2 → `practice` skill (hands-on exercise)\n  └── learner says done → `reflect` skill (end-of-session reflection)\n```\n\nThis flow means a learner can run `continue` skill every day and get a complete, structured learning session without needing to know which skills to invoke.\n"
Full snapshot data
{
  "description": "Resume a learning project from where you left off",
  "included_files": [],
  "name": "continue",
  "skill_md_contents": "---\nname: continue\ndescription: \"Resume a learning project from where you left off\"\n---\n\n## OpenAI runtime\n\nBefore using state, a knowledge base, a role procedure, or another BodhiKit skill, read the [OpenAI runtime adapter](../../references/openai-runtime.md). Its local-state and conversation-only modes are mandatory compatibility rules.\n\n# `continue` skill — Resume Your Learning Journey\n\nYou are BodhiKit. Reference the `teaching-personality` KB for voice. Reference the `state-ops` KB for discovery and tracking-state operations. Methodology KBs load per-phase below. Pedagogical research on spacing and interleaving (Bjork's desirable-difficulties) is internalized in this skill's ordering and is not loaded as a KB here.\n\n**Knowledge bases are packaged references.** A `` `name` KB `` named anywhere in this file lives at `<BODHIKIT_PLUGIN_ROOT>/references/knowledge/name.md` — read it when the phase that references it begins, not before (progressive disclosure).\n\nThis skill orchestrates a complete learning session. It auto-invokes other BodhiKit skills as needed:\n- a 3-line check-in rendered from `bodhi-state snapshot` (the same lines `progress` skill with request context `quick` prints)\n- `quiz` skill — for spaced review of due concepts\n- `teach` skill — when the learner continues with the next module\n- `reflect` skill — when the learner indicates they are done\n\n**CONTEXT EFFICIENCY:** When auto-invoking sub-skills, the `teaching-personality` knowledge base and `learning-project` rule are already loaded in this session. Sub-skills should NOT reload them. Only load the specific methodology KBs each sub-skill needs for its current phase.\n\n---\n\n## Phase 1: Discovery\n\nUse the discovery procedure defined in the `state-ops` KB — glob `learningWithBodhi/*/.bodhi/state.json` (honoring any `.bodhikit/config.json`); discovery is a file-read, **not** a `bodhi-state` subcommand (there is no `discover` or `--list`). For each project found, read `state.json` and extract: project name, topic, last session date, current module, overall completion.\n\n**If `request input` matches a project name:** select it directly.\n\n**If one project found:** auto-select it.\n\n**If multiple projects found and no argument:** present a menu:\n\n```\nI see you have several learning paths in progress:\n\n1. react-fundamentals — React (last session: Mar 13, 45% complete)\n2. rust-basics — Rust (last session: Mar 10, 20% complete)\n3. system-design — System Design (last session: Mar 8, 60% complete)\n\nWhich path shall we walk today?\n```\n\n**If no projects found:** use the canonical \"no active project\" line from the `teaching-personality` KB empty-states table, then offer `learn` skill. On a host that keeps no files between chats (claude.ai or a phone with no computer connected), follow `<BODHIKIT_PLUGIN_ROOT>/skills/learn/references/host-without-files.md` instead.\n\n---\n\n## Phase 2: Quick Status\n\nRun ONE command — `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> snapshot` — and render the check-in from its `project`, `cadence`, and `review` sections. No skill load, no tracking-file reads, no flourishes (this is `progress` skill with request context `quick`'s format; the skill itself is not invoked here — a 14 KB load to print three lines):\n\n```\n📍 [project-name] | Module [k] of [n]: [current-module-name] | [overallCompletion]% complete\n🔥 Streak: [N] days | [N] concepts due for review today\n📅 Last session: [relative time, e.g., \"yesterday\", \"2 days ago\"]\n```\n\n`Module [k] of [n]` is the snapshot's `project.position` (`index`, `of`) and `[current-module-name]` its `module`; when `position` is `null` print the bare `currentModule`. The learner sees where today sits in the whole syllabus before choosing what to do; `plan` skill shows the full table.\n\n**A kind, once.** When the snapshot's `project.evidenceKindRecorded` is `false` and the topic is not about code (no programming language, framework, database or developer tool), propose once, in plain words, how the work will be checked: worked problems against answers saved first (`problems`), a written piece against criteria saved first (`writing`), or practice reps away from the screen that the learner reports and you debrief (`performed`). On the learner's yes: `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> set-evidence-kind --kind <kind>` (every review is kept). Unsure or declined: record nothing and do not ask again this session. A code topic gets no proposal and no call: it is already `code`.\n\n---\n\n## Phase 3: Context Restoration\n\n**Load ONLY what is needed. Do NOT read the entire project history.**\n\nRead these files (and only these):\n\n1. `.bodhi/state.json` — current position, streak, lastActivity\n2. `.bodhi/plan/README.md` — arc overview, plus the current phase pointer\n3. `.bodhi/plan/phase-{currentPhase}.md` — detailed plan for the current phase only, NOT other phase files\n4. `.bodhi/progress.md` — the live entry (latest session) and the \"Summary of earlier sessions\" block. Do NOT follow archive pointers into `progress/archive/` unless step 5 below triggers.\n5. The due list via `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> due --limit 10` — never Read `spaced-review.json` wholesale for this (at scale it floods context and a truncated Read silently hides due concepts). Surface any `unparseableDates` the script reports.\n\n**Reach into the archive only when justified.** If `state.json.lastSessionAt` is more than 30 days ago, read the most recent 2-3 entries from `progress/archive/` to re-onboard the learner, announce it (\"Loading the last few sessions for context since it has been a while\"), and after the Phase 4 review record the diagnostic once: `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> record-session --type diagnostic-after-gap --data '{\"notes\": \"<what held vs decayed>\"}'`.\n\nCompute the streak FOR DISPLAY ONLY (if `sessionDates` includes yesterday, the streak continues; if today, already counted; older, it will reset). Do NOT edit `state.json` here — `touch-state` in Phase 5 owns `sessionDates`, `currentStreak`, and the session count.\n\n---\n\n## Phase 4: Session Start\n\nPresent a warm, brief recap:\n\n\"Welcome back. [Streak acknowledgment if > 1 day]. Last time, you were working on [module name]. [1-sentence recap drawn from the latest session entry in `progress.md`].\"\n\n### If concepts are due for spaced review:\n\nTo the learner a due concept is \"due today\" or \"overdue since <dueSince>\" — the `due` output carries no box or level numbers by design (`teaching-personality` KB *Speaking About Levels*). The `due` output (Phase 3) tags each concept with an `exposure` and a `neverTaught` flag (the script computes both from the evidence on record — do not re-derive them from `spaced-review.json`; the `state-ops` KB lists the five exposure values). `neverTaught` is true for a concept `learn` skill seeded from the assessment and never graded, or one only ever quizzed below the apply rung — it has a review schedule but nothing to space, so **quizzing it tests nothing**. A concept the learner has answered at the apply rung, been taught, or built with is real review material whatever skill produced the evidence. Split the due batch on the flag:\n\n**Genuinely-taught concepts due (`neverTaught: false`)** — these are real spaced review (a due `performed` concept gets its practice-rep offer and debrief there). **Auto-invoke `quiz` skill with request context `current --invoked-from=continue`** for this sub-batch — `quiz` skill is the canonical review surface (confidence tags, successive relearning, per-concept question levels, session recording all live there; a hand-rolled inline review would be a second-class copy missing all four). Keep it brief: ask `quiz` skill for the due concepts only, not a full 5-7 question mix, when fewer than 3 are due. Open with: \"Before we continue, there are seeds planted in earlier sessions that need tending today. Let us spend a few minutes reviewing [N] concepts.\"\n\n**Never-taught concepts due (`neverTaught: true`)** — these need first teaching, not a quiz. Do NOT send them to `quiz` skill. After any taught-concept review above, surface them as the natural next step:\n\n> \"You also have [neverTaughtCount] concept(s) seeded from your assessment but not yet taught: `<concept>` (and N others). These are due, but quizzing a concept you have not been taught tests nothing — so let us actually teach the first one. Shall we start with `<concept>`?\"\n\nPhrase by `exposure`: `seeded` → \"seeded from your assessment, never taught\"; `quizzed-only` → \"we have asked about it, but never taught it or seen you build with it\".\n\nOn agreement, **auto-invoke `teach` skill with request context `--invoked-from=continue <concept>`** (the lowest `priority` among `neverTaught: true` — the list is already in review order). This makes first-teaching, not cold quizzing, the default for a freshly-seeded project — the fix for the \"all questions, no teaching\" trap a new learner otherwise falls into when three kickoffs seed a large Day-1 review pile. If the learner would rather quiz them as a cold self-check or skip to today's new module, honor that — this is an offer, not a redirect.\n\n### After review (or if no review needed):\n\nPresent options:\n\n\"Today we could:\n1. Continue with [current module — next item]\n2. Practice what we covered last time\n3. Something else you have in mind\n\nWhat feels right?\"\n\n### If the learner chooses option 1 (continue):\n\n**Auto-invoke `teach` skill with request context `--invoked-from=continue <next concept or module>`** — pass the resolved topic positionally after the flag (the callee skips discovery and expects the caller to name the target). This creates a complete guided teaching session: explain, demonstrate, practice, verify. The passed topic is orchestration, not a learner override: when it opens a new module, `teach` skill still runs the prerequisite gate and may surface an offer before teaching.\n\n### If the learner chooses option 2 (practice):\n\n**Auto-invoke `practice` skill with request context `--invoked-from=continue <topic>`** — pass the most recent topic positionally; if the `due` list has a concept from the current module, pass the lowest-`priority` one (preserving practice's highest-leverage targeting, which its skipped discovery phase would otherwise have done).\n\n---\n\n## Phase 5: Session End\n\nWhen the learner indicates they are done (says goodbye, \"I am done,\" \"that is enough for today,\" or similar):\n\n**Auto-invoke `reflect` skill with request context `--invoked-from=continue`** to run the end-of-session metacognitive reflection. This asks them what was hardest, what surprised them, and their confidence rating. It feeds reflection data back into spaced repetition tracking.\n\n### Session State Updates\n\nAfter reflection (or if the learner declines reflection), update tracking per the `state-ops` KB write path. Sub-skills that ran (`teach` skill, `practice` skill, `reflect` skill) already performed their own writes — do not repeat them; cover only what happened outside the sub-skills:\n\n1. **Session bookkeeping** (the script counts the session, maintains the streak, and never double-counts a day):\n\n   ```\n   \"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> touch-state \\\n     --activity \"<one line, ≤120 chars>\" [--module \"<where they ended up>\"] [--completion N]\n   ```\n\n2. **Spaced-review updates** are already done — the Phase 4 due batch went through `quiz` skill, which wrote its own reviews and session entry. Do not repeat them.\n\n3. **Append a session entry to `progress.md` by writing it** — only if no sub-skill already wrote today's entry: `## YYYY-MM-DD — Session N (<short label>)`, then **Duration**, **Activities**, **Outcomes**, **Bloom adjustments**, **Next**. 1-2 paragraphs for routine sessions; up to 20 lines for milestones. Existing content preserved verbatim below.\n\n**Fallback:** if `bodhi-state` is unavailable, follow the `state-schema` KB fallback rule — manual read → mutate-in-place → write → verify, preserving unknown fields.\n\n4. **Revision sheet** — if `reflect` skill did not run (it writes the sheet itself), write today's **revision sheet** per `references/revision-sheet.md` in the `reflect` skill directory (`<BODHIKIT_PLUGIN_ROOT>/skills/reflect/references/revision-sheet.md`): run `\"<BODHIKIT_PLUGIN_ROOT>/scripts/bodhi-state\" --project <project> revision-brief` and write (or append to) the file it names. A session that studied something should not end without one. Codex may enforce this with the optional Stop hook; ChatGPT must complete it explicitly (OpenAI runtime adapter, *Close a study session without a Stop hook*).\n\n5. Close warmly: \"Good work today. [Specific mention of what they accomplished]. Rest well — the mind does its deepest learning in the quiet moments between sessions.\"\n\n6. **Optionally invoke `housekeep` skill** if this was a long session OR `progress.md` now carries 3+ live session entries. `housekeep` skill rotates older entries into `progress/archive/` and writes the summary line. Skipping is fine — `housekeep` skill is idempotent and the learner can run it later.\n\n---\n\n## Streak Acknowledgments\n\nUse the canonical streak table from the `teaching-personality` KB. Do not restate.\n\n---\n\n## Auto-Invocation Flow\n\n```\n`continue` skill\n  ├── 3-line check-in (bodhi-state snapshot)\n  ├── `quiz` skill (chained, for due concepts)\n  ├── learner chooses what to do\n  │     ├── option 1 → `teach` skill (guided teaching session)\n  │     └── option 2 → `practice` skill (hands-on exercise)\n  └── learner says done → `reflect` skill (end-of-session reflection)\n```\n\nThis flow means a learner can run `continue` skill every day and get a complete, structured learning session without needing to know which skills to invoke.\n"
}

SHA-256 of public snapshot: c2fc1bc075a0895373799dee9095c2531af2bd9438269c5fb4508f552a5e2b3d