<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-AU"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.zavacaregroup.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.zavacaregroup.com/" rel="alternate" type="text/html" hreflang="en-AU" /><updated>2026-11-15T22:33:57+11:00</updated><id>https://blog.zavacaregroup.com/feed.xml</id><title type="html">Agents That Know When to Stop</title><subtitle>A design diary from an Azure Master Architect capstone: five AI agents for a fictional aged-care operator, Zava Care Group, built on Azure in Australia.</subtitle><author><name>Johan</name></author><entry><title type="html">Three boundaries: facility, country, region</title><link href="https://blog.zavacaregroup.com/2026/11/three-boundaries-facility-country-region/" rel="alternate" type="text/html" title="Three boundaries: facility, country, region" /><published>2026-11-15T15:00:00+11:00</published><updated>2026-11-15T15:00:00+11:00</updated><id>https://blog.zavacaregroup.com/2026/11/three-boundaries-facility-country-region</id><content type="html" xml:base="https://blog.zavacaregroup.com/2026/11/three-boundaries-facility-country-region/"><![CDATA[<div class="scene" data-time="01:52 · a storm · Zava Care Group">
  <p>The wind brings a branch down across the street, and the facility’s internet goes with it.</p>

  <p>In room 14, Mrs Wu sits up and swings her legs out of bed. The bed sensor notices. Twenty metres away, a small box in the comms cupboard decides this is worth an alert, and Priya’s handset buzzes.</p>

  <p>She’s there before Mrs Wu has found her slippers. Nobody in the building knows the internet is down, and that’s the point.</p>
</div>

<aside class="callout honest">
  <p>That scene shows the <strong>design</strong>. Night Watch is <span class="badge target">Target</span>: nothing is deployed on site yet, and its accuracy thresholds are still proposals. The boundaries in this post are what that design has to fit inside.</p>
</aside>

<h2 id="why-boundaries-come-first">Why boundaries come first</h2>

<p>Most architecture diagrams start with services. This one starts with <strong>lines on a map</strong>, because the non-negotiables are about <em>where</em> things happen:</p>

<ul>
  <li>Identifiable health data stays <strong>in Australia</strong>.</li>
  <li>Only de-identified metrics go <strong>regional</strong>.</li>
  <li>Night alerting runs <strong>on site</strong> and works <strong>offline</strong>.</li>
</ul>

<p>Get the lines right and many later decisions follow from them. Get them wrong and no amount of security tooling will fix it.</p>

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

<pre><code class="language-mermaid">flowchart TB
    subgraph REG["Regional plane · not designed yet"]
        RM[("De-identified&lt;br/&gt;quality metrics")]
    end
    subgraph AU["Country plane · Australia"]
        subgraph AUE["Australia East · as-built sandbox"]
            PLAT["Landing zone, shared platform,&lt;br/&gt;cloud agents, care data,&lt;br/&gt;logs and audit"]
        end
        subgraph AUSE["Australia Southeast · recovery option"]
            DR["Landing-zone infrastructure only"]
        end
        subgraph FAC["Facility edge · target"]
            NWE["Night Watch:&lt;br/&gt;triage, local alerts,&lt;br/&gt;local event store"]
        end
    end
    subgraph TEN["Microsoft tenant services"]
        IDS["Staff and family identity"]
        A365["Agent 365 registry&lt;br/&gt;logging off"]
    end

    NWE -. "pseudonymised events" .-&gt; PLAT
    PLAT -. "de-identified export only" .-&gt; RM
    PLAT -. "recovery inside Australia" .-&gt; DR
    PLAT --- IDS
    PLAT -. "inventory only, no care content" .-&gt; A365
</code></pre>

<h2 id="whats-allowed-across-each-line">What’s allowed across each line</h2>

<p>This table matters more than the diagram. Each boundary has an explicit <em>allowed</em> list and an explicit <em>never</em> list.</p>

