The Pain
The methodology works. It took the whole course to build: the lab manual that briefs every session, the cleaning procedure with its filter cascade, the contract hooks that caught the schema drift, the RA subagents with their report contracts, the referee that argues from outside, the warehouse plumbing, the worktree discipline that keeps a 3 a.m. failure deletable. It lives in your dotfiles and your repo’s configuration and, more than you would like to admit, in your head — the order you do things in, the thing you always check, the reason that hook exists.
And it is going to graduate when you do. The new student joining in the fall will spend their first six weeks rediscovering what you already know, badly, while the careful machinery you built sits one directory over, uninstalled, because there is no command that installs it. The lab will re-onboard from scratch — the same dead ends, the same drift caught late, the same evening lost to a 100%-null column — not because the knowledge was lost but because it was never packaged. A methodology that lives in one person’s setup dies with that person’s tenure. The work was never just the analysis; it was the apparatus around the analysis, and an apparatus you cannot hand to the next person is an apparatus you have to rebuild every time the lab turns over.
Why / When
This lesson packages everything the course built into one installable
artifact — call it lab-kit — so the methodology ships like software
instead of dying like folklore. This is the distribution problem named
in the methods literature as a first-class research output: a way of
working is only reproducible if someone other than its author can adopt
it whole.
The pipeline stage this serves is onboarding and distribution — the work of making the lab’s way of working portable. The role it absorbs is the onboarding nobody wants to run twice: instead of walking each new member through six weeks of setup, you hand them a kit and a command. It is worth doing precisely when the conventions have stopped changing — a packaged methodology is a release, and releasing something that is still in flux ships a wrong answer with a version number on it. Package the parts of the course that have settled into law; leave the parts you are still arguing about un-boxed.
Contrary winds
Not for: a convention that is still changing weekly — package a methodology once it has stopped moving, or you will ship a kit that is wrong by the time it installs.
Mechanics
What’s in the box
The kit is not new work — it is the course, inventoried. Everything you built is already an artifact; packaging is collecting the artifacts and declaring how they install. The box holds, by the lesson that produced each piece:
| From | Artifact | What it carries |
|---|---|---|
| B1 | instruction templates | the lab manual that briefs every session |
| C1 | the skill library + the referee | the cleaning procedure and the cold critic, as invocable skills |
| C2 | the hook suite | the contract gates that block silent corruption |
| C3 | the MCP config | the warehouse and external-source plumbing |
| D1 | the agent definitions | the RA subagents with their report contracts |
| D2 / D4 | worktree + contract conventions | the isolation and provenance discipline, as documentation |
The first four install as configuration; the last two install as documentation, because a convention is a thing you teach, not a binary you drop in. The skill is the reusable unit at the center of all of it — its anatomy (a trigger, an instruction body, the bundled scripts it calls) is what makes the cleaning procedure portable across labs, and it is the same anatomy whether the kit ships one skill or twenty.
Packaging
A loose pile of files is not a kit; a kit is a manifest plus the files, versioned and installable in one step. Both tools bundle skills, hooks, agents, and MCP config into a single distributable unit and install it with one command — the dialects differ in the packaging format and where the bundle is published.
Claude Code
The unit of distribution is a plugin: a manifest that bundles the skills, the hook suite, the agent definitions, and the MCP config into one installable package, published to a marketplace a new member installs from.
{ "name": "lab-kit", "version": "1.0.0", "description": "The weather-mobility lab's methodology, packaged.", "skills": ["clean-trips", "paper-summary", "demanding-adviser"], "hooks": "hooks/settings.json", "agents": ["agents/eda-borough.md"], "mcpServers": "mcp/.mcp.json"}The manifest names the parts; the plugin carries them. A new member adds
the marketplace and installs the plugin, and the cleaning skill, the
contract hooks, the RA subagents, and the warehouse MCP server all
arrive together — the methodology, in one command. The skills are the
same .claude/skills/<name>/SKILL.md units from C1, now bundled rather
than copied by hand; the hooks are C2’s settings.json block; the
agents are D1’s markdown definitions. Nothing in the box is new. The
plugin is the envelope.
Codex
Distribution has two layers. The first is a plugin bundle — the same
skills, hooks, agents, and MCP config collected into one installable
package. The second is layered team config: a committed .codex/
directory that carries the conventions a whole team shares, merging over
each member’s personal setup so the lab’s defaults arrive with the repo.
name = "lab-kit"version = "1.0.0"description = "The weather-mobility lab's methodology, packaged."skills = ["clean-trips", "paper-summary", "demanding-adviser"]hooks = "hooks/hooks.json"agents = ["agents/eda-borough.toml"]mcp = "mcp/config.toml"The skills are the same .agents/skills/<name>/SKILL.md units from C1,
now bundled; the hooks are C2’s [hooks] table; the agents are D1’s TOML
definitions. Individual skills publish to the agentskills.io standard
— the open skill format both ecosystems read — so the cleaning skill is
installable on its own, not only as part of the kit. A new member adds
the team config and installs the bundle, and the whole apparatus arrives
with the repo. Nothing in the box is new; the bundle is the envelope and
the layered config is how it reaches the team.
The payoff
Here is the scene the whole lesson exists for. A new student clones an
empty scratch repository, fetches the course data with one command
(python3 get_data.py — Get the data), installs lab-kit
with one more, and types a single prompt:
> Clean the latest TLC month and profile the demand–weather relationship.And it works. The cleaning skill fires with its filter cascade, the contract hooks guard the writes, the warehouse MCP server answers the queries, the EDA subagent profiles the relationship — none of which the student configured, all of which arrived in the kit. Six weeks of onboarding collapses into one install and one prompt. That is the test of a methodology distribution: not that the box contains the right files, but that an empty repo plus the box plus one sentence reproduces the lab’s way of working. If the prompt above runs clean in a scratch repo, the methodology is portable. If it does not, the kit is a folder, not a release.
Guided Run — Methodology in a Box
Assemble lab-kit as a plugin bundling the C1 skills, C2 hooks, D1 agents, C3 MCP configGuided Run — Methodology in a Box
Assemble lab-kit as a plugin bundling the C1 skills, C2 hooks, D1 agents, C3 MCP configField Assignment
Artifact make check-e3 passes — lab-kit installs in a scratch repo and one-prompt clean-and-profile works out of the box
Package the course into lab-kit and prove it installs. The deliverable
is a smoke test: an empty repo, one install, one prompt, a clean profile.
Claude Code
- Assemble
lab-kitas a plugin: the manifest bundling C1’s skills, C2’s hook suite, D1’s agent definitions, and C3’s MCP config, with the D2/D4 conventions as bundled documentation. Version it1.0.0. - Publish it to a marketplace (a local one is fine for the smoke test).
- In a fresh scratch repo with none of your config, add the marketplace and install the plugin in one command.
- Run the smoke test: the single prompt clean the latest month and profile the demand–weather relationship. It must work with zero further setup — skill fires, hooks guard, MCP answers, subagent profiles.
- Bundle no credentials and no machine-specific paths — confirm by
reading the kit as a stranger would. File the smoke-test transcript
in
journal/. Thenmake check-e3.
Codex
- Assemble
lab-kitas a plugin bundle plus a layered team config: the manifest bundling C1’s skills, C2’s hook suite, D1’s agent definitions, and C3’s MCP config, with the D2/D4 conventions as bundled documentation. Version it1.0.0; publish the standalone skills to the agentskills.io standard. - Stage the bundle where a new member installs from.
- In a fresh scratch repo with none of your config, add the team config and install the bundle in one command.
- Run the smoke test: the single prompt clean the latest month and profile the demand–weather relationship. It must work with zero further setup — skill fires, hooks guard, MCP answers, subagent profiles.
- Bundle no credentials and no machine-specific paths — confirm by
reading the kit as a stranger would. File the smoke-test transcript
in
journal/. Thenmake check-e3.
make check-e3 verifies two things: the kit’s manifest is complete and
versioned, and the one-prompt smoke test runs clean in a scratch repo
with nothing of yours installed. A kit that passes this is the lab’s
methodology made portable — the thing F1 inherits when it ships the
analysis as a replication package the world can run.
make check-e3advances E3An unversioned kit just relocates the drift it was meant to stop.
The empty-repo one-prompt run is the only honest check that the box is whole.
Check each item only once it is true of YOUR repo — the gate is self-certified, like the rest of your methodology.
Pitfalls & Gotchas
- [both]
〜〜
An unversioned lab kit drifts exactly like the un-codified methodology it replaced. A kit with no version number is a moving target two members install on two days and get two different labs from — which is the folklore problem with a manifest stapled to it. Release the kit like software: a version, a changelog, a tag. The whole point was to stop the methodology from drifting; an unversioned kit just relocates the drift.
- [both]
〜〜
Bundling credentials or machine-specific paths into the kit ships your laptop, not your methodology. An API key, a
/Users/you/path, a warehouse URL only your machine resolves — each one turns a portable kit into one that works exactly nowhere but where it was built. Read the kit as a stranger on a clean machine would: anything that only makes sense from your seat does not belong in the box. - [both]
The smoke test is the spec, not a courtesy. A kit that installs cleanly and looks complete can still fail the one prompt that matters because a skill quietly depends on a file the bundle forgot. The empty-repo one-prompt run is the only honest check that the box is whole — pass it before you call the kit released, every version.
Check Your Bearings
This check opens when the guided simulation above is complete — the questions assume you have seen the run.
(noted in your field journal as an override)Field journal
Parity note
Packaging is genuine parity in shape, with a distribution wrinkle. Both tools bundle skills, hooks, agents, and MCP config into one installable unit that arrives with a single command — a plugin published to a marketplace on one side, a plugin bundle plus layered team config on the other. The wrinkle is the open standard: individual skills publish to agentskills.io, the shared skill format both ecosystems read, so a cleaning skill written for one tool is increasingly installable in the other — the convergence point this whole course bets on. The conventions in the box (worktree and contract discipline) ship as documentation in both, because a way of working is taught, not dropped in. See the parity matrix for the dated detail.