lab-create
Skill152 starsChanged 7 days agoMITView on GitHub
Create a new MCS Labs hands-on lab in the classic format (README plus _labs page with a long-form use-case walkthrough) or the guided missions format (lab_format missions with copyable prompts, reveals and knowledge checks), then wire it to its module and event agendas, preview it unlisted and validate it. Use when asked to create, add, draft or scaffold a lab, turn prompts or a demo script into a lab, convert a lab to missions, or add a new lab to a bootcamp or event. Not for fixing an existing lab (use lab-update) or auditing one (use lab-review).
In this repository7 other files it gives its agents.
- .github/copilot-instructions.mdCopilot instructions
- lab-reviewSkill
- lab-runthroughSkill
- lab-updateSkill
- liftline-dispatchSkill
- zava-stock-policySkill
- hotel-operations-briefingSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 26
Ask for anything missing, one question at a time:
- Very specific: line 47
Every prompt sits alone in a text code fence so it can be copied.
- Very specific: line 51
Use today's product names.
- Distinctive: line 56
When there is a system of record, tell learners to open it in another tab, both in the prerequisites and in Lab Details: say what it is and …
- Very specific: line 84
Images: Put them in labs/<slug>/images/ and link them relatively (images/name.webp) from both copies.
- Distinctive: line 87
Missions only: Follow "Authoring a guided mission lab" in the checklist, and:
- Very specific: line 131
Commit both copies, images, and module and agenda changes together on a feature branch.
- Very specific: line 132
Add the slug to the Which lab?
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Create a lab
A lab is two hand-written copies plus images. labs/<slug>/README.md is what GitHub
readers see; _labs/<slug>.md is the published page and carries the front matter.
CI (scripts/check-lab-sync.js) fails a PR that changes the README without the
_labs copy. The authoring contract is docs/NEW_LAB_CHECKLIST.md: read it first and
treat it as the source of truth. This skill adds the decisions and the order of work.
1. Choose the format
| Choose | When |
Missions (lab_format: missions) | A product tour driven by prompts and UI choices, 20–45 minutes, where each section should end with a "why it worked" reveal and a quick check. The reference lab is cowork-zava-sales. |
| Classic (default) | Long builds with many configuration steps, code or large tables; labs that several deliveries share; external labs (front matter stub only). |
Missions is opt-in per lab and must not change other labs. Do not convert a shared lab in place: copy it to a new slug for the delivery that needs the new format.
2. Gather inputs before writing
Ask for anything missing, one question at a time:
- Slug (kebab-case, unique across
_labs/andlabs/), title, one-sentence description. - Persona and level (100, 200 or 300), journeys, section, duration in minutes.
- Parent module slug, and which events or agendas should list the lab.
- The finish line: the artifact the learner leaves with.
- Prompts the requester supplied. Keep supplied prompts verbatim; never "improve" them.
- Environment: tenant, accounts, licenses, connectors or plugins the facilitator prepares.
- The system of record, if the scenario reads or writes business data (a CRM, a ticketing app): its name, URL and what learners should check there. Zava Sales uses Zava Sales Hub.
Confirm with the requester before adding a lab to an advertised (listed) event or replacing a lab in an existing agenda.
3. Design for doing, not reading
Apply ../lab-review/references/learning-design.md while drafting. In short:
- One outcome per section, stated up front; the learner acts within the first screen.
- Steps start with a verb and name the exact UI label in bold.
- Every prompt sits alone in a
textcode fence so it can be copied. - Explain why after the learner has seen it work (the reveal), not before.
- Mark what is optional. Budget minutes per section; they must add up to
duration. - Ground every product claim in a current Microsoft Learn page and cite it.
- Use today's product names.
scripts/lab-audit-terms.jsonlists retired ones; since August 2026 it is Microsoft Copilot and Microsoft Copilot Chat (not Microsoft 365 Copilot), and since October 2026 the Microsoft Copilot harness (not GitHub Copilot harness). Keep license SKU names, such as Microsoft 365 Copilot (add-on), as the price list shows them, and UI labels exactly as the product shows them. - When there is a system of record, tell learners to open it in another tab, both in the prerequisites and in Lab Details: say what it is and what to check there, so they can confirm what Copilot found and see the records it creates.
4. Scaffold the files
Templates are in templates/. Replace every %%PLACEHOLDER%% and delete every
TEMPLATE NOTE comment; grep -rnE '%%|TEMPLATE NOTE' labs/<slug> _labs/<slug>.md
must return nothing before you commit.
| Format | labs/<slug>/README.md | _labs/<slug>.md |
| Classic | templates/classic-README.md | templates/classic-site.md |
| Missions | templates/missions-README.md | templates/missions-site.md |
Then:
- Headings. README headings carry an emoji (house style);
_labsheadings never do. The hand-written table of contents must use the ids each renderer generates:## 🧭 Lab Detailsis#-lab-detailson GitHub and## Lab Detailsis#lab-detailson the site. An emoji with a variation selector (🛠️, ⚙️, ✍️) keeps U+FE0F in the GitHub id, so the link is#️-instructions-by-use-case. Do not guess: the audit checks every anchor. - Order.
orderis one global sort. Pick a free number next to the labs it should sit beside (grep -H '^order:' _labs/*.md); the audit reports duplicates asfm-order-duplicate. - Module.
module: <slug>needs_modules/<slug>.md, and that module'slab:should name this lab when it is the companion lab. - Images. Put them in
labs/<slug>/images/and link them relatively (images/name.webp) from both copies. Capture product screenshots with thelab-runthroughskill: WebP, with light and dark pairs for product UI. - Missions only. Follow "Authoring a guided mission lab" in the checklist, and:
- Core mission
minutesmust sum toduration; extensions getoptional: true. - Each prompt appears identically in front matter, the
_labsbody and the README, in order. Use|-for multiline prompts so YAML adds no trailing newline. - Each
checkhas exactly one option withcorrect: true. - Each step screenshot has
title,alt,caption, andwidthandheightthat match the file; addsrc_darkfor product UI and a<picture>element in both bodies. The hero has nosrc_dark. scripts/lab-missions.test.jsasserts which labs use missions. Add the new slug to that allowlist and add a contract test for the new lab modeled on the Zava Sales tests (prompts verbatim in all copies, copies in sync, mission contract).- The layout opens each step's Click-by-click help by default, so write
helpas the complete click path most learners will follow, not as an afterthought. - The layout keeps checkmarks, quiz answers and the
reflectionnote only in the browser's local storage, says so next to the note, and offers Save a PDF copy (the browser's print dialog) at the end. Do not promise elsewhere that notes are saved, and do not add download buttons: prompts are copied in place.
- Core mission
5. Preview without touching the public site
- While the lab is in review, give it
unlisted: true,search: falseandsitemap: false. The URL is public but not advertised or indexed. - List it in a preview event (for example
_data/agendas/bootcamp-preview.yml) rather than an advertised one. An unlisted lab in a listed agenda is anagenda-unlisted-laberror. - To ship into an advertised event later: remove the three preview flags, swap the agenda
row's
slug, keep the event's fallbacklabs:list in agenda order, and setlab: falseon a companion module row when an explicit lab row follows it (_data/agendas/README.md).
6. Validate
npm run audit:labs -- <slug> # no errors; read every warning and info line
npm test # unit tests, including the missions contract tests
bash tools/run.sh # or .\tools\run.ps1; open /mcs-labs/labs/<slug>/In the browser, check images, the table of contents, Previous and Next with
?event=<id>, and light and dark themes. For missions also check keyboard use, a mobile
width and the page with JavaScript disabled. Then run the lab-review skill, and
lab-runthrough when a training environment is available.
7. Hand off
Commit both copies, images, and module and agenda changes together on a feature branch.
Add the slug to the Which lab? dropdown in .github/ISSUE_TEMPLATE/lab_update.yml
(alphabetical) so people can report problems with it. Open the PR with
../lab-update/templates/pr-body.md. Never merge your own PR.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

