← How I Built It
Claude Sonnet 5

How I built the Fusion Cloud AI-Readiness Assessment demo

Given a description of an Oracle Fusion Cloud ERP environment — target agent use case, transaction volume, integration method, and which governance controls already exist — produce a readiness score, named gaps, and a recommended approach. Retired and rebuilt 2026-09-10 from the site's prior Oracle EBS → S/4HANA migration-complexity demo, which answered a different question (should you leave EBS) than this one does (is it safe to run governed AI agents against the Fusion Cloud ERP environment you already have) — same reasoning-model scaffolding, new domain.

Last reviewed

Evidence typeModel demonstration — Claude Sonnet 5 reasons live, via the production endpoint, over the allowlisted Fusion Cloud ERP scenario a visitor selects; it does not connect to a live Fusion tenant , and there is no sandbox connection yet.

Nothing but enums reaches the prompt

Every input — agent use case, transaction volume, integration method, governance controls — is validated against a fixed allowlist before anything is assembled into a prompt:

const USE_CASES = [
  "AP invoice exceptions (Fusion Payables)",
  "Procurement requisition triage (Fusion Procurement)",
  "GL journal review & anomaly detection (Fusion General Ledger)",
  "Expense report auditing (Fusion Expenses)",
] as const;
const VOLUMES = ["<1,000/month", "1,000–10,000/month",
                  "10,000–100,000/month", "100,000+/month"] as const;
const INTEGRATION_METHODS = ["No integration yet — planning phase",
  "Calling Fusion REST APIs directly",
  "Oracle Integration Cloud (OIC) as middleware",
  "Oracle AI Agent Studio (business-object + deep-link tools)"] as const;

There's no free-text field anywhere in this form. A public demo endpoint that accepts arbitrary text and feeds it to a system prompt is a prompt-injection surface; a form that only accepts membership in a known set removes that surface entirely rather than trying to sanitize around it.

The prompt reasons about the specific selection

The system prompt frames Claude as a senior AI-governance architect and explicitly instructs it to reference real Fusion Cloud ERP concepts for the use case actually selected — Payables invoice holds and matching for AP exceptions, supplier and purchase-order approval for procurement triage, chart-of-accounts and period-close controls for GL review — rather than returning generic AI-governance advice that would apply to any input. Each governance control is marked Present, Absent, or Unknown (the default), and the prompt keeps those apart. One conditional line does real work: if fewer than two controls are confirmed present and at least one is confirmed absent, the prompt requires the response to call that out as a structural blocker to autonomous agent action, not a minor gap to note in passing. Unknown controls are never described as missing and never trigger that verdict on their own; they come back as items to confirm, with a provisional score.

The response is validated, not trusted

Structured output from a model is still a string until proven otherwise. Before anything reaches the client:

  • ✓Code fences are stripped and the outermost JSON object is extracted defensively — models sometimes wrap output in commentary even under instruction not to.
  • ✓readinessScore is clamped into the 1–10 range with Math.min/Math.max, and rejected outright if it isn't a finite number.
  • ✓recommendedApproach.approach is lowercased and checked against exactly three allowed values (pilot-ready / needs-guardrails / not-ready) — anything else fails the request rather than silently passing through.
  • ✓keyGaps and nextSteps are truncated to 3 items regardless of how many the model returns, keeping the response shape predictable for the UI.

Why Sonnet, and why 5 requests per 10 minutes

This is the only demo on the site that runs Claude Sonnet 5, with extended thinking explicitly disabled — the reasoning load (weighing use case against transaction volume against which governance controls already exist to produce a specific, defensible recommendation) is real, but this use case doesn't need multi-step deliberation to get there. It also gets the tightest rate limit on the site — 5 requests per 10 minutes per IP, against 30 requests per day for the extraction demos — because a reasoning-model call costs meaningfully more than a Haiku extraction call, and a public demo endpoint has to assume it will be hit by more than curious visitors.

Labeled benchmark

Run 2026-09-10

Model

Claude Sonnet 5 (extended thinking disabled)

Sample size

4 configurations attempted; 3 completed (see limitations)

Data source

4 distinct Fusion Cloud ERP use-case / integration-method / governance-control combinations, run live against the production endpoint at tioga.ai.

Schema-valid responses

3/3 completed runs (100%)

Thin-controls disclosure rule followed

1/1 confirmed applicable case

Average latency

~14s

Rate limit enforced

Confirmed: 5 requests / 10 min per IP

Limitations

  • —This is a reasoning/judgment task, not classification — there's no single "correct" readiness score to measure accuracy against. The metrics above check structural reliability (valid output, disclosure-instruction adherence), not correctness of the recommendation itself.
  • —One test case was rejected by the demo's own 5-requests/10-minute rate limit during this benchmark run — a real constraint, not a bug.
  • —Readiness scores haven't been validated against real agent-deployment outcomes; treat them as directional, not calibrated.
  • —The thin-controls figure was measured on 2026-09-10 against the earlier rule, which treated any submission with fewer than two confirmed controls as a structural blocker. Since 2026-09-21 the demo calls it a structural blocker only when at least one control is confirmed Absent; controls marked Unknown alone no longer trigger it. The current rule hasn't been re-benchmarked yet.