<table>
  <thead>
    <tr>
      <th>From → to</th>
      <th>Allowed</th>
      <th>Never</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Facility → Australia East</td>
      <td>Pseudonymised alert and acknowledgement events, for other agents to use</td>
      <td>Raw sensor streams, or anything that alerting depends on</td>
    </tr>
    <tr>
      <td>Australia East → regional</td>
      <td>De-identified extracts or aggregates, after a review against Australian law</td>
      <td>Anything identifiable or re-identifiable about residents, families or staff</td>
    </tr>
    <tr>
      <td>Australia East → Agent 365</td>
      <td>Agent inventory: names, descriptions, IDs, sponsors</td>
      <td>Care content or traces</td>
    </tr>
    <tr>
      <td>Australia East → Australia Southeast</td>
      <td>Infrastructure recovery within Australia</td>
      <td>Any failover outside Australia</td>
    </tr>
    <tr>
      <td>Internet → Australia East</td>
      <td>HTTPS through Front Door with WAF, to private origins</td>
      <td>Direct access to the network; public endpoints on data services</td>
    </tr>
  </tbody>
</table>

<h2 id="boundary-1-the-facility">Boundary 1: the facility</h2>

<p>Night Watch is the only agent that lives on site. Its triage engine, sensor broker, alert tiers, acknowledgement and escalation, nurse-call adapter and an append-only event log all run in the building.</p>

<p>Two rules make this work:</p>

<ol>
  <li><strong>Nothing that alerting needs crosses the line.</strong> If the cloud vanished, alerting wouldn’t notice.</li>
  <li><strong>Only pseudonymised events go up.</strong> The cloud uses them to start a draft incident note for an RN, to hold routine family updates, and to inform shift planning. Raw sensor streams stay on site.</li>
</ol>

<h2 id="boundary-2-the-country">Boundary 2: the country</h2>

<p>Everything else runs in a single Azure region, <strong>Australia East</strong>. That covers every resource and every log destination: there’s no cross-region peering, no replication and no log export.</p>

<p>Some less obvious choices also come from this boundary:</p>

<ul>
  <li><strong>AI models use regional deployments in Australia East</strong>, not the global or multi-region “data zone” options, so prompts and responses are processed in-country.</li>
  <li><strong>Family accounts sit in an identity tenant hosted in Australia.</strong></li>
  <li><strong>Network flow logs stay in-region</strong>, because network telemetry can include IP metadata about the people using the service.</li>
</ul>

<h3 id="the-line-people-forget">The line people forget</h3>

<p>Some Microsoft services live at the <strong>tenant</strong> level rather than in a region. Agent 365, which provides a registry and governance for agents, stores its activity data in the tenant’s geography rather than in Australia East.</p>

<p>The design therefore registers each agent’s <em>existence</em> (name, ID, sponsor) and keeps Agent 365 activity logging <strong>switched off</strong> until a privacy review approves it. That’s an uncomfortable trade-off: it gives up useful telemetry to stay on the right side of the line.</p>

<h2 id="boundary-3-the-region">Boundary 3: the region</h2>

<p>The brief wants a group-wide view of quality across countries. The only thing allowed to feed it is <strong>de-identified</strong> data, exported from each country’s record after a de-identification step that is reviewed against Australian law.</p>

<p>This plane is <span class="badge target">Target</span>, and not designed yet. No regional hub and no cross-border connection exist, and that’s deliberate. Adding one will be a separate, explicit decision.</p>

<h2 id="when-australia-east-has-a-bad-day">When Australia East has a bad day</h2>

<p>This is where the boundaries get expensive. The obvious recovery site is <strong>Australia Southeast</strong>, but:</p>

<ul>
  <li>The FHIR service used for the care record <strong>isn’t offered in Australia Southeast</strong> (checked 9 Nov 2026).</li>
  <li>The Care Record design also lists Speech, Azure OpenAI and Agent Service as not available there. I need to re-check this before writing the disaster-recovery decision.</li>
</ul>

<p>Like-for-like failover inside Australia isn’t possible today, and failover <em>outside</em> Australia is never allowed. The working approach is to <strong>fail closed and degrade manually</strong>:</p>

