What you type, what Claude asks, what you get

Claude reads your agents, then grills the riskiest ones one question at a time and pushes back when the code says otherwise. On day one you get a map of every agent and a risk register that predicts which ones will fail. Thirty days of logs show whether it was right.

25
AI agents
52
Questions in the audit
3
At risk on day one
6
Predictions confirmed

A Claude Code team that already has agents

The team's repository claims-service/ has 25 Python agents in src/agents/, one file per agent, prompts in prompts/, the routing graph in src/graph.py, an approvals queue with escalation rules in config/approvals.yaml, a withdrawal handler, and logging to stdout. Nobody describes the agents to Claude. The code, prompts, config and git history describe them, and the interview finds what the code cannot show.

  1. Install the plugin

    /plugin marketplace add ORG/juggernaut-harness
    /plugin install juggernaut-harness@juggernaut
  2. Start the audit

    /juggernaut-harness:audit ./claims-service

    Claude reads the repository before it asks anything.

    Claude

    I read 31 files and the git history. Here is what I found:

    • 25 model calls in src/agents/, each with a prompt file (27 prompt files, two of them shared house rules).
    • A routing graph with 10 decision points, 4 places where agents run at the same time, and 7 places where work goes back to an earlier step.
    • 10 places where the flow waits for a person, from the approvals queue and its config.
    • 7 calls to outside systems and one rule-based check.
    • A withdrawal handler that can stop a claim at any point.

    How deep should we go? A quick audit is about 12 questions and 10 minutes and gives you the map and the obvious gaps. A deep audit is about 50 questions and 45 minutes and goes agent by agent through the riskiest ones, which is where weak agents get found.

    Recommended: deep, because these agents decide payouts and write regulated letters.

    You

    Deep.

    Claude

    From the code, these seven agents carry the most risk. I will grill them one at a time, in this order. The other 18 get a confirmation table at the end.

    1. Compliance reviewer: its prompt asks it to review the letter and also return a corrected letter, and nothing checks what it returns.
    2. Letter writer: it writes regulated letters, its prompt changed three times in six weeks, and no test references it.
    3. Damage estimator: it drives the payout, runs on Opus 5.5 for an extraction job, and has no fallback in the code.
    4. Settlement calculator: it drives the payout, and its reviewer uses the same model family.
    5. Exclusions finder: downstream code parses its output as JSON, but there is no schema and nothing validates it.
    6. Claim file summarizer: it runs on GPT-6 Astra with high thinking for a summary.
    7. Coverage analyst: a wrong coverage call is the most expensive mistake in the process.
  3. Process questions

    Ten questions about the process as a whole come first. Three of them:

    Claude

    I grouped the steps into six roles: Intake, Coverage, Investigation, Settlement, Customer comms and Finance. Does that match how your team talks about the process?

    Recommended: yes.

    You

    Yes.

    Claude

    Your code sets timeouts but no target times. Should each agent's SLA be about half its timeout? The damage estimator has a 120-second timeout, so its SLA would be 60 to 70 seconds.

    Recommended: yes, and tell me any you want tighter.

    You

    Yes. Damage estimator is 70 seconds.

    Claude

    Your approvals config escalates denial sign-off after 24 hours, SIU after 48 hours and adjuster review after 24 hours. For denial and SIU the work stays with the same person and a notice goes out. For adjuster review it is reassigned. Is that right?

    Recommended: yes.

    You

    Correct.

    The other seven cover the outcome, daily volume, payment failures, withdrawals, cost limits (set from real usage later, with the file summarizer capped at three cents a call), where golden inputs live today (nowhere for most agents), and logging.

  4. Grilling the damage estimator

    Claude

    What does a bad estimate from the damage estimator look like? Give me one you have actually seen.

    Recommended: the last estimate an adjuster corrected.

    You

    Last month it priced a water heater at retail instead of our parts list. The payout was $640 too high.

    Claude

    How was that caught?

    You

    The adjuster caught it in review.

    Claude

    Adjuster review only happens on claims over $5,000. Under that, the estimate goes straight to the settlement calculator, and the settlement reviewer's prompt compares the total against the policy limits, not the line items. So on most claims a wrong line item reaches the payout unchecked. Is that right?

    You

    Yes. I hadn't thought about that.

    Claude

    Which inputs make it struggle?

    You

    Long invoices, anything over about ten pages. And photos where you can't tell how big the damage is.

    Claude

    Your code sends the whole invoice in one call with max_tokens: 2500. A twelve-page invoice can need more than 2,500 tokens of line items, so the list gets cut off. Has it ever been tested on a long invoice?

    You

    No.

    Claude

    Why Opus 5.5? This is an extraction job.

    You

    I don't know. It was set up that way.

    Claude

    I'll record that as unanswered. What happens when it fails or times out?

    You

    It retries twice and then the claim stops.

    Claude

    So there is no fallback: no smaller model and no hand-off to a person. Should a failed estimate go to an adjuster instead of stopping the claim?

    Recommended: yes.

    You

    Yes.

    Claude

    How many claims with known-correct estimates could you give me as golden inputs?

    You

    Two right now.

    Claude

    Damage estimator: readiness 55, at risk. A wrong line item reaches the policyholder without a full check, it runs a premium model on an extraction job, and it has no fallback today. The adjuster hand-off goes on the fix list. Test to add: five long invoices with known line-item totals.

  5. Grilling the letter writer

    Claude

    What does a bad letter look like?

    You

    The worst one dropped the appraisal-rights disclosure. That's a regulatory problem.

    Claude

    When does that happen?

    You

    When the payout has more than one adjustment.

    Claude

    How do you test a new version of its prompt before it goes live?

    You

    We read a couple of letters and ship it.

    Claude

    Git shows the prompt changed three times in the last six weeks, and nothing in tests/ references it. So every version went live untested on a regulated letter. How many letters with known-correct disclosures could you give me?

    You

    None saved. We could pull some.

    Claude

    Letter writer: readiness 58, at risk. Its prompts ship untested, its output reaches the policyholder, and it has no golden inputs. The disclosure check and the compliance reviewer catch some mistakes, but the next untested prompt change is the risk. Test to add: five letters with two or more adjustments in three states.

  6. Grilling the compliance reviewer

    Claude

    Its prompt asks it to review the letter and to return the corrected letter in full. Is it a reviewer or an editor?

    You

    Both, I guess.

    Claude

    When it edits, who checks its edits?

    You

    Nobody. Its version is what gets sent.

    Claude

    So wording legal never approved can reach a policyholder. Has that happened?

    You

    Legal flagged one letter last quarter. We assumed it was the letter writer.

    Claude

    The prompt also asks it to check word count, headings and format. Code can check those exactly and for free. Who owns this prompt?

    You

    I'm not sure.

    Claude

    Compliance reviewer: readiness 19, at risk, the lowest in the system. It does two jobs, nothing checks its edits, its prompts ship untested, and nobody owns it. Fix list: return fixes instead of rewriting, move the format checks to code, and assign an owner.

  7. The other grilled agents

    AgentWhat the team saidWhat Claude recorded
    Settlement calculatorIt applied depreciation twice on two replacement-cost claims this quarter. The current prompt was checked on two claims. Nobody knows how depreciation rules differ by state.Readiness 79, watch. Tested on few cases, a reviewer from the same model family, one unanswered question.
    Exclusions finderIt misses endorsements that exist only as scanned PDFs. The coverage analyst uses its list without checking it.Readiness 70, watch. Nothing checks it, and a miss reaches the policyholder.
    Claim file summarizerNobody knows who reads the summary or why it runs on GPT-6 Astra. QA samples about 5% of closed claims.Readiness 65, watch. A premium model on a summary, no golden inputs, two unanswered questions.
    Coverage analystConflicting endorsements are routed to the specialist as unclear. Twelve golden policies run before every prompt change.Readiness 100, ready. This is what a well-run agent looks like.

    For the other 18 agents, Claude shows one table of what the code says about each (job, model, inputs, output, schema, reviewer, timeout, retries) and the team confirms it, correcting two rows. The interview took 52 questions and about 45 minutes.

  8. Turn on recording

    Everything so far comes from the code and the interview. Health, Runs and Optimize need something the code cannot provide: a record of what each agent actually does on real claims. The agents do not write one yet, and Claude has no access to production of its own, so this step settles two things: how the record gets written, and how it reaches someone who is allowed to read it.

    Claude

    Health needs a record of every claim, and your agents do not write one yet. Where does the claims service run in production, and where do its logs go?

    You

    AWS ECS. Logs go to CloudWatch.

    Claude

    Then I will add the harness recorder: one Python file with no dependencies. It writes one JSON line per event to stdout, which CloudWatch already collects. It records which agent ran, the model, token counts, timing, status, which way each decision went and each review verdict. It never records claim text, prompts or letters, and nothing goes to Juggernaut. Add it?

    Recommended: yes.

    You

    Yes.

    Claude

    I instrumented three places: src/agents/base.py for every agent call and its token usage, src/graph.py for every routing decision and review verdict, and src/approvals/queue.py for when a person picks up and finishes a task. The run id is your internal claim id, which is opaque. Next question: can you read the claims service logs in CloudWatch yourself?

    You

    No. The platform team owns production logging.

    Claude

    Then the events have to reach you through them. Because the events hold metadata only, no claim text or customer details, this is usually an easy approval. From simplest to most convenient:

    1. They export the harness events when you ask and send you the file.
    2. They copy the harness events every day to a bucket you can read.
    3. They give you read-only access to the filtered events in CloudWatch.

    Recommended: the daily copy to a bucket, so health is one command for you and no extra work for them after setup.

    You

    The daily copy. Can you write the request?

    Claude

    Done: .harness/request-for-log-owner.md says what to copy (lines where workflow_id is claims-settlement), how often, who needs read access, and shows a sample line so they can see there is no customer data in it. One thing to be clear about: I cannot reach CloudWatch, the bucket or any of your servers. Getting the logs is always a manual step you do. Whenever you want a health check, download the files into .harness/runs/ with your read-only access, then run /juggernaut-harness:health. The command is aws s3 sync s3://claims-harness-events .harness/runs, saved in .harness/config.yaml so you do not have to remember it.

    Two days later the bucket exists. The team runs one claim through staging, the user downloads its events into .harness/runs/, and Claude checks them. check-logs reads the log files and compares them with the blueprint: how many runs and events it found, which agents reported, which did not, whether every model call carried token counts, and whether any step ids are missing from the blueprint.

    python harness.py check-logs .harness/harness.yaml --runs .harness/runs
    1 file(s), 88 events for claims-settlement, 1 runs, from 2026-09-24 to 2026-09-24
    agents reporting: 17 of 25
      not seen yet (paths not taken, or not instrumented): Denial letter writer, SIU referral writer,
      SIU escalation notice, Translator, Reminder writer, Dispute summarizer, Payment exception handler,
      Withdrawal confirmation
    model calls: 17, all with token counts
    Claude

    The recording works. 17 of 25 agents reported, every model call with token counts. The other 8 sit on paths this claim did not take: denial, SIU, translation, reminder, dispute, payment exception and withdrawal. Health will have data from the day this ships to production.

    Claims service on ECSThe recorder writes one line per eventCloudWatch keeps the linesThe platform team's daily copy lands in a bucketYou download the files into .harness/runscheck-logs, then the console
  9. What Claude produces on day one

    FileWhat it holds
    .harness/harness.yamlThe blueprint with every interview answer recorded per agent
    .harness/risk-register.mdReadiness for all 25 agents: 3 at risk, 9 to watch, 13 ready, with reasons and the test to add for each
    .harness/audit-report.mdMissing controls and the fix list, including the adjuster hand-off, the compliance reviewer changes and the drafted schema
    .harness/harness.mdThe process spec, one card per step
    .harness/harness.bpmnBPMN 2.0 for bpmn.io or Camunda Modeler
    .harness/harness.htmlThe console: map, process cards with readiness, and a dry-run forecast
    src/harness_recorder.py and three edited filesThe recorder and its calls, shown as a diff for review
    .harness/config.yamlThe download command the user runs to copy the logs from the bucket, saved so nobody has to remember it
    .harness/request-for-log-owner.mdWhat to copy, how often, who needs access, and a sample line showing there is no customer data
    AgentReadinessBiggest reasons
    Compliance reviewer19, at riskPrompts ship untested; nothing checks its edits; two jobs
    Damage estimator55, at riskA wrong line item reaches the policyholder; premium model on extraction; no fallback
    Letter writer58, at riskPrompts ship untested on a regulated letter; no golden inputs
    Claim file summarizer65, watchNo golden inputs; premium model on a summary
    Exclusions finder70, watchNothing checks its output; a miss reaches the policyholder
    Settlement calculator79, watchTested on few cases; reviewer from the same model family
    The first part of the claims settlement process map with intake agents, coverage agents and the parallel investigation
    The map Claude draws from the code: lanes, agents with their jobs, parallel splits, decisions and loops back.
  10. Thirty days later: which agents are slipping?

    The recorder shipped with the next release on September 25. Every claim since has been written to CloudWatch and copied to the bucket each night by the platform team's job. Claude cannot reach either one, so the health check starts with the user getting the logs.

    /juggernaut-harness:health
    Claude

    I cannot reach CloudWatch, the bucket or any of your servers, so I need the logs on this machine first. Download the last 30 days into .harness/runs/ with your read-only access, using the command saved in .harness/config.yaml: aws s3 sync s3://claims-harness-events .harness/runs. If you cannot run it, ask the platform team for the files, or drop them here. Tell me when they are in place.

    You

    Done. The files are in .harness/runs.

    Claude

    I checked the files: 414 claims and 55,083 events over 30 days, with all 25 agents reporting. Three of 25 agents are below the threshold.

    • Damage estimator, 53. It is timing out: p95 latency is 231 seconds against its 70-second SLA, and 32% of attempts are retried. It breaks its output schema on 4.7% of calls.
    • Letter writer, 54. It fell from 96 after prompt v5 went live on October 5. The compliance check now sends its letters back on 79% of decisions, up from 21%.
    • Settlement calculator, 59. It fell from 91 after prompt v3 went live on October 12. Its reviewer now passes only 61% of its payouts.

    The risk register flagged all of these on day one. The damage estimator and the letter writer were at risk. The settlement calculator was on watch for thin testing, and its v3 shipped without the golden claims the register asked for. The compliance reviewer is rewriting letters, the exclusions finder breaks its schema on 8.4% of calls, and the claim file summarizer is 25% of all agent spend.

    The Letter writer drawer showing a 30-day trajectory falling from 96 to 54 and a score composition led by gate pass rate
    The Letter writer's drawer: health fell after prompt v5, and the biggest penalty is how often its letters get sent back.
  11. What should we fix first?

    /juggernaut-harness:optimize
    Claude

    The top findings, with estimated savings per claim:

    1. Claim file summarizer: a summary step on GPT-6 Astra. Move it to a fast model. About $0.084 per claim, plus $0.017 from lowering its thinking.
    2. Letter writer: the compliance loop sends it back on 79% of decisions since prompt v5. Fix the letter writer before the reviewer, since every pass reruns both. About $0.048 per claim.
    3. Compliance reviewer: it rewrites the whole letter instead of returning fixes. About $0.027 per claim.
    4. Damage estimator: timing out on Opus 5.5 for an extraction job. Test Sonnet 5, which saves about $0.019 per claim.
    5. Settlement calculator: worse since prompt v3. Run the golden claims against v2 and v3 and roll back if v3 loses.

    Every model or prompt change needs the measured test first: rerun three to five golden claims on the new setting and compare pass rates, schema violations and a human read.

    You

    Run the golden claims for the letter writer on v4 and v5.

    Claude

    v4 passed compliance on 5 of 5 golden claims and v5 on 2 of 5. I recommend rolling back to v4. Want me to change the prompt reference in harness.yaml and the agent code?

    The Optimize view with spend by agent and ranked findings
    The Optimize view ranks every finding with its evidence and estimated saving.

