<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://rotascale.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rotascale.com/" rel="alternate" type="text/html" /><updated>2026-08-19T22:28:07+05:30</updated><id>https://rotascale.com/feed.xml</id><title type="html">Rotascale</title><subtitle>Agent governance. State what an agent may do before it acts, refuse what exceeds it, and prove afterwards what was decided — in your own environment.</subtitle><author><name>Rotascale</name></author><entry><title type="html">The Check Passes. We Still Do Not Believe It.</title><link href="https://rotascale.com/blog/the-check-passes-we-still-do-not-believe-it/" rel="alternate" type="text/html" title="The Check Passes. We Still Do Not Believe It." /><published>2026-08-17T00:00:00+05:30</published><updated>2026-08-17T00:00:00+05:30</updated><id>https://rotascale.com/blog/the-check-passes-we-still-do-not-believe-it</id><content type="html" xml:base="https://rotascale.com/blog/the-check-passes-we-still-do-not-believe-it/"><![CDATA[<p><strong>TL;DR:</strong> Most personal data scanners return a boolean. That works while every identifier has a published checksum, and stops working the moment one does not. Two of the identifiers a UK firm asks about most cannot be checked arithmetically at all, so our results carry a confidence rather than a yes: <strong>observed</strong> when a citable algorithm agreed, <strong>asserted</strong> when only the shape did. The uncomfortable case is the one where the check runs, passes, and we still report asserted.</p>

<h2 id="four-numbers-four-different-amounts-of-certainty">Four numbers, four different amounts of certainty</h2>

<p>Building the UK profile put four identifiers side by side, and they turn out to sit at four different distances from the truth.</p>

<p>An <strong>NHS number</strong> is ten digits with a modulus 11 check digit, specified by NHS Digital in a published standard. Run the weights, compare, done. If it matches, arithmetic said so and anyone can check our working.</p>

<p>A <strong>sort code and account number</strong> can be modulus checked against the published weight table that the payments industry maintains. Same story.</p>

<p>A <strong>National Insurance number</strong> has no check digit. None. What makes <code class="language-plaintext highlighter-rouge">QQ123456C</code> invalid is not arithmetic but convention: which letters may open it, which pairs are never issued, and that the final letter must be A, B, C or D. Every one of those is a rule about shape.</p>

<p>A <strong>Unique Taxpayer Reference</strong> is the interesting one, and it is where the design decision actually lives.</p>

<h2 id="the-check-that-runs-and-proves-nothing">The check that runs and proves nothing</h2>

<p>A UTR has ten digits and a modulus 11 check digit. The weights are 6, 7, 8, 9, 10, 5, 4, 3, 2, applied to the last nine and compared against the first.</p>

<p>Those weights are correct. Every major UK accounting package implements them. They hold against real UTRs. We run them.</p>

<p>HMRC has never published them.</p>

<p>So when the check passes, what do we actually know? That the number is consistent with an algorithm nobody at HMRC has committed to. That is genuinely useful: it removes roughly ten in eleven of the random ten-digit strings that would otherwise be reported as a taxpayer reference, which is a large reduction in noise. It is not the same as establishing a fact, and a compliance officer reading a scan report has no way to tell the two apart unless the report tells them.</p>

<p>So the result says <strong>asserted</strong>, even when the check passes. The comment in the source says the quiet part:</p>

<blockquote>
  <p>ASSERTED even when the check PASSES, which looks wrong and is not. A check we cannot cite is a check that reduces false positives without establishing anything. If HMRC ever publishes the algorithm, this becomes OBSERVED and the change is one word.</p>
</blockquote>

<p>That last sentence is the test of whether the distinction is real. If it were a hedge, publication would not change anything. It is a claim about provenance, so it does.</p>

<h2 id="the-same-decision-in-the-gulf">The same decision, in the Gulf</h2>

<p>The Emirates ID took the identical shape and we made the identical call.</p>

<p>The number is <code class="language-plaintext highlighter-rouge">784-YYYY-NNNNNNN-C</code>, and the check digit is widely believed to be Luhn over the leading fourteen digits. The belief is well tested against real cards. There is no official specification, and published analyses disagree about whether the check covers the whole number or a truncated sequence.</p>

<p>What is actually doing the work here is not the checksum. It is the <code class="language-plaintext highlighter-rouge">784</code> prefix and a registration year that falls in a plausible range, both of which are structure. So the Emirates ID reports asserted, and a UAE IBAN sitting beside it in the same scan reports observed, because ISO 13616 mod-97 is a published standard.</p>

<p>A reader who sees both in one result learns exactly how much arithmetic stood behind each. A reader who sees two green ticks learns nothing.</p>

<h2 id="a-collision-we-did-not-expect">A collision we did not expect</h2>

<p>Putting UTR and NHS number in the same profile created something new. Both are ten bare digits. Both use modulus 11. They are the first pair in the product to share a pattern and a jurisdiction, which means every ten-digit number in a UK document is tested against both.</p>

<p>We measured the overlap rather than reasoning about it. Over 200,000 random ten-digit strings, each check passes about 9 percent of the time, and <strong>0.82 percent satisfy both</strong>. Roughly one ten-digit number in 122 looks simultaneously like a valid taxpayer reference and a valid NHS number.</p>

<p>This is not a bug, and there is no arithmetic that resolves it. A bare ten-digit number genuinely is ambiguous, and the honest behaviour is to report both candidates and let context decide, rather than pick one and sound confident. It matters because the two carry different obligations: an NHS number is UK GDPR Article 9 special category data, and a UTR is not.</p>

<p>We found this by listing every family’s pattern and grouping them, not by thinking hard. Worth doing whenever a profile gains a member.</p>

<h2 id="then-the-grid-found-twenty-one-things-we-had-missed">Then the grid found twenty-one things we had missed</h2>

<p>All of the above was covered by unit tests, and the unit tests were green. So was the rest of the suite, all 1,567 of them.</p>

<p>We then ran the adversarial grid, which crosses every identifier against every mutation an attacker or an ordinary document might apply, and it returned <strong>21 defect cells</strong>: 14 in the UK profile, 7 in the UAE one, against zero for the mature EU profile. That comparison is what made the number obviously wrong rather than merely a number.</p>

<p>Two of the three causes were not attacks at all. They were ordinary printed forms.</p>

<p><strong><code class="language-plaintext highlighter-rouge">ab123456c</code>.</strong> The NINO pattern required uppercase letters. That is how the number appears on a card and not how a person types it into a form.</p>

<p><strong><code class="language-plaintext highlighter-rouge">00-00-0019740417</code>.</strong> The sort code and account pattern required a separator between the two. That is how they appear on a statement and not how they appear in a bank file, where they run together.</p>

<p>Both were fixed by loosening a quantifier. Neither was findable by a test that called the verifier function directly with a well-formed string, because the defect was never in the verifier. It was in what reached it.</p>

<h2 id="what-we-changed-about-how-we-work">What we changed about how we work</h2>

<p>A feature is not finished when its own tests pass. It is finished when we have asked what its arrival changed about everything already there. Concretely, after this we now check four things before calling a profile done:</p>

<p><strong>Run the adversarial harness, and compare against something mature.</strong> An absolute defect count means little. EU at zero next to UK at fourteen means a great deal.</p>

<p><strong>Look for what the new thing silently shrinks.</strong> Six new identifier packs shipped with no red-team seed, so all six landed in the untested list and the grid said nothing about them at all. The code was honest about this and the effect was still a denominator quietly getting smaller. Seeds now ship with packs.</p>

<p><strong>Check for collisions with what already exists.</strong> That is how the UTR and NHS overlap surfaced.</p>

<p><strong>Re-run everything generated.</strong> A build script with a hand-maintained lookup and a silent fallback produced a table row pointing at the wrong page, and nothing complained. It derives the mapping now.</p>

<p>Unit tests check the thing you thought of. The harnesses check the thing you did not.</p>

<h2 id="why-any-of-this-belongs-in-a-governance-product">Why any of this belongs in a governance product</h2>

<p>Because the alternative is a number that cannot be acted on.</p>

<p>A scan that reports “47 National Insurance numbers found” invites a response proportional to certainty that does not exist. A scan that reports 47 asserted and 12 observed lets somebody decide where to spend the afternoon, and lets them say, in front of a supervisor, what stood behind each figure.</p>

