Lab Homework
Generates a personal practice assignment tied to a specific Claude Code Lab meeting.
Language
Default: English. Switch to Russian if the user wrote to you in Russian. The generated assignment file is written in the same language as the user's request.
Inputs
1. Curriculum manifest
Fetched from the public API:
https://agency-lab.glebkalinin.com/api/curriculum/<cohort>.json
- Cohort slug stored in
<vault>/.config.md under cohort:. On first run, ask the user via AskUserQuestion — options: goal-driven-design-ru, goal-driven-design-en, claude-code-lab-05, claude-code-lab-04 (older cohorts claude-code-lab-03/-02 on request).
- Cache: write the response to
<vault>/.cache/curriculum-<cohort>.json with an added top-level _fetched_at ISO timestamp. Reuse the cache if younger than 24h.
- Refresh triggers: user phrases "refresh curriculum", "update curriculum", "pull latest", "обнови программу", "обнови курс" force a re-fetch. If the cache is older than 7 days, offer a refresh before continuing.
- Schema:
schema_version: 2. See references/curriculum-schema.md. If schema_version is missing or unknown, refuse and tell the user to update the skill.
- Failure: on 404 or network error, tell the user, suggest
refresh curriculum, and offer to accept the meeting topic in one sentence as manual input. Do not fabricate content.
2. Meeting content
Each meeting in the manifest has two fields the skill uses:
summary_md — the already-synthesized record of what was covered in that meeting.
has_content: boolean — true when summary_md is real content, false when it's a pre-event stub.
If has_content is true: use summary_md as the source of truth. Do not fetch a separate transcript. Do not invent content.
If has_content is false (meeting hasn't happened yet): see "Handling future meetings" below.
Optional per-meeting endpoint (for direct drill-in without re-fetching the cohort list):
https://agency-lab.glebkalinin.com/api/curriculum/<cohort>/<meeting>.json
3. Personal vault
Read from the vault (see lab-context skill):
goals.md — what the user wants
tools-learned.md — what's already familiar (recent entries matter more)
projects.md — what they're working on (best landing pad for tasks)
profile.md — level, primary language
homework/ — existing assignments (to avoid duplicates)
If the vault is missing or empty, point to lab-context first. Don't invent personal context.
4. Sandbox context (optional)
Read <vault>/sandbox/ if it exists. These files provide a simulated work environment (clients, customers, stakeholders, projects) that grounds homework in realistic scenarios.
- Real projects beat sandbox. If
projects.md has an active project that fits the meeting topic, use it as the task landing pad.
- If no real project fits (or
projects.md is empty), use sandbox entities to make the task concrete — reference specific clients, customers, or team members.
- Never mix sandbox and real-project context in the same task.
- Starter sandbox templates are bundled at
<skill-dir>/sandboxes/{company,consultant,freelancer,solopreneur}/. If the user has no <vault>/sandbox/ and asks for one, offer to copy one of these.
Workflow
- Resolve cohort — read
<vault>/.config.md for cohort:. If missing, ask via AskUserQuestion (default claude-code-lab-05) and save it.
- Fetch or reuse the curriculum manifest (see caching rules above).
- Ask which meeting via
AskUserQuestion, populated from manifest.meetings[] (number + title). Mark stubs visibly — append " (upcoming)" or " (not yet covered)" to titles where has_content is false. Single-select.
- Ask parameters via a second
AskUserQuestion:
- "How much time do you have?" — 30 min / 1 hour / evening / weekend
- "Where should this land?" — active project / playground / either
- Read vault + optional sandbox (profile, goals, tools-learned, projects, existing homework, sandbox/).
- Generate the assignment using the pedagogical rubric below, grounded in the selected meeting's
summary_md.
- If
has_content: false, follow "Handling future meetings" below instead of improvising from the stub.
- Offer recommended agents (optional step, silent when not applicable).
- If the manifest has a top-level
agents[] array AND the selected meeting has recommended_agents: look each up, tell the user "[Agent Name] could help — install to .claude/agents/?", confirm before installing.
- Otherwise: check the bundled
<skill-dir>/agents/ directory. If bundled agents are topic-relevant (e.g. prompt-coach for prompting meetings), offer to install from local copies. Confirm first.
- Write confirmed agents to
.claude/agents/<id>.md. Skip any that already exist.
- Never install automatically. If the user declines, move on and don't re-offer.
- Write the homework file to
<vault>/homework/YYYY-MM-DD-meeting-<NN>-<slug>.md.
- Update
<vault>/progress.md:
- If the file doesn't exist, create it from
<skill-dir>/references/progress-template.md (substitute {{date}} with today's ISO date).
- Find the section for this meeting (e.g.
## Meeting 03 — Prompt Engineering). If missing, create it.
- Append a line:
- [ ] Homework: [[homework/YYYY-MM-DD-meeting-NN-slug.md]].
- Update the
updated: date in frontmatter and bump homework_completed by 0 (increment only when the user marks it done).
- Use Edit, never overwrite the file wholesale.
- Summarise briefly in the chat: one sentence about the task + the reflection question. Don't dump the whole file.
Handling future meetings
When the selected meeting has has_content: false, the manifest's summary_md is a stub and can't ground the task. Options, in order of preference:
- Use the title + description. The frontmatter usually encodes intent (e.g.
Meeting 05: Subagents & Research (theory + demos)). If that's enough to design a preparatory task, tell the user: "This meeting hasn't happened yet. I'll design a prep task based on the planned topic (). Confirm before I write."
- Ask the user to describe the planned topic in one sentence if the title is too vague.
- Redirect to a completed meeting if the participant is unsure. Show only
has_content: true meetings and ask again.
Never silently generate a task using fabricated content.
Pedagogical rubric
- An artifact is mandatory. The participant must end up with a file / folder / script / commit they can show at the next meeting. "Read the docs" ≠ a task.
- Open-ended, not a test. Frame as "build X that does Y" — the how is the participant's call.
- 80% familiar + 20% new. Most of the task leans on
tools-learned.md. Exactly one new element — not two.
- Ground it in the summary. Pull specific topics / demos from
summary_md. The task should feel like "continue what we did on screen".
- Land it in a real project when possible. Real project > sandbox > playground.
- Provocation, not instruction. "Figure out how the agent could verify its own work" > "create a hook that runs pytest after every Edit".
- One reflection question that can't be googled — only answered from experience.
- Smaller than feels right. 45 minutes finished > 3 hours abandoned.
Output format
Save to <vault>/homework/YYYY-MM-DD-meeting-<NN>-<slug>.md:
---
date: <YYYY-MM-DD>
meeting: <NN>
meeting_title: <title from manifest>
estimated_time: <30m | 1h | evening | weekend>
tools: [<tool1>, <tool2>]
related_goal: <quote from goals.md>
related_project: <[[projects#name]] or playground or sandbox/<entity>>
status: new
---
# <Task name>
## Why this matters for you
<1-2 sentences linking the task to the user's goal>
## Context from the meeting
<1-2 sentences summarising the relevant slice of `summary_md` — what the presenter showed>
## What you'll build
<clear description of the target — build, fix, or investigate>
## The new thing
<the single 20% — explicitly named>
## Done when
- [ ] <concrete observable result>
- [ ] <another one>
## Reflection
<one question worth asking yourself after you finish>
Rules
- One task per call. If the user wants more — suggest picking one.
- Never duplicate past homework. Check
homework/ first. Continue an existing task as "part 2" or pick a different angle.
- Concrete over abstract. Not "practice MCP" but "write an MCP server with one tool
get_current_weather, wire it into Claude Code, call it three times".
- Never create files outside the vault. For scratch dirs use
<vault>/homework/<slug>/.
- If the manifest fetch fails, tell the user and offer
refresh curriculum or accept a one-sentence topic. Don't fabricate.
- If the cache is stale (older than 7 days), warn and offer to refresh before generating.
1---2name: lab-homework3description: Use when the user wants a practice assignment between Claude Code Lab meetings — a concrete task tied to a specific lab meeting, that combines their personal goals with what was actually covered in the presentation. Triggers on "give me homework", "generate a practice task", "what should I practice", "homework for meeting 3", "задание на неделю". Fetches the current cohort's curriculum from agency-lab.glebkalinin.com, uses the meeting summary as the presentation record, reads the lab vault (plus optional sandbox) for personal context, and writes the assignment as a new markdown file. Also updates progress.md and optionally installs recommended agents.4---56# Lab Homework78Generates a personal practice assignment tied to a specific Claude Code Lab meeting.910## Language1112**Default: English.** Switch to Russian if the user wrote to you in Russian. The generated assignment file is written in the same language as the user's request.1314## Inputs1516### 1. Curriculum manifest1718Fetched from the public API:1920```21https://agency-lab.glebkalinin.com/api/curriculum/<cohort>.json22```2324- Cohort slug stored in `<vault>/.config.md` under `cohort:`. On first run, ask the user via `AskUserQuestion` — options: `goal-driven-design-ru`, `goal-driven-design-en`, `claude-code-lab-05`, `claude-code-lab-04` (older cohorts `claude-code-lab-03`/`-02` on request).25- **Cache:** write the response to `<vault>/.cache/curriculum-<cohort>.json` with an added top-level `_fetched_at` ISO timestamp. Reuse the cache if younger than 24h.26- **Refresh triggers:** user phrases "refresh curriculum", "update curriculum", "pull latest", "обнови программу", "обнови курс" force a re-fetch. If the cache is older than 7 days, offer a refresh before continuing.27- **Schema:** `schema_version: 2`. See `references/curriculum-schema.md`. If `schema_version` is missing or unknown, refuse and tell the user to update the skill.28- **Failure:** on 404 or network error, tell the user, suggest `refresh curriculum`, and offer to accept the meeting topic in one sentence as manual input. Do not fabricate content.2930### 2. Meeting content3132Each meeting in the manifest has two fields the skill uses:3334- `summary_md` — the already-synthesized record of what was covered in that meeting.35- `has_content: boolean` — `true` when `summary_md` is real content, `false` when it's a pre-event stub.3637**If `has_content` is true:** use `summary_md` as the source of truth. Do not fetch a separate transcript. Do not invent content.3839**If `has_content` is false** (meeting hasn't happened yet): see "Handling future meetings" below.4041**Optional per-meeting endpoint** (for direct drill-in without re-fetching the cohort list):4243```44https://agency-lab.glebkalinin.com/api/curriculum/<cohort>/<meeting>.json45```4647### 3. Personal vault4849Read from the vault (see `lab-context` skill):50- `goals.md` — what the user wants51- `tools-learned.md` — what's already familiar (recent entries matter more)52- `projects.md` — what they're working on (best landing pad for tasks)53- `profile.md` — level, primary language54- `homework/` — existing assignments (to avoid duplicates)5556If the vault is missing or empty, point to `lab-context` first. Don't invent personal context.5758### 4. Sandbox context (optional)5960Read `<vault>/sandbox/` if it exists. These files provide a simulated work environment (clients, customers, stakeholders, projects) that grounds homework in realistic scenarios.6162- **Real projects beat sandbox.** If `projects.md` has an active project that fits the meeting topic, use it as the task landing pad.63- If no real project fits (or `projects.md` is empty), use sandbox entities to make the task concrete — reference specific clients, customers, or team members.64- **Never mix** sandbox and real-project context in the same task.65- Starter sandbox templates are bundled at `<skill-dir>/sandboxes/{company,consultant,freelancer,solopreneur}/`. If the user has no `<vault>/sandbox/` and asks for one, offer to copy one of these.6667## Workflow68691. **Resolve cohort** — read `<vault>/.config.md` for `cohort:`. If missing, ask via `AskUserQuestion` (default `claude-code-lab-05`) and save it.702. **Fetch or reuse the curriculum manifest** (see caching rules above).713. **Ask which meeting** via `AskUserQuestion`, populated from `manifest.meetings[]` (number + title). Mark stubs visibly — append " (upcoming)" or " (not yet covered)" to titles where `has_content` is false. Single-select.724. **Ask parameters** via a second `AskUserQuestion`:73 - **"How much time do you have?"** — 30 min / 1 hour / evening / weekend74 - **"Where should this land?"** — active project / playground / either755. **Read vault + optional sandbox** (profile, goals, tools-learned, projects, existing homework, sandbox/).766. **Generate the assignment** using the pedagogical rubric below, grounded in the selected meeting's `summary_md`.77 - If `has_content: false`, follow "Handling future meetings" below instead of improvising from the stub.787. **Offer recommended agents** (optional step, silent when not applicable).79 - If the manifest has a top-level `agents[]` array AND the selected meeting has `recommended_agents`: look each up, tell the user "**[Agent Name]** could help — install to `.claude/agents/`?", confirm before installing.80 - Otherwise: check the bundled `<skill-dir>/agents/` directory. If bundled agents are topic-relevant (e.g. `prompt-coach` for prompting meetings), offer to install from local copies. Confirm first.81 - Write confirmed agents to `.claude/agents/<id>.md`. Skip any that already exist.82 - Never install automatically. If the user declines, move on and don't re-offer.838. **Write the homework file** to `<vault>/homework/YYYY-MM-DD-meeting-<NN>-<slug>.md`.849. **Update `<vault>/progress.md`:**85 - If the file doesn't exist, create it from `<skill-dir>/references/progress-template.md` (substitute `{{date}}` with today's ISO date).86 - Find the section for this meeting (e.g. `## Meeting 03 — Prompt Engineering`). If missing, create it.87 - Append a line: `- [ ] Homework: [[homework/YYYY-MM-DD-meeting-NN-slug.md]]`.88 - Update the `updated:` date in frontmatter and bump `homework_completed` by 0 (increment only when the user marks it done).89 - Use **Edit**, never overwrite the file wholesale.9010. **Summarise briefly** in the chat: one sentence about the task + the reflection question. Don't dump the whole file.9192## Handling future meetings9394When the selected meeting has `has_content: false`, the manifest's `summary_md` is a stub and can't ground the task. Options, in order of preference:95961. **Use the title + description.** The frontmatter usually encodes intent (e.g. `Meeting 05: Subagents & Research (theory + demos)`). If that's enough to design a *preparatory* task, tell the user: "This meeting hasn't happened yet. I'll design a prep task based on the planned topic (<title>). Confirm before I write."972. **Ask the user to describe the planned topic in one sentence** if the title is too vague.983. **Redirect to a completed meeting** if the participant is unsure. Show only `has_content: true` meetings and ask again.99100Never silently generate a task using fabricated content.101102## Pedagogical rubric103104- **An artifact is mandatory.** The participant must end up with a file / folder / script / commit they can show at the next meeting. "Read the docs" ≠ a task.105- **Open-ended, not a test.** Frame as "build X that does Y" — the *how* is the participant's call.106- **80% familiar + 20% new.** Most of the task leans on `tools-learned.md`. Exactly one new element — not two.107- **Ground it in the summary.** Pull specific topics / demos from `summary_md`. The task should feel like "continue what we did on screen".108- **Land it in a real project when possible.** Real project > sandbox > playground.109- **Provocation, not instruction.** "Figure out how the agent could verify its own work" > "create a hook that runs pytest after every Edit".110- **One reflection question** that can't be googled — only answered from experience.111- **Smaller than feels right.** 45 minutes finished > 3 hours abandoned.112113## Output format114115Save to `<vault>/homework/YYYY-MM-DD-meeting-<NN>-<slug>.md`:116117````markdown118---119date: <YYYY-MM-DD>120meeting: <NN>121meeting_title: <title from manifest>122estimated_time: <30m | 1h | evening | weekend>123tools: [<tool1>, <tool2>]124related_goal: <quote from goals.md>125related_project: <[[projects#name]] or playground or sandbox/<entity>>126status: new127---128129# <Task name>130131## Why this matters for you132<1-2 sentences linking the task to the user's goal>133134## Context from the meeting135<1-2 sentences summarising the relevant slice of `summary_md` — what the presenter showed>136137## What you'll build138<clear description of the target — build, fix, or investigate>139140## The new thing141<the single 20% — explicitly named>142143## Done when144- [ ] <concrete observable result>145- [ ] <another one>146147## Reflection148<one question worth asking yourself after you finish>149````150151## Rules152153- **One task per call.** If the user wants more — suggest picking one.154- **Never duplicate past homework.** Check `homework/` first. Continue an existing task as "part 2" or pick a different angle.155- **Concrete over abstract.** Not "practice MCP" but "write an MCP server with one tool `get_current_weather`, wire it into Claude Code, call it three times".156- **Never create files outside the vault.** For scratch dirs use `<vault>/homework/<slug>/`.157- **If the manifest fetch fails**, tell the user and offer `refresh curriculum` or accept a one-sentence topic. Don't fabricate.158- **If the cache is stale** (older than 7 days), warn and offer to refresh before generating.