This file is read by Copilot and other coding agents that operate on this repo. It defines what to do, what to avoid, and where to look when the agent is helping the maintainer evolve the workshop.
A living workshop teaching the Agent DevOps loop on Microsoft Foundry, using the fictitious Contoso Travel Concierge as the running scenario. Two agent implementations (Prompt Agent, Hosted Agent) share one dataset.
Canonical plan: .github/PLAN.md.
- Agent name: Contoso Travel Concierge
- Company: Contoso (fictitious)
- Data IDs:
CT-FL-*(flights),CT-HT-*(hotels),CT-CR-*(car rentals) - Never introduce real company/product names in scenario content
| Path | Why |
|---|---|
data/*.csv |
Change requires schema update in specs/schemas/ and test bump. Coordinate with maintainer. |
src.original/** |
Pristine baseline for scripts/reset.sh. Never edit unless intentionally bumping the baseline. |
artifacts/**/reference/** |
Versioned known-good outputs. Versioned via filename suffix (-v1, -v2), never overwritten. |
When any of these change, update the others in the same PR:
.github/PLAN.md— the intentspecs/course.yamlandspecs/*.schema.json— machine-readable truthtests/**— verification of the truthlabs/**— learner-facing content
If tests fail after your change, that's the guardrail catching drift — fix the mismatch rather than skipping the test.
Every file under labs/{fundamentals,core,more}/*.md must follow
labs/_template/lab-template.md:
- H1 title starting with
Lab NN — ... 🎯 Goal·🧭 Where this fits·📋 Steps·✅ Verify·🧠 Recap·➡️ Next- Callouts:
> 🎯> ✅> 💡> ⚠️> 🧭> 🧠 - Every generative step ships a
reference/artifact underartifacts/
Two-variant rule (guarded by tests/test_lab_content.py):
-
Inline gotcha — a single lab-specific mistake, ≤ 4 lines, fits in the step's flow. Format:
> ⚠️ **Gotcha:** <one-liner>. -
Cross-cutting gotcha — infra/tool errors that recur across labs, or need multi-step recovery. Author them once in
labs/TROUBLESHOOTING.mdunder a stable H3 using the Symptom / Cause / Fix / Prevent template. In the lab, keep the callout to one line:> ⚠️ **Gotcha — <error phrase>.** Details in [Troubleshooting · <section>](../TROUBLESHOOTING.md#anchor).
> ⚠️ **Cost:** … and > ⚠️ **Known limitation:** … follow the same visual
style but are not enforced by the drift-check.
Do not modify .github/agents/workshop-coach.agent.md behavior contract
casually. The coach must always:
- Guide, never do the task for the learner
- Locate the learner via
progress-trackerbefore responding - Refuse "do it for me" requests politely
Use <!-- TODO(nitya): ... --> in markdown and # TODO(nitya): in code for
maintainer follow-ups (screenshots, exact commands, model pinning, etc.).
Canonical entries live in labs/TROUBLESHOOTING.md.
Bullets below are pointers — keep them in lockstep with the canonical section
anchors and the in-lab callouts that link to them.
azd provision— soft-deleted resource blocks re-provision. Purge the Cognitive Services (Foundry) account or use a freshazd envname. Troubleshooting · Lab 01.azd provision—invalid character 'n' after object key:value pair. Non-emptyAI_PROJECT_DEPLOYMENTS(or the other three*Jsonparams) breaks the parameters file on azd ≤ 1.31. Workaround:azd env set AI_PROJECT_DEPLOYMENTS "[]". Structural fix tracked asTODO(nitya)ininfra/main.bicep(switch the four params toarray/objecttypes). Troubleshooting · Lab 03 + Lab 05.azd deploy— 409 Conflict. Reusing the sameazd envname after a torn-down deploy hits stale Foundry data-plane state; recovery needs a fresh env name. Troubleshooting · Lab 05.azd deploy— 404Subdomain does not map to a resource. Stale bearer token, not a missing resource. Re-auth bothazandazd(independent token caches). Troubleshooting · Lab 05.- Mixed UI→CLI path creates a second resource group. A portal-first
learner running
azd env new … && azd provisionin Lab 05 creates a second RG. Fix:bash scripts/link-portal-rg.sh(idempotent). Troubleshooting · Lab 05 "Path check" + Lab 00 overview warning. - Portal cannot create hosted agents. The Foundry portal can view and
manage hosted agents but has no create flow —
azd deployis the only supported creation path today. Do not add "portal path" instructions for hosted agents unless the portal ships that flow. (No troubleshooting entry — this is a static product limitation, not an error.)
Run before opening a PR:
pip install -r requirements-dev.txt
pytest -qCI runs the same suite on every PR.