HEART Part 6: Human Control and Safety#
Who is in charge, and how harm is prevented
Author: Milind K. Patil, Syncaissa Systems Inc. Status: Working draft 1, November 2026. Part of the HEART Standards Family. Includes the corrections of Security Advisory HEART-2026-001. Version: 1.0 (draft) Read first: Part 1: Basics and Part 2: Autonomy Levels. Track: Basic: "In one minute" and Section 9. Intermediate adds Sections 2.1 to 2.4 (the human column of 2.3), 3 and 10. Advanced adds all of 2.3, Sections 4 to 8, and 9.1.
In one minute#
Part 2 says how much a system may do on its own. This part says how that freedom is controlled.
Seven rules keep people in charge:
| # | Rule | In one sentence |
|---|---|---|
| 1 | One gate | Every action, whoever asks for it, passes the same check. |
| 2 | Risky means a person | Destructive and physical actions need a person to say yes. |
| 3 | A person, really present | Saying yes needs proof that a person is there, approving this exact action. A login alone is not enough. |
| 4 | No back doors to power | Anything that gives power for later, such as a new Playbook, counts as risky. |
| 5 | Models suggest, systems decide | Nothing an AI says is ever carried out directly. |
| 6 | Stop always works | On every system that can act on its own (A3 and above), one command halts all automatic action, at once, with no approval and no internet. |
| 7 | Stay out of safety | A HEART never sits in a safety circuit or a control loop. The product stays safe without it. |
These rules apply at every Autonomy Level. No setting can loosen them. Settings can only make them stricter.
1. Why this part matters#
A HEART can act: restart a service, change a setting, switch a motor. That is useful, and it is dangerous. Three things can go wrong:
- An AI makes a mistake. It misunderstands a request, or is tricked by text hidden in a log or an email (prompt injection).
- Someone pretends to be someone else. A program, or an AI agent, uses a person's login.
- Small permissions add up. Something allowed to do a small thing uses it to gain a bigger power later.
This part closes all three, with rules that are checked by the system itself, never by the AI.
2. The approval gate#
2.1 How risky is the action?#
Every action has a risk (Part 3):
| Risk | Meaning | Example |
|---|---|---|
read | Looks only | Read a temperature |
write | Changes something that can be undone | Change a setting, clear a cache |
destructive | Hard or impossible to undo | Delete data, factory reset, install firmware |
An action that moves, heats, powers or switches something in the real world is also marked physical.
2.2 Who is asking?#
Every request comes from one of four kinds of initiator:
| Initiator | Meaning |
|---|---|
human | A person |
ai | An AI model, an AI agent, or anything interpreted from plain language |
peer | Another system |
rule | A Playbook (a rule a person adopted in advance) |
The kind comes from the login token's heart_caller claim, set by the owner's login service, never chosen by the caller (Part 4). A token without it counts as peer. A token given to an AI agent always counts as ai (Section 3.4). Anything interpreted from plain language counts as ai, even when no AI model was used, because any interpretation can be wrong.
2.3 The gate#
Every action passes two checks, in this order. The system MUST enforce both.
First, the mode. A Full system has an autonomy mode, which follows from its current level (Section 6.1). For every Action that is not read:
| Mode | ai, peer or rule initiator | human initiator |
|---|---|---|
observe | Refused with 409 autonomy-stopped | Goes on to the table |
suggest | Ask a person, whatever the allowlist says | Goes on to the table |
act | Goes on to the table | Goes on to the table |
Then, the table.
| Risk | Rule | AI | Peer | Person |
|---|---|---|---|---|
read | Run | Run | Run | Run |
write | Run if allowlisted, otherwise ask a person | Ask a person, unless allowlisted (and only at current level A5) | Ask a person, unless allowlisted | Run |
destructive | Ask a person | Ask a person, always | Ask a person | Run, after proof of presence |
Adjustments:
- A physical action asked for by an AI or a peer counts as
destructive. A person's own physical action needs proof of presence, like a destructive one. A Playbook may run a physical action only if it was adopted as physical (Section 4.2). - The allowlist is the owner's list of
writeactions that may run without asking each time. It can never contain anythingdestructive. An Action is allowlisted only when one entry matches all three of:- the entry names the Action's target (capability or operation),
- the Action's initiator kind is in the entry's
initiators(rule,aiorpeer), and - every argument the Action changes is inside the entry's envelope (HEART Core, Section 7.4). An argument the envelope does not name MUST NOT change automatically. An entry for a target with no input values needs no envelope.
- AI and the allowlist. An
aiAction may use the allowlist only while the system's current level (Pulseautonomy.current, Part 2) is 5. Below that, an AI-startedwritealways asks a person. This is what separates A4 from A5. - The allowlist is part of the control message (
allowlist, read withGET /heart/v1/tending/autonomy) and is changed withPUT /heart/v1/tending/allowlist(scopeheart.admin). Adding or widening an entry isdestructive(Section 4.1). Removing or narrowing one iswrite.
One exception: the steps of an approved Trial. When a person approves the first Action of a Trial (HEART Core, Section 7.5), they approve the whole plan: that Action's digest covers the arguments of every step and the values the undo will restore. The later steps and the undo are Actions whose approvedBy points to that first Action. They pass the guards (Section 9.1) at the moment they run, but not the gate again. There is no other exception to this section or to Section 3.
Configuration can make this table stricter, never looser. For example, an owner may require approval for every write, but cannot let an AI run a destructive action on its own.
2.4 Every state change passes the gate#
The gate is not only for capabilities. Every operation in the standard that changes anything passes it: changing a setting, adding a custom command, removing a peer. Each operation's risk is given in the API Standard (Section 13) and the OpenAPI file (x-heart-risk). Where the risk is per-item, it depends on the request: for example, POST /heart/v1/lifecycle/factory-reset is destructive, POST /heart/v1/lifecycle/restart is write, and the same restart with "mode": "force" is destructive, because it skips saving state. A shutdown of a system that nothing can wake remotely is destructive too: it cannot be undone without someone on site. An option can only raise a risk, never lower it. Where Section 4.1 makes an operation stricter, the stricter risk applies. Any of them may answer 202 with an Action waiting for approval.
3. Approving: a person, really present#
3.1 Why a login is not enough#
A login token says which account is calling. It does not say who is there. People connect AI assistants to their accounts, so an assistant may hold a person's token. If a token were enough to approve, an AI could approve its own risky suggestions.
So HEART asks for proof of presence: evidence that only a person who is actually there can give.
3.2 What an approval needs#
- A digest. Every Action has a
digest: SHA-256 over the canonical JSON (RFC 8785) of the object{"system", "id", "operation", "arguments", "physical"}, that is the system ID, the Action's ID, the capability or operation ("METHOD /path", with the path as sent), the values (a capability'sarguments, or the request body withoutactionIdandpresence), and whether it is physical. The client may choose the Action's ID itself, asactionIdin the request (a UUID, never used before on that system), so it can compute the digest before it sends anything. For the first Action of a Trial,argumentsalso holds every step and the values the undo will restore (Section 2.3). Once an Action is waiting for approval, none of these may change. Any change makes a new Action, which needs a new approval. An approval screen SHOULD recompute the digest from what it shows, and refuse to ask if the two differ. - Proof for that digest. An approval MUST carry
presence(method,digest,proof): proof that a person approved this digest. The system MUST verify it. These methods are defined:
| Method | What the person does | proof | Good for |
|---|---|---|---|
webauthn | Confirms with a passkey: fingerprint, face or PIN on their phone, laptop or security key | base64url of the JSON object {credentialId, authenticatorData, clientDataJSON, signature}. The WebAuthn challenge is the raw 32 bytes of the digest, and user verification MUST be set. The credential MUST have been enrolled for that person on this system beforehand (Section 3.5). | Apps, dashboards |
ciba | Taps "approve" on their enrolled phone (Section 3.5), which shows the Action's details | The OpenID CIBA result token, which MUST name the person and carry the digest in its binding_message or an equivalent claim | Remote approval |
remote-site | Approves on a registered remote site, such as HEART Hub, after signing in there | base64url of the site's Ed25519 signature over the RFC 8785 JSON of {actionId, digest, decision, at}, sent with that JSON. The device pins the site's public key when the site is registered. It MUST verify the signature and the digest, and refuse a proof whose at is more than 300 seconds old. | Devices watched from a website |
fleet | Approves a whole fleet command once, at the HEART Gateway, with one of the methods above (Section 8) | base64url of the JSON object {fleet, system, actionId, approvedBy, at, signature}, signed by the Gateway for this one system. digest is the fleet digest. The device MUST verify it with the Gateway key it pinned at join, and refuse it unless its own name is among the fleet's targets, the operation and arguments are exactly its request's, and at is at most 300 seconds old. | Fleets of devices |
device-button | Presses a physical button on the device itself | Not yet defined. A system MUST NOT accept device-button until its format is defined in this part. Until then it is a vendor extension only. | Machines and appliances |
remote-site is weaker than webauthn: it proves that the person signed in to the site, and that the site vouches for them, not that the person's own authenticator was used. So a remote-site proof MUST NOT be accepted for a physical Action unless the owner has opted in on the device itself (remoteSitePhysical: true). The same holds for fleet, which trusts the Gateway: it MUST NOT be accepted for a physical Action unless the owner has opted in on the device (fleetPhysical: true).
- Who may approve. The approver MUST be a
humanprincipal. It MUST NOT be the Action'sinitiator, whatever kind of initiator that is, a person included. It MAY be the person on whose behalf an AI started the Action (onBehalfOf). A person who starts a destructive or physical Action themselves does not approve it afterwards: they send proof of presence with the request itself, in one call (below). - A time limit. Every Action waiting for approval carries
expiresAt. An Action not approved by then MUST becomeexpiredand MUST NOT run. The time limit is the owner'sapprovalTimeoutSec: 86400 seconds (24 hours) by default, and never less than 60.
A person's own request, in one call. A person who asks for something destructive or physical chooses the Action's ID (actionId), computes its digest, proves presence for that digest, and sends all three with the request. The system recomputes the digest, checks the proof, and runs the Action at once. A request sent without proof becomes an Action that waits for another person's approval. To run it alone, the person sends it again with a new actionId and proof, and cancels the waiting one or lets it expire. Reusing an actionId is refused (409 conflict), so a proof can never be used for a second Action.
Saying no (deny) or cancel needs no proof, because it only makes things safer.
An approval without proof gets 403 presence-required. A proof that does not check out, or that covers a different digest, gets 403 presence-invalid.
3.3 What the person sees#
Proof of presence is only as good as what the person is shown. The approval screen SHOULD show, in plain language:
- what will happen, with the exact values,
- why it was suggested, and by whom (or by which AI, on whose behalf),
- whether it is physical or cannot be undone,
- what happens if they do nothing, and when the request expires (
expiresAt).
The standard can make each approval specific and traceable. It cannot make a person read carefully. Products SHOULD make careless approval hard, for example by never batching risky approvals into one tap.
3.4 AI agents never approve#
A token given to an AI agent (an agent registration, or an act claim naming any actor other than a HEART Gateway) is always treated as ai, and can never hold the heart.approve scope (Part 4). A person working through a HEART Gateway stays a person. Together with proof of presence, this means software cannot approve, even when it holds a person's login.
3.5 Enrolling a passkey or a phone#
Proof of presence needs something the person has enrolled on the system: a passkey (webauthn) or a phone that confirms CIBA requests (ciba). The presence module manages them (API Standard 13.2, rule 13):
| Operation | What it does | Risk |
|---|---|---|
GET /heart/v1/presence/methods | Lists the enrolled methods, never their keys | - |
POST /heart/v1/presence/methods | Enrols a method for the calling person | destructive |
DELETE /heart/v1/presence/methods/{id} | Removes a method | write |
Enrolling gives the power to approve, so it needs proof of presence like any destructive change: from one of the person's own methods, in the same request, or another person's approval. The system's first method, while none is enrolled, needs a person at the device: the request comes through the device's local interface, or is confirmed on the device. Removing a method only lowers authority, so it needs no proof, except that a system that has no other way to prove presence (card.presence.requireMethod) keeps its last method. With a passkey enrolled, a person can approve a change to a device on a pole or in a pump station from anywhere, without walking to a button.
4. No back doors to power#
4.1 Changes to authority are destructive#
Some operations do nothing by themselves, but decide what may happen later without a person. If they were only write, an AI on the allowlist could use them to give itself power. So every operation that does any of these MUST be treated as destructive, whatever its table says:
| Operation | Why |
|---|---|
| Adding or changing a Playbook, or adding to or widening the allowlist or an envelope | Creates a standing order |
Raising autonomy: any increase of the ceiling max (Section 6.1) | Lets the system act on its own |
| Trusting another system, or raising its clearance | Gives another system power |
| Changing AI providers, regions, budgets or the model pin | Changes who sees data and who decides |
Entering maintenance: declaring a maintenance window, or POST /heart/v1/lifecycle/maintenance-on | Unlocks maintenance-only commands |
| Enrolling a passkey or phone for proof of presence (Section 3.5) | Gives a new way to approve |
| Granting a caller access, or widening a grant: a new grant, a role with more scopes or a higher clearance, a new client certificate, a later or removed expiry (API Standard 13.2 rule 21) | Lets someone new act on the system |
Making things safer stays easy. Lowering max, stopping, removing a rule, narrowing or removing an allowlist entry, removing trust, removing a presence method, narrowing or removing a grant, and returning to the immediately previous model pin (POST /heart/v1/evolution/rollback) are write (or, for Stop, read), never destructive.
4.2 Actions that happen later keep their author#
A schedule or a Playbook runs later, when nobody is watching. It MUST NOT run with more power than whoever made it.
- Schedules remember who created them. When one fires, its action passes the gate again, as that creator. Creating a schedule has the risk of what it schedules, and at least
write. - Playbooks run as
ruleonly if they areenabledand theirstatusisadopted. A Playbook becomesadoptedonly throughPUT /heart/v1/tending/rules/{id}, sent by, or approved by, ahumanholdingheart.admin, with proof of presence. The system records who adopted it (adoptedBy), exactly which capability it may run, and whether it was adopted as physical (adoptedPhysical). It can never run another capability, and it may run a physical one only ifadoptedPhysicalis true. - A Playbook's
statusisproposedunless a person adopts it this way. Playbooks and schedules made by an AI or another system, Playbooks the HEART learned, and Playbooks the vendor ships with the product all start proposed.
4.3 What this guarantees#
Together, Sections 2 to 4 guarantee:
An AI or another system can cause a destructive or physical action only after a person proves presence for that exact action — whether it asks directly, holds a person's token, writes a Playbook, or schedules it for later.
This holds as long as AI and other systems cannot use a person's authenticator, signatures cannot be forged, and any registered remote site (remote-site, Section 3.2) is not itself compromised. The last is why remote-site is refused for physical Actions unless the owner opts in. It protects against software pretending to be a person. It does not protect against a person approving something they did not read.
5. Models suggest, systems decide#
5.1 The rule#
Nothing an AI model says is ever carried out directly. A model can only propose. Every proposal becomes an Action with initiator ai, and passes the gate like any other.
- An AI-started Action carries
onBehalfOf: the person or rule whose request led to it. - It has at most that person's or rule's rights. A model can never gain power that the one behind it did not have.
- Plain-language requests (
/serve) run asai, even when no model was used. Onlyreadoperations run without confirmation (HEART Core Standard, Section 6). - Stop is the exception. A request that means "stop automatic action", such as "stop", "stop autonomy" or "stop all automatic actions", runs Stop at once, because stopping is always the safe direction. A request to stop a machine or a part of it, such as "stop the conveyor", is a request for that thing's
haltcapability, which passes the gate like any physical action. Stop would leave the conveyor running.
5.2 Keeping instructions and data apart#
Prompt injection hides instructions in data: a log line, an email, a message from another system. The Reason format (the standard shape of every model call) keeps the two apart:
- Instructions contain only text the system's owner wrote.
- Everything else, including user text, logs, files and messages from other systems, goes in context, marked
untrusted. Adapters MUST keep the two apart in what they send to the model. - Permission never depends on model output. Even a perfectly fooled model can only propose, and the gate does not care how convincing the proposal sounds.
- Messages from other systems are data. Nothing arriving in the inbox can start an action, and received messages can never trigger a Playbook.
5.3 Grounding#
A model may not invent a target or a value (HEART Core Standard, Section 6.1). Every action must name something that exists, and every value must be stated by the person, a declared default, or read from the system just now. If two readings are possible, the system asks. If nothing matches, it says so rather than guessing.
5.4 Budgets#
A model call that would go over the per-call limit or the daily budget MUST NOT be made. It answers 429 budget-exceeded. A cost-spike alert at 80% of the daily budget is recommended.
6. Stop always works#
Stop sets the autonomy ceiling max to 2, or keeps it lower if it already is, so the mode is observe. Every system at A3 or above MUST offer it (Part 2, Rule 1). There are two routes to it, with the same effects: POST /heart/v1/tending/stop, and PUT /heart/v1/tending/autonomy with a max of 2 or below. Both have risk read and need only scope heart.tend, and a plain-language request meaning "stop automatic action" runs Stop at once (Section 5.1). Anything else that stops automatic action (a Command Center's autonomy-stop signal, or a Trial whose undo failed) is Stop as well.
Stop stops automatic action, not the machine. A machine or a part of it is stopped with its own halt capability (API Standard 6.4).
It MUST:
- take effect at once,
- need no approval and no internet,
- work even when the system is unwell,
- cancel every Action that has not started,
- cancel every running Action that is
cancellable, at its next safe point; other running Actions finish, - undo any running Trial (HEART Core, Section 7.5). That undo is the only action allowed after stop, and it still passes the guards. The Trial ends
stopped.
After stop:
- The system still notices problems, explains them and tells people (Autonomy Levels A1 and A2).
- New Actions that are not
readfromai,peerandruleinitiators are refused with409 autonomy-stopped. A person's own Actions still pass the gate as usual. - Only a person can turn automatic action back on, by raising
max, which needs proof of presence or another person's approval (Section 4.1).
6.1 Autonomy ceiling and modes#
A Full system has one autonomy setting: the ceiling max, from 0 to 5, read with GET /heart/v1/tending/autonomy and set with PUT /heart/v1/tending/autonomy (API Standard 13.4). Its current level is the lowest of max, the promised level and what it can deliver now (Part 2, Section 7). Lowering max needs only scope heart.tend and no approval. Raising it is destructive, needs heart.admin as well, and only a person may do it (Section 4.1).
Nobody sets the mode. It follows from the current level:
| Mode | Behaviour | Current level |
|---|---|---|
observe | Notices, alerts and explains. Refuses every non-read Action from ai, peer and rule. | 0 to 2: A1 and A2 at Full, and any system after stop |
suggest | Also proposes actions. Every non-read Action from ai, peer and rule asks a person, whatever the allowlist says. | 3: A3 |
act | Acts within the gate table (Section 2.3). ai uses the allowlist only at 5. | 4 and 5: A4, A5 |
Only Full systems have a ceiling and a mode. Basic and Connected systems take no action, so they need neither.
6.2 Cutting the brain#
Stop takes away a system's freedom to act on its own. The brain switch takes away its AI model, from outside, even when the system cannot be reached (API Standard 7.4). A model can be jailbroken, poisoned or simply wrong, and a new version may behave in ways nobody has watched yet. Trust in a model is earned by watching what it does, never assumed.
It cuts the brain, never the machine. A brainless system keeps noticing problems, runs the Playbooks a person adopted, and does what people approve. A car, robot or pump keeps its own controller and safety system (Section 9, rules 1, 2 and 6). "Brainless" means no more advice from the model. It never means "stopped".
Four layers, each only able to make a system less able to act:
| Layer | Pulled by | Effect | Stops a rogue |
|---|---|---|---|
| K1 Brain cut | The Command Center, the owner | No lease, so no brain. Minimum Tending and approved work go on | Brain |
| K2 Autonomy stop | The owner, at the device or by signal | observe: nothing runs on its own; a running Trial is undone (Section 6) | Brain, Playbooks, rules |
| K3 Quarantine | The Command Center, the Gateway, the owner | The system's identity key is revoked: peers, the Gateway and monitor sites refuse it, and it gets no tokens or leases | A compromised heart reaching others |
| K4 Physical stop | A person, the safety system | E-stop or power off, outside HEART | Anything, including compromised firmware |
Where the brain runs, and how fast a cut takes effect:
| Where the model runs | How its answers are trusted | A cut takes effect |
|---|---|---|
| In the cloud, through the Command Center | The Command Center signs each answer | At the next answer |
| On the device, countersigned (default for proposing and planning) | The device sends each answer to the Command Center to be checked and signed | At the next answer. With no link, no proposals |
| On the device, lease only (default for explaining and chat) | Used without a round trip while the lease lasts | Within seconds by a pushed signal, or within one lease (300 s by default) |
| On the device, in auto mode, with the link lost | Used offline, narrowing with time, for at most the profile's cap | Not while there is no link; at most the cap; at once on reconnecting, before the brain is used again |
Auto mode exists because some machines cannot wait for a server: a car in a tunnel, a truck underground, a rover between contacts. It is not "no switch". It is a short offline lease, signed in advance, that only the owner can turn on with proof of presence, that starts only when the link is lost, that narrows from planning to explaining to nothing, that never proposes a hazardous change, and that ends at the first contact. Its risks and how each is reduced:
| Risk | Reduced by |
|---|---|
| Prompt injection from the world (signs, voices, passengers, QR codes) | Untrusted input is data, never instructions; every answer is only a Proposal and passes the gate, envelopes and hazardous rules; the Core's self-cut |
| A wrong or poisoned model nobody is watching | Only the model file whose hash the lease names is loaded; its uses narrow with time; the signed audit is reviewed on return |
| A stolen device keeps its brain | The offline cap; the first contact cuts it; quarantine (K3) |
| Clock tricks to stretch a lease | Leases are counted on the device's own clock from when they arrived; a changed clock can only shorten them |
| A replayed old lease or signal | Each lease and signal has a unique ID and time; old ones are refused |
| Compromised firmware | No switch can stop that code. Quarantine (K3) and the physical stop (K4) |
Who may pull the switch:
- The owner of a system can always cut its brain, with one approval.
- The operator of a Command Center can cut any scope it serves: one system, a fleet, a model everywhere, one use everywhere, a profile, or everything.
- The global switch (every system of a Command Center), and cutting one model for all owners, needs 3 of 5 named key holders, never one person. Restoring after a global cut needs the same.
- Cutting needs one fewer approval than restoring, except for the global switch, which needs 3 of 5 both ways, and a written review before restoring (HEART Command Center 1.0, Section 4).
Tripwires. A Command Center MUST cut automatically, at the narrowest scope that covers the problem, when a system's gate keeps refusing the brain's Proposals, the same unusual answer appears across many systems, a system reports a safety-relevant disagreement, rate or cost jumps, or a known prompt-injection pattern is seen. A trip tells the owners why, and a person reviews it before the brain comes back. The system itself also cuts its own brain when its gate refuses too many Proposals (API Standard 7.4 rule 11).
The public log. Every lease policy change, cut, restore and trip is written to a tamper-evident public log, with times and reasons but never system data, so anyone can check when and why a switch was pulled.
What a Command Center can never do. It can only lower risk. It can make systems less smart, or sign bad answers, which still meet each system's gate, envelopes, preconditions and approvals. It can never make a system act, approve an Action, raise autonomy or change a setting.
7. Changing the AI model#
A new AI model can behave differently, even if it is "better". So a system with the Full Feature Set MUST:
- Pin the exact model version used in production, where the provider offers one.
- Test a new model against the system's own test cases before adopting it.
- Record every change as
evolving.model.adoptedorevolving.model.rejectedin the Rhythm, so any change in behaviour can be traced to a date. - Be able to go back to the previous model.
Changing the model is a change to authority (Section 4.1), so it needs a person's proof of presence. Going back to the immediately previous pin is lowering, so it is write.
8. One command to many systems#
A HEART Gateway can send one command to many systems at once (a fleet command). A mistake made a thousand times is far worse than the same mistake made once, so:
- Fleet commands MUST roll out in stages: a few systems first, then more, with a pause between stages. The first stage MUST NOT include more than 10% of the target systems (at least one).
- A failure limit pauses the rollout automatically when too many systems fail.
- If the request gives no
rollout, or leaves out part of it, the Gateway MUST use these defaults:batchSize= 5% of the target systems, rounded up,maxFailures= 1,pauseSec= 300. - Each system still applies its own gate.
- Any fleet command that is not
readMUST also be approved by a person at the Gateway, whatever its risk on a single system. That approval follows Section 3 exactly: the fleet command is an Action on the Gateway, and the approval carries proof of presence for its digest. The digest covers the operation, its arguments, whether it is physical, the selector, the rollout, and the exact list of systems it reaches. - One approval, not one per system. The Gateway then sends each system the operation with an approval it signs for that system alone. A system accepts it in place of a person's approval only if the Gateway key it pinned signed it, its own name is on the approved list, the operation and arguments are exactly those approved, and it is at most 300 seconds old. A physical action needs the owner's own consent on the device (
fleetPhysical), as for a remote site. Everything else still holds on each system: its gate, its guards, its limits and Stop (API Standard 13.3).
9. Physical safety#
Embedded systems can hurt people. These rules take priority over everything else in the standard.
- Stay out of the safety chain. A HEART MUST NOT be part of a safety function, such as an emergency stop, overheat cut-out, pressure trip or safety PLC. Safety functions MUST work with the HEART absent, stopped or hacked.
- Stay out of real-time loops. A HEART advises and supervises. It MUST NOT sit in a control loop that has hard timing needs, such as a thermostat loop or motion control.
- Never bypass protection. No capability, custom command or raw device access may disable or override a hardware interlock or a safety controller.
- Physical means risky. A physical action from an AI or another system is always treated as destructive.
- The device has the last word. Devices keep their own limits, whatever a request says.
- Fail safe. If the HEART, the Gateway or the cloud is lost, the device MUST carry on in its normal, safe way.
- Certification is separate. Following HEART says nothing about safety standards such as IEC 61508 (industrial), ISO 26262 (vehicles) or IEC 62304 (medical software).
Where HEART sits in a control system:
| Layer | Run by | HEART's role |
|---|---|---|
| Safety (trips, interlocks, safety PLC) | A certified safety system | None. Read-only at most. |
| Real-time control (thermostat loop, motion, PLC scan) | The existing controller | None in the loop. It may read values. |
| Supervision (setpoints, recipes, modes) | Operators | Advises, and acts only through guards and approval |
| Maintenance and diagnosis | Engineers | Its main value: explains, predicts, gathers evidence |
9.1 Guards#
Product commands can carry guards, checked by the system just before sending, whoever asked (API Standard, Section 14.4):
| Guard | Refuses unless |
|---|---|
whenStates, whenStatus | The system is in an allowed state |
requiresMaintenance | The system is in maintenance |
minIntervalSec, maxPerHour | The command is not repeated too fast |
interlocks | Conditions read from the device at that moment hold, such as "tank level above 10 cm". Each interlock is a check (HEART Core, common check): a signal (a Signal Table signal or a property), an operator and a number. A boolean reads as 1 (true) or 0 (false). An interlock whose signal cannot be read counts as failed. |
A guard or interlock that cannot be checked counts as failed, everywhere, including for native passthrough. A failed guard answers 409 guard-failed, and the refusal is recorded.
10. The threat list#
Every known threat, and the rule that answers it.
| Threat | Answer | Section |
|---|---|---|
| Prompt injection through logs, messages or user text | Untrusted context; permission never depends on model output | 5.2 |
| An AI tricked into a harmful action | The gate is enforced outside the model; destructive AI actions always need a person | 2.3 |
| An AI agent approving with a person's token | Proof of presence for the exact digest; agent tokens are ai | 3 |
| A compromised remote approval site | remote-site proofs are signed with a pinned key, at most 300 s old, and refused for physical Actions unless the owner opted in on the device | 3.2 |
| One approval stretched to more systems or other commands | A fleet approval names the exact targets, operation and arguments, is signed per system with the pinned Gateway key, is at most 300 s old, and is used once | 8 |
| Standing orders created to gain power later | Authority changes are destructive; deferred actions keep their author | 4 |
| A model acting with more power than its user (confused deputy) | onBehalfOf; at most the user's rights | 5.1 |
| An invented command or value | Grounding; nothing unmatched is guessed | 5.3 |
| A message from another system acting as a command | Inbox messages are data, and never trigger Playbooks | 5.2 |
| Runaway AI cost | Budgets checked before each call | 5.4 |
| An AI model changing behaviour silently | Pinned models, tests before adoption, recorded changes | 7 |
| A mistake across a whole fleet | Staged rollout, failure limit, approval at the Gateway | 8 |
| A HEART causing physical harm | Out of the safety chain and control loops; physical means risky | 9 |
| A command run in the wrong conditions | Guards and live interlocks | 9.1 |
| Stolen, forwarded or replayed tokens | Tokens bound to one system and one holder | Part 4, 6 |
| Forged caller headers | Trusted only when signed, or from a verified local process | Part 4, 9.4 |
| An impostor device, or a man in the middle | Identity keys, signed Cards, checked certificates | Part 4, 7 |
| Spoofed or replayed MQTT commands | Signed, short-lived, replay-checked commands | Part 4, 11 |
| A custom command used as a back door | Creating one is destructive; raw access is off by default and closed to AI | API Standard, 14 |
| Command injection through a custom command | Typed, validated values; no shell, ever | API Standard, 14.3 |
| A malicious software update | Updates signed and checked before install | API Standard, 13.2 |
| Data leaking through answers or receipts | The Valve filters before a model sees anything; salted receipts | Part 5 |
11. Changes needed in other files#
| Change | Where |
|---|---|
| When the parts replace the API Standard, Sections 6.3, 7, 10, 11, 13.3, 13.4 and 15 move here. Until then, this part prevails where they differ | HEART-API-Standard-1.0.md |
Record the proof method in an Action's decision (presenceMethod, including remote-site), set by the host after checking | schemas/1.0/action.schema.json, reference implementation |
Add expiresAt and approvedBy to the Action, and approvalTimeoutSec, remoteSitePhysical and the allowlist operation to control | schemas/1.0/, openapi/heart-api-1.0.yaml |
Mark lifecycle and autonomy risks as per-item | openapi/heart-api-1.0.yaml, API Standard 13 |
Add onBehalfOf, the digest and the expiry time to the approval screen guidance in the guides | guides/ |
| Add tests for CIBA and device-button proofs | Part 9, reference implementation |
12. Open items#
| Item | Why it matters |
|---|---|
| Approval fatigue | People who approve many requests start approving without reading. One approval per fleet command (Section 8) groups the largest case. Limits on how often a system may ask may still be needed. |
| Two-person approval | Some industries need two people to approve the most dangerous actions. An optional "two approvers" rule could be added. |
| Device-button proof | How a device proves that its button was really pressed, and by whom, needs a defined format. Until then, device-button is not accepted (Section 3.2). |
| Remote-site strength | remote-site relies on the site's own login. A later version may require the site to pass on a WebAuthn assertion from the person. |
| Emergency override | Owners may need a way to approve quickly in an emergency without lowering any rule. This needs careful design. |
| Safety-case evidence | HEART records could support a safety case (UL 4600, ISO 21448) without being part of the safety function. How is not yet defined. |