<ul>
  <li>The operator’s clinical system stays the system of record, so the FHIR copy can be rebuilt from it.</li>
  <li>Cloud agents pause, or tell people that staff will follow up.</li>
  <li>Caregivers keep documenting in the clinical system directly.</li>
  <li><strong>Night Watch carries on</strong>, because it never depended on the cloud.</li>
</ul>

<aside class="callout human">
  <p>When a boundary forces the system to degrade, <strong>people take over</strong> rather than a fallback AI somewhere else. Caregivers document directly, staff answer families, and Priya’s handset keeps working. The design treats “a person does it the old way” as a legitimate recovery mode, not as a failure.</p>
</aside>

<aside class="callout tradeoff">
  <p><strong>Residency or resilience?</strong> A second region with full failover would be more resilient. Choosing one region, with manual degradation inside Australia, keeps the residency story simple and true. I’m accepting a weaker recovery position for the cloud agents in exchange for a residency boundary that holds even during an outage. Night Watch, the one safety-critical agent, isn’t affected either way.</p>
</aside>

<h2 id="honest-gaps">Honest gaps</h2>

<aside class="callout honest">
  <ul>
    <li><strong>Residency is enforced by template defaults, not by policy yet.</strong> An Azure Policy that allows only Australia East and Australia Southeast is the next thing to close. It turns “in-country by design” into “in-country by enforcement”.</li>
    <li><strong>There’s no facility connectivity design yet</strong> (VPN or ExpressRoute).</li>
    <li><strong>Recovery tiers per agent</strong> are still an open decision.</li>
    <li><strong>The SMS path</strong> for family messages has an open question about where messages transit.</li>
  </ul>
</aside>

<aside class="callout reading">
  <p>The design documents <em>Solution overview: deployment boundaries</em> and <em>Landing zone: regions and data residency</em>, together with the requirements and constraints.</p>
</aside>

<p><strong>That’s Part 1.</strong> Next, in Part 2, we go down a layer: an AI landing zone, three kinds of identity, and why “private by default” is harder than it sounds.</p>]]></content><author><name>Johan</name></author><summary type="html"><![CDATA[Deployment boundaries for an aged-care agent platform: on-site Night Watch, an Australian data plane, a de-identified regional plane and in-country recovery.]]></summary></entry><entry><title type="html">The whole system on one page</title><link href="https://blog.zavacaregroup.com/2026/11/the-whole-system-on-one-page/" rel="alternate" type="text/html" title="The whole system on one page" /><published>2026-11-15T12:00:00+11:00</published><updated>2026-11-15T12:00:00+11:00</updated><id>https://blog.zavacaregroup.com/2026/11/the-whole-system-on-one-page</id><content type="html" xml:base="https://blog.zavacaregroup.com/2026/11/the-whole-system-on-one-page/"><![CDATA[<div class="scene" data-time="21:15 · a family chat window · Zava Care Group">
  <p>Grace opens the family portal and types: <em>“Did Mum eat dinner? And is the doctor worried about her blood pressure?”</em></p>

  <p>The reply comes back in seconds. Mum had most of her dinner and enjoyed the soup. The second question, it says, is one for the care team, and a nurse will call Grace tomorrow morning.</p>

  <p>Grace doesn’t see what happened behind that answer. The agent was never able to read the blood-pressure notes in the first place.</p>
</div>

<p>That one exchange contains most of the architecture. This post shows the rest on one page.</p>

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

<blockquote>
  <p>The model drafts. Rules decide. People confirm.</p>
</blockquote>

<p>A language model is very good at writing, summarising and translating, but it isn’t a reliable place to keep a decision. So in this design, the decisions live elsewhere:</p>

<ul>
  <li><strong>Consent, entitlement and disclosure</strong> (who may see what) are code.</li>
  <li><strong>Claim rules and pricing</strong> are code.</li>
  <li><strong>Roster rules</strong> (24/7 registered nurse cover, skill mix, award rules) are a solver plus an independent checker.</li>
  <li><strong>Alert triage</strong> for Night Watch is deterministic.</li>
</ul>

<p>The model writes the words. It never makes the decision.</p>

<h2 id="seven-principles">Seven principles</h2>

