SUPPORT SIGNAL / 15-MINUTE WALKTHROUGH

A proposal,
not an action.

Turn a support request into something a person can inspect. Keep classification, evidence, and approval as separate responsibilities.

Static guide. Simulation example. No live inference.
The displayed proposal documents deterministic rules, not a saved model response. This page runs neither .NET nor Microsoft Agent Framework and makes no Azure calls.

THE BUSINESS PROBLEM

A reported outage is not a verified diagnosis.

A support operator needs a classification, a suggested next step, and a draft reply. The application must preserve what the requester actually said without pretending it confirmed the cause, contacted anyone, or restored service.

02

THE RESPONSIBILITY BOUNDARY

One agent. Explicit checks. A human decision.

APPLICATION / C#

01. Accept input

Validate the request length and selected mode. Treat the text as untrusted data, not instructions to the application.

POST /api/analyze
LIVE PATH ONLY

02. Propose

A code-defined Agent Framework agent calls a Foundry deployment. The application owns the instructions; Foundry serves inference.

AsAIAgent / RunAsync
APPLICATION / C#

03. Validate

Parse the result. Check labels, required text, and exact evidence membership. Reject invalid results rather than simulating a success.

Triage.Validate
PERSON / REVIEW

04. Review

Inspect and edit the proposed reply. Approval is local; changing reviewed text clears it. No message is sent.

Original + human edits
Is this a Foundry hosted agent?

No. In the live lab, AIProjectClient.AsAIAgent defines the agent in application code. It does not create a service-managed agent resource. The agent runs in the .NET application, with no tools or conversation memory in this sample. App Service hosting is optional and separate from model inference.

Direct model inference would also solve this one-shot task. The framework provides a small agent boundary for learning; multiple agents would not improve the explanation.

03

READ BEFORE CLASSIFYING

What do we actually know?

SERVICE OUTAGE / SYNTHETIC FIXTURE

The requester's report

The production portal has been unavailable to all users since 9:15 AM. Opening the dashboard returns error 500. We need access restored to continue operations.

This text comes from the application's Service outage scenario. It reports scope and symptoms; it does not verify them.

Pause here. Which category fits? Is the cause known? Would you promise a recovery time based on this text?

EXPECTED SIMULATION OUTPUT / NOT AI

Reliability / High

SummaryPossible service disruption; scope not yet verified.

Outage-related words select Reliability. Production-wide scope selects High. These are deterministic teaching rules, not measured model behavior.

EvidenceThe entire request above

The simulator copies up to 180 characters. This fixture is shorter than that limit.

SUGGESTION / NOT EXECUTION

A next step for an operator

Verify service status and scope before escalating to the on-call team.

No diagnosis. No recovery promise.

The draft reply acknowledges the request and says the cause and resolution timeline are not confirmed. The app does not investigate systems or contact anyone.

ONE APPLICATION CHECK, MADE VISIBLE

Does the quote appear in the request?

Edit an evidence excerpt. This browser exercise illustrates the exact, case-sensitive substring check. It does not classify the request or run the .NET validator.

Evidence membership experiment

Empty evidence, more than 3,000 characters, or text absent from the request is rejected. Matching is case-sensitive; whitespace is not normalized.

EVIDENCE MEMBERSHIP ONLY

Quote found, interpretation not verified

This excerpt appears exactly in the request. It does not establish the cause, scope, or correctness of the proposed response. Human review is still required.

04

FOLLOW THE LIVE PATH, THEN THE SHARED CHECKS

The model call is not the whole application.

In the live branch of POST /api/analyze, the app defines one agent, runs it, and parses its response. Authentication is configured separately: Azure CLI locally or managed identity when hosted.

Program.cs / live branchC#
var agent = new AIProjectClient(uri!, credential).AsAIAgent(
    model: model!, name: "SupportSignal", instructions: Triage.Instructions);
