Scaffold agent
Skill observability-oss/progress-observability-plugin/skills/scaffold-agent
Scaffold a new .NET AI agent project with Progress Observability already wired up, starting from the observability-oss dotnet-agent-starter template. Use when the user wants to create, scaffold, bootstrap, or start a new agent — "build me an agent that…", "scaffold a .NET agent", "new agent project with observability", "start an agent from the template".From its SKILL.md
npx -y skills add observability-oss/progress-observability-plugin --skill scaffold-agentAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.9 KB, as published. Nobody here has run it
Scaffold an instrumented .NET agent
Create a working, already-instrumented .NET agent for the user's domain by
starting from the observability-oss/dotnet-agent-starter template and filling
in only its marked slots.
This skill writes files. Most of this plugin only reads the Progress
Observability Platform; this skill creates a project on disk and makes no MCP
calls at all. (Its sibling instrument-agent retrofits observability onto a
project that already exists.)
The template already contains the observability wiring, the pinned package versions, and the configuration layering — all of it verified to build. Your job is the domain layer: the agent's name, its instructions, its tools, and its knowledge corpus. Everything else is copied through untouched.
Workflow
-
Gather what you need. Ask for whatever the user hasn't already said:
- What the agent does — one or two sentences. This becomes its instructions.
- Its actions — 2–4 things it should be able to do (look something up, create a record, run a calculation). These become tools.
- Grounding documents — does it answer from a body of knowledge? If so, what kind of documents.
- A short name — used for the project, the app name, and the folder. Slugify it (lowercase, hyphens) for the app name.
Don't over-interview. Two exchanges is plenty; sensible defaults beat a questionnaire.
-
Fetch the template. Prefer the newest release tag; fall back to the default branch when the repo has no tags yet:
REPO=https://github.com/observability-oss/dotnet-agent-starter.git TAG=$(git ls-remote --tags --refs --sort=-v:refname "$REPO" 'v*' | head -n1 | sed 's|.*refs/tags/||') git clone --depth 1 ${TAG:+--branch "$TAG"} "$REPO" <target-folder> rm -rf <target-folder>/.gitScaffold into a new folder named after the agent, never into a folder that already has files in it. If the clone fails (no network, no git), stop and give the user the clone command to run themselves — do not reconstruct the template from memory. Getting the observability wiring or the package versions subtly wrong is worse than not scaffolding.
-
Rename the project to the user's agent (skip if they want to keep
StarterAgent): renamesrc/StarterAgent/and its.csproj, then update<RootNamespace>and everynamespace StarterAgent;declaration. Mechanical — the build in step 5 catches any miss. -
Fill the marked slots, and only those. The template marks each one with a
scaffold:comment:Marker Where What to write scaffold:app-nameProgram.cs,appsettings.jsonThe slugified agent name scaffold:system-promptProgram.csInstructions derived from what the user described scaffold:toolsProgram.cs+Tools.csOne method per action, registered in the tools list scaffold:corpusKnowledgeBase.cs+docs/Their grounding documents - Tools: one public method per action on the tools class, each with a
[Description]attribute on the method and on every parameter (the model picks tools by those descriptions), returningstring. Implement them as stubs over plausible in-memory data — notthrow new NotImplementedException()— so the agent actually runs and produces real tool-call spans on day one. Leave a// TODO:marking where the user's real system connects. Give at least one tool an honest failure path (unknown id → a clear "not found" message), which is what makestrace-triagedemonstrable. - Corpus: replace
docs/*.mdwith a few short markdown documents for their domain. Keepobservability-basics.md— it stays accurate and useful. - Instructions: tell the agent to ground answers in the knowledge base when a corpus exists, to use its tools rather than guess, and to say so plainly when something isn't found.
- Tools: one public method per action on the tools class, each with a
-
Never touch: the
ObservabilityTracer.Initialize/AddObservability()/Shutdown()block, the pinnedPackageReferenceversions, theConfigurationBuilderlayering, or theUserSecretsId. If the user asks to change one, do it — but tell them what it affects first. -
Verify. Run
dotnet buildin the new project. It must succeed before you report success. Fix what you broke; if the failure is in untouched template code, say so rather than papering over it. -
Hand off. Tell the user, in this order:
- the
dotnet user-secrets setcommands for their Azure OpenAI settings and the Progress Integration key (ac_p_…), run from the project folder; dotnet run, and a couple of example prompts that exercise their tools;- then
/health-checkto confirm traces are flowing — after whichtrace-triage,cost-report,coverage-gaps, andeval-from-tracework against their own agent.
Two things that trip people up on the first run, so state both:
- The MCP key (
acm_…) is a different key from the Integration one, and it is read by the coding agent rather than by their app — so it goes in the environment (OBSERVABILITY_MCP_API_KEY), not user secrets, and must be set before the agent starts. - The scaffolded folder carries its own
.mcp.json, which only applies when that folder is the project root. If you scaffolded into a subfolder, tell them to open it as its own project before running/health-check.
- the