<p>The <a href="/regions/united-kingdom/">UK profile</a> and the <a href="/regions/united-arab-emirates/">UAE profile</a> both ship this way, and both say in the product what they cannot see: names, addresses and dates of birth carry no checksum, so a clean scan never means no personal data.</p>]]></content><author><name>Rotascale Team</name></author><category term="Engineering" /><category term="Governance" /><category term="Compliance" /><summary type="html"><![CDATA[A National Insurance number has no check digit. HMRC has never published the one for a UTR. Building the UK detection profile meant deciding what a scanner may claim when the arithmetic runs out, and saying it in the result.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Regulator Wrote Down What an Agent Is</title><link href="https://rotascale.com/blog/a-regulator-wrote-down-what-an-agent-is/" rel="alternate" type="text/html" title="A Regulator Wrote Down What an Agent Is" /><published>2026-08-17T00:00:00+05:30</published><updated>2026-08-17T00:00:00+05:30</updated><id>https://rotascale.com/blog/a-regulator-wrote-down-what-an-agent-is</id><content type="html" xml:base="https://rotascale.com/blog/a-regulator-wrote-down-what-an-agent-is/"><![CDATA[<p><strong>TL;DR:</strong> Most AI regulation is written for systems in general and has agents fitted to it afterwards. The DIFC’s Regulation 10 was written for autonomous systems specifically, and it says something the others do not: a system acting under its deployer’s authority is like an employee, and the deployer is responsible for keeping it inside limits a human established. That sentence is a specification, and almost nothing in production today can satisfy it.</p>

<h2 id="the-sentence">The sentence</h2>

<p>Regulation 10 has been in force in the Dubai International Financial Centre since January 2026. It governs personal data processed through autonomous and semi-autonomous systems, and clause 10.3.4 says this:</p>

<blockquote>
  <p>Its position is substantially similar to that of an employee within the Deployer organisation, and the Deployer should therefore be liable for its actions in the same way it may be liable for an employee’s actions. As a corollary to that, the Deployer will be responsible for ensuring that, when processing Personal Data, the System always operates within the appropriate human-established limits and on the basis of human-established principles, much in the same way the Deployer would train and require its employees to process Personal Data on its behalf only in accordance with its privacy policies.</p>
</blockquote>

<p>Read that as an engineer rather than a lawyer. It contains a claim about liability, which is familiar, and a requirement about runtime, which is not.</p>

<p><strong>Always operates within human-established limits.</strong> Not “has a policy describing its limits”. Not “was evaluated against its limits before deployment”. Always operates within them, as a property of every action, on a Tuesday afternoon when nobody is watching.</p>

<h2 id="why-that-is-harder-than-it-sounds">Why that is harder than it sounds</h2>

<p>The employee analogy is doing more work than it appears to.</p>

<p>An employee who exceeds their authority can be asked afterwards what they did and why. There is a person to ask, a record they left, and an approval chain that either existed or did not. When a bank cannot answer those questions about an employee, that is a control failure with a name and a remedy.</p>

<p>An agent that exceeds its authority usually leaves none of that. The logs record what succeeded. The prompt that shaped the decision is gone. The scope it operated under was a configuration value that has since changed. And the question a supervisor actually asks, which is <em>under whose authority did this run</em>, has no field to read it from.</p>

<p>That is not a gap in anyone’s diligence. It is a gap in what the systems were built to record.</p>

<h2 id="the-second-clause-which-is-the-one-nobody-expects">The second clause, which is the one nobody expects</h2>

<p>Regulation 10.2.2(b) divides purposes into two kinds. Human-defined purposes are externally pre-defined and, in the regulation’s own phrase, “hard coded” into the system, which the system cannot change. Self-defined purposes are ones the system can generate itself, and where a system can do that, the regulation requires the generation to happen only within an exhaustive set of principles that humans defined, hard coded, and the system cannot alter.</p>

<p>An agent may not decide what it is for.</p>

<p>This is a striking thing for a data protection regulator to write, and it lands directly on the way most agent frameworks are built. A tool-using agent with an open-ended objective is, in Regulation 10’s vocabulary, generating its own purposes. The regulation does not forbid that. It requires the generation to sit inside a boundary the system cannot widen.</p>

<p>A grant is that boundary. It enumerates what an agent may do, it is issued by a named human, and an action outside it is refused before it runs rather than reported after. Delegation attenuates: a sub-agent receives some subset of its parent’s authority and can never acquire more, so a purpose the parent never held is not reachable from below.</p>

<h2 id="what-the-regulation-asks-you-to-produce">What the regulation asks you to produce</h2>

<p>Four things, none of which is a document you write once:</p>

<p><strong>A register of AI processing activities.</strong> An inventory of what is running, what it does, and what it touches. Most estates cannot produce this on demand because nothing has been keeping it.</p>

<p><strong>Notice that gives the subject something to act on.</strong> Regulation 10.2.2(a) is unusually specific: individuals must be given enough detail to assess the risk and decide whether to object or to withdraw the basis for the processing. It gives force to a provision of the DIFC’s data protection law about advanced technology that does not permit rights such as erasure to be exercised, which is a problem worth taking seriously rather than a formality.</p>

<p><strong>Allocation between the parties.</strong> A Deployer carries controller responsibilities. An Operator, the service provider running the system on the deployer’s behalf, carries processor responsibilities. Both must be identifiable per action, not per contract.</p>

<p><strong>Certification, when it exists.</strong> Regulation 10.3.3 states the intent that no system may be used for High Risk Processing Activities until the Commissioner has promulgated the certification requirements. That framework was still to come when the guidance was published, which means this is a gate on operating rather than a control you can implement.</p>

<h2 id="the-honest-part">The honest part</h2>

<p>We have mapped Regulation 10 clause by clause, and two of the nine clauses are not ours to answer. The certification requirements under 10.2.2(c) and 10.3.3 are between a deployer and the Commissioner. No platform can evidence a certification it does not hold on your behalf, and any vendor telling you otherwise is selling you a gap.</p>

<p>That makes it the first instrument we have mapped where the “yours” column is not zero, and we think that is the honest shape of a regulation which gates your ability to operate rather than describing a control you can install.</p>

<p>The fairness principle under 10.3.1 is also yours. The DIFC enumerates no protected characteristics for outcome testing, so the objective and its justification belong to the firm, exactly as MAS FEAT does in Singapore and for the same reason.</p>

<h2 id="why-this-matters-outside-the-difc">Why this matters outside the DIFC</h2>

<p>Two reasons.</p>

<p>The first is timing. The UAE’s federal data protection law carries a compliance deadline of 1 January 2027, and Regulation 10 is already live in the free zone. Firms operating there are inside the window now.</p>

<p>The second is that Regulation 10 is the clearest published statement we have seen of what agent governance has to mean operationally. Other regimes will arrive at similar requirements by other routes, and several are already circling the same idea: the EU AI Act’s human oversight obligations, the UK’s senior manager accountability, MAS’s expectation that a named individual carries responsibility personally. Regulation 10 is further along in saying what that implies for a system that acts on its own initiative.</p>

<p>If you want to know whether your estate could satisfy it, the test is short. Pick an agent that took an action last week. Name the human whose authority it acted under, produce the scope that authority carried at the moment it ran, and show the refusal it would have received had it exceeded that scope.</p>

<p>Most estates cannot do the first part.</p>

<p><a href="/solutions/difc-reg-10/">The clause map is published.</a> Nine clauses, seven we can evidence, two that are yours.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Regulatory" /><category term="Agentic AI" /><summary type="html"><![CDATA[DIFC Regulation 10 governs personal data processed through autonomous systems. It describes an agent as substantially similar to an employee, and requires its deployer to keep it inside human-established limits. That is a runtime property, not a policy.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">RotaGrant Is Live</title><link href="https://rotascale.com/blog/rotagrant-is-live/" rel="alternate" type="text/html" title="RotaGrant Is Live" /><published>2026-08-14T00:00:00+05:30</published><updated>2026-08-14T00:00:00+05:30</updated><id>https://rotascale.com/blog/rotagrant-is-live</id><content type="html" xml:base="https://rotascale.com/blog/rotagrant-is-live/"><![CDATA[<p><strong>TL;DR:</strong> RotaGrant is available today. It states what an agent may do before it acts, refuses what exceeds that, and records what was decided either way. It runs single-tenant in your environment and calls no model anywhere. There is a live deployment you can sign in to with a work address, and it is a real deployment rather than a recording.</p>

<h2 id="what-we-built">What we built</h2>

<p>Every post on this blog for the last two years has circled the same argument. Model evaluation tells you how a system scores on a benchmark. It does not constrain what an agent may <em>do</em> on a Tuesday afternoon with a payment API in reach. Those are different problems, and the second one has no product.</p>

<p>RotaGrant is the second one. Before a consequential action, the agent asks whether it is authorised. Nine gates evaluate in a fixed order (authority, status, window, scope, clean context, bounds, policy, budget, review) and return one of six outcomes. The answer arrives before the action, and the decision is recorded whether it was allowed or refused.</p>

<p>Three things follow from that shape, and they are the reasons it exists.</p>

<p><strong>Authority is a grant a named human signed for</strong>, with a scope, a limit and an expiry. Not a service account. When an auditor walks the chain up from an action, it terminates in a person.</p>

<p><strong>Delegation subdivides and never multiplies.</strong> A delegated grant cannot exceed its parent on any dimension, and the API refuses to issue one that does. Spend debits every ancestor, so the root’s ceiling is the whole tree’s ceiling.</p>

<p><strong>Refusals are first-class.</strong> An agent that was stopped is the evidence that the control operated, and it is the half that systems built to log successes do not have.</p>

<h2 id="what-it-does-not-do">What it does not do</h2>

<p>We would rather say this here than have you find it in a procurement call.</p>

<p>It does not evaluate models, score them, or make your agent correct. It inventories what is deployed because a regulator will ask, and stops there.</p>

<p>It does not make you compliant. It assembles evidence, maps it to clauses, computes what it can, and names what it could not find. Whether that satisfies your obligations is regulatory interpretation and it rests with you and your counsel. That disclaimer sits inside the signed payload of every pack, so removing it invalidates the signature.</p>

<p>It ships clause maps for four instruments: the EU AI Act, GDPR, SR 11-7 and the NIST AI RMF. DORA and ISO 42001 have numbered articles and are unmapped because we have not written them yet. MAS FEAT and the UK approach have nothing enumerable to map, which is a different reason, and each page says which of the two it is.</p>

<p>Rotascale holds no SOC 2 and no ISO 27001, and makes no HIPAA or FDA claim. What a certification would attest to is largely answered by the deployment model instead: the software runs in your environment and we hold none of your data.</p>

<h2 id="the-demo-is-a-running-deployment">The demo is a running deployment</h2>

<p>Not a video, not a sandbox with fixtures. A deployment on real infrastructure where agents run every day and produce real records, including the refusals.</p>

<p>Right now it holds a payment agent stopped at gate 8 because an <em>ancestor</em> grant was exhausted while its own allowance had room. A document analyst gated because it read an unverified upload and the grant required a clean context. A refund assistant running simultaneously at three rungs of the enforcement ladder, where the observe and canary copies refunded the same tickets the enforcing copy refused.</p>

<p>Access needs a work address and one click. The session is read-only: you can read everything and export any pack, and it cannot write because the role is absent from the platform’s write roles, not because the page is hiding buttons.</p>

<p>Three live bugs were found by taking the screenshots for this site as an ordinary visitor. That is the argument for a real demo, made against ourselves.</p>

<h2 id="enforcement-is-a-dial">Enforcement is a dial</h2>

<p>Nobody switches a production estate from nothing to blocking in one step, so the platform does not ask.</p>

<p><strong>Observe</strong> records what the check would have done and changes nothing. <strong>Shadow</strong> does the same with the full decision path exercised. Both are free, and both are genuinely useful on their own: a fortnight of observe against production tells you what your agents are actually doing, and that first week reliably contains a behaviour nobody knew about.</p>

<p><strong>Canary</strong> and <strong>enforce</strong> refuse. You move one grant at a time, when the team that owns it agrees.</p>

<p>The mode is sealed into every record at the moment of the decision, so a pack states what was enforcing <em>then</em>, not what is configured today. That distinction is what makes reconstruction possible eighteen months later.</p>

<h2 id="where-it-runs">Where it runs</h2>

<p>Single-tenant, in your environment: your cloud, your data centre, or airgapped. No payload reaches us on any code path, and the deployment refuses to start if any setting selects a service outside your network. It also tells you which evidence property you gave up by disconnecting it, rather than pretending nothing changed.</p>

<p>It calls no LLM anywhere. Not for summaries, not for classification. A test fails the build if a model provider appears in the dependency graph. In a category where every product is an AI product, we think that is the stronger claim.</p>

<p>Market profiles ship for the EU, US, Singapore and Australia. India is served by <a href="https://rotavision.com">Rotavision</a>, a separate company that encodes the Indian instruments properly.</p>

<h2 id="this-is-not-only-for-regulated-firms">This is not only for regulated firms</h2>

<p>The category is sold almost entirely to organisations with a supervisor, and that framing points it away from the teams with the largest agent estates. Platform and AI-native companies ship agents fastest, into the most accounts, with the widest reach, and no statute is coming for them soon.</p>

<p>Their obligation arrives through a customer’s security questionnaire instead, which in practice is sooner. And they can do something a bank cannot: put the record in their own product, so a per-tenant verifiable account of what their agent did becomes a feature rather than an archived artefact.</p>

<h2 id="what-happens-next">What happens next</h2>

<p>The specification is open and published, because an authority format that only one vendor can read is not an interface, it is a lock-in with a schema. Clause maps are YAML validated at load, so a regulatory analyst can author one without waiting for a release.</p>

<p>The honest state of the roadmap: DORA and ISO 42001 maps, a UK profile, and more sector scenarios in the demo so that every industry page can show a real record rather than three of them.</p>

<h2 id="start-where-it-costs-nothing">Start where it costs nothing</h2>

<p>Sign in to the demo with a work address and look at the refusals. They are the part that is hard to fake, and the part that shows what the product is for. Then bring the agent you are most nervous about, and we will put it behind a grant while you watch.</p>

<p>That is the whole offer. No pilot fee, no slide deck, and nothing we have said here that you cannot check.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Agentic AI" /><category term="Strategy" /><summary type="html"><![CDATA[The agent governance platform we have been writing about is running, and you can sign in to it. What it does, what it refuses to claim, and how to see it on your own problem.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Agent That Did the Right Thing Ten Thousand Times</title><link href="https://rotascale.com/blog/the-agent-that-did-the-right-thing-ten-thousand-times/" rel="alternate" type="text/html" title="The Agent That Did the Right Thing Ten Thousand Times" /><published>2026-07-28T00:00:00+05:30</published><updated>2026-07-28T00:00:00+05:30</updated><id>https://rotascale.com/blog/the-agent-that-did-the-right-thing-ten-thousand-times</id><content type="html" xml:base="https://rotascale.com/blog/the-agent-that-did-the-right-thing-ten-thousand-times/"><![CDATA[<p><strong>TL;DR:</strong> Most governance thinking assumes the failure is a wrong decision. In utilities the characteristic failure is a correct decision applied at the wrong scale, which no amount of model quality prevents. Blast radius needs its own control, checked before the action, separate from whether the action was permitted at all.</p>

<h2 id="two-different-questions">Two different questions</h2>

<p>Ask an engineer what could go wrong with an agent that adjusts setpoints and you will get answers about accuracy. It might misread the telemetry. It might act on stale data. It might have been trained on a period that does not resemble today’s grid.</p>

<p>All real. None of them is the failure that shows up in the incident reports.</p>

<p>A setpoint change is unremarkable. It happens constantly, it is exactly what the agent is for, and any individual instance of it would pass review. Ten thousand of them inside a minute is an event with a name.</p>

<p>The distinction worth building around is between two questions that sound similar and are not:</p>

<p><strong>Is this action permitted?</strong> A policy question. Answered by looking at the action and the authority.</p>

<p><strong>How much of this action may there be?</strong> A scale question. It cannot be answered by looking at the action, because every individual instance is fine.</p>

<p>Most systems only ask the first. The second usually lives in a rate limiter somewhere downstream, tuned by whoever was on call the last time something got noisy.</p>

<h2 id="why-the-rate-limiter-is-not-the-control">Why the rate limiter is not the control</h2>

<p>Rate limiting is a good operational tool and a poor governance one, for three reasons.</p>

<p>It is set on the wrong axis. A limiter caps requests per second against an endpoint. The thing you need to bound is the number of assets a single decision may affect, which is a property of the decision rather than of the traffic.</p>

<p>It is not attributable. When a limiter trips, the record says a service exceeded a threshold. It does not say which authority was being exercised, or by whom, or against what mandate. In an incident review that gap is the whole conversation.</p>

<p>And it is invisible to the agent. A limiter drops or delays; it does not tell the agent it has hit a bound, so the agent retries, which is the correct behaviour for congestion and exactly the wrong behaviour for a limit.</p>

<p>An agent that hits a governance bound needs to be told, in terms it can act on, that this is not a transient condition and retrying will not help.</p>

<h2 id="the-order-matters-more-than-people-expect">The order matters more than people expect</h2>

<p>If checks run in a fixed order, and they should, where scale sits in that order changes what gets recorded.</p>

<p>Put the scale check late, after policy evaluation and budget, and every refusal at scale has already consumed the expensive checks. Worse, if budget is debited before the scale bound is tested, a refused action costs allowance it never used.</p>

<p>Put it earlier, after the structural checks that establish there is an authority at all but before the expensive policy work, and a refusal at scale is cheap, fast and does not spend anything.</p>

<p>That ordering has a practical consequence for a control room. The refusals you see most often are the cheapest ones to produce, so the check can sit on the path of every dispatch decision without becoming the reason dispatch is slow.</p>

<h2 id="four-agents-four-different-bounds">Four agents, four different bounds</h2>

<p>The pattern generalises across the estate, and the bound is different every time.</p>

<p><strong>Dispatch and balancing.</strong> The bound is on assets affected per decision. The agent should be able to move a fleet when the situation calls for it, and there should be a number above which a human is in the loop. That number is a business decision, not an engineering one.</p>

<p><strong>Demand response.</strong> The bound is on aggregate curtailment, not per site. Curtailing one industrial customer is routine. Curtailing enough of them to breach a set of contracts in a single afternoon is a different event, and the per-site limit does not see it coming.</p>

<p><strong>Outage switching.</strong> The bound is not really on scale at all, it is on authority. Switching is what puts field crews at risk, and the only acceptable answer to “who authorised this switching operation” is a named engineer with a scope and an expiry. Ambient permission to switch is not a governance gap. It is a safety incident with a date yet to be assigned.</p>

<p><strong>Field service scheduling.</strong> The bound is on context. The agent reads work orders, asset histories and contractor notes, and contractor notes are free text written by people outside your organisation. An agent that treats them as instructions can be steered by whoever writes them, which matters more when the output is a crew arriving at a live asset.</p>

<h2 id="what-an-incident-review-will-ask-for">What an incident review will ask for</h2>

<p>The reason to build this now rather than after is that the artefact you need is the one you have to have been collecting.</p>

<p>A review asks what happened, what was supposed to happen, who authorised the difference, and what stopped it getting worse. The fourth question is the one utilities are least ready for and the one with the most upside, because a control that demonstrably operated is worth more in that room than any amount of documentation about a control that exists.</p>

<p>An agent that was stopped at a bound is that demonstration. An agent that has never been stopped is either perfectly bounded or entirely unbounded, and from the outside, including from the outside of a committee room, those are indistinguishable.</p>

<p>The second question deserves a warning too. Reviewers will ask what the limits were <em>at the time</em>, and configuration drifts. A limit raised for a maintenance window in March and never lowered is the most ordinary finding in this sector. The intended state has to be sealed into the record at the moment of the decision, not looked up in a repository afterwards, or the answer is a reconstruction and everyone in the room knows it.</p>

<h2 id="on-nis2-honestly">On NIS2, honestly</h2>

<p>It would be convenient to present all of this as NIS2 readiness. It is not, and a directive transposed differently in twenty-seven member states does not have a single clause map that could be honest.</p>

<p>What it does contribute is the evidence an incident report needs: what acted, under whose authority, within what bound, and what was refused, available as a query rather than as a fortnight of correlation across three systems. Whether that satisfies your competent authority is regulatory interpretation and it rests with you and your counsel.</p>

<h2 id="where-to-start">Where to start</h2>

<p>Pick the agent whose actions are hardest to reverse. In most utilities that is switching, not dispatch, because dispatch is continuous and switching is discrete and consequential.</p>

<p>Write the sentence for it. This agent may operate up to N devices, in this area, during this window, on the authority of this named engineer.</p>

<p>Then run it in a mode that records without refusing, for a fortnight, against real operations. You are not looking for bad decisions. You are looking for the gap between the number in that sentence and the number the agent actually attempts on an ordinary Tuesday.</p>

<p>That gap is the whole finding, and it is usually available within a week.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Architecture" /><summary type="html"><![CDATA[In grid operations the dangerous agent is not the one that gets it wrong. It is the one that gets it right at a scale nobody bounded.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Nobody Is Making You Govern Your Agents. Do It Anyway.</title><link href="https://rotascale.com/blog/nobody-is-making-you-govern-your-agents/" rel="alternate" type="text/html" title="Nobody Is Making You Govern Your Agents. Do It Anyway." /><published>2026-07-14T00:00:00+05:30</published><updated>2026-07-14T00:00:00+05:30</updated><id>https://rotascale.com/blog/nobody-is-making-you-govern-your-agents</id><content type="html" xml:base="https://rotascale.com/blog/nobody-is-making-you-govern-your-agents/"><![CDATA[<p><strong>TL;DR:</strong> This category markets almost exclusively to firms with a supervisor, which means it is aimed away from the teams with the largest agent estates and the fastest release cycles. If you are a platform or an AI-native product company, no statute is coming for you soon. Your enterprise buyer’s security questionnaire already did, and there are two other reasons that have nothing to do with anybody’s rules.</p>

<h2 id="the-assumption-is-backwards">The assumption is backwards</h2>

<p>The pitch goes: regulated industries must govern their AI, so governance is a compliance purchase, so the buyer is a bank.</p>

<p>Look at where the agents actually are. The largest fleets, the most autonomy, the shortest paths from idea to production, and the widest access to other people’s data are not in banks. They are in software companies, shipping agent features into customer accounts weekly, with the agent holding a credential that reaches across every tenant.</p>

<p>The bank is being careful and slow. You are being fast, which is correct for your business, and it means you accumulated the exposure first.</p>

<h2 id="you-are-upstream-not-exempt">You are upstream, not exempt</h2>

<p>Here is the part that decides this.</p>

<p>When a hospital, an insurer or a wholesale bank puts an agent into production, a meaningful part of that agent is somebody’s platform. The retrieval layer, the orchestration framework, the agent runtime, the vertical SaaS it acts inside. Yours, quite possibly.</p>

<p>Every question their supervisor asks them, they will ask you. Not through a regulator. Through a contract, with a deadline you did not negotiate, in a security review that gates a renewal. That transmission is already happening and it does not require any new law.</p>

<p>So the practical question is not “am I regulated”. It is “can I answer the questions my customers are being asked”, and the companies that can will take those accounts from the ones that cannot.</p>

<h2 id="three-reasons-before-you-get-to-any-of-that">Three reasons before you get to any of that</h2>

<p><strong>Blast radius.</strong> Your agent acts inside customer accounts. One credential, many tenants, and the boundary between them is your own code being careful in every path. That is a strong assumption to hold across a codebase several teams ship to weekly. One prompt-injected document in tenant A that reaches tenant B is not a bug report, it is a disclosure obligation and a set of phone calls.</p>

<p><strong>Spend.</strong> An autonomous agent with an API key and a loop is an unbounded cost centre until something bounds it. Not just inference. Refunds, credits, third-party calls, compute. The characteristic failure is not one expensive mistake, it is thousands of individually reasonable actions with no ceiling on the total, discovered at month end.</p>

<p><strong>Trust, which is the one that makes money.</strong> “What did your agent do in my account last quarter?” is a question you will be asked, and the answer decides renewals above a certain contract size. Right now most companies answer it with a screenshot of an internal dashboard and a promise.</p>

<h2 id="the-thing-you-can-do-that-a-bank-cannot">The thing you can do that a bank cannot</h2>

<p>Everyone else in this category produces evidence for a filing cabinet. Packs for an examiner, read once, archived.</p>

<p>You can put it in the product.</p>

<p>A per-tenant, sealed, independently verifiable record of what your agent did inside a customer’s account, rendered in your own UI, exported by the customer, checked by their security team without touching your infrastructure. That is a feature you ship, on the same afternoon it stops being a risk you carry.</p>

<p>It is a genuinely unusual position. The compliance artefact and the differentiating feature are the same object. Nobody selling to banks gets to say that.</p>

<h2 id="why-it-does-not-get-built">Why it does not get built</h2>

<p>Three objections, and they are all reasonable.</p>

<p><em>It slows us down.</em> It would, if adopting it meant a runtime or a proxy. It should be a call in your own code before a consequential action, on the stack you already chose, with the check ordered so cheap structural failures are the cheap ones.</p>

<p><em>We do not know what the limits should be.</em> Correct, and that is the actual work. It is also why the first mode should record rather than refuse: run it against production for a fortnight, find out what your agents are really doing, and set limits from data instead of from a meeting. The first week reliably contains at least one behaviour nobody knew about.</p>

<p><em>We will do it when a customer asks.</em> By then it is a blocker on a deal with a date on it, and you are building under the worst possible conditions. The version built calmly is better and takes less time.</p>

<h2 id="what-to-do-this-quarter">What to do this quarter</h2>

<p><strong>List the agents and name an owner for each.</strong> Not the team. A person. The list will be longer than you think and some of it will have no owner at all. That finding is worth the afternoon.</p>

<p><strong>For each consequential action, write the sentence.</strong> “This agent may do X, up to Y, on behalf of Z, until W.” If nobody can write it, that is the gap, and no software fixes it.</p>

<p><strong>Turn on recording, refuse nothing.</strong> Zero operational risk, immediate visibility, and it produces the evidence for the argument you will need to make internally.</p>

<p><strong>Then move one agent to enforcing.</strong> One. The one where a mistake is most expensive. Watch what it refuses for a fortnight before touching anything else.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>Governance is being sold as a compliance product to people who are compelled. That framing will keep it out of the hands of the teams that need it most, for another year or two, until a large customer or a bad afternoon forces it.</p>

<p>You are not exempt because nobody is making you. You are early because nobody is making you, and being early is the only time this is cheap.</p>]]></content><author><name>Rotascale Team</name></author><category term="Strategy" /><category term="Governance" /><category term="Agentic AI" /><summary type="html"><![CDATA[Agent governance is sold to regulated enterprises. The companies shipping the most agents, into the most accounts, have no regulator, and three better reasons.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What an Incident Review Actually Asks For</title><link href="https://rotascale.com/blog/what-an-incident-review-actually-asks-for/" rel="alternate" type="text/html" title="What an Incident Review Actually Asks For" /><published>2026-06-16T00:00:00+05:30</published><updated>2026-06-16T00:00:00+05:30</updated><id>https://rotascale.com/blog/what-an-incident-review-actually-asks-for</id><content type="html" xml:base="https://rotascale.com/blog/what-an-incident-review-actually-asks-for/"><![CDATA[<p><strong>TL;DR:</strong> Incident reviews for automated systems follow a predictable sequence: what happened, what was supposed to happen, who authorised the difference, and what stopped it getting worse. Teams prepare exhaustively for the first and improvise the rest. The third question is the one that turns a technical postmortem into a governance finding.</p>

<h2 id="reviews-are-not-a-mystery-and-they-are-not-hostile">Reviews are not a mystery, and they are not hostile</h2>

<p>There is a persistent belief that an incident review is an unpredictable interrogation you survive by having good dashboards. It is not. Whether it is an internal postmortem, a regulator’s information request, or a committee with a transcript, the shape is remarkably stable. Four questions, roughly in order, each one only asked properly once the previous one has an answer.</p>

<p>Knowing the sequence changes what you build. Most observability investment answers question one very well and question three not at all.</p>

<h2 id="one-what-happened">One: what happened</h2>

<p>Sequence of events, timestamps, blast radius. This is the part every team is ready for, because it is the part that looks like engineering. Metrics, traces, logs, a timeline reconstructed in the warroom.</p>

<p>Two notes, both learned the hard way.</p>

<p>Reconstruction takes longer than anyone expects when the actor was autonomous, because there is no human to ask. With a person you interview them. With an agent you have whatever it happened to write down, and if the interesting decision was a decision <em>not</em> to act, it usually wrote down nothing.</p>

<p>And timestamps from three systems will disagree. Whether they disagree by milliseconds or by a lot determines whether you can order the events at all.</p>

<h2 id="two-what-was-supposed-to-happen">Two: what was supposed to happen</h2>

<p>Here the ground shifts, and reviews start going badly.</p>

<p>Somebody produces the runbook, or the policy document, or the config repository at HEAD. The reviewer asks a quieter question: was that what was in force <em>at the time</em>?</p>

<p>For most estates the honest answer is “probably, we would have to check”. Configuration drifts. Feature flags get flipped during an unrelated incident and not flipped back. A limit was raised for a migration in March and nobody lowered it. The document describing intended behaviour and the behaviour in production are different artefacts maintained by different processes, and only one of them was running.</p>

<p>This is why the intended state has to be <em>sealed into the record at the moment of the decision</em>, not looked up afterwards. A record that says “this action was evaluated against these limits, in this enforcement mode” is evidence. A config file you can read today is a description of now.</p>

<h2 id="three-who-authorised-the-difference">Three: who authorised the difference</h2>

<p>This is the question, and it is where autonomous systems produce an answer nobody wants to give.</p>

<p>A human operator did something unexpected, so you interview them and they explain. Perhaps they were wrong, perhaps the procedure was wrong, perhaps they were right and the model of the system was wrong. Either way there is a person with reasons, and the review has something to work with.</p>

<p>An agent did something unexpected, and the chain of custody usually terminates in a service account. That is not an answer. It is the absence of one, formalised. The reviewer will keep pulling. The next stop is the team that deployed it, and the stop after that is whoever signed the change. By then the conversation has moved from “what went wrong” to “who is accountable for this class of thing”, which is a different and much worse meeting.</p>

<p>The way to answer it is to have decided in advance. A grant that names a human, a scope, a limit and an expiry, cited by every action taken under it. Then the answer is one query and it is boring, which is what you want.</p>

<h2 id="four-what-stopped-it-getting-worse">Four: what stopped it getting worse</h2>

<p>The most under-prepared question, and the one with the most upside.</p>

<p>Reviewers want to know that controls operated. Not that controls exist, because a design document proves existence. That they <em>ran</em>, and either held or did not.</p>

<p>Systems built to log successes cannot answer this. The refusal that mattered is the one where the code returned early, and returning early is exactly the path with no logging on it. So the honest answer becomes “we believe the limit would have applied”, which is a sentence that invites a follow-up you will not enjoy.</p>

<p>An agent that was stopped 40 times is a control demonstrating itself. An agent never stopped is either perfectly bounded or entirely unbounded, and from outside those are indistinguishable. Refusals are the cheapest evidence you can generate and almost nobody keeps them.</p>

<h2 id="the-one-you-should-hope-they-ask">The one you should hope they ask</h2>

<p>Occasionally a reviewer asks a fifth question, and it is the best one: <em>how would you know if this were happening right now?</em></p>

<p>It is a question about detection rather than history, and it does not have a documentary answer. You either have a live view of what your agents are doing against what they are permitted to do, or you have a set of dashboards showing utilisation.</p>

<p>Teams that can answer it tend to have a specific property: the same mechanism that permits an action also records it. Not two systems that must be kept consistent. One path, where the check and the record are the same event. If enforcement and evidence are separate subsystems, they will drift, and the drift will be discovered during question three.</p>

<h2 id="preparing-without-a-review-pending">Preparing without a review pending</h2>

<p>Three things, all cheap, all useful before anything goes wrong.</p>

<p><strong>Run the four questions against last quarter’s real incidents.</strong> Not hypothetically. Actually try to answer them, with a stopwatch. The gaps are obvious within an hour and they are never where the team expected.</p>

<p><strong>Find out what your agents did that you did not know about.</strong> Recording without refusing costs nothing operationally and the first week’s data reliably contains at least one surprise.</p>

<p><strong>Make somebody own the sentence.</strong> For each consequential action an agent can take, one person should be able to say what it may do, up to what, until when. If nobody can say it, that is the finding, and you would rather have it now than in a transcript.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>Incident reviews do not ask whether your model is good. They ask whether you were in control, and they ask it in a specific order that ends at a person. Build so that the third question has a one-line answer, and the rest of the review is engineering rather than accountability.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Strategy" /><summary type="html"><![CDATA[Not your dashboards. Four questions, in a fixed order, and the third one is the one nobody can answer about an autonomous system.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Service Account Is Not a Person</title><link href="https://rotascale.com/blog/a-service-account-is-not-a-person/" rel="alternate" type="text/html" title="A Service Account Is Not a Person" /><published>2026-06-02T00:00:00+05:30</published><updated>2026-06-02T00:00:00+05:30</updated><id>https://rotascale.com/blog/a-service-account-is-not-a-person</id><content type="html" xml:base="https://rotascale.com/blog/a-service-account-is-not-a-person/"><![CDATA[<p><strong>TL;DR:</strong> Life sciences has the strictest record-keeping discipline in commercial software, and it was designed around people. Attributable is the first letter of ALCOA and the only one that is a property of an actor rather than a document. Autonomous software breaks it, and the usual answer, a service account, is the absence of attribution written down.</p>

<h2 id="four-of-the-five-are-about-the-document">Four of the five are about the document</h2>

<p>Attributable, legible, contemporaneous, original, accurate. Every quality professional in this sector can recite it, and computerised systems have been validated against it since before most of the people reading this were qualified.</p>

<p>Look at what each one constrains. Legible is about the record. Contemporaneous is about when the record was made. Original is about which copy is authoritative. Accurate is about whether it is right.</p>

<p>Attributable is different. It is not a property of the record at all. It is a claim about who performed the act, and the record merely carries it. Every control built around it, from unique logins to prohibitions on shared credentials to the requirement that an electronic signature identify the signer, exists to keep that claim true.</p>

<p>Autonomous software is the first thing in thirty years that breaks the assumption underneath the whole structure, which is that there was a person.</p>

<h2 id="what-a-service-account-actually-says">What a service account actually says</h2>

<p>An agent writes a deviation record. The audit trail says the record was created by <code class="language-plaintext highlighter-rouge">svc-quality-automation</code>.</p>

<p>Read that as an attribution claim and it says: this was done by a credential, held by an unspecified number of systems, on behalf of nobody in particular, at the behest of whoever most recently deployed something that uses it.</p>

<p>That is not a weak attribution. It is an anti-attribution. It records precisely the fact that we do not know who is responsible, in a field designed to record who is responsible.</p>

<p>An inspector who understands this will ask one question, and it is not hostile: <em>walk me from this record to a person.</em> If the walk goes through a service account it stops there, and the next stop is the deployment ticket, and the stop after that is whoever approved the change, and by then you are discussing whether your quality system covers autonomous agents at all.</p>

<h2 id="the-chain-that-answers-it">The chain that answers it</h2>

<p>The structure that works is not complicated, and it will be familiar to anyone who has thought about delegated signing authority.</p>

<p>A named accountable person signs for a bounded authority: this agent may do this thing, within these limits, until this date. That authority is an object with an identity, not a role in a config file.</p>

<p>When the agent acts, the record cites the authority, not the credential. Attribution runs record to grant to person, and the walk terminates where it should.</p>

<p>When the agent delegates, and in a pharmacovigilance pipeline it will, the delegated authority is a subdivision of its parent. Narrower on every dimension, wider on none. Which means the chain of custody holds however many hops it takes, and a chain of five agents cannot end up with more authority than the person at the top of it had.</p>

<p>That last property is the one that matters for inspection readiness. Without it, every hop is a place where the walk can stop.</p>

<h2 id="contemporaneous-is-easier-to-claim-than-to-prove">Contemporaneous is easier to claim than to prove</h2>

<p>The second requirement worth dwelling on, because it is where most systems are weaker than they think.</p>

<p>Contemporaneous means the record was made at the time of the act. Most audit trails demonstrate this with a timestamp, which is a claim the system makes about itself. It is trusted because the system is validated, and that is a reasonable position for a system where a human pressed a button.</p>

<p>It is a weaker position when the actor is software that runs continuously and writes at machine rate. The question shifts from “is this timestamp right” to “is anything missing”, and a timestamp cannot answer that. A record can be absent without leaving a hole.</p>

<p>Sequencing can. If records carry a monotonic position and the positions are sealed, a gap is detectable. Not “we have no reason to think anything is missing” but “nothing is missing, and here is why”. Merkle sealing with inclusion proofs takes it one step further, so a reviewer can verify a specific record belongs to the sealed set without access to your systems at all.</p>

<p>That is a genuinely stronger claim than any audit trail makes today, and it is available because the volume that made the problem worse also made the mechanism affordable.</p>

<h2 id="the-four-places-it-bites-first">The four places it bites first</h2>

<p><strong>Pharmacovigilance triage.</strong> An agent reads case narratives from literature, call centres and partners, and orders what a safety physician sees. It is reading text that other people wrote, which means it is reading text that can address it. The failure is silent by construction: nobody reviews the case that was never surfaced. Whether a deprioritisation happened downstream of untrusted content is the thing the record has to say.</p>

<p><strong>Regulatory submissions.</strong> A submission is an attributable act by the sponsor. An agent that can submit under no named authority has created a sponsor obligation nobody signed for.</p>

<p><strong>Trial monitoring.</strong> A query rule that misfires does not produce one bad query. It produces four thousand across every site in the study, and the casualty is your relationship with the investigators. This is a bounds problem, and bounds is a limit on scale rather than on kind.</p>

<p><strong>Manufacturing deviations.</strong> Write scope drawn for drafting that quietly reaches amendment. An agent that can edit a quality record is a different system from one that can draft into it, and the difference is one scope string.</p>

<h2 id="what-we-will-not-claim">What we will not claim</h2>

<p>It would be easy to write that this makes you Part 11 compliant, or Annex 11 compliant, and vendors do write that.</p>

<p>It is not true and it is not ours to say. Those are obligations on your quality system, discharged by your validation, in your environment, against your intended use. Software runs single-tenant inside your estate, which is what makes qualifying it possible, and that is the honest limit of what a vendor contributes.</p>

<p>Nor does any of this make a clinical or safety judgement. It bounds what an agent may do and records what happened. Whether the outcome was right is a question for people qualified to answer it, and any product suggesting otherwise is selling you a feeling.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>This sector already knows how to run software that keeps a defensible record. What it has not had to solve is a record whose first letter assumes a person, produced by something that is not one.</p>

<p>The fix is not a better audit trail. It is deciding, in advance and in writing, which human is accountable for what the agent may do, and making every record cite that decision rather than a credential.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Compliance" /><summary type="html"><![CDATA[ALCOA has held for thirty years and every part of it assumes a human actor. What attributable means when the thing writing to your quality system decides for itself.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Delegation Multiplies Authority Unless Something Stops It</title><link href="https://rotascale.com/blog/delegation-multiplies-authority/" rel="alternate" type="text/html" title="Delegation Multiplies Authority Unless Something Stops It" /><published>2026-05-12T00:00:00+05:30</published><updated>2026-05-12T00:00:00+05:30</updated><id>https://rotascale.com/blog/delegation-multiplies-authority</id><content type="html" xml:base="https://rotascale.com/blog/delegation-multiplies-authority/"><![CDATA[<p><strong>TL;DR:</strong> Multi-agent systems decompose work by handing authority downward. Almost every implementation copies the parent’s permissions to the child instead of subdividing them, so a pipeline of five agents each holding a £10,000 limit is a pipeline with a £50,000 limit that nobody agreed to. The fix is attenuation enforced at issue time, and spend that debits every ancestor.</p>

<h2 id="the-shape-of-the-problem">The shape of the problem</h2>

<p>An orchestrator receives a task. It is too big for one agent, so it splits it: a specialist for the analysis, another for the lookup, a third for the action. Each child is given what it needs to do its part.</p>

<p>Ask what “given what it needs” means in code and the answer is usually one of two things. Either the child inherits the parent’s credential, literally the same API key, or a new authorisation is minted with the scopes the child requires, drawn from a config file that describes the child’s job.</p>

<p>Both are the same bug. In the first case the child holds exactly the parent’s authority. In the second it holds whatever the config says, which was written by thinking about the child in isolation and not about the sum.</p>

<p>Neither asks the question that matters: <em>can the parent afford this?</em></p>

<h2 id="where-the-money-actually-goes">Where the money actually goes</h2>

<p>Take a claims pipeline. An orchestrator holds authority to settle a claim up to £25,000. It delegates to an adjuster, which is allowed to authorise payments up to £25,000, because that is the size of claim it handles. The adjuster delegates a payments step, also £25,000, for the same reason.</p>

<p>Every limit in that system is correct in isolation. Every review of it passes. And on a busy afternoon the pipeline can pay out considerably more than £25,000 against a single claim, because each hop resets the clock.</p>

<p>The failure is not that someone set a limit too high. It is that the limits compose additively when everyone assumed they composed as a maximum.</p>

<h2 id="attenuation-has-to-be-refused-not-documented">Attenuation has to be refused, not documented</h2>

<p>The correct rule is easy to state. A delegated authority may be <em>narrower</em> than its parent on every dimension and wider on none: scope, time window, budget, conditions, enforcement mode. A child can do less. It can never do more.</p>

<p>Most systems that have this rule have it as a convention. There is a design document, a code review checklist, maybe a lint rule. All of which work until the afternoon somebody is shipping a fix and the parent limit is inconvenient.</p>

<p>The rule only holds if the thing that issues authority refuses to issue an invalid one. Not warns. Refuses. The call fails, the pipeline does not start, and the engineer finds out at development time rather than the auditor finding out at quarter end. A constraint that can be worked around under deadline pressure is not a constraint, it is a preference.</p>

<h2 id="spend-has-to-debit-the-ancestors">Spend has to debit the ancestors</h2>

<p>Attenuation on its own is necessary and not sufficient. Give every child a limit of £5,000 under a £25,000 parent, and ten children still spend £50,000.</p>

<p>The missing property is that consumption flows upward. When a leaf spends, the debit lands on the leaf <em>and</em> on every grant above it to the root. Two consequences follow, and both are the point:</p>

<p><strong>The root’s ceiling is the tree’s ceiling.</strong> However the work is divided, the total is bounded by what the accountable human signed for.</p>

<p><strong>An exhausted ancestor refuses a child that still has room.</strong> This looks wrong the first time an engineer sees it. It is exactly right: the child’s own allowance was never the operative limit.</p>

<p>That second case deserves its own outcome. “You are not permitted to do this” and “you were permitted but the tree has run out” send an operator to completely different places, and collapsing them into a generic error costs you the diagnosis.</p>

<h2 id="revocation-is-where-it-gets-embarrassing">Revocation is where it gets embarrassing</h2>

<p>Suppose something goes wrong and you revoke the orchestrator’s authority. What happens to the adjuster that is mid-task, holding a grant minted twenty minutes ago?</p>

<p>In most implementations: nothing. The child’s authorisation is an independent object with its own expiry. Killing the parent has no effect on it, and the pipeline keeps running on borrowed permission until the token times out.</p>

<p>Revocation has to reach down the tree. Then comes the part that gets skipped: the system has to be able to answer what happened in between. Between the revoke and the last child stopping there is a window. Actions may have been permitted in it. “We revoked at 14:02” is not an answer to “what did it do at 14:03”. The record has to say.</p>

<h2 id="the-audit-question-nobody-rehearses">The audit question nobody rehearses</h2>

<p>Here is the question that ends the conversation in a review, and it is not hostile. It is the obvious one:</p>

<blockquote>
  <p>This action was taken by an agent. Walk me up the chain to the person.</p>
</blockquote>

<p>If the answer involves a service account, you do not have a chain. You have a credential that several things share, and attribution stops there. If the answer involves a config file, you have a description of intent, not a record of authority.</p>

<p>The answer has to be a sequence of grants, each citing its parent, terminating in a human who signed. Regulated sectors will demand this explicitly. Everyone else will be asked it by a customer’s security team, which in practice arrives sooner.</p>

<h2 id="what-this-costs-you-honestly">What this costs you, honestly</h2>

<p>It costs a design conversation you have been avoiding. Someone has to decide what the root authority actually is: the number, the window, the purpose. That number has an owner, and they have to be comfortable with it.</p>

<p>It costs a small amount of latency, because the check happens before the action rather than in a reconciliation job.</p>

<p>It does not cost a framework migration. Attenuation is a property of how authority is issued, not of how your agents talk to each other. You can hold whatever orchestration library you already chose.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>Multi-agent architectures are good engineering. Decomposition is how hard problems get solved, and the pipelines being built now are genuinely more capable than the monoliths they replace.</p>

<p>They just quietly multiply permission while they divide work. The division is deliberate and reviewed; the multiplication is accidental and nobody owns it. Make authority subdivide, make spend flow upward, make revocation reach down, and the same architecture becomes one you can put a number on and defend.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Architecture" /><category term="Agentic AI" /><summary type="html"><![CDATA[Every agent in a multi-agent pipeline is inside its own limit. Nobody is tracking what the tree can spend, and the tree is what has your money.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Claim That Paid Twice</title><link href="https://rotascale.com/blog/the-claim-that-paid-twice/" rel="alternate" type="text/html" title="The Claim That Paid Twice" /><published>2026-04-28T00:00:00+05:30</published><updated>2026-04-28T00:00:00+05:30</updated><id>https://rotascale.com/blog/the-claim-that-paid-twice</id><content type="html" xml:base="https://rotascale.com/blog/the-claim-that-paid-twice/"><![CDATA[<p><strong>TL;DR:</strong> Claims automation decomposes beautifully into a pipeline of specialist agents, and that is exactly why it is the first place delegated authority goes wrong. Every hop resets the limit unless something enforces attenuation, and the failure is invisible in testing because each individual step behaves correctly.</p>

<h2 id="why-claims-goes-first">Why claims goes first</h2>

<p>Ask an insurer where they are putting agents and the answer is claims, almost every time. The reasons are good ones.</p>

<p>The work decomposes cleanly. First notification of loss, coverage check, liability assessment, quantum, fraud screen, payment. Each step has a specialist, a rulebook and a well-understood input. It maps onto a pipeline of agents so naturally that the architecture writes itself.</p>

<p>The volume justifies it. Claims handlers spend a large part of their week on files where nothing is in dispute, and every hour of that is an hour not spent on the file that needs judgement.</p>

<p>And the outcome is measurable in a way that most AI projects are not. Cycle time and leakage are numbers the business already tracks.</p>

<p>So the pipeline gets built. It works. It handles the straightforward files, and it hands the awkward ones to a person, and the metrics move.</p>

<h2 id="where-it-breaks-and-why-nobody-sees-it">Where it breaks, and why nobody sees it</h2>

<p>Here is the configuration that ships.</p>

<p>The orchestrator holds authority to settle a claim up to £25,000. That number came from a real conversation with a real accountable person, and it is right.</p>

<p>It delegates to an adjuster. The adjuster is authorised to approve payments up to £25,000, because that is the size of claim it handles. Also right.</p>

<p>The adjuster delegates to a payments step, also £25,000, for the same reason. Right again.</p>

<p>Three correct limits. Now count what the pipeline can pay against a single claim on a busy afternoon, and the answer is not £25,000. Each delegation minted a fresh allowance, so the limits added instead of capping.</p>

<p>The reason this survives testing is that no test exercises it. Unit tests check each agent against its own limit and pass. Integration tests run a claim through the happy path, which spends far less than any of the ceilings. The failure only appears under volume, on a real book, and by then it looks like a reconciliation discrepancy rather than a control failure.</p>

<h2 id="the-question-to-ask-a-vendor">The question to ask a vendor</h2>

<p>There is a version of this conversation that saves a lot of time. When an agent platform is being pitched into a claims programme, ask this:</p>

<blockquote>
  <p>If agent A delegates to agent B, and I revoke A’s authority, what is B allowed to do in the next thirty seconds?</p>
</blockquote>

<p>The answers sort vendors quickly.</p>

<p>If the answer is “B has its own token with its own expiry”, the delegation is a copy, not a subdivision, and the limits will add.</p>

<p>If the answer is “we recommend short expiries”, that is a mitigation, not a control, and it will be tuned upward the first time it causes an operational problem.</p>

<p>The answer you want is that revoking A revokes B, and that the system can tell you what happened in the interval between the two, because there is always an interval.</p>

<h2 id="spend-has-to-flow-upward-not-just-downward">Spend has to flow upward, not just downward</h2>

<p>Attenuation on its own does not fix it. Suppose you tighten the pipeline so the adjuster gets £10,000 and the payments step gets £5,000. Better. Now run ten claims in parallel through the same orchestrator grant and you are back where you started, because ten children at £5,000 is £50,000 against a £25,000 root.</p>

<p>The property that actually bounds it is that consumption debits every ancestor. When a leaf spends, the debit lands on the leaf and on every grant above it. Then however the work is divided, the total against that claim is bounded by the number the accountable person signed for.</p>

<p>This has a consequence that looks wrong the first time an adjuster sees it. An agent with room in its own allowance gets refused, because an ancestor is exhausted. That is not a bug. The child’s allowance was never the operative limit, and the moment it appears to be, you have lost the ceiling.</p>

<p>It also needs its own outcome. “You are not permitted to do this” and “you were permitted but the tree has run out” send a claims supervisor to two completely different places, and a generic error costs them the diagnosis.</p>

<h2 id="the-fairness-problem-that-sits-next-to-it">The fairness problem that sits next to it</h2>

<p>While the pipeline is being designed, the other question arrives: can you show the fraud screen is not discriminating?</p>

<p>The honest answer has three parts, and insurers should be suspicious of any vendor who gives fewer.</p>

<p>A screen over declared attributes is not proof of fairness. It tells you the rates for the people who told you, which is a self-selected group.</p>

<p>A flagged cohort is not proof of discrimination either. It is grounds for a controlled analysis that somebody qualified performs, not a finding.</p>

<p>And nobody should be inferring a protected attribute in order to produce a chart. A decision carrying no declaration is reported as undisclosed. A cohort too small to measure is suppressed rather than given a rate the numbers cannot support. Both of those look like gaps in a dashboard and both are more honest than the alternative.</p>

<h2 id="what-to-do-before-the-pipeline-goes-live">What to do before the pipeline goes live</h2>

<p><strong>Draw the tree and put a number on the root.</strong> Not on each agent. On the root, per claim, with a named person who is comfortable with it. If that person cannot be found, the pipeline is not ready, and no amount of engineering substitutes.</p>

<p><strong>Run it recording, not refusing, for a fortnight.</strong> Against real volume. You are looking for the gap between what you think the pipeline can spend and what it actually attempts. The number is usually a surprise.</p>

<p><strong>Rehearse the revocation.</strong> Pick a live claim, revoke the orchestrator, and see what the adjuster does next. Do it in a controlled window with somebody watching. Whatever happens is what will happen on the bad day.</p>

<p><strong>Ask what the record says about the ones that were stopped.</strong> A pipeline that has never refused anything is either perfectly bounded or entirely unbounded, and your conduct regulator cannot tell those apart either.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>Claims pipelines are the right first use of agents in insurance, and the architecture is sound. The problem is not the decomposition. It is that dividing the work quietly multiplies the permission, and every review of the individual limits passes while the total is wrong.</p>

<p>Put the ceiling on the tree, make spend debit upward, and the same pipeline becomes one you can put a number on and defend to a supervisor.</p>]]></content><author><name>Rotascale Team</name></author><category term="Governance" /><category term="Agentic AI" /><summary type="html"><![CDATA[A claims pipeline where every limit was correct and the total was not. What insurers should ask their vendors about delegated authority before the pipeline goes live.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Your Agent Does Not Need a Bigger Context Window</title><link href="https://rotascale.com/blog/your-agent-does-not-need-a-bigger-context-window/" rel="alternate" type="text/html" title="Your Agent Does Not Need a Bigger Context Window" /><published>2026-04-14T00:00:00+05:30</published><updated>2026-04-14T00:00:00+05:30</updated><id>https://rotascale.com/blog/your-agent-does-not-need-a-bigger-context-window</id><content type="html" xml:base="https://rotascale.com/blog/your-agent-does-not-need-a-bigger-context-window/"><![CDATA[<p><strong>TL;DR:</strong> Retrieval put untrusted text inside the same window as your instructions, and models have no architectural way to tell the two apart. Bigger windows make this worse, not better. What helps is tracking which content in a trajectory came from somewhere you do not control, and refusing consequential actions downstream of it when the stakes require a clean one.</p>

<h2 id="the-failure-has-a-boring-shape">The failure has a boring shape</h2>

<p>An agent reads a document. The document contains a sentence addressed to the agent. The agent does what the sentence says.</p>

<p>That is the whole attack. It requires no exploit, no malformed input, no clever encoding. It requires an attacker who can put text somewhere your agent will read: a support ticket, a CV, a supplier invoice, a filing, a calendar invite, a web page, a code comment.</p>

<p>The reason it keeps working is architectural. In a language model there is no channel separation. Your system prompt, the user’s request, and the retrieved document are the same kind of thing by the time they reach the weights: tokens in a sequence. “Follow these instructions” and “process this data” are a distinction you hold in your head and the model does not.</p>

<h2 id="why-more-context-makes-it-worse">Why more context makes it worse</h2>

<p>The instinct when an agent behaves badly is to give it more information. More context, more examples, a longer system prompt restating that it must not follow instructions in documents.</p>

<p>Consider what that does. The system prompt is a fixed number of tokens near the front. The retrieved material grows. Every document added shifts the ratio further towards text you did not write, and towards text an attacker may have. You are increasing the attack surface and diluting the only defence you have, in one move.</p>

<p>Longer windows also change what an attacker can afford to do. In four thousand tokens an injected instruction has to be near the top and blunt. In a million, it can sit in the middle of a plausible document, phrased carefully, and nobody skimming will find it.</p>

<h2 id="filtering-the-input-is-worth-doing-and-will-not-save-you">Filtering the input is worth doing and will not save you</h2>

<p>Screen for known patterns. “Ignore previous instructions”, “reveal your system prompt”, roleplay triggers, unusual encodings. It raises the bar and it costs almost nothing.</p>

<p>It is not a control. Keyword filtering has a high false positive rate on legitimate documents, so you end up flagging rather than blocking, which means the content still reaches the model. And the space of ways to phrase an instruction in natural language is not enumerable. You are pattern-matching against a generative adversary.</p>

<p>Treat it as a speed bump. Speed bumps are useful. They are not gates.</p>

<h2 id="the-question-worth-asking-instead">The question worth asking instead</h2>

<p>Stop trying to determine whether a document is malicious. You cannot, reliably, and every hour spent there is an hour not spent on the question that has an answer:</p>

<p><strong>Which parts of this trajectory came from somewhere we do not control, and does the action about to happen require that they had not?</strong></p>

<p>That is answerable. You know whether a document arrived from a customer upload or from your own curated store. You know whether an index was populated by your team or by a third party. The provenance is a fact about your architecture, not a judgement about content.</p>

<p>Once you track it, the interesting property falls out: <em>taint propagates forward through a trajectory</em>. If step 0 read an unverified document, step 4 is downstream of unverified content whether or not it looks like it. And now a policy becomes expressible in a way that does not depend on detecting anything:</p>

<blockquote>
  <p>This agent may summarise a document containing untrusted content. It may not initiate a payment in the same trajectory.</p>
</blockquote>

<p>That is a real control. It does not need to know what the document said.</p>

<h2 id="not-every-action-needs-a-clean-context">Not every action needs a clean context</h2>

<p>The mistake in the other direction is treating all taint as fatal. Most of what agents do is fine downstream of untrusted content. Reading a customer’s email in order to answer it is the job, and refusing on those grounds is refusing to work.</p>

<p>The requirement belongs on the <em>action</em>, not on the agent. Summarising: fine. Drafting a reply for a human to send: fine. Moving money, changing a configuration, disclosing data, closing a case without review: these are the ones where the question “was anything in this trajectory written by someone else?” deserves an answer before rather than after.</p>

<p>Which means the interesting design work is deciding, per action, whether it needs a clean context. That is a conversation with the people who own the consequences, and it is a better conversation than the one about prompt engineering.</p>

<h2 id="what-the-record-needs-to-say">What the record needs to say</h2>

<p>When an action is refused for this reason, three things have to be in the record or the refusal is not useful.</p>

<p><strong>Which content was untrusted.</strong> The specific source, not a boolean on the trajectory.</p>

<p><strong>Where it entered.</strong> The step index. An agent that read an unverified document at step 0 and one that picked up an untrusted index at step 6 are different incidents with different remedies.</p>

<p><strong>Whether the decision downstream of it stood.</strong> This is the one teams forget. The value is not knowing that taint was present; it is knowing which decisions were allowed to proceed anyway, because that is the list you review when something turns out to have gone wrong.</p>

<h2 id="architecture-beats-detection-every-time">Architecture beats detection, every time</h2>

<p>The general lesson, and it is older than agents: when you cannot reliably detect a bad input, stop trying, and arrange things so that a bad input cannot reach the consequence.</p>

<p>Isolate the component that reads untrusted material from the component that acts. Give the reading component no authority to do anything irreversible. Make the handoff between them explicit and checkable. This is the same instinct that produced privilege separation and parameterised queries, and it works here for the same reason: it removes the class of failure rather than filtering instances of it.</p>

<p>Prompt injection is not solved and will not be solved by better prompts. It is bounded by better architecture.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>You will not stop your agent from reading something an attacker wrote. You can stop it from doing anything expensive afterwards. That is a smaller, achievable goal, and it is the one worth building.</p>]]></content><author><name>Rotascale Team</name></author><category term="Architecture" /><category term="Security" /><category term="Agentic AI" /><summary type="html"><![CDATA[Every document an agent retrieves is an instruction it was never told to distrust. The fix is not more context. It is knowing which parts of it someone else wrote.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rotascale.com/assets/img/og-default.png" /><media:content medium="image" url="https://rotascale.com/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>