var response = await agent.RunAsync(JsonSerializer.Serialize(new { untrustedSupportRequest = request.Text }), cancellationToken: timeout.Token);
proposal = Triage.Parse(response.ToString());
1

Instructions are not enforcement

Triage.Instructions asks for JSON and says the request is untrusted. This lab does not use a model-enforced JSON schema. The application must still reject bad output.

Read the instructions and endpoint
2

Validate both provider paths

After simulation or live inference, Triage.Validate checks allowed category and priority values, required field lengths, and evidence membership. Valid JSON alone is insufficient.

Read the offline contract checks
3

Make failures visible

The live branch has a cancellation deadline. An invalid provider result stays an error. It is never replaced silently with the deterministic simulation.

Read the failure paths
4

Keep original output separate from edits

Browser code clears approval after changes. Export preserves the original proposal and adds humanEdits. Local approval is not a command to send the reply.

Read review and export behavior
Program.cs / Triage.ValidateC#
if (!input.Contains(p.Evidence, StringComparison.Ordinal)) throw new InvalidDataException("Evidence is not in the request");

This line is deliberately small. It proves membership, not meaning. The browser experiment above illustrates this rule; the complete validator also checks the other proposal fields.

05

YOUR LIVE PRESENTATION

Start with the report. End with the boundary.

  1. 00:00 / 2 MIN

    Name the problem and mode

    "We want a reviewable proposal, not an autonomous support action." State that the displayed result is deterministic simulation, not a model recording.

  2. 02:00 / 4 MIN

    Read the outage case

    Ask what is known. Show the expected category and priority, then try the invented quote. Explain why a matching quote still does not prove a diagnosis.

  3. 06:00 / 4 MIN

    Open the C#

    Show the live agent invocation and the shared validator. The agent definition belongs to the app; inference belongs to Foundry. Simulation bypasses the agent.

  4. 10:00 / 3 MIN

    Demonstrate review in the separate app

    Analyze Service outage in simulation mode. Edit the reply, approve it, then edit again to clear approval. Export and point out originals versus human edits.

  5. 13:00 / 2 MIN

    Close with what remains unproven

    "We validated the shape and the quotation. A person must still judge the interpretation." Leave room for a question.

Launch the separate .NET app for the review and export steps

From the repository root, with PowerShell 7 and the exact SDK from global.json installed:

.\scripts\Test-Prerequisites.ps1
.\Start-Demo.ps1 -Lab 1 -Offline

Open http://localhost:5187. Select Service outage and Analyze request. Expect Reliability / Priority high with a simulation label. No model or MAF runs. Rehearse before the event so restore and compilation do not happen on stage.

Editing a reply or next step clears approval. Changing the input or mode clears the proposal. Reload loses browser state. Stop the server with Ctrl+C and remove exported synthetic JSON when no longer needed.

Prerequisites, live setup, costs, and cleanup
06

WHAT THIS DEMO DOES NOT PROVE

Keep the claim smaller than the evidence.

Simulation is not AI quality

Keyword rules reproduce the workflow but can mishandle negation or mixed intent. Their output and timing do not measure a model.

Instructions are not a guarantee

Asking the model to ignore embedded commands is useful guidance, not proof against every adversarial request. Inputs and outputs remain untrusted.

Local approval is not an audit trail

The app's review state is in browser memory. It is not persisted or an identity-verified approval. Nothing is sent.

A past run is not the next run

The repository records dated live observations separately. This website makes no new inference call and does not verify your credentials, access, or deployment.

Sources & version boundary

The sample pins .NET SDK 11.0.100-rc.1.26425.128 (RC1) and Microsoft.Agents.AI.Foundry 1.24.0-preview.261006.1. The connector is preview; this guide neither upgrades it nor claims it is generally available.

The quote exercise and presentation sequence are this project's teaching design. The review rule is application behavior, not a framework-provided approval guarantee.

Validate what you can.
Expose what you cannot.