<ol>
  <li><strong>The model drafts, deterministic services decide, people confirm.</strong> The decision logic is rules and code, not prompts.</li>
  <li><strong>The confirmed record is a hard boundary.</strong> Drafts never go into the care record. Billing and Family Communication only read <em>confirmed</em> entries.</li>
  <li><strong>Agents hold no data roles.</strong> Resident data is reached through a gateway, with one route and one permission for each consumer.</li>
  <li><strong>Identity is proven, not chosen.</strong> Every agent has its own least-privilege identity, and every human decision records who made it.</li>
  <li><strong>One data plane per country.</strong> Identifiable data stays in Australia East. A regional plane only ever receives de-identified metrics.</li>
  <li><strong>Safety-critical alerting is local.</strong> Night Watch runs on site and doesn’t depend on the cloud.</li>
  <li><strong>The simpler service wins</strong> unless a written decision record shows why something newer fits better.</li>
</ol>

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

<p>Boxes are capabilities, not servers. Dashed boxes are designs that haven’t been built yet.</p>

<pre><code class="language-mermaid">flowchart TB
    subgraph People
        STAFF["Staff&lt;br/&gt;caregivers, RNs, managers, billing"]
        FAM["Families and supporters"]
    end
    FD["Secure front door&lt;br/&gt;Front Door + WAF, staff and family sign-in"]
    subgraph Agents["Cloud agents · Australia East"]
        CR["Care Record"]
        BI["Billing"]
        SP["Shift Planning"]
        FC["Family Communication"]
    end
    subgraph Support["What the agents lean on"]
        AI["AI runtime&lt;br/&gt;Foundry, regional model"]
        DET["Rules, not prompts&lt;br/&gt;consent, entitlement,&lt;br/&gt;claim rules, roster solver"]
        GW["Care Record Gateway"]
    end
    FHIR[("FHIR care record&lt;br/&gt;synthetic data")]
    NW["Night Watch&lt;br/&gt;on site, local alerting"]
    REG[("Regional view&lt;br/&gt;de-identified only")]

    STAFF --&gt; FD
    FAM --&gt; FD
    FD --&gt; Agents
    Agents --&gt; AI
    Agents --&gt; DET
    Agents --&gt; GW --&gt; FHIR
    NW -- "alerts to handsets" --&gt; STAFF
    NW -. "pseudonymised events" .-&gt; Agents
    FHIR -. "de-identified export" .-&gt; REG

    classDef target stroke-dasharray: 5 5
    class BI,SP,NW,REG target
</code></pre>

<h2 id="two-decisions-worth-unpacking">Two decisions worth unpacking</h2>

<h3 id="1-where-does-a-decision-live">1. Where does a decision live?</h3>

<table>
  <thead>
    <tr>
      <th>Option</th>
      <th>What it means</th>
      <th>Verdict</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Let the model decide, with guardrails</td>
      <td>The prompt says “only share routine information”; content filters catch mistakes</td>
      <td>✗ Correct most of the time, which isn’t good enough for disclosure or claims</td>
    </tr>
    <tr>
      <td><strong>Rules decide, the model writes</strong></td>
      <td>Deterministic code works out what’s allowed; the model only phrases the answer</td>
      <td>✓ Chosen</td>
    </tr>
  </tbody>
</table>

<p>In Grace’s case, a deterministic entitlement service checked who she is, which resident she’s linked to and which kinds of information she may see. The model only got to write the reply after that check.</p>

<h3 id="2-how-does-an-agent-reach-resident-data">2. How does an agent reach resident data?</h3>

<table>
  <thead>
    <tr>
      <th>Option</th>
      <th>Risk</th>
      <th>Verdict</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Give each agent a role on the FHIR service</td>
      <td>A prompt-injected tool call can read anything the role allows</td>
      <td>✗</td>
    </tr>
    <tr>
      <td>One shared service account</td>
      <td>One compromise exposes everything, and the audit trail can’t tell who did what</td>
      <td>✗</td>
    </tr>
    <tr>
      <td><strong>A gateway with one route and one permission per consumer</strong></td>
      <td>Each agent can only call its own narrow route</td>
      <td>✓ Chosen</td>
    </tr>
  </tbody>
