BID REVIEW QUEUE / 15-MINUTE WALKTHROUGH

Decisions,
not chat.

Let a model classify. Let your .NET application decide when to trust, escalate, or ask a person.

Static guide. Recorded evidence. No live inference.
Uses a synthetic case and responses saved on October 14, 2026. This page does not run the .NET app or call Azure.

THE BUSINESS PROBLEM

35 lines. Not 35 easy decisions.

An estimator needs to map bid items to utility systems and work types before pricing. Some descriptions are clear; others need judgment. The goal is a reviewable classification, not awarding a contract, pricing a bid, or sending it.

02

THE RESPONSIBILITY BOUNDARY

The model answers. Your code owns the rule.

APPLICATION / C#

01. Define

Build the input, questions, and every allowed option. Include a way to abstain.

PayItemQuestions.For
FOUNDRY / MODEL

02. Classify

Microsoft-Decision-1 returns a choice and per-option probabilities, not a written rationale.

state + questions
APPLICATION / C#

03. Validate & route

Check the response contract. Apply the threshold. Ask a second model only for eligible uncertain lines.

ReviewPolicy.Evaluate
PERSON / REVIEW

04. Resolve

Review unresolved cases. Changing an answer invalidates its previous approval.

Review, correct, approve

These calls are orchestrated by the sample, not by an automatic Foundry workflow. The lab uses Blazor Server and a Minimal API with shared services; GitHub Pages hosts only this static guide.

Why no agent framework?

Each item needs bounded classification, with no autonomous tools, memory, or conversation. A model cascade with human review is enough. Interfaces separate live calls from replay; an agent framework would add orchestration this task does not need.

03

ONE CASE BEFORE THE WHOLE DATASET

Would you accept item 13?

PAY ITEM 13 / SYNTHETIC

Sanitary Sewer Bypass Pumping, Complete

Unit: LS (lump sum). The model receives the number, description, and unit. Quantities and prices stay in the .NET application.

Pause here. Is this gravity sewer work or force main work? The application offers those categories; the model cannot introduce a new accepted category.

FIRST MODEL / RECORDED

Microsoft-Decision-1

SystemForce main
0.7078selected-option probability
not measured accuracy
Work typeSupport work

Work-type probability: 0.9954. The weakest selected probability drives the threshold rule.

SECOND OPINION / RECORDED

gpt-6-luna

SystemSanitary gravity

Different system. Same work type.

Work typeSupport work

The second opinion supplies choices, not a replacement probability. Disagreement remains evidence even if you lower the threshold.

CHANGE THE POLICY, NOT THE EVIDENCE

Where would you draw the line?

The initial threshold is 0.90. Explore only this recorded case; this is not the full app's review queue.

Threshold experiment

0.50 to 0.99. Try 0.70, then return to 0.90. No model call is made.

APPLICATION ROUTE AT 0.90

A person must review

The system probability is below 0.90 and the recorded models disagree. Neither a valid response nor a second opinion proves correctness.

Inspect the original choices and probabilities

A reduced view of the bundled recordings, not a new response. The separate service confidence field is not used by the threshold rule.

Enable JavaScript to inspect the recorded JSON, or open the recording in the repository below.
Open the decision recording
04

FAMILIAR .NET, A PROBABILISTIC DEPENDENCY

Follow one decision through C#.

Start with the existing endpoint. Blazor calls the same service and policies directly; the UI does not need an HTTP round trip to this endpoint.

Program.cs / POST /api/decideC#
var outcome = await decisions.DecideAsync(request.Item, request.Mode, request.ReverseOptions, ct);
var result = outcome.Result;
var review = ReviewPolicy.Evaluate(request.Item, result, outcome.Questions, request.Threshold);
1

Define a closed contract

PayItemQuestions.For creates the questions and options. unclear permits abstention. A span copied from text can still be the wrong span.

Read PayItems.cs
2

Treat the model as an external dependency

IDecisionProvider separates Foundry from replay. The service uses explicit mode selection, cancellation, timeouts, and visible errors. A failed live request never becomes a silent replay.

Read DecisionService.cs
3

Validate before applying policy

DecisionWire.ParseResponse checks each question, offered choice, and finite probability. Every offered option must be scored, with a sum of 1 within the application's 0.02 tolerance.

Read Decisions.cs
4

Keep business rules in ordinary C#

The rule accepts only when every selected probability meets the threshold, every choice is most probable, and none is unclear. Reviewer edits require approval again.

Read Review.cs
Add the second opinion after the basic flow is understood

Only eligible lines below the threshold reach the second model. Abstentions and non-top choices go to a person instead. All choices must agree for acceptance by agreement; a failed second opinion leaves the line with a person.

Program.cs / selective escalationC#
if (request.SecondOpinion && EscalationPolicy.Eligible(result, outcome.Questions, request.Threshold))
{
    try { opinion = await decisions.SecondOpinionAsync(request.Item, outcome.Questions, request.Mode, ct); }
    catch (DecisionFailure failure) { secondOpinionError = failure.Message; }
}
Read Escalation.cs

A model cascade with human review describes this sample's design, not a built-in Foundry approval feature. The JavaScript experiment above illustrates only item 13; the .NET policies remain the application implementation.

05

YOUR LIVE PRESENTATION

One story. Five stops.

  1. 00:00 / 2 MIN

    Start with the problem

    "We are classifying bid lines, not approving contracts." Introduce the application, model, and person as separate responsibilities.

  2. 02:00 / 4 MIN

    Follow item 13

    Ask the audience to predict. Reveal the recorded choices, their disagreement, and the review route. Name the recorded mode before showing the results.

  3. 06:00 / 4 MIN

    Open the C#

    Show the endpoint, the parser, and the policy. "The model is a dependency. Validation and business rules are still our job."

  4. 10:00 / 3 MIN

    Change policy; then demonstrate review in the app

    Move the threshold without a model call. In the separate .NET app, approve a line, edit an answer, and show approval clear. Export originals separately from edits.

  5. 13:00 / 2 MIN

    Close with limits, not a success rate

    "Two models can be wrong together. Choose a threshold on representative labeled data, not because 0.90 sounds reassuring."

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

From a repository checkout in PowerShell 7, with the exact SDK from global.json installed:

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

Open http://localhost:5190. At 0.90 with recorded second opinions enabled, the bundled demo expects 35 decided: 24 by rule, 8 by agreement, 3 awaiting review. Confirm these during rehearsal; new live calls need not reproduce them.

Restore and compile before presenting. -Offline disables live configuration, not network access for package restore. Stop 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 evidence in view.

Probability is not accuracy

A 0.90 prediction does not establish 90% correctness. Calibration is measured across comparable labeled cases, not inferred from one answer.

Agreement is a policy

Two models can share an error. Agreement does not create a new calibrated probability or replace meaningful human review.

Replay is not availability

These October 14, 2026 recordings do not establish current Foundry availability, latency, pricing, or model quality on your workload.

This is not production approval

The app keeps review state in its Blazor session. It is not a durable audit trail. This guide stores no approvals and sends no bid data.

Sources & version boundary

The sample targets .NET 11 RC1, Microsoft-Decision-1 version 1, and the Microsoft provider's v1/systemone API. The sample treats the decision model as preview: its recorded catalog observation and documentation signals differ. See the source register rather than assuming general availability.

Build it. Understand it.
Make it reproducible.