← Back to the maintenance example

ACTUAL VISIBLE CONVERSATION

Finding. Approval. Repair.

Actual visible messages, not a scripted dialogue. The repair approval is the owner’s recorded reply. Task prompts were prepared by the supervising assistant. The fresh model did not receive the creator oracle. Its MCP calls were blocked; it diagnosed supplied files. The supervising assistant separately read the Analyser and created the exports through its local action API. Hosted model inference; no local-only inference claim. CLI default model/effort were not captured, so no model-level or token-savings claim is made. Later independent review tightened the recovery assertion gate; preserved original session messages below predate that fix.

Messages are rendered for readability; the verbatim record is in conversation.json. Task prompts are preserved verbatim, including typing errors.

diagnosis · task

You are reviewing an unfamiliar synthetic support application. You did not author it. Read SUPPORT-TICKET.md, inspect supplied src/, generated/ and evidence/ as needed. Use the supplied analyser MCP tools to examine the genuine recorded facts in the currently loaded isolated Analyser support bundle; count and quote relevant record indexes and values. Diagnose the observed mismatch, explain its path through the graph, and propose the smallest source correction plus regression checks. DO NOT EDIT application code, regenerate or rerun captures yet: the owner must see and approve the concrete proposed repair first. End with a concise approval request. Do not read outside this workspace, other project sources, previous sessions or creator materials. The MCP tool response may include paths; these are context only, not permission to explore outside this workspace. No web, secret access, dependencies, subagents or hosted compilation. Distinguish observations from source-based inference and do not invent a human conversation or approval. The prepared fixture is synthetic; do not call it a real customer incident. Keep all original evidence unchanged.

diagnosis · assistant

I’ll read the ticket and supplied files, then use the analyser tools to trace the recorded mismatch. I’ll keep the evidence unchanged and propose a concrete repair for approval before any edits or reruns.

diagnosis · assistant

The supplied source calculates shipping from the subtotal before discount. That explains how £94.50 of discounted merchandise could receive free shipping. The analyser context call was blocked by the tool approval policy; I’ll check whether record reads are also blocked and verify the generated graph separately.

diagnosis · assistant

The source defect is in Shipping.java: free shipping is tested against merchandise before discount. The requirement uses discounted merchandise.

The Analyser investigation is blocked: context, aggregate and read calls all returned "MCP tool call requires approval, but approval policy is never". I therefore cannot claim MCP-verified counts, record indexes or bundle identity. The following observations come from the supplied events.yaml, using zero-based file-order indexes.

I counted 13 records: five orders, four configuration updates and four lifecycle records. The five order records each contain one recorder invocation, with cumulative counts 1–5.

IndexRecorded values
2baseline: discountedPence: 10500, shippingPence: 0, totalPence: 10500, RELEASED
3policy update: discountPercent: 10, creditLimit: 9700; only policy logged
4discounted-order: subtotalPence: 10500, discountedPence: 9450, shippingPence: 0, totalPence: 9450, creditApproved: true, RELEASED, recorder count: 2
5below-threshold: discountedPence: 8100, shippingPence: 500, totalPence: 8600, RELEASED
7stock-unavailable: stockAvailable: false, creditApproved: true, REJECTED_STOCK
10recovered: discountedPence: 10500, shippingPence: 0, totalPence: 10500, RELEASED, recorder count: 5

Updates at indexes 6, 8 and 9 log only inventory or policy changes; none logs a publication.

The source and generated graph explain the mismatch through:

Order → input → subtotal → discount → shipping → total → creditCheck → releaseDecision → recorder

There is also a direct discount → total edge and a stock branch, input → stockCheck → releaseDecision. Generated dispatch calculates discount before shipping, then total and credit. This supports a wrong-value diagnosis rather than a scheduling diagnosis: shipping reads discount.subtotal.amount, despite depending on the discount node.

For index 4, the required calculation is 10500 − 1050 = 9450, then 500 shipping, producing 9950 > 9700, hence REJECTED_CREDIT. CreditCheck’s inclusive comparison is correct; the total supplied to it is too low. This is source-based inference consistent with the supplied capture, not proof of what the inaccessible Analyser bundle contains.

The smallest proposed source correction is:

- amount=discount.subtotal.amount>=10000?0:500;
+ amount=discount.amount>=10000?0:500;

After approval, regression checks should cover:

  • The original sequence: only discounted-order changes to shipping 500, total 9950, REJECTED_CREDIT; five publications remain.
  • Discounted merchandise of 9999, 10000 and 10001 pence: shipping 500, 0, 0.
  • Fractional-penny discount truncation, such as 10% of 10001: discounted amount 9001.
  • Credit equality accepted and one penny over rejected, including shipping.
  • Both checks failing produces REJECTED_STOCK; every rejection still publishes once.
  • Updates publish nothing or re-evaluate nothing; subsequent orders use updated state. Repeated orders do not decrement stock.

No files were changed, compilation or capture was run, or evidence regenerated.

Do you approve this one-expression repair and the proposed regression checks?

approval · human

{ "recordedAtUtc": "2026-11-01T16:10:16.550791+00:00", "source": "Owner reply in the live Codex conversation", "question": "Approve changing Shipping.java free-shipping comparison to the discounted amount and adding boundary/update regression tests?", "answer": "Approve the repair and tests", "scope": "Synthetic maintenance demonstration only; no production application changes" }

repair · task