</table>

<p>The Family Communication agent holds a permission called <code class="language-plaintext highlighter-rouge">CareRecord.Read.Shareable</code>. It doesn’t hold a FHIR role at all. Even if someone tricked the model into asking for blood-pressure notes, the gateway route it can call simply doesn’t return them.</p>

<aside class="callout human">
  <p>The architecture ensures that every decision is made by rules or by a person:</p>

  <ul>
    <li><strong>Rules</strong> work out what may be shared, claimed or rostered.</li>
    <li><strong>People</strong> confirm records, certify claims, approve rosters and respond to alerts.</li>
    <li><strong>The model</strong> writes, summarises and translates in between.</li>
  </ul>

  <p>When the rules can’t settle something, it goes to a person, not back to the model.</p>
</aside>

<h2 id="agents-dont-talk-to-each-other">Agents don’t talk to each other</h2>

<p>You might expect five agents to call each other directly. They don’t. They share <strong>facts</strong>, not <strong>permissions</strong>:</p>

<ul>
  <li><span class="agent cr">Care Record</span> is the source of facts. Billing and Family Communication only see entries a caregiver has confirmed.</li>
  <li><span class="agent nw">Night Watch</span> events become <em>draft</em> incident notes for an RN to review, and they put a hold on routine family messages, so Grace doesn’t get a cheerful “quiet night” update after a fall.</li>
  <li><span class="agent sp">Shift Planning</span> publishes the approved roster, which tells Night Watch whose handset to alert.</li>
</ul>

<p>This means one agent can never gain another agent’s data rights by asking it for something.</p>

<h2 id="whats-built-and-what-isnt">What’s built, and what isn’t</h2>

<table>
  <thead>
    <tr>
      <th>Building block</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Landing zone (hub and spoke, default-deny egress, private DNS)</td>
      <td><span class="badge built">As-built</span></td>
    </tr>
    <tr>
      <td>Staff identity and family identity (family accounts hosted in Australia)</td>
      <td><span class="badge built">As-built</span></td>
    </tr>
    <tr>
      <td>Secure front door (Front Door Premium with WAF, private origins)</td>
      <td><span class="badge built">As-built</span></td>
    </tr>
    <tr>
      <td>AI runtime (private Foundry project, regional model deployment, Prompt Shields)</td>
      <td><span class="badge built">As-built</span></td>
    </tr>
    <tr>
      <td>FHIR record behind the Care Record Gateway</td>
      <td><span class="badge built">As-built</span> with synthetic data</td>
    </tr>
    <tr>
      <td><span class="agent fc">Family Communication</span></td>
      <td><span class="badge demo">Demo</span></td>
    </tr>
    <tr>
      <td><span class="agent cr">Care Record</span></td>
      <td>Partial: a synthetic slice, not end to end</td>
    </tr>
    <tr>
      <td><span class="agent bi">Billing</span>, <span class="agent sp">Shift Planning</span>, <span class="agent nw">Night Watch</span></td>
      <td><span class="badge target">Target</span></td>
    </tr>
    <tr>
      <td>Facility-level supervision and inter-agent events</td>
      <td>Not designed yet</td>
    </tr>
    <tr>
      <td>Regional de-identified analytics</td>
      <td>Not designed yet</td>
    </tr>
  </tbody>
</table>

<aside class="callout tradeoff">
  <p><strong>More boxes in exchange for fewer surprises.</strong> A gateway, a separate rules service and a checker for every solver add moving parts. Letting each agent call the data directly would be simpler. Principle 7 says the simpler option wins <em>unless</em> there’s a written reason. Here the reason is a prompt-injection attack that can’t reach data it has no route to. In aged care, I think that justifies the extra boxes.</p>
</aside>

<aside class="callout honest">
  <p>The brief asks for “facility-level supervision on a group platform.” I haven’t designed that orchestration pattern yet, so it’s missing from the diagram. The event backbone between agents and the audit store are also still open.</p>
