This is a sample. Every name and number below is fictional — the traffic comes from a synthetic accounts-payable system driven by a scripted agent, not from any customer. It exists to show the exact document a pilot produces: this page is the unedited output of the open-source generator (python -m stonefold_report.sample in the stonefold repo), and regenerating it yields this file. How advisory mode works →
Stonefold

Advisory Report

Agent ap-desk
Window 2026-07-27 — 2026-08-07
Mode: advisory throughout

Across 9 days with traffic, the record shows 45 actions by this agent; 93.3% could be judged by the policy; it would have refused 6 and asked a person 11 times (4 distinct questions). Nothing is recommended for enforcement until the review in §4 comes back.

Nothing in this window was prevented. The gateway decided every action and acted on none of them; every number below is what a policy would have done, not what it stopped.
45actions observed
93.3%of them judgeable by policy
6would have been refused
4distinct questions for a person

1 · What we could see

judged: 42 (93.3%)42 · 93%not judged: 3 (6.7%)3
judgednot judged (hatched)
Why an action could not be judgedActions
action not declared in the registry3

Enforcement over the judged share is a control with exactly this hole in it — worth deciding about deliberately, not discovering later.

2026-07-27: 607-272026-07-28: 1607-282026-07-29: 207-292026-07-30: 407-302026-07-31: 407-312026-08-01: 008-012026-08-02: 008-022026-08-03: 008-032026-08-04: 208-042026-08-05: 408-052026-08-06: 408-062026-08-07: 308-07
Actions per day, empty days and tinted weekends included · traffic on 9 of 12 days · busiest 2026-07-28 (16)

2 · What the policy would have done

a required pre-check did not passa required pre-check did not pass: 99over the declared value limitover the declared value limit: 66requires a named approverrequires a named approver: 22
would refusewould ask a human
RuleMeaningActionsCount
gate:preconditiona required pre-check did not passpay9
gate:valueLimitover the declared value limitpay6
gate:requireApprovalrequires a named approverupdateBankAccount2

Of 42 judged actions: 25 would have been allowed, 6 refused, 11 sent to a person.

26 landed

These are the settle reports — what actually happened to the effects that went through. Only actions with an external effect report one, so reads and record changes do not appear in this count; and because nothing was enforced, effects the policy would have refused or held ran and settled with the rest.

3 · What it would have cost in attention

4questions a person would face
11times they would have been asked

The busiest question — Invoice.pay (NO_MATCHING_PO) — accounts for 7 of those asks on its own.

The first number is the staffing one. A repeatable check asked twenty times is one queue item; an approval is a separate decision each time, because two payments are two payments.

4 · What the policy would have got wrong

Not reviewed. Whether a refusal was right is a question about your work, not our records. Until the worksheet below comes back, this report states no false-positive rate — not a rate of zero.

How to complete this: print this page and tick one box per line, or return the rulings in writing keyed as gate:valueLimit @ Invoice.pay. “Ordinary work” means the policy would have stopped something that should have happened.

Would have refusedMeaningCountOrdinary workCorrectly refusedUnsure
gate:valueLimit
Invoice.pay
over the declared value limit6

5 · What the agent could reach

Some rules judge not whether an action may run but how much a read returns — which rows of a table the agent gets to see. This section measures that narrowing: what the agent received, against what a scoped policy would have let it receive.

scope would have shown: 1120 (66.7%)1120 · 67%scope would have withheld: 560 (33.3%)560 · 33%
would have shownwould have withheld (hatched)

Across 14 scoped reads the agent received 1680 row-results; scope would have withheld 560. Row-results, not distinct rows — this report keeps no row values to tell them apart, deliberately. The widest single read (Invoice.read) alone would have lost 40.

The rows it read are not rows it misused. What was done with them is not in our records.

6 · What your own systems already catch

Not joined. This needs your systems' outcomes for the same actions. Without it, every count in §2 is an upper bound on what this policy adds — some of it your own controls would have refused anyway, and this report cannot say how much.

7 · Disclosures

8 · What this measurement cannot tell you

These numbers describe what your agents attempted while nothing stopped them. Under enforcement each agent would have seen the gateway's answer and done something else next — retried differently, asked a person, given up. The counts are the truth about this window, not a simulation of an enforced one, and the direction of the difference is not knowable in advance.

This window is also just this window — one month-end, one set of holidays — and it measures the policy we wrote together, not the product in general.

9 · What we would turn on first

  1. Nothing is ready to enforce yet — not because the rules failed, but because §4's review has not happened. A rule with catches and no verdicts is a rule whose false positives have not been looked for. Completing the worksheet is the single step that unlocks this section.
  2. The approval load is measured: 4 questions over the window (§3). Whether the role that would answer them can absorb that is a staffing judgment this report informs but cannot make — the role is named in the policy beside this report.
  3. Coverage work before or alongside any of it: action not declared in the registry (3). Turning enforcement on beside an unjudged path moves the traffic, not the risk.
  4. Advisory continues to run through any of these steps — every change can be measured against live traffic the same way this report was.
Appendix — where each number comes from
FigureAudit query
Actions observedcount(*) where agent = <agent>
Judged / not judgedcount(*) group by coverage
Cause of unjudgedcoverage='unjudged' group by rule / advised.rule
Would have refusedcoverage='judged' and advised.decision='deny'
Would have asked a humancoverage='judged' and advised.decision='hold'
Distinct questionscount(distinct advised.dedupeKey) over the holds above
Batches refused wholedistinct (correlationId, batchAdvice.failingIndex)
Items refusedsum(itemAdvice.wouldRefuse)
Rows read / narrowedsum(scopeWouldRemove.returned / .removed) where measured
Kill ordersrule like 'kill:%'
Kill store unreachablerule = 'kill-unavailable'

Every figure is reproducible from your own audit export with these queries. A report you cannot check is a brochure.