Specimen — not a review of anyone’s system

This document is an example of the format. The system examined is a sandbox automation written and owned by us, populated with invented customer records, built so that the checks below could be run against something real. No organisation named in it is a client. Nothing in it has been relied upon by anybody. A review issued for an actual engagement carries a named addressee and does not carry this notice.

Written review of an existing automation

Engagement NF-WR-2026-0001 · 2026-08-11 · Noorflows LLC

Addressee and subject matter

AddresseeSpecimen — no addressee
System examined“Reply Desk” — an inbound customer-email automation for a small online shop
Source examinedOne file, 102 lines, plus a store of 4 customer order records
What it doesReceives a customer email, finds the order, asks a language model to draft a reply and decide whether to refund, takes small refunds automatically, sends the reply, writes one line to a log
Messages put through it5 (4 ordinary, 1 with the mail provider failing)
Run on2026-08-11

What this document is, and what it is not

A written review says what we would do about a system and what it would cost. It states findings and it makes recommendations. That is the whole of it.

It is not an audit and expresses no assurance. We are not accountants and this is not assurance work. Where a finding rests on something we could not see, that is said in the finding rather than left for the reader to guess.

Two substitutions, both stated so no finding is read as more than it is.

Outbound calls were intercepted and recorded rather than sent, so no email, refund or model request left the machine during this run. What is reported is the exact request the system built.

The language model was replaced by a scripted stand-in, so the run is repeatable and costs nothing. It reads the customer’s message and asks for a refund when the customer asks for money back, which is what the system’s own instruction tells a model to do. Because that decision is what triggers a refund, the stand-in determines the counts in checks 1, 2 and 3 — how many refunds ran, and for how much. It does not determine the findings. That nobody checks who is writing, that no person approves a refund, that a failed reply is neither retried nor queued, and that a repeated message is handled twice, are all properties of the code, and they hold whatever a model returns.

Check 1 · Does it do what it is supposed to do

Four messages were put through the system. Two of them expose the same missing step.

 SenderOrder foundRecord belongs toSender owns itMoney moved
S1p.raman@​example-mail.test1042p.raman@​example-mail.testyes£84.00
S2whoever@​somewhere-else.test1042p.raman@​example-mail.testno£84.00
S3t.whelan@​example-mail.testnonenone
S4a.nkem@​example-mail.test1044a.nkem@​example-mail.testyesnone
Finding 1.1 — nobody checks that the person writing owns the order.

In S2 the message came from an address that appears nowhere in the shop’s records. The system found order 1042, placed that customer’s full record in front of the model, refunded £84.00 against it, and sent the reply to the address that wrote in. The order number is the only credential the system asks for, and order numbers are printed on every parcel, invoice and delivery note that leaves the building. Searching the source for a comparison between the sender and the order’s own email address returns nothing.

Finding 1.2 — a date at the front of the message defeats the order lookup.

S3 opens “On 04/08/2026 I placed order 1043”. The system takes the first run of four or more digits in the message, which is 2026. No order 2026 exists, so the customer is treated as having no order at all — while their real order number sits nine words later. The reply still goes out. The customer is answered by a system that never found their purchase, and nothing in the log distinguishes that case from a normal one.

S4 is included as a control. The refund ceiling does hold: an order of £312.00 was not refunded automatically. The ceiling works. The question the ceiling does not answer is who is allowed to trigger it, which is finding 1.1.

Check 2 · What happens when it breaks

The same run was repeated with the mail provider returning 502 Bad Gateway. Nothing else was changed.

reply delivered to customer : 0
refund taken anyway         : £47.25
log rows written            : 1
what the log says happened  : {"at":"2026-08-11T09:55:00Z","from":"m.kelsey@example-mail.test",
                               "order":1045,"action":"refund","refunded":47.25}
retried                     : no
queued for a person to see  : no
Finding 2.1 — when the mail fails, the money still moves and the customer is never told.

The refund was taken before the reply was attempted, so a failure at the last step leaves the shop out of pocket and the customer uninformed. There is no retry and no queue. The failure is caught, written to the console, and the run continues to a successful conclusion.

Finding 2.2 — the log records the failed message exactly as it records a successful one.

The single log line says the action was a refund and that £47.25 was refunded. Both are true. What it does not record is that the customer was never reached. Reading the log a week later, this message is indistinguishable from one that went perfectly. Whatever number the shop reports from that log will be wrong in the direction that flatters it.

Check 3 · What it decides on its own

Refunds executed2 of 4 messages
Of those, approved by a person0
Money moved with no human involved£168.00
Automatic ceiling in the code£200.00 per order
Approval step anywhere in the sourcenone
Finding 3.1 — refunds under £200 complete with nobody looking.

The decision is made by a language model reading a five-line instruction, and executed immediately. Nothing is held, nothing is queued, and no person sees the money leave. The ceiling limits the size of a single mistake. It does not limit how many of them happen in a day, because there is no daily total and no count.

Check 4 · What leaves the business, and who receives it

Destinationhttps://api.anthropic.com/v1/messages
Requests built in this run5, one per message
Customer fields inside the requestorder, customer name, email, phone, postal address, card_last4, order total, status, carrier scan time
First request body865 bytes
Payments destinationhttps://api.stripe.com/v1/refunds
Finding 4.1 — the whole customer record is sent, not the part needed to answer.

Every field held about the customer goes into the request, including their phone number, their home address and the last four digits of their card. The question being answered is “where is my parcel”. Nothing in the reply requires an address or a card. The record is sent whole because it is easier to send the whole thing than to choose.

This is not an accusation against the provider. It is a statement about what has left the building, which is the thing the shop is answerable for.

Check 5 · What it costs to run, and what happens at volume