</aside>

<aside class="callout reading">
  <p>The design document <em>Solution overview: conceptual architecture</em>, together with the care record platform design and the identity architecture.</p>
</aside>

<p><strong>Next:</strong> three boundaries (facility, country and region) and what’s allowed to cross each one.</p>]]></content><author><name>Johan</name></author><summary type="html"><![CDATA[The conceptual architecture for five aged-care AI agents on Azure: principles, building blocks and how the agents share facts without sharing rights.]]></summary></entry><entry><title type="html">What problem are we designing for?</title><link href="https://blog.zavacaregroup.com/2026/11/what-problem-are-we-designing-for/" rel="alternate" type="text/html" title="What problem are we designing for?" /><published>2026-11-15T09:00:00+11:00</published><updated>2026-11-15T09:00:00+11:00</updated><id>https://blog.zavacaregroup.com/2026/11/what-problem-are-we-designing-for</id><content type="html" xml:base="https://blog.zavacaregroup.com/2026/11/what-problem-are-we-designing-for/"><![CDATA[<div class="scene" data-time="06:40 · end of the night shift · Zava Care Group">
  <p>Tomás has finished his last round. Before he can go home, he has to write up the night: who slept, who didn’t, who needed help to the bathroom at 2 a.m.</p>

  <p>Down the corridor, Priya is reading through an incident note. Was it a fall or a slip? Does it need reporting? The decision is hers.</p>

  <p>Two hours away, Grace’s phone buzzes: <em>“How was Mum’s night?”</em> Nobody has had time to answer yet.</p>
</div>

<p>None of these three people needs an AI to <em>decide</em> anything for them. What they need is time. That’s the problem this series is about.</p>

<h2 id="the-brief-in-three-numbers">The brief, in three numbers</h2>

<p>The case study describes a regional aged-care operator. I’ve called it <strong>Zava Care Group</strong>.</p>

<div class="big-number">
  <div><strong>180</strong><span>nursing facilities and home-care stations</span></div>
  <div><strong>~9,000</strong><span>caregivers</span></div>
  <div><strong>up to ⅓</strong><span>of each shift spent on care records, billing and shift planning</span></div>
</div>

<p>Caregivers are scarce, and every hour spent on paperwork comes out of hands-on care. Night incidents, family enquiries and rejected insurance claims add to the load.</p>

<p>The brief asks for agentic AI that hands that time back to care. It also sets firm limits on what the agents may do.</p>

<h2 id="five-agents-five-jobs">Five agents, five jobs</h2>

<p>The operator asked for five agents. Each one gets a fixed <strong>autonomy level</strong>, which says how far it can go before a person steps in:</p>

<ul>
  <li><strong>L2 (recommend):</strong> the agent proposes, and a person approves <em>before</em> anything happens.</li>
  <li><strong>L3 (act with oversight):</strong> the agent carries out the task within set rules, and a person confirms the result, handles exceptions and responds to escalations.</li>
</ul>

<table>
  <thead>
    <tr>
      <th>Agent</th>
      <th>Its job</th>
      <th>Level</th>
      <th>Who decides</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><span class="agent cr">Care Record</span></td>
      <td>Turns spoken or typed notes into structured draft entries</td>
      <td>L3</td>
      <td>The caregiver confirms; the RN handles incidents and care-plan changes</td>
    </tr>
    <tr>
      <td><span class="agent bi">Billing</span></td>
      <td>Prepares claims from confirmed care and flags exceptions</td>
      <td>L3</td>
      <td>A billing administrator reviews exceptions; a person certifies</td>
    </tr>
    <tr>
      <td><span class="agent sp">Shift Planning</span></td>
      <td>Recommends rosters that respect skill mix, award rules and care-minute targets</td>
      <td><strong>L2</strong></td>
      <td>The facility manager</td>
    </tr>
    <tr>
      <td><span class="agent nw">Night Watch</span></td>
      <td>Raises falls and wandering alerts from facility sensors</td>
      <td>L3</td>
      <td>Night staff and the RN on duty</td>
    </tr>
    <tr>
      <td><span class="agent fc">Family Communication</span></td>
      <td>Answers family enquiries within a disclosure policy</td>
      <td>L3</td>
      <td>Staff, for anything sensitive</td>
    </tr>
  </tbody>