What you give and what you get

Way inYou giveClaude readsReady on day oneRun log comes from
Audit in Claude CodeA path and about 50 answers in a deep auditAgent code, prompts, routing, approval config, git historyMap, process, spec, BPMN, risk register, audit report, the recorder and a download commandThe recorder, from the day it ships. You download the logs, or whoever owns them sends them
Design in Claude.ai or CoworkAnswers and golden inputsNothing, there are no agents yetBlueprint, prompts, map, process, spec, BPMN, risk register, forecastSimulated runs now; the recorder once the agents are built
Import from n8nThe workflow file, its execution history and the grill answersThe n8n nodes, connections and execution historyMap, process, spec, BPMN, risk register, and Health, Runs and Optimize from the historyn8n's own execution history, with no code changes

The risk register predicts which agents will fail from the design and the interview. Health, Runs and Optimize show which agents did fail, so they need a run log. The two together tell you whether the register was right.

The Health view of the Juggernaut Harness console for the claims example
The Health view of the claims example.

Where the run data comes from

Health, Runs and Optimize read a run log: one line per event, written while the agents run in production. The map, the process spec and the risk register do not need one. The harness is bring-your-own-logs: Claude cannot reach CloudWatch, Datadog, Splunk or any of your servers, and never asks for credentials. Getting the logs is always a manual step: you download them, or whoever owns them sends them, and you put them where Claude can read them.