The owner has now explicitly replied: "Approve the repair and tests" to the proposal to change Shipping.java to compare discounted merchandise against the free-shipping threshold, and to add boundary/update regression tests. This is actual owner approval recorded by the supervising session, not a simulated dialogue. Apply only that one-expression repair, regenerate the processor locally with the supplied helper, and run the original capture plus your proposed regression checks. Baseline src/generated/evidence are preserved in original/; do not modify them. Keep a standalone regression runner under checks/ (not src/, to avoid helper generation including its own generated-class dependency). Check expected numeric facts and decision/publication counts, including the 9999/10000/10001 shipping boundary, rounding, credit equality/one-over, both-fail precedence, updates not publishing, and repeated orders not consuming snapshot stock. Prove a relevant regression fails against the original source/generated processor in a separate build directory and passes after the repair. Save machine-readable and readable receipts with actual command outputs. Do not silently accept unexpected failures. No further functionality extension is approved in this turn. No network services, secrets, package installs, repository source outside this workspace, web or subagents. The helper is authorized to read its prepared cached compiler classpath and reviewed runtime. Do not read creator materials or other sessions. The supervising LLM independently queried the isolated Analyser's record4 and confirmed the recorded shipping0,total9450,credit9700,RELEASED; your original MCP calls were blocked and must remain disclosed. Use local source/audit and tests for this repair; do not claim you successfully used the MCP tools. End with exact files changed, tests and limits.

repair · assistant

I’ll apply the approved expression change, regenerate locally, and add a standalone runner under checks/. I’ll test the original processor in a separate build directory to demonstrate the regression, then save command outputs and results for the repaired build.

repair · assistant

The first compile found a checked exception missing from the new regression runner’s setup. I’ve retained that failure output and will correct the runner before continuing. The application change remains the single approved expression.

repair · assistant

Applied the one-expression repair: shipping now compares discount.amount >= 10000.

  • Regenerated locally; generated Java and GraphML remained byte-identical.
  • Original source/processor failed the regression as expected: shipping: expected=500 actual=0.
  • Repaired runner passed 85 assertions across 15 orders and 10 updates, covering all requested cases.
  • Original capture passed: discounted-order now totals 9950, returns REJECTED_CREDIT, and five orders produce five publications.
  • All original/ hashes remain unchanged.

Changed files: src/demo/fulfilment/Shipping.java, evidence/events.yaml, evidence/observed.csv.

Added: checks/Regression.java, checks/run.py, and checks/receipts/{capture,generate,initial-runner-compile-failure,original-compile,original-regression,repaired-regression-compile,repaired-regression}.log, plus results.json and results.txt. Build artifacts are under build/.

Limits: verification used local source, audit and runtime tests. My Analyser MCP calls remained blocked. The runner’s initial compile error was corrected and its output retained.

extension · task

The owner has now asked us to complete the maintenance example and review it locally. Their original requested extension was "a new node halfway down a graph a new event and handler on an existing node". Implement the following assistant-proposed concrete extension as a LOCAL CANDIDATE, not as an exact business rule the owner dictated: a configurable per-order handling charge, default0p. Add HandlingCharge after Discount in the computation graph and before Total; Total must include discounted merchandise + shipping + handling, using checked arithmetic. The free-shipping threshold stays based only on discounted merchandise. Add HandlingFeeUpdate event (nonnegative integer pence, validate) and a new non-propagating handler on existing Policy so a fee update changes only subsequent orders and publishes nothing/re-evaluates nothing. This produces12processing nodes and4business event types if implemented as described. Preserve original/ and repaired/ byte-for-byte (repaired/ contains approved repair and its receipts). Do not overwrite original repair receipts in checks/receipts: use checks/extension-receipts. Regenerate locally and add an ExtensionCheck with genuine fresh audit and observations under extension-evidence/. Test default0 preserves corrected existing results; positive charge crosses credit limit; total exactlyatcredit accepted; charge doesnot affect free-shipping threshold; updateleavespreviouscalculatedvalues/publicationcountunchanged; stock-priority still holds; fee reset recovers; negativefee refused; overflow refuses without publishing, followed by valid recovery only if supported—report accurately if it doesn't recover. Retain all failure logs. Also independently supplied extra repair regression is available under <local-file> only if needed; do not readotherprojectsource or creatororacle. No web,secrets,downloads,hosted generation or subagents. MCP bridge calls wereblocked in diagnosis; use local source/runtime for implementation and don't invent successfulMCPcalls. Record exactcommands and observedcounts. Do not claim human approval of the specific handling-charge rule; human approvedrepair and requestedthis general structural extension. A local website review ispending.

extension · assistant

I’ll implement the handling charge as a local candidate, preserving original/, repaired/, and the repair receipts. I’ll add separate extension checks and fresh evidence, including an explicit check of whether the processor recovers after arithmetic overflow.

extension · assistant

The extension checks passed, including recovery after overflow: the overflowing order published nothing; resetting the fee allowed the next order to publish once. The corrected behavior with a zero fee also passed all 85 existing assertions. I’ll now record the fresh audit counts and verify the preserved files and exact change list.

extension · assistant

Implemented the handling charge as a local candidate, not an owner-specified business rule.

The regenerated graph has 12 processing nodes and 4 business event types. Handling defaults to 0p; Total uses checked arithmetic; shipping still depends only on discounted merchandise.

Validation passed:

  • Existing regression: 85 assertions.
  • Extension checks: 80 assertions.
  • Fresh audit: 23 records, including 9 order attempts, 10 updates and 8 publications.
  • All five fee updates invoked only Policy.
  • Overflow threw without publishing; fee reset and the next valid order recovered on the same processor.

Changed: Policy.java, Total.java, GenerateApplication.java, and both generated processor files. Added: HandlingCharge.java, HandlingFeeUpdate.java, checks/ExtensionCheck.java, checks/run-extension.py, extension receipts and fresh extension-evidence/.

original/, repaired/ and checks/receipts/ remain byte-for-byte unchanged.

Exact commands, outputs and counts are in results.txt and results.json.

Limits: local runtime verification only; no successful MCP calls. Local website review remains pending.