</table>

<p>Notice that <strong>nothing goes above L3</strong>. The brief says “no automated care decisions”, and that caps every agent. Agents can draft, prepare, recommend and alert. Clinical judgement stays with qualified staff.</p>

<p>Shift Planning sits one step lower than the rest. A wrong roster affects staffing standards and labour rules and is hard to undo, so a manager signs it off before it takes effect.</p>

<aside class="callout human">
  <p>In every one of these jobs, a person still makes the final call:</p>

  <ul>
    <li>Tomás confirms what goes into the care record.</li>
    <li>Priya decides whether an incident is reportable and whether a care plan changes.</li>
    <li>Daniel approves the roster.</li>
    <li>A billing administrator certifies every claim.</li>
    <li>Staff take over any family conversation about something sensitive.</li>
  </ul>
</aside>

<h2 id="targets-not-results">Targets, not results</h2>

<p>The brief comes with ambitious numbers. Here they are, labelled honestly:</p>

<table>
  <thead>
    <tr>
      <th>The brief’s target</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Documentation time cut by <strong>60%</strong></td>
      <td><span class="badge target">Target</span> Not measured</td>
    </tr>
    <tr>
      <td>About <strong>1.3 million care-hours</strong> a year handed back</td>
      <td><span class="badge target">Target</span> Derived from the 60%</td>
    </tr>
    <tr>
      <td>Roughly <strong>700 caregivers’</strong> worth of time</td>
      <td><span class="badge target">Target</span> Depends on an assumed hours-per-caregiver figure</td>
    </tr>
    <tr>
      <td><strong>USD 40 million</strong> in additional serviced revenue at current occupancy caps</td>
      <td><span class="badge target">Target</span> Not an Australian forecast</td>
    </tr>
    <tr>
      <td>Billing rejections cut by <strong>70%</strong></td>
      <td><span class="badge target">Target</span> Not measured</td>
    </tr>
    <tr>
      <td><strong>15%</strong> more residents served with the same staff</td>
      <td><span class="badge target">Target</span> Needs restating for Australia</td>
    </tr>
  </tbody>
</table>

<aside class="callout honest">
  <p>None of these figures has been measured, and several rest on assumptions that still need a real baseline. The “700 caregivers” figure, for example, divides the returned hours by an <em>assumed</em> number of working hours per caregiver per year. I treat all of them as hypotheses for the design to test, not as promises.</p>
</aside>

<h2 id="the-australian-twist">The Australian twist</h2>

<p>The brief describes an Asian operator, but I’ve framed the design around <strong>Australian</strong> regulation. A real regulatory setting turns vague requirements into concrete ones. It also changes how some of the targets read.</p>

<p><strong>The growth targets need an Australian translation.</strong> The latest <a href="https://insideageing.com.au/more-aged-care-homes-fall-into-the-red-despite-rising-occupancy-stewartbrown-warns/">StewartBrown survey coverage</a> reported residential occupancy near capacity (Inside Ageing, 21 July 2026). So “15% more residents” doesn’t translate directly. Capacity and agency hours avoided, or growth in home care, are better measures. The brief’s USD 40 million revenue target also needs a local value model; it isn’t an Australian forecast.</p>

<p><strong>Care minutes are measured on paid hours.</strong> Each resident’s funding class comes with daily care-minute targets, set in the <a href="https://www.legislation.gov.au/F2025L01173/2026-10-01/text">Aged Care Rules 2025</a> (compilation in force from 1 October 2026). These are counted against paid worked hours, so saving documentation time <em>doesn’t</em> raise a facility’s reported care minutes. What it does is put more of those paid minutes into direct care, which matters more.</p>

<p><strong>Billing value is mostly about accuracy.</strong> For residential care, the money is in getting each resident’s funding classification right and on time (<a href="https://www.health.gov.au/our-work/residential-aged-care/funding/Funding-for-permanent-residential-aged-care">Department of Health, 24 July 2026</a>). Fewer rejections matter more for home care and private fees.</p>