Paid model calls per inbound message1.0
Cap or rate limit in the codenone
Duplicate-message guardnone
Finding 5.1 — cost rises in a straight line with inbound mail, and nothing stops it.

One paid call per message, with no ceiling on calls per hour or per day. A bad week, a mailing list that bounces into the support address, or one automated sender in a loop, all cost real money at the same rate as real customers. We are not quoting a monthly figure here because the model, the token counts and the provider’s price list are all things the shop can change, and a figure quoted without those is decoration.

Finding 5.2 — the same message delivered twice is handled twice.

Nothing records that a message has already been seen. Mail providers do redeliver. A redelivered refund request would produce a second refund on the same order, and the two log lines would look like two customers.

Check 6 · What you would own if we disappeared

SourceOne file, 102 lines, plain JavaScript, no framework
Automated testsnone found
Where the decision rules liveInside a prompt string, lines 44 to 48
Model named in the codeclaude-sonnet-4-5
Finding 6.1 — the business rules are five lines of English inside a text block.

The rule that decides whether money is returned to a customer is a sentence in a prompt. It is not written down anywhere else, it is not tested, and changing it requires editing the same file that talks to the payment provider. Anybody who can edit that file can change the refund rule without that being visible as a change to the refund rule.

The favourable half: it is one small file of ordinary JavaScript with no framework and no proprietary runtime. Whoever holds it can read it in an afternoon. The shop is not locked to a vendor. It is locked to one person’s memory of what the file does, which is a cheaper problem to fix.

Finding 6.2 — one model is named directly in the code.

Model names are retired on a published schedule and requests to a retired name simply fail. A name written into the source means the failure arrives as an outage on the provider’s date rather than as a change the shop chose to make.

Check 7 · What we would refuse to do

  1. We would not raise the automatic refund ceiling. The ceiling is the only thing currently limiting the cost of finding 1.1, and until a person is in the loop, raising it makes the same defect more expensive.
  2. We would not put the fix in the prompt. Whether an email is allowed to move money is not a matter of wording, and a rule written in English inside a text block cannot be tested. It goes in code with a test that has been watched failing.
  3. We would not touch the payment provider integration in the same change as the reply logic. They fail differently and they should be changed separately.
  4. We would not add a dashboard. Nothing here is caused by a lack of charts, and a dashboard over an unreliable log makes the wrong number easier to believe.

Check 8 · What we would do, in what order, and what it would cost

Prices are our published figures in US dollars. The order is deliberate: everything that stops money moving wrongly comes before anything that improves the answers.

 WhatWhy it is in this positionPrice
1Check the sender owns the order before anything else runsCloses finding 1.1. Until this is in, every other improvement makes a system that serves strangers faster.included below
2Put a person in front of every refund; the system proposes, a human approvesCloses finding 3.1 and makes 2.1 survivable. The refund stops being a thing the model does and becomes a thing a person does on the model’s advice.included below
3Retry the reply, and put anything that still fails where a person will see itCloses 2.1 and 2.2. A failure has to be visible or it is not a failure, it is a silence.included below
4Send the model only the fields the answer needs; stop sending address, phone and card digitsCloses 4.1. Cheapest item on the list and the one with the largest consequence if it is ever asked about.included below
5Record every message once, and refuse the second copyCloses 5.2.included below
 All five, delivered as one working system with a runbookThis is our first-build engagement.$5,400
6Fix the order lookup so a date cannot be read as an order numberCloses 1.2. Small, and it is inside the same file as items 1 to 5, so it comes with them.included above
7Keep it running afterwards and change it as the shop changesOptional and not required for anything above to work.from $549 / month

If the shop chooses to do none of this, the single change we would still urge, because it can be made in one line and prevents the worst outcome on this list, is item 1.

Exclusions — what was not examined

  1. The shop’s own systems upstream of this automation — the mailbox it reads from, the store, and the payment account — were not examined. Nothing here states that they are sound.
  2. No request was actually sent to the model provider, the mail provider or the payment provider. Findings about what leaves the business describe the request the system built, not a response any provider gave.
  3. The language model’s own behaviour was not assessed. A scripted stand-in was used. Nothing here states how good or bad the drafted replies would be.
  4. Cost is stated as calls per message, not as money. No monthly figure is given.
  5. Nothing was fixed. This review changes no code.

Method, and one correction made during the review

The checks are a script that puts messages through the system with its outbound calls recorded, and reads the system’s own source for the presence or absence of specific mechanisms. It is run from a single command and produces the figures quoted above.

A check in this review reported something that was not true, and was corrected before this document was written.

The first run reported that the system had a duplicate-message guard. It has none. The check searched the whole file for a small set of words, and matched the word “seen” inside a comment. A search that reads comments is measuring the author’s English rather than the running system. Comments are now removed before any search, and the number of lines removed is printed on each run so that the removal can be seen to have happened. Finding 5.2 is the corrected result.

It is recorded here because a review that never reports being wrong is not describing how the work is done.

Who may rely on this review

Nobody. It is a specimen, produced against a sandbox we built ourselves, and no engagement stands behind it. A review issued for a real engagement names its addressee here and restricts reliance to that addressee and to anyone they nominate in writing.

Independence

We wrote the system examined in this document. For a specimen that is unavoidable — there was no client system to look at — and it is stated here rather than left to be discovered.

In an engagement we do not review a system we built. Where a client asks us to look at our own work, that is a different piece of work with a different name, and it is charged and described differently.

No fee depends on what a review finds.

The checks described above were run by me and the findings stated are the ones they produced.

[Name withheld]
Engagement lead, Noorflows LLC · 2026-08-11

Our terms state that every report carries the name of the person who signed it. It is withheld here because this is a specimen with no addressee and no engagement behind it, and for that reason this copy is not a signed deliverable. A review issued for a real engagement is signed and named.