Your situationHow the log reaches the harness
You can read the logsYou download them with your own access, for example with aws s3 sync, and put them in .harness/runs/. The command is saved in .harness/config.yaml so you do not have to remember it.
Someone else owns the logsThey export the harness events or copy them to a folder or bucket you can read. The events hold metadata only, so access is usually an easy approval. Claude writes the request for them.
Your agents run in n8nImport the execution history with import-n8n-runs, using an n8n API key you or an admin hold.
You use Claude.ai or CoworkUpload the log files to the conversation.
Nothing runs yetClaude runs the design on sample inputs in the conversation.

check-logs is the first thing to run on any log. It counts runs and events, lists which agents reported and which did not, flags model calls without token counts and models missing from the price table, and catches step ids that are not in the blueprint. With no log, the health command says there is no run data and stops. It never estimates.

Juggernaut Dev never receives any of it. The harness has no server, account or telemetry. The recorder writes metadata only, such as step ids, models, token counts, timings and decisions, to your own logs, folder or database, and never prompts, inputs or outputs.

The claims example on this page uses a generated log in the same format, so the results can be shown without anyone's real data.

What comes next

Coming soon

Juggernaut Enterprise

A delivery kit deployed in your own cloud. Infrastructure-as-code templates copy harness events from CloudWatch, Azure Monitor, Datadog or Splunk into storage in your account every day and host the console behind your own sign-in, so nobody downloads logs by hand. Your data never leaves your account.

In the future

Juggernaut Cloud

Hosted dashboards, alerts and history for teams that do not want to run anything themselves. Opt-in, metadata only, with its own data terms.

Open source under Apache-2.0. Works in Claude.ai, Claude Cowork, Claude Code and OpenAI Codex.