<p><strong>Regulation shapes the design.</strong> For example, privacy-policy transparency rules for automated decision-making <a href="https://www.oaic.gov.au/news/media-centre/new-resources-on-transparency-for-use-of-ai-and-automated-decision-making">commence on 10 December 2026</a> (OAIC, 30 September 2026). Any agent that does something “substantially and directly related” to a significant decision needs to be disclosed.</p>

<aside class="callout tradeoff">
  <p><strong>Choosing one real country over a generic “Asian market.”</strong> Australia gives me named obligations, dates and rules to design against, which makes the architecture testable. The cost is that a few of the brief’s targets don’t map neatly and have to be restated. I think that’s a fair price, because a design that names its constraints is easier to defend than one that doesn’t.</p>
</aside>

<h2 id="the-rules-that-cant-be-broken">The rules that can’t be broken</h2>

<p>These are the non-negotiables. Every later post comes back to them.</p>

<ol>
  <li><strong>No automated care decisions.</strong> Agents draft, recommend or alert. People confirm, approve, certify or respond.</li>
  <li><strong>Resident health records stay in Australia.</strong> Identifiable data never leaves the country.</li>
  <li><strong>Only de-identified quality metrics go regional.</strong> A group-wide view of quality, without names.</li>
  <li><strong>Night Watch alerting runs on-site and keeps working offline.</strong> A falls alert can’t depend on an internet connection.</li>
</ol>

<p>The brief also requires these controls, which the design treats as equally firm:</p>

<ul>
  <li><strong>Consent before sensitive data is processed</strong>, with a non-AI fallback.</li>
  <li><strong>Alert-accuracy thresholds</strong> that Night Watch must meet before it goes live.</li>
  <li><strong>A family disclosure policy</strong> that is enforced in code, outside the language model.</li>
  <li><strong>A billing audit trail</strong>, with a person certifying each claim.</li>
</ul>

<h2 id="whats-in-scope-and-what-isnt">What’s in scope, and what isn’t</h2>

<table>
  <thead>
    <tr>
      <th>In scope</th>
      <th>Out of scope</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Five agents with human checkpoints at the levels above</td>
      <td>Any automated clinical decision</td>
    </tr>
    <tr>
      <td>A shared Azure platform in Australia East</td>
      <td>Replacing the operator’s clinical, payroll, claims or nurse-call systems</td>
    </tr>
    <tr>
      <td>A standard health-data (FHIR) layer over the clinical system, with synthetic data</td>
      <td>Real resident, staff or family data</td>
    </tr>
    <tr>
      <td>A design for on-site Night Watch that works offline</td>
      <td>A production rollout</td>
    </tr>
    <tr>
      <td>A simulated “Zava Care Group” to test against</td>
      <td>Treating the simulation as part of the solution</td>
    </tr>
  </tbody>
</table>

<h2 id="still-open">Still open</h2>

<p>I’ll be honest about what’s not settled yet:</p>

<ul>
  <li><strong>The value model.</strong> The business case for an Australian operator isn’t written yet, so there are no baselines.</li>
  <li><strong>How to restate “more residents served”</strong> for a market that’s already nearly full.</li>
  <li><strong>The final success measures for a pilot.</strong> The candidates are documentation minutes per resident-day, billing exception rate, night alert-to-acknowledgement time, staff turnover and occupancy. None has a baseline yet.</li>
</ul>

<aside class="callout reading">
  <p>The design documents <em>Solution overview: business context and scope</em> and <em>Solution overview: requirements and constraints</em>, plus the case-study brief. Figures quoted from the brief are targets.</p>
</aside>

<p><strong>Next:</strong> the whole system on one page, and the principle that holds it together: <em>the model drafts, rules decide, people confirm.</em></p>]]></content><author><name>Johan</name></author><summary type="html"><![CDATA[The business problem behind five AI agents for aged care: the brief, the targets, the Australian twist and the non-negotiables.]]></summary></entry></feed>