[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M711PCVQQ5DB7HXSYAH9SCQS":3,"skill-same:01M711PCVQQ5DB7HXSYAH9SCQS":95},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M711PCVQQ5DB7HXSYAH9SCQS","lab-runthrough",null,"Run an MCS Labs hands-on lab (classic or guided missions format) step by step in a real browser on a training or demo tenant, the way an attendee would, to find steps, UI labels, prompts and screenshots that no longer match the product. Logs each step with evidence and distinguishes passed, drift, defect, variance, blocked, untested and unverified outcomes; recaptures drifted screenshots, including light and dark pairs. Runs windowed or headless in an isolated private profile, signed in by the person or as a provisioned event training account. Use when asked to test, run, walk through, dry-run, validate or smoke-test a lab or event curriculum, check whether a lab still works after a product update, or refresh a lab's screenshots. Never writes credentials into the repo, logs or chat. Hand the log to lab-update for the fix PR.","microsoft\u002Fmcs-labs","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M711P2X3QGJ5GH3WYXBT2T0K",152,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"lab runthrough","lab","dry","when","defect","tenant","labels","hand","headless","missions","training","drift","log","never","fix","credentials","logs","product","browser","run","2026-11-10 10:12:30",false,"---\nname: lab-runthrough\ndescription: Run an MCS Labs hands-on lab (classic or guided missions format) step by step in a real browser on a training or demo tenant, the way an attendee would, to find steps, UI labels, prompts and screenshots that no longer match the product. Logs each step with evidence and distinguishes passed, drift, defect, variance, blocked, untested and unverified outcomes; recaptures drifted screenshots, including light and dark pairs. Runs windowed or headless in an isolated private profile, signed in by the person or as a provisioned event training account. Use when asked to test, run, walk through, dry-run, validate or smoke-test a lab or event curriculum, check whether a lab still works after a product update, or refresh a lab's screenshots. Never writes credentials into the repo, logs or chat. Hand the log to lab-update for the fix PR.\n---\n\n# Run through a lab\n\nA run-through is the only way to know a lab still works. Follow the instructions exactly\nas an attendee would, write down what really happens, and leave the tenant as you found it.\n\n## Safety rules\n\nThese are rules for the automated runner, not steps to paste into a learner's lab.\nKeep run evidence, coverage limits, credit totals, screenshot provenance and\naccount-specific troubleshooting in the run log and PR. Do not turn a runner's setup\nproblem into a required attendee step or repeat warnings supplied by the training tenant.\nHand off only necessary learner-facing corrections; independent-tenant setup belongs\nin the existing expandable setup section. Use the same learner-facing rules as authors\nand reviewers in `..\u002Flab-review\u002Freferences\u002Flearning-design.md`.\n\n- **Training or demo tenants only.** Never use a customer or production tenant, or your own\n  work account, unless the owner explicitly says so.\n- **Credentials.** Either the person signs in themselves in the launched window, or you\n  use a throwaway account the event tenant provisions (`references\u002Ftraining-accounts.md`).\n  Keep its credentials in a JSON file outside the repository and pass them through\n  `LAB_CREDENTIALS`, never on a command line. Never write them to a log, commit, PR body\n  or chat summary, and delete the file when the run is over.\n- **Separate browser profile.** Use `scripts\u002Fcapture.cjs launch`, which starts a fresh\n  temporary Edge or Chrome profile in a private window, windowed or `--headless`. Do not\n  use an embedded or side-panel browser: it shares your session and the script cannot\n  drive it. Pass `--forbid \"\u003Chost user's name or alias>\"` to `login` so a run that reaches\n  the host user's own account stops at once.\n  Honor the requested browser and visibility: if desktop Edge was requested, use\n  windowed Edge with an isolated profile, not a silent switch to headless Chrome.\n  If that isolation cannot be provided, ask before using another browser or profile.\n- **No real outreach.** Keep customer emails as drafts. Do not send messages, invites or\n  posts to anyone except the signed-in test user.\n- **Stop what you start.** Pause or delete scheduled tasks and automations the lab\n  creates, and confirm after a page reload. Delete test records when the lab says to.\n- **Connections and approvals.** Inspect the actual owner of imported connections before\n  publishing or running a tool. Repair only a copy you own with an authorized identity;\n  otherwise stop and report blocked. Never alter another runner's connections or assets.\n  An unresolved destination is not approval to create or upload: cancel the pending card\n  if it blocks questions, verify the destination and absence of the target, then request a\n  fresh fail-on-conflict action. Never overwrite data to force a test. Prefer one-time\n  permissions; revoke only permissions this run introduced.\n- **Cost.** Cowork and other agents consume credits. Record `\u002Fcost` (or the product's\n  equivalent) in the log.\n- **Raw captures stay out of the repository.** They show names, mail and chats.\n  `capture.cjs` refuses an output folder inside the repo. Check every crop for personal data\n  that is not part of the training scenario before it is committed.\n\n## 1. Prepare\n\n1. Run `npm run audit:labs -- \u003Cslug>` and fix nothing yet; note anything that already fails.\n   If modules\u002Fpresentations are excluded, use the\n   [scoped validation guidance](..\u002Flab-update\u002FSKILL.md#5-validate) instead: named slugs\n   alone do not prevent repository-wide audit scans.\n2. Read both copies: `labs\u002F\u003Cslug>\u002FREADME.md` and `_labs\u002F\u003Cslug>.md`\n   (`_labs\u002Fmission-\u003Cslug>.md` for a missions lab). For a missions lab, the front matter\n   `missions` list holds the prompts, steps, checks and screenshots.\n3. List the prerequisites (licenses, tenant, plugins, connections, sample data) and confirm\n   with the person which tenant and account to use. For an event tenant, use one training\n   account for the whole dependent sequence (`references\u002Ftraining-accounts.md`). Separate\n   browser profiles isolate cookies only; they do not isolate backend records, plugins,\n   agent memory, generated files, schedules or connections.\n4. Copy `templates\u002Frunthrough-log.md` to a folder outside the repository (for example the\n   session files folder) and fill in the header, including exclusions and any reused\n   evidence. Match shared labs by instructions, prompts, assets, prerequisites and\n   outcomes, not their titles; reuse only the matching verified routes and retain every\n   blocker. See `references\u002Frunthrough-evidence.md`.\n5. Run `npm ci` once if `node_modules\u002Fpuppeteer` is missing, and `pip install pillow` if you\n   will crop screenshots.\n\n## 2. Launch and sign in\n\nWith the person signing in:\n\n```bash\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs launch \"\u003Clab start URL>\"\n```\n\nAsk them to sign in to the training account in the window that opens, then confirm with\n`capture.cjs pages`.\n\nWith a provisioned training account, when headless testing is permitted:\n\n```powershell\n$env:LAB_CREDENTIALS = \"\u003Ctemp folder>\\account.json\"\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs launch \"\u003Clab start URL>\" --headless --port 9352\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs login --port 9352 --forbid \"\u003Chost user's name>|\u003Calias>\"\n```\n\nExit code 3 means a person is needed (MFA, password change); exit code 4 means the wrong\naccount. Stop and tell the person either way. The first visit to a product can show\none-time dialogs; accept them once (see the product quirks) before timing a lab.\n`references\u002Fbrowser-session.md` lists every command, the options and the quirks seen so\nfar.\n\n### Curriculum sequencing\n\nDefault to running related Chat, Cowork, Code and Studio labs sequentially with one\ntraining account. Before each handoff, record which person owns the agent, record, file,\nschedule or connection, whether a run is in flight, and whether it is safe for the next\nlab to change it. Keep shared credentials until the last dependent run is complete. Use\nthe exact asset names and prompts in the lab; do not add test suffixes or tags. Do not\ndelete another runner's browser profile, connection or assets.\n\nParallelize only when the accounts and assets are genuinely independent and you have\nchecked dependencies. Separate `--port`, `--out` and logs per browser; this prevents\ncookie collisions, not shared backend state. If delegation is used, give each runner the\nspecific isolated account\u002Fassets, port, output folder, credentials file path (never its\ncontents), `--forbid` text and the ownership\u002Fhandoff rules. Keep shared files (tests,\nagendas, issue templates) with one editor.\n\n## 3. Execute every step as written\n\nFor each step or mission, in order:\n\n1. Do exactly what the text says. Use `controls \"\u003Cregex>\"` to find a control by its\n   accessible name and `click \"\u003Cname>\"` to use it. If the label in the lab is not on screen,\n   that is a finding: do not quietly use the new label.\n2. Enter prompts verbatim from the lab: save the prompt text to a file outside the repo and\n   run `prompt \u003Cfile>`, then `wait \"\u003Ctext you expect>\"`.\n3. Verify the learner-visible outcome, not just the prompt or chat claim. Download and\n   inspect cited source documents and generated files; check business records in their\n   system of record, including required fields, ownership, relationships and timezone.\n   Separate actuals from projections and record known-missing values or failed fields.\n   Confirm Outlook drafts exist and remain unsent; verify a schedule's saved time\u002Ftimezone\n   after save settles and reloads. A scheduled draft is not execution, a save warning is\n   not proof a plugin loaded, and a node-only classifier test is not end-to-end success.\n4. Log one row: instruction, expected, actual, status and evidence (`shot \u003Cname>`, exact\n   UI text, artifact or system-of-record check). Use the vocabulary and coverage rules in\n   `references\u002Frunthrough-evidence.md`; do not mark untested or unverified behavior as\n   passed, or force drift\u002Fvariance into failure.\n\n| Status | Meaning | Example |\n| --- | --- | --- |\n| passed | Works as written | Button and result match |\n| drift | The product changed; the lab is now wrong | \"Agents & Plugins\" is now \"Plugins\" |\n| defect | The lab was wrong or unclear all along | Step skips a required toggle |\n| variance | AI output differs but meets the goal | Different wording, same three slides |\n| blocked | The environment stopped you | Missing license, plugin not installed |\n\nVariance is normal for generative output; only log drift when the lab's claim or\nscreenshot would mislead an attendee. Routing to a specialist does not prove a required\nconfirmation or clean user-facing output. Voice without supplied speech is untested, not\nfailed. Retained instructions at a user's request are not a fresh pass. Work around a\nblocked step only if the lab offers a path for it; otherwise log it and continue where\npossible. Time each mission or use case against its stated minutes. Test core and optional\npaths separately; an optional route failing must not erase a passing core route or support\nan unconditional overall verdict.\n\n## 4. Recapture screenshots that drifted\n\nFor future captures, target **2x the final displayed width in native pixels**. Keep the\nCSS viewport stable and prefer browser device-scale emulation over zooming out to fit\nmore UI. Never upscale an existing image to simulate resolution. Launch with `--scale 2`\nand crop at capture time with `--element`, `--clip` and `--zoom`; see the\nhigh-resolution checklist in `references\u002Fbrowser-session.md`. This guidance\ndoes not request a bulk recapture of existing screenshots.\n\n1. Find the screenshot's file name in both copies; reuse it so no Markdown changes.\n2. Missions labs publish light and dark WebP pairs (`src` and `src_dark`). Set the product\n   theme to **System** first: `pair` emulates the operating-system color scheme, which an\n   explicit Light or Dark setting overrides. (Microsoft Copilot, November 2026:\n   bottom-left **Settings and more** gear > **Settings** > **General** > **Preferences** >\n   **Theme**.) Then run `pair \u003Cname> --scheme-attr data-color-scheme`, and restore the\n   person's theme afterwards. Classic labs use a single image, usually PNG: run\n   `shot \u003Cname>`.\n3. Write a crop spec (`{\"\u003Cname>\": [left, top, right, bottom]}`) using control boxes from\n   `controls`, then crop into the lab folder in the format the lab already uses:\n\n   ```bash\n   python .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcrop_images.py spec.json \u003Craw folder> labs\u002F\u003Cslug>\u002Fimages --format webp --sheets \u003Craw folder>\u002Fsheets\n   ```\n\n   Use `--format png --light-only` for classic PNG images. If using `--max-width`, keep\n   at least twice the intended displayed width; do not downsample to the CSS width.\n   When a lab has both a classic and a missions\n   version, capture each step once with `pair`, then crop it twice: `--light-only` PNG\n   for the classic lab and WebP pairs for the missions lab.\n4. After every theme switch, scroll the target back into view and recompute its bounds;\n   theme changes can reset scroll. Open both crops at full resolution and at their actual\n   size on the lab page, not just contact sheets. Check the current response, whole\n   filename and all required controls are present in both crops; do not accept a previous\n   response, table or hidden dialog. Retake from the product with the exact lab name rather\n   than editing pixels to change names, results or product state.\n5. Note the printed width and height. Missions front matter needs `width` and `height` to\n   match the file. Update `alt` when the state shown changed. OCR is only a way to find\n   candidate sensitive text: inspect dark images, avatars and full-resolution crops\n   visually, and check image metadata (EXIF\u002FXMP). Cropping is not automatic masking.\n\nRecapturing is part of the fix, so hand the new files to `lab-update` rather than committing\nthem here.\n\n## 5. Clean up and hand off\n\n1. Pause or delete only scheduled tasks and automations this run created; reload and\n   confirm. Wait for save to settle before reload. Check the source switch directly rather\n   than trusting an agent's claim that it searched a disabled source.\n2. Remove only test records and drafts the lab says to delete; leave others' connections\n   and assets untouched. Revoke only permissions introduced by this run.\n3. Record `\u002Fcost` if the lab used credits.\n4. Run `capture.cjs close` (with each `--port` you used) to shut the browser and delete its\n   temporary profile. Delete the credentials file when the last run is done.\n5. Finish the log: core and optional coverage, counts per status, outcomes verified,\n   blockers and unverified boundaries, screenshots to replace, and proposed PRs. Do not\n   issue an unconditional verdict if coverage is incomplete. Hand it to `lab-update`. Do\n   not commit the log or raw captures.\n","# Run through a lab\n\nA run-through is the only way to know a lab still works. Follow the instructions exactly\nas an attendee would, write down what really happens, and leave the tenant as you found it.\n\n## Safety rules\n\nThese are rules for the automated runner, not steps to paste into a learner's lab.\nKeep run evidence, coverage limits, credit totals, screenshot provenance and\naccount-specific troubleshooting in the run log and PR. Do not turn a runner's setup\nproblem into a required attendee step or repeat warnings supplied by the training tenant.\nHand off only necessary learner-facing corrections; independent-tenant setup belongs\nin the existing expandable setup section. Use the same learner-facing rules as authors\nand reviewers in `..\u002Flab-review\u002Freferences\u002Flearning-design.md`.\n\n- **Training or demo tenants only.** Never use a customer or production tenant, or your own\n  work account, unless the owner explicitly says so.\n- **Credentials.** Either the person signs in themselves in the launched window, or you\n  use a throwaway account the event tenant provisions (`references\u002Ftraining-accounts.md`).\n  Keep its credentials in a JSON file outside the repository and pass them through\n  `LAB_CREDENTIALS`, never on a command line. Never write them to a log, commit, PR body\n  or chat summary, and delete the file when the run is over.\n- **Separate browser profile.** Use `scripts\u002Fcapture.cjs launch`, which starts a fresh\n  temporary Edge or Chrome profile in a private window, windowed or `--headless`. Do not\n  use an embedded or side-panel browser: it shares your session and the script cannot\n  drive it. Pass `--forbid \"\u003Chost user's name or alias>\"` to `login` so a run that reaches\n  the host user's own account stops at once.\n  Honor the requested browser and visibility: if desktop Edge was requested, use\n  windowed Edge with an isolated profile, not a silent switch to headless Chrome.\n  If that isolation cannot be provided, ask before using another browser or profile.\n- **No real outreach.** Keep customer emails as drafts. Do not send messages, invites or\n  posts to anyone except the signed-in test user.\n- **Stop what you start.** Pause or delete scheduled tasks and automations the lab\n  creates, and confirm after a page reload. Delete test records when the lab says to.\n- **Connections and approvals.** Inspect the actual owner of imported connections before\n  publishing or running a tool. Repair only a copy you own with an authorized identity;\n  otherwise stop and report blocked. Never alter another runner's connections or assets.\n  An unresolved destination is not approval to create or upload: cancel the pending card\n  if it blocks questions, verify the destination and absence of the target, then request a\n  fresh fail-on-conflict action. Never overwrite data to force a test. Prefer one-time\n  permissions; revoke only permissions this run introduced.\n- **Cost.** Cowork and other agents consume credits. Record `\u002Fcost` (or the product's\n  equivalent) in the log.\n- **Raw captures stay out of the repository.** They show names, mail and chats.\n  `capture.cjs` refuses an output folder inside the repo. Check every crop for personal data\n  that is not part of the training scenario before it is committed.\n\n## 1. Prepare\n\n1. Run `npm run audit:labs -- \u003Cslug>` and fix nothing yet; note anything that already fails.\n   If modules\u002Fpresentations are excluded, use the\n   [scoped validation guidance](..\u002Flab-update\u002FSKILL.md#5-validate) instead: named slugs\n   alone do not prevent repository-wide audit scans.\n2. Read both copies: `labs\u002F\u003Cslug>\u002FREADME.md` and `_labs\u002F\u003Cslug>.md`\n   (`_labs\u002Fmission-\u003Cslug>.md` for a missions lab). For a missions lab, the front matter\n   `missions` list holds the prompts, steps, checks and screenshots.\n3. List the prerequisites (licenses, tenant, plugins, connections, sample data) and confirm\n   with the person which tenant and account to use. For an event tenant, use one training\n   account for the whole dependent sequence (`references\u002Ftraining-accounts.md`). Separate\n   browser profiles isolate cookies only; they do not isolate backend records, plugins,\n   agent memory, generated files, schedules or connections.\n4. Copy `templates\u002Frunthrough-log.md` to a folder outside the repository (for example the\n   session files folder) and fill in the header, including exclusions and any reused\n   evidence. Match shared labs by instructions, prompts, assets, prerequisites and\n   outcomes, not their titles; reuse only the matching verified routes and retain every\n   blocker. See `references\u002Frunthrough-evidence.md`.\n5. Run `npm ci` once if `node_modules\u002Fpuppeteer` is missing, and `pip install pillow` if you\n   will crop screenshots.\n\n## 2. Launch and sign in\n\nWith the person signing in:\n\n```bash\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs launch \"\u003Clab start URL>\"\n```\n\nAsk them to sign in to the training account in the window that opens, then confirm with\n`capture.cjs pages`.\n\nWith a provisioned training account, when headless testing is permitted:\n\n```powershell\n$env:LAB_CREDENTIALS = \"\u003Ctemp folder>\\account.json\"\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs launch \"\u003Clab start URL>\" --headless --port 9352\nnode .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs login --port 9352 --forbid \"\u003Chost user's name>|\u003Calias>\"\n```\n\nExit code 3 means a person is needed (MFA, password change); exit code 4 means the wrong\naccount. Stop and tell the person either way. The first visit to a product can show\none-time dialogs; accept them once (see the product quirks) before timing a lab.\n`references\u002Fbrowser-session.md` lists every command, the options and the quirks seen so\nfar.\n\n### Curriculum sequencing\n\nDefault to running related Chat, Cowork, Code and Studio labs sequentially with one\ntraining account. Before each handoff, record which person owns the agent, record, file,\nschedule or connection, whether a run is in flight, and whether it is safe for the next\nlab to change it. Keep shared credentials until the last dependent run is complete. Use\nthe exact asset names and prompts in the lab; do not add test suffixes or tags. Do not\ndelete another runner's browser profile, connection or assets.\n\nParallelize only when the accounts and assets are genuinely independent and you have\nchecked dependencies. Separate `--port`, `--out` and logs per browser; this prevents\ncookie collisions, not shared backend state. If delegation is used, give each runner the\nspecific isolated account\u002Fassets, port, output folder, credentials file path (never its\ncontents), `--forbid` text and the ownership\u002Fhandoff rules. Keep shared files (tests,\nagendas, issue templates) with one editor.\n\n## 3. Execute every step as written\n\nFor each step or mission, in order:\n\n1. Do exactly what the text says. Use `controls \"\u003Cregex>\"` to find a control by its\n   accessible name and `click \"\u003Cname>\"` to use it. If the label in the lab is not on screen,\n   that is a finding: do not quietly use the new label.\n2. Enter prompts verbatim from the lab: save the prompt text to a file outside the repo and\n   run `prompt \u003Cfile>`, then `wait \"\u003Ctext you expect>\"`.\n3. Verify the learner-visible outcome, not just the prompt or chat claim. Download and\n   inspect cited source documents and generated files; check business records in their\n   system of record, including required fields, ownership, relationships and timezone.\n   Separate actuals from projections and record known-missing values or failed fields.\n   Confirm Outlook drafts exist and remain unsent; verify a schedule's saved time\u002Ftimezone\n   after save settles and reloads. A scheduled draft is not execution, a save warning is\n   not proof a plugin loaded, and a node-only classifier test is not end-to-end success.\n4. Log one row: instruction, expected, actual, status and evidence (`shot \u003Cname>`, exact\n   UI text, artifact or system-of-record check). Use the vocabulary and coverage rules in\n   `references\u002Frunthrough-evidence.md`; do not mark untested or unverified behavior as\n   passed, or force drift\u002Fvariance into failure.\n\n| Status | Meaning | Example |\n| --- | --- | --- |\n| passed | Works as written | Button and result match |\n| drift | The product changed; the lab is now wrong | \"Agents & Plugins\" is now \"Plugins\" |\n| defect | The lab was wrong or unclear all along | Step skips a required toggle |\n| variance | AI output differs but meets the goal | Different wording, same three slides |\n| blocked | The environment stopped you | Missing license, plugin not installed |\n\nVariance is normal for generative output; only log drift when the lab's claim or\nscreenshot would mislead an attendee. Routing to a specialist does not prove a required\nconfirmation or clean user-facing output. Voice without supplied speech is untested, not\nfailed. Retained instructions at a user's request are not a fresh pass. Work around a\nblocked step only if the lab offers a path for it; otherwise log it and continue where\npossible. Time each mission or use case against its stated minutes. Test core and optional\npaths separately; an optional route failing must not erase a passing core route or support\nan unconditional overall verdict.\n\n## 4. Recapture screenshots that drifted\n\nFor future captures, target **2x the final displayed width in native pixels**. Keep the\nCSS viewport stable and prefer browser device-scale emulation over zooming out to fit\nmore UI. Never upscale an existing image to simulate resolution. Launch with `--scale 2`\nand crop at capture time with `--element`, `--clip` and `--zoom`; see the\nhigh-resolution checklist in `references\u002Fbrowser-session.md`. This guidance\ndoes not request a bulk recapture of existing screenshots.\n\n1. Find the screenshot's file name in both copies; reuse it so no Markdown changes.\n2. Missions labs publish light and dark WebP pairs (`src` and `src_dark`). Set the product\n   theme to **System** first: `pair` emulates the operating-system color scheme, which an\n   explicit Light or Dark setting overrides. (Microsoft Copilot, November 2026:\n   bottom-left **Settings and more** gear > **Settings** > **General** > **Preferences** >\n   **Theme**.) Then run `pair \u003Cname> --scheme-attr data-color-scheme`, and restore the\n   person's theme afterwards. Classic labs use a single image, usually PNG: run\n   `shot \u003Cname>`.\n3. Write a crop spec (`{\"\u003Cname>\": [left, top, right, bottom]}`) using control boxes from\n   `controls`, then crop into the lab folder in the format the lab already uses:\n\n   ```bash\n   python .github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcrop_images.py spec.json \u003Craw folder> labs\u002F\u003Cslug>\u002Fimages --format webp --sheets \u003Craw folder>\u002Fsheets\n   ```\n\n   Use `--format png --light-only` for classic PNG images. If using `--max-width`, keep\n   at least twice the intended displayed width; do not downsample to the CSS width.\n   When a lab has both a classic and a missions\n   version, capture each step once with `pair`, then crop it twice: `--light-only` PNG\n   for the classic lab and WebP pairs for the missions lab.\n4. After every theme switch, scroll the target back into view and recompute its bounds;\n   theme changes can reset scroll. Open both crops at full resolution and at their actual\n   size on the lab page, not just contact sheets. Check the current response, whole\n   filename and all required controls are present in both crops; do not accept a previous\n   response, table or hidden dialog. Retake from the product with the exact lab name rather\n   than editing pixels to change names, results or product state.\n5. Note the printed width and height. Missions front matter needs `width` and `height` to\n   match the file. Update `alt` when the state shown changed. OCR is only a way to find\n   candidate sensitive text: inspect dark images, avatars and full-resolution crops\n   visually, and check image metadata (EXIF\u002FXMP). Cropping is not automatic masking.\n\nRecapturing is part of the fix, so hand the new files to `lab-update` rather than committing\nthem here.\n\n## 5. Clean up and hand off\n\n1. Pause or delete only scheduled tasks and automations this run created; reload and\n   confirm. Wait for save to settle before reload. Check the source switch directly rather\n   than trusting an agent's claim that it searched a disabled source.\n2. Remove only test records and drafts the lab says to delete; leave others' connections\n   and assets untouched. Revoke only permissions introduced by this run.\n3. Record `\u002Fcost` if the lab used credits.\n4. Run `capture.cjs close` (with each `--port` you used) to shut the browser and delete its\n   temporary profile. Delete the credentials file when the last run is done.\n5. Finish the log: core and optional coverage, counts per status, outcomes verified,\n   blockers and unverified boundaries, screenshots to replace, and proposed PRs. Do not\n   issue an unconditional verdict if coverage is incomplete. Hand it to `lab-update`. Do\n   not commit the log or raw captures.\n",{"name":5,"description":7},"main","35fbee7edefea140fb9ba869035c416eee1a9a6c",".github\u002Fskills\u002Flab-runthrough",104,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-10 05:53:42",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add microsoft\u002Fmcs-labs --skill lab-runthrough",{"tool":59,"command":60},"bunx","bunx skills add microsoft\u002Fmcs-labs --skill lab-runthrough",{"tool":62,"command":63},"pnpm","pnpm dlx skills add microsoft\u002Fmcs-labs --skill lab-runthrough","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002FSKILL.md",true,[67,73,77,81,87,91],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fbrowser-session.md","REFERENCE","参考文档",25343,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Freferences\u002Fbrowser-session.md",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Frunthrough-evidence.md",8176,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Freferences\u002Frunthrough-evidence.md",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Ftraining-accounts.md",3701,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Freferences\u002Ftraining-accounts.md",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fcapture.cjs","SCRIPT","脚本",47613,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcapture.cjs",{"path":88,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Fcrop_images.py",4796,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Fscripts\u002Fcrop_images.py",{"path":92,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":93,"sourceHtmlUrl":94},"templates\u002Frunthrough-log.md",4222,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-runthrough\u002Ftemplates\u002Frunthrough-log.md",[96,117,136,150,171,190],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":39},"01M711PQPKJNAQH31JEZK2Y27S","hotel-operations-briefing","Prepare a grounded Contoso Grand Hotel operations briefing and review-ready executive email from the supplied annual performance report. Use for hotel briefing, urgent operational issues, or an executive email grounded in that report.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002Flabs\u002Fmcs-copilot-harness-latest\u002Fmaterials\u002Fhotel-operations-briefing\u002FSKILL.md",[],[103,104,105,106,107,108,109,110,111,112,113,114,115,116],"operations","hotel","briefing","hotel operations briefing","review","prepare","use","issues","report","performance report","performance","for","email","ready",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":39},"01M711PNV5P6PGCPDJ55QSVDGE","zava-stock-policy","Evaluate Zava demo stock allocation and delivery-charge approval policy using bundled synthetic reference data.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002Flabs\u002Fmcs-agent-integration\u002Fassets\u002Fzava-stock-policy\u002FSKILL.md",[],[124,125,126,127,128,129,130,131,132,133,134,135],"stock","policy","zava stock policy","demo","approval","synthetic","reference","data","allocation","delivery","evaluate","charge",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":39},"01M711PMBNEGPHD883NTCTR4E5","liftline-dispatch","Evaluate delivery capacity, unloading, slots, and quotes from LiftLine's bundled synthetic service fixture for the Zava demo.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002Flabs\u002Fmcs-agent-integration\u002Fassets\u002Fliftline-dispatch\u002FSKILL.md",[],[143,144,145,146,147,133,148,114,134,149,129,127],"liftline dispatch","dispatch","capacity","quotes","service","slots","fixture",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":39},"01M711PH1DWF7CVENV5HDTVSA9","lab-update","Fix or refresh an existing MCS Labs hands-on lab (classic or guided missions format) and open a pull request. Applies findings from a lab-review report, a lab-runthrough log, a GitHub lab-update issue or a product change, keeps the README and _labs copies in sync, replaces drifted screenshots, keeps durations and agendas consistent, records confirmed product renames for the audit, validates, and opens a reviewable PR. Use when asked to fix, update, refresh, correct or modernize a lab, apply review findings, update screenshots, handle a product rename across labs, or open a PR for lab changes. Never merges.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-update\u002FSKILL.md",[],[20,157,158,159,160,109,161,22,162,163,164,165,166,167,114,168,32,169,170,33],"lab update","update","update issue","open","Existing","apply","review report","records","correct","review findings","README","pr","hands-on","pull",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":39},"01M711P9D9AXAH175EM8HFNHDE","lab-review","Review an MCS Labs hands-on lab (classic README\u002F_labs format or the guided missions format) for broken anchors and images, README and site copies drifting apart, invalid front matter, durations that disagree with Lab Details or event agendas, retired product names, out-of-date product claims, and wordy or hard-to-follow instructions. Produces a prioritized report with file and line evidence and proposed fixes. Use when asked to review, audit, check, QA, lint or health-check a lab, an event's labs, all labs, or a lab PR, or to find what needs updating after a product change. Read-only; hand fixes to lab-update and live testing to lab-runthrough.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-review\u002FSKILL.md",[],[107,20,178,169,179,180,181,182,168,22,109,183,184,185,186,167,187,188,114,189],"lab review","evidence","broken","invalid","images","qa","only","testing","front","event","read-only","fixes",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":39},"01M711P6KTXZ0EH96KZ43QRWY5","lab-create","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).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmcs-labs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flab-create\u002FSKILL.md",[],[20,197,198,199,200,201,22,161,109,202,203,204,205,167,187,206,114,169,207,208],"create","lab create","knowledge","convert","preview","new","module","long","walkthrough","page","form","long-form"]