host tessila-01 · env dev
All tenants
REQ-111 · lifecycle| Tenant | Plan | State | Modules | Lifecycle |
|---|
Erase a tenant's data
ADR-009 · platform admin onlyNothing is preselected and there is no “select all”, because almost every real erasure is partial. Some categories cannot be erased here and say why rather than being hidden, and this is not the same as deleting the tenant: billing is retained ten years as a blanked stub. Which control keeps nothing, and why.
Choosing what to erase, category by category. Nothing is preselected and there is no
“select all”, because almost every real erasure is partial: a customer leaves
and the billing record stays, a pilot ends and everything but the audit goes.
Some categories cannot be erased here and say why rather than being hidden.
This is not the same as deleting the tenant. Choosing Account clears the identity, and where records must legally outlive it — billing is retained ten years — the row stays as a blanked stub so the ledger is still attributable to something. That is the right answer for a customer exercising a right. For a test tenant, a demo or a mistake, where none of it should exist, use Delete this tenant permanently: it keeps nothing, and it is the only control here that does.
This is not the same as deleting the tenant. Choosing Account clears the identity, and where records must legally outlive it — billing is retained ten years — the row stays as a blanked stub so the ledger is still attributable to something. That is the right answer for a customer exercising a right. For a test tenant, a demo or a mistake, where none of it should exist, use Delete this tenant permanently: it keeps nothing, and it is the only control here that does.
City oversight — state or regional parent
CIV-080 · CIV-053 · platform admin onlyA consolidated view of one city’s aggregate figures and nothing else — and neither tenant can ask for it. No case, plate read, camera, operator or citizen is reachable through it, the authority can take no action in the city, and a parent of a parent is refused by name. Every read lands in the city’s own chain of custody. Why.
A city is an isolated tenant. Declaring a parent gives a state or regional authority a
consolidated view of that city’s aggregate figures (CIV-053) — counts of
incidents, detections, the e-challan funnel, camera health, crowd zones and citizen-rights
compliance, by day — and nothing else. No case, no plate read, no camera or stream, no
operator and no citizen is reachable through it, and the authority can take no action in the
city: it cannot acknowledge, decide, edit or entitle anything.
Neither tenant can ask for this. It is declared here, by a platform administrator, against a recorded basis, and it is one level deep: a parent may not itself have a parent, so a district under a province is refused by name rather than stacked. Every read the authority then makes is recorded in the city’s own chain of custody, which is where a city goes to ask who looked at its figures.
Neither tenant can ask for this. It is declared here, by a platform administrator, against a recorded basis, and it is one level deep: a parent may not itself have a parent, so a district under a province is refused by name rather than stacked. Every read the authority then makes is recorded in the city’s own chain of custody, which is where a city goes to ask who looked at its figures.
| City | Reports to | Basis | Declared | Action |
|---|
Module & feature entitlement
REQ-110 · click a chip to toggle| Tenant | Core modules | Features | State |
|---|
Devices
§6 Connect · a device is provisioned here, and nowhere elseCredential for this device — shown once
Copy this into the device now. The platform stores only a hash of it, so nobody
— including a platform administrator — can read it back. Closing this box is
the last time it exists.
Describe what this device measures
1 · Measurements
2 · Alarms
When will this cross its limit?
close
| Device | Profile | Last seen | State | Credential |
|---|
Fleet lifecycle & circularity
CIV-094 · ADR-009 · chain of custodyErasing a device is refused until somebody records the method, the reference and the date; retiring one never is. This platform did not witness the erasure and does not say it did, and if the movement balances do not reconcile no export is produced at all. Why the two steps are separate, and what the sealed export has to add up to.
Every device carries a lifecycle — procured, deployed, maintained, refurbished,
retired, erased — and every move between them is a chain-of-custody event
recorded with the person who made it. The refusals are recorded too. That is
the half a list of successful transitions throws away, and
“why was this meter not erased on the 4th” is the question a chain
of custody exists to answer.
Retiring a device is not refused. Erasing one is. A device is retired when it comes off the wall, and holding it in “deployed” until somebody produces a certificate would make the estate say a meter in a crate is in service. The certified erasure is a second, guarded step, refused until somebody records the method, the reference and the date — and who asserted it comes from the session, never from a form. This platform did not witness the erasure and never says it did; what it prints is the method, the reference and the name.
The export below is sealed and it reconciles: opening balance, movements in and out, closing balance, and the identity that ties them. A device that changed state twice inside the period is one device and two movements, and both numbers are shown, because a reader given one of them reads it as the other. If the balances do not add up, or the record did not fit in one read, no export is produced at all.
Retiring a device is not refused. Erasing one is. A device is retired when it comes off the wall, and holding it in “deployed” until somebody produces a certificate would make the estate say a meter in a crate is in service. The certified erasure is a second, guarded step, refused until somebody records the method, the reference and the date — and who asserted it comes from the session, never from a form. This platform did not witness the erasure and never says it did; what it prints is the method, the reference and the name.
The export below is sealed and it reconciles: opening balance, movements in and out, closing balance, and the identity that ties them. A device that changed state twice inside the period is one device and two movements, and both numbers are shown, because a reader given one of them reads it as the other. If the balances do not add up, or the record did not fit in one read, no export is produced at all.
| Device | State | Retired | Certified erasure | Asserted by |
|---|
Cold chain
PKG-02 · ECO-003 · excursions, spoilage, SLAA room that is not reporting is its own state, and a gap in the temperature history refuses the spoilage score outright rather than reading silence as compliance. The uptime figure refuses any period containing time the room was not heard from, and there is no field for who opened a door and never will be (PRD-001). Why nothing is interpolated across a gap.
A cold room carries an excursion lifecycle — in band, door open,
defrosting, above band, above the limit, and not reporting. The last of those is
a state and not a flag, because a room nobody has heard from is not a room that is in
band, and every figure below has to be able to tell those two apart.
A spoilage score is a claim about somebody’s stock, so it is never a bare number: it carries the thresholds it was measured against, the time above each of them, and the coverage of the window. A gap in the temperature history refuses it outright. An unmonitored hour contributes no minutes above any threshold, which is exactly what a compliant hour looks like — so a score computed across a gap reads silence as compliance, and that is how spoiled product gets certified. Nothing is interpolated across a gap; the gaps are listed instead.
The uptime figure is the number a customer gets paid on. It refuses a truncated read, an unfinished period, a period with no baseline, and any period containing time the room was not reporting — that time is neither up nor down, and both ways of absorbing it (counting it as up, or dividing by the observed time instead of the period) produce a real number about a different period from the one on the label.
Door-open analytics is about the door. Openings, durations and the hour of the day. There is no field for who opened it and there never will be (PRD-001).
A spoilage score is a claim about somebody’s stock, so it is never a bare number: it carries the thresholds it was measured against, the time above each of them, and the coverage of the window. A gap in the temperature history refuses it outright. An unmonitored hour contributes no minutes above any threshold, which is exactly what a compliant hour looks like — so a score computed across a gap reads silence as compliance, and that is how spoiled product gets certified. Nothing is interpolated across a gap; the gaps are listed instead.
The uptime figure is the number a customer gets paid on. It refuses a truncated read, an unfinished period, a period with no baseline, and any period containing time the room was not reporting — that time is neither up nor down, and both ways of absorbing it (counting it as up, or dividing by the observed time instead of the period) produce a real number about a different period from the one on the label.
Door-open analytics is about the door. Openings, durations and the hour of the day. There is no field for who opened it and there never will be (PRD-001).
| Room | Profile | State | Since | Lifecycle |
|---|
Device profiles
CON · what a measurement means
A profile says what a device’s readings MEAN: the unit, what counts as normal, and
the hard limit past which the asset is damaged. Charts draw their bands from it and
forecasts project to its limit, so a wrong number here is wrong for every device using
the profile — which is why it could be created and, until now, never corrected.
A profile in use cannot be deleted. Removing one would leave those devices pointing at nothing: their bands disappear and their forecasts lose the limit they project to, with no error anywhere. The refusal names the devices.
A profile in use cannot be deleted. Removing one would leave those devices pointing at nothing: their bands disappear and their forecasts lose the limit they project to, with no error anywhere. The refusal names the devices.
| Profile | Measurements | Devices using it | Updated |
|---|
What normal looks like
AII-003 · measured, not assumed
A reading is only high or low compared to something, and this is the something.
Each row is what this device's own numbers have been, learned from them and from
nothing else — no model, no vendor's idea of normal, no data leaving the
jurisdiction.
“Still learning” is an answer, not a gap. A detector that scores a reading against three observations is not detecting anything, it is guessing with a number attached. Until a baseline has enough to be worth comparing against, it says so and scores nothing.
“Still learning” is an answer, not a gap. A detector that scores a reading against three observations is not detecting anything, it is guessing with a number attached. Until a baseline has enough to be worth comparing against, it says so and scores nothing.
| Device & measurement | Normal range | Learned from | Flagged |
|---|
Operational forecasting
AII-005 · 010 · measured, or refused
Ask what a measurement will do next, from this tenant’s own readings. Every answer
carries the model and its version, the horizon it speaks about, a prediction
interval and an error measured on history the model did not see — and
most of the time the answer is a refusal, because a bin whose truck stopped reporting for
a week has no forecast and a week nobody measured is not a quiet week.
This is not the copilot. A paragraph a language model writes about a junction is an outlook, carries no interval and no measured accuracy, and says so on its own label.
This is not the copilot. A paragraph a language model writes about a junction is an outlook, carries no interval and no measured accuracy, and says so on its own label.
| Model & version | Registered | Definition |
|---|
What was shown, and how well it did (AII-010). Every forecast this tenant was given,
with the version that produced it and the accuracy it was shown with — or the reason
no figure was given.
| Subject & series | Model | Answer | Error (held out) | Input drift |
|---|
District utility & environment
PRD-023 · water, loss, air, floodA district with silent meters is not a district with low demand, so a point whose sources were mostly quiet is a gap and is never scaled up to stand for the whole district. Network loss is computed only where both sides were observed, and none of this is ever about a person, a household or a meter account (PRD-001). How the coverage travels with each point.
Water demand, network-loss trend, air quality and flood level for a district —
on the same measured primitive as the panel above, and never about a person, a household
or a meter account (PRD-001).
Every point carries how many of the district’s sources reported into it. A point whose meters were mostly quiet is a gap, not a low reading, and it is never scaled up to stand for the whole district: a district with silent meters is not a district with low demand. Network loss is a difference and is computed only where both sides were observed — subtracting an absent reading yields the whole of supply as the loss, which is what a burst main looks like.
Every point carries how many of the district’s sources reported into it. A point whose meters were mostly quiet is a gap, not a low reading, and it is never scaled up to stand for the whole district: a district with silent meters is not a district with low demand. Network loss is a difference and is computed only where both sides were observed — subtracting an absent reading yields the whole of supply as the loss, which is what a burst main looks like.
The threshold is yours. This platform states none: what counts as too much demand is
the network’s capacity, what counts as bad air is the standard’s category
boundary, and what counts as a flood is the stage an authority set (BCN-002).
Nothing here warns anybody — a public warning is the authorised
authority’s and is issued from Beacon, from a reading a gauge actually took
(BCN-003).
Every frozen feed in the city
PRD-024 · the scheduled sweepAn empty table here can mean the feeds that were read are reporting, or that nobody looked, so the coverage sentence above it is never absent and never a guess. A sweep that was refused, or that ran out of budget part way through the estate, leaves the same empty table as a healthy city. Nothing here has been acted on: a finding does not book an engineer, take an asset out of service or write to a device.
The panel below this one answers for one device you chose. This one is what a
schedule found on every device of this tenant, whether anybody opened it or not
— because the instruments most likely to be broken are exactly the ones nobody has a
reason to click on.
An empty list here is two completely different facts, and the line above the table says which. It can mean the feeds that were read are reporting. It can also mean nobody has looked: the sweep has never run for this tenant, or it was refused, or it ran out of budget part way through the estate, or it failed. A sweep that did not happen leaves exactly the same empty table as a healthy city, so the coverage sentence is never absent and is never a guess.
Somebody is told now, and the line under the table says who. A frozen feed raises an alarm on that instrument’s own device row, and a sweep that could not cover the estate at all raises one about the estate — which is the only way anybody learns that an empty table above means nobody looked. Both land on the ordinary alarm board, and Pulse keeps one open alarm per subject, so a camera frozen for a fortnight is raised once and not every six hours.
Nothing here has been acted on. A finding is a record, this screen and an alarm: no engineer is booked, no asset is taken out of service, no threshold moves and no device is written to.
An empty list here is two completely different facts, and the line above the table says which. It can mean the feeds that were read are reporting. It can also mean nobody has looked: the sweep has never run for this tenant, or it was refused, or it ran out of budget part way through the estate, or it failed. A sweep that did not happen leaves exactly the same empty table as a healthy city, so the coverage sentence is never absent and is never a guess.
Somebody is told now, and the line under the table says who. A frozen feed raises an alarm on that instrument’s own device row, and a sweep that could not cover the estate at all raises one about the estate — which is the only way anybody learns that an empty table above means nobody looked. Both land on the ordinary alarm board, and Pulse keeps one open alarm per subject, so a camera frozen for a fortnight is raised once and not every six hours.
Nothing here has been acted on. A finding is a record, this screen and an alarm: no engineer is booked, no asset is taken out of service, no threshold moves and no device is written to.
What this city has asked to keep current
§31.2 · the registration, and what the passes managedA figure on a forecasting screen is as fresh as the last time somebody opened it, unless something keeps it current — and “keep this current” is a decision somebody records here, with their name and their reason, not a list this platform infers. Two of the five surfaces cannot be refreshed by a schedule at all, and the table says which registered places those are rather than leaving them out. One of the five has no registrable subject at all, and that is written down rather than worked around.
Why a decision and not an inference. Keeping a corridor’s congestion forecast
current costs model fits every six hours for as long as the registration stands. A
platform that inferred the list would spend that on whatever anybody once clicked, so
every row names the person who recorded it and the basis they stated — the same rule
a road’s stated capacity follows.
An empty “last attempt” is not a fresh figure. A registered place the passes have never reached looks exactly like one registered a minute ago, and only one of those is a problem. So every row carries what the last pass actually managed and, where it could not, why — a refusal with a cause rather than a gap in a table.
Two surfaces cannot be refreshed and say so by name. A crowd zone’s count series and a district’s aggregate arrive WITH the request, because this platform holds no aggregate series of its own. There is nothing for a schedule to re-read, and a schedule that composed one would be filing a series it invented under the place’s name. Every registered zone and district is therefore refused on every run with readings-not-held, which is a stated gap about a named place — a place missing from a refresh list reads as one whose forecast is holding.
And one surface has no subject at all. An incident-hotspot map is about a whole watched road network, and this platform’s closed list of what an alarm or a registration may be about has no member meaning that. It was not invented and it was not borrowed from a member that already means something else, so that surface stays pull-only; the table says what declaring one would take.
Nothing here is acted on. A registration decides WHEN a surface is recomputed and nothing else: no threshold moves, no responder is dispatched and no device is written to.
An empty “last attempt” is not a fresh figure. A registered place the passes have never reached looks exactly like one registered a minute ago, and only one of those is a problem. So every row carries what the last pass actually managed and, where it could not, why — a refusal with a cause rather than a gap in a table.
Two surfaces cannot be refreshed and say so by name. A crowd zone’s count series and a district’s aggregate arrive WITH the request, because this platform holds no aggregate series of its own. There is nothing for a schedule to re-read, and a schedule that composed one would be filing a series it invented under the place’s name. Every registered zone and district is therefore refused on every run with readings-not-held, which is a stated gap about a named place — a place missing from a refresh list reads as one whose forecast is holding.
And one surface has no subject at all. An incident-hotspot map is about a whole watched road network, and this platform’s closed list of what an alarm or a registration may be about has no member meaning that. It was not invented and it was not borrowed from a member that already means something else, so that surface stays pull-only; the table says what declaring one would take.
Nothing here is acted on. A registration decides WHEN a surface is recomputed and nothing else: no threshold moves, no responder is dispatched and no device is written to.
Is the instrument itself failing?
PRD-024 · the estate, not what it measuresA frozen feed is the one failure that looks like perfect health, so when a feed is frozen or silent the predictions below are withheld rather than computed and the reason is shown in their place. The four rows are four kinds of evidence and are not comparable: an R² is not a held-out error, and a report count says nothing about the future at all. Why a constant scores the lowest error on the estate.
Every number on this platform is made of streetlights, cameras and roadside sensors. This
asks whether one of them is on its way to failing — from the shape of its
reporting as much as from what it reports.
A frozen feed is the one failure that looks like perfect health. A hung encoder, a latched ADC or a controller repeating its last good frame keeps arriving on time, at the right rate, with a plausible value, so every arrival-based check says the device is fine — and the seasonal forecast fitted to a constant scores the lowest error on the whole estate. When a feed is frozen or silent, the predictions below are withheld rather than computed, and the reason is shown in their place.
The four rows are four different kinds of evidence and are not comparable. An R² says how well a line describes the readings it was fitted to; a held-out error says how wrong a model was on history it had not seen; a report count says nothing about the future at all. Each row says which it is.
A frozen feed is the one failure that looks like perfect health. A hung encoder, a latched ADC or a controller repeating its last good frame keeps arriving on time, at the right rate, with a plausible value, so every arrival-based check says the device is fine — and the seasonal forecast fitted to a constant scores the lowest error on the whole estate. When a feed is frozen or silent, the predictions below are withheld rather than computed, and the reason is shown in their place.
The four rows are four different kinds of evidence and are not comparable. An R² says how well a line describes the readings it was fitted to; a held-out error says how wrong a model was on history it had not seen; a report count says nothing about the future at all. Each row says which it is.
Awaiting a human
AII-011 · nothing here has happened
A forecast that books an engineer is a model spending somebody’s money. Everything
the platform predicts arrives here instead, doing nothing, until a named person
accepts or declines it — and the platform refuses to record a decision with
nobody attached to it. Accepting does not schedule the work; it records that
a person agreed the window is right, which is what a maintenance system is then
handed.
| Recommendation | Confidence | Source | Raised | Decision |
|---|
Dashboards
VIS · a dashboard is a documentA stale save is refused rather than replacing somebody’s work, and a public link is a grant whose URL this platform cannot show a second time. A widget binds to an alias by NAME and never to a device, publishing freezes the devices resolved at that moment, and the history is bounded and says how many versions are no longer held.
One page renders every dashboard. The document says which widgets and which aliases;
the alias resolver says which devices, per tenant and per viewer. That is why a widget
binds to an alias by NAME and never to a device: replace a pump and the dashboard is
unchanged.
Saving carries the version you loaded. If somebody else has saved since, the write is refused and you are told, rather than their work being replaced by yours.
History is kept, bounded, and a restore moves forward. Every version this dashboard replaced is held, so “put the wall display back the way it was” has an answer at three in the morning. Restoring version 3 writes a NEW version whose content is old rather than setting the counter back — two documents sharing a number would break the refusal above. How far back the history goes is bounded, and the panel says how many older versions are no longer held, because a history that starts at version 400 otherwise looks exactly like one that starts at version 1.
A public link is a grant, not this dashboard without a login. Publishing freezes the devices the dashboard resolves to AT THAT MOMENT, and the link shows those and only those for as long as it lives. A dashboard that says “every pump” would otherwise publish the pump installed next March by an engineer who has never heard of the link. Adding a device to the estate does not add it to a link: publishing more is minting a new one, which is a decision with a date and a name on it. The URL is shown once, when it is minted, and this platform cannot show it again.
Saving carries the version you loaded. If somebody else has saved since, the write is refused and you are told, rather than their work being replaced by yours.
History is kept, bounded, and a restore moves forward. Every version this dashboard replaced is held, so “put the wall display back the way it was” has an answer at three in the morning. Restoring version 3 writes a NEW version whose content is old rather than setting the counter back — two documents sharing a number would break the refusal above. How far back the history goes is bounded, and the panel says how many older versions are no longer held, because a history that starts at version 400 otherwise looks exactly like one that starts at version 1.
A public link is a grant, not this dashboard without a login. Publishing freezes the devices the dashboard resolves to AT THAT MOMENT, and the link shows those and only those for as long as it lives. A dashboard that says “every pump” would otherwise publish the pump installed next March by an engineer who has never heard of the link. Adding a device to the estate does not add it to a link: publishing more is minting a new one, which is a decision with a date and a name on it. The URL is shown once, when it is minted, and this platform cannot show it again.
| Name | Widgets | Aliases | Window | Updated |
|---|
What this platform polls
SNMP · read-only, by constructionThis platform cannot write over SNMP: there is no SET encoder and no constant for one, because SNMP SET is how you reboot a switch or trip a relay and that belongs to whoever owns the actuator. Passphrases are never typed into a target, and loopback, link-local including the cloud metadata address, and multicast are refused. Why v3 and v2c are not cosmetically different.
Switches, routers, UPSs, PDUs and substation gear speak SNMP and are already on the
wall. A target says which agent to poll and which OID means which measurement; what
comes back goes through the ordinary ingest path, so it is metered, scored and
evaluated against rules exactly like a reading a device posted itself.
This platform cannot write over SNMP. There is no SET encoder and no constant for one. SNMP SET is how you reboot a switch or trip a relay, and that is actuation: it belongs to whoever owns the actuator, not to a monitoring platform.
Version 3 or version 2c, and the difference is not cosmetic. v2c sends its community string in cleartext in every packet. v3 authenticates every message and can encrypt it. Passphrases are never typed into a target: a target names a secret, and the value lives in the server’s secret store — the same arrangement the SMS gateways use.
A target is an outbound request to an address you choose. Loopback, link-local — including the cloud metadata address — and multicast are refused, because those are this platform’s own network rather than yours.
This platform cannot write over SNMP. There is no SET encoder and no constant for one. SNMP SET is how you reboot a switch or trip a relay, and that is actuation: it belongs to whoever owns the actuator, not to a monitoring platform.
Version 3 or version 2c, and the difference is not cosmetic. v2c sends its community string in cleartext in every packet. v3 authenticates every message and can encrypt it. Passphrases are never typed into a target: a target names a secret, and the value lives in the server’s secret store — the same arrangement the SMS gateways use.
A target is an outbound request to an address you choose. Loopback, link-local — including the cloud metadata address — and multicast are refused, because those are this platform’s own network rather than yours.
| Target | Version | Measurements | Last heard |
|---|
Entity groups
A named set of thingsA group is not a place, and its membership is a list you write rather than a rule that computes. A saved filter is more convenient and the wrong shape: it would change when somebody renames a device from a screen where nobody knows this group exists, moving a machine into or out of somebody's access. A member that no longer exists is shown as missing rather than quietly dropped.
The pumps serviced under one contract, the sensors a fire officer signed off,
everything on the Tuesday round. A group is a label you put on a set so a screen or a
report can name it in one word.
A group is not a place. The site map answers where a thing is, and a thing is in exactly one container. A group answers something else, and a thing is in as many groups as you find useful.
Membership is a list you write, not a rule that computes. A saved filter is more convenient and is the wrong shape: a group is what a permission will be granted on, so a computed set would change when somebody renames a device or corrects its type. That person is looking at a device screen, has no idea this group exists, and has just moved a machine into or out of somebody’s access. If you want every pump, the device and asset lists already filter by type.
A member that no longer exists is shown as missing rather than quietly dropped, and deleting an entity takes it out of every group, because an id can be registered again and a leftover membership would attach itself to the next machine with that name.
A group is not a place. The site map answers where a thing is, and a thing is in exactly one container. A group answers something else, and a thing is in as many groups as you find useful.
Membership is a list you write, not a rule that computes. A saved filter is more convenient and is the wrong shape: a group is what a permission will be granted on, so a computed set would change when somebody renames a device or corrects its type. That person is looking at a device screen, has no idea this group exists, and has just moved a machine into or out of somebody’s access. If you want every pump, the device and asset lists already filter by type.
A member that no longer exists is shown as missing rather than quietly dropped, and deleting an entity takes it out of every group, because an id can be registered again and a leftover membership would attach itself to the next machine with that name.
| Group | Members | Missing |
|---|
Entity views
A narrower way of looking at one thingA view narrows and it never grants: holding one is not permission, and somebody who cannot read the device cannot read a view of it either. You list what may be read and never what may not, because a hide-list exposes the next measurement the device sends by default; a view with nothing listed is refused rather than treated as unrestricted, and attributes default to none.
A pump reports forty measurements. The contractor who services its bearings should see
vibration and temperature, from the date their contract started, and nothing else. A
view is that: one entity, a list of what may be read from it, and optionally a window
of when.
A view narrows. It never grants. Holding one is not permission: every read still goes through your ordinary sign-in, and somebody who could not read the device cannot read a view of it either. What a view does is take somebody already entitled and give them less. When this platform has customers beneath a tenant, a grant will point at a view, and the restriction is already written.
You list what may be read, never what may not. A hide-list reads more naturally and fails on the next reading the device sends: somebody adds a measurement in six months, against a view written by a person who has left, and it is exposed by default. A view with nothing listed is refused rather than treated as unrestricted.
Attributes are separate and default to none. That is where a serial number, a site address and an installer’s phone number live — the fields least likely to be thought about by somebody writing a view about vibration.
A view narrows. It never grants. Holding one is not permission: every read still goes through your ordinary sign-in, and somebody who could not read the device cannot read a view of it either. What a view does is take somebody already entitled and give them less. When this platform has customers beneath a tenant, a grant will point at a view, and the restriction is already written.
You list what may be read, never what may not. A hide-list reads more naturally and fails on the next reading the device sends: somebody adds a measurement in six months, against a view written by a person who has left, and it is exposed by default. A view with nothing listed is refused rather than treated as unrestricted.
Attributes are separate and default to none. That is where a serial number, a site address and an installer’s phone number live — the fields least likely to be thought about by somebody writing a view about vibration.
| View | Of | May read | Window |
|---|
Plant this platform reads
Modbus TCP · read-only, by constructionThis platform cannot write to a PLC: there is no encoder for a write function code and no constant for one. A value wider than one register is refused without a declared word order, a 4xxxx or 3xxxx address is refused with the arithmetic done for you, and unit 0 is refused. Why each, and what a target is.
Modbus was published in 1979 and is in every building management system, VFD, power
meter, PLC, flow computer and RTU your sites already own. A target says which
controller to read and which registers mean which measurement; what comes back goes
through the ordinary ingest path, so it is metered, scored and evaluated against rules
exactly like a reading a device posted itself.
This platform cannot write to a PLC. There is no encoder for a write function code and no constant for one. A Modbus write goes into the registers a controller keeps its setpoints in — a pump speed, a burner demand, a valve position, an interlock — and that belongs to whoever owns the plant and carries the hazard study, not to a monitoring platform.
A register has no type, so you have to say what it is. A holding register is sixteen bits and nothing more. A float is two of them, and the standard defines byte order within a register while saying nothing about the order of the registers themselves — so both are conformant and vendors are split. Guessing does not produce an error, it produces a plausible wrong number: a flow of 10.0 read the other way round is 2.3e-41 on Monday and something that looks reasonable on Tuesday. Every value wider than one register must declare its word order, and that is refused rather than defaulted.
Addresses here are wire addresses and count from zero. If the manual says 40001, the wire address is 0. Numbers in the 4xxxx and 3xxxx ranges are refused with the arithmetic done for you, because transcribing them is the commonest Modbus configuration mistake there is and it reads real data from the wrong place rather than failing.
The unit id matters even over TCP. A serial gateway fronts up to 247 slaves on one address and port, distinguished by that one byte. Unit 0 is the serial broadcast address and is refused: a gateway may answer it from whichever slave it likes.
This platform cannot write to a PLC. There is no encoder for a write function code and no constant for one. A Modbus write goes into the registers a controller keeps its setpoints in — a pump speed, a burner demand, a valve position, an interlock — and that belongs to whoever owns the plant and carries the hazard study, not to a monitoring platform.
A register has no type, so you have to say what it is. A holding register is sixteen bits and nothing more. A float is two of them, and the standard defines byte order within a register while saying nothing about the order of the registers themselves — so both are conformant and vendors are split. Guessing does not produce an error, it produces a plausible wrong number: a flow of 10.0 read the other way round is 2.3e-41 on Monday and something that looks reasonable on Tuesday. Every value wider than one register must declare its word order, and that is refused rather than defaulted.
Addresses here are wire addresses and count from zero. If the manual says 40001, the wire address is 0. Numbers in the 4xxxx and 3xxxx ranges are refused with the arithmetic done for you, because transcribing them is the commonest Modbus configuration mistake there is and it reads real data from the wrong place rather than failing.
The unit id matters even over TCP. A serial gateway fronts up to 247 slaves on one address and port, distinguished by that one byte. Unit 0 is the serial broadcast address and is refused: a gateway may answer it from whichever slave it likes.
| Controller | Unit | Measurements | Last heard |
|---|
The cooling template
PKG-01 · rows this tenant owns, not a built-inRe-running never overwrites an edit, and nothing is installed into anybody's tenant until somebody asks. What it writes are rows this tenant owns and can edit, not a built-in the profile screen cannot see. The unit is part of every key name because changing a unit under a stable key silently reinterprets every reading already recorded against it, so the plant's own gauges decide and not the server.
Installing writes four ordinary device profiles — chiller, computer-room air
handler, pump, energy-transfer station — plus the standard condition alarm rules and
a plant dashboard. They are rows this tenant owns and can edit from the screens that
already exist, not a hidden built-in the profile screen cannot see. Re-running never
overwrites an edit: anything already here is kept and reported.
The unit is part of every key name (
Nothing is installed into anybody’s tenant until somebody asks.
The unit is part of every key name (
chw_supply_temp_c against
chw_supply_temp_f), and that is deliberate. Changing a unit under a stable
key name silently reinterprets every reading already recorded against it, so changing
the unit has to be a new series rather than a re-labelled one. Pick the system the
plant’s own gauges read in; it is the plant’s choice, not the server’s,
so two tenants on one deployment may differ.
Nothing is installed into anybody’s tenant until somebody asks.
What each asset can actually be measured on
PKG-01 · a figure that cannot be computed says soNeither delta-T nor kW/ton is a reading, and a row shows a number only when both readings exist, are declared in the same unit and describe one state of the plant. Otherwise it says which was missing: a dead return sensor would read as a plant that has stopped transferring heat, and a load sensor at zero as the most efficient chiller ever built. “No loop” is not a fault and no sensor will fix it.
Delta-T is the return temperature minus the supply temperature on one loop: how
much heat the water actually carried. kW/ton is electrical power divided by the
cooling delivered — kilowatts over tons of refrigeration, which is an SI numerator
over a US-customary denominator, so the conversion is stated on every figure that uses
it.
Neither is a reading. Each is computed from two readings, and a row here shows a number only when both exist, are declared in the same unit, and were taken close enough together to describe one state of the plant. Otherwise the row says which of those was missing. A dead return sensor would otherwise produce a delta-T of zero, which reads as a plant that has stopped transferring heat, and a load sensor at zero would produce the most efficient chiller ever built. Both look exactly like measurements.
“No loop” and “no load declared” are not faults. A pump has a suction and a discharge pressure, which are not a supply and a return; an air handler does not measure the heat it moves. Those rows will never carry that figure and no sensor will fix it.
Neither is a reading. Each is computed from two readings, and a row here shows a number only when both exist, are declared in the same unit, and were taken close enough together to describe one state of the plant. Otherwise the row says which of those was missing. A dead return sensor would otherwise produce a delta-T of zero, which reads as a plant that has stopped transferring heat, and a load sensor at zero would produce the most efficient chiller ever built. Both look exactly like measurements.
“No loop” and “no load declared” are not faults. A pump has a suction and a discharge pressure, which are not a supply and a return; an air handler does not measure the heat it moves. Those rows will never carry that figure and no sensor will fix it.
| Asset | Profile | Loop | Delta-T | kW/ton | Why there is no figure |
|---|
Firmware
OTA · signed, or not acceptedAn image is verified before it is stored and anything that does not verify is refused; a deployment with no key cannot accept firmware at all. Unsigned firmware distribution is remote code execution with a rollout schedule. Revoking keeps the record rather than removing the row, because a record pointing at a row that is gone is worse than one marked withdrawn. Why the digest is checked again on the way out.
An image is verified before it is stored. The platform checks the vendor’s
signature against the key configured for this deployment, and refuses anything that does
not verify. A deployment with no key cannot accept firmware at all — unsigned
firmware distribution is remote code execution with a rollout schedule.
The digest is checked again on the way out. The signature says who made these bytes; the digest says the bytes about to reach a fleet are still the ones that were checked.
Revoking keeps the record. A campaign that shipped an image is something somebody will read later, and a record pointing at a row that is gone is worse than one pointing at a row marked withdrawn.
The digest is checked again on the way out. The signature says who made these bytes; the digest says the bytes about to reach a fleet are still the ones that were checked.
Revoking keeps the record. A campaign that shipped an image is something somebody will read later, and a record pointing at a row that is gone is worse than one pointing at a row marked withdrawn.
| Image | Version | Size | Digest | State |
|---|
Rollouts
OTA · silence does not advance a rolloutNothing advances on its own, and sent is not installed: a rollout continues only when enough devices have said they are running the new build. A batch nobody has heard from has no failures and would pass a failure threshold while telling you nothing at all. A version that could not be read is not a version that is behind, nothing is ever moved backwards, and Stop is final.
The first batch is a canary, and every batch is followed by a hold. The hold is
not politeness: it is the only moment at which evidence exists and somebody can still
act on it. Nothing advances on its own — each batch is sent because a person asked
for it.
Sent is not installed. Sent means this platform finished writing bytes. Installed means the device came back and said it is running the new build. A rollout continues only when enough devices have said so: a batch nobody has heard from has no failures, and would pass a failure threshold while telling you nothing at all.
Nothing is ever moved backwards. A device already on this version or newer is skipped, and so is one whose version could not be read — “I could not read it” is not “it is behind”.
Stop is final. Halting a rollout ends it. Continuing afterwards means planning a new one, which is a decision with a name on it.
Sent is not installed. Sent means this platform finished writing bytes. Installed means the device came back and said it is running the new build. A rollout continues only when enough devices have said so: a batch nobody has heard from has no failures, and would pass a failure threshold while telling you nothing at all.
Nothing is ever moved backwards. A device already on this version or newer is skipped, and so is one whose version could not be read — “I could not read it” is not “it is behind”.
Stop is final. Halting a rollout ends it. Continuing afterwards means planning a new one, which is a decision with a name on it.
| Rollout | Version | State | Progress |
|---|
The estate
TWN · a rollup, not a second alarmUnknown is not clear: an asset with nothing beneath it has not been observed at all. The state on a row is not stored anywhere, an alarm is never copied up the hierarchy, and a second parent is refused rather than counted twice. What an asset is, and what Inspect asks.
An asset is anything that is not a device: a site, a building, a line, a machine.
Containment is what a rollup walks, so this is the difference between a control room
being told Line 3 is in alarm and being told a sensor id.
The state on a row is not stored anywhere. It is computed when this screen asks: the worst severity open beneath that asset at that moment. The alarm itself stays on the device and the rule that raised it, where it can still be acknowledged — copying it up the hierarchy would turn one bearing into five alarms, four of which nobody can acknowledge meaningfully.
Unknown is not clear. An asset with nothing beneath it has not been observed to be fine; it has not been observed at all. A map somebody has not finished wiring up must not read as a quiet plant.
A thing is contained by one thing. A second parent makes a rollup count the same alarm twice and leaves “where is this” with no answer, so the platform refuses it. Move it instead.
Inspect asks the rollup itself. The State column is a summary computed for the whole map in one pass; Inspect asks for one asset and gets the severity breakdown and the chain it hangs from. That chain is the answer to the question somebody standing in front of a sensor actually has, which is not “is anything wrong” but “what is this part of”.
The state on a row is not stored anywhere. It is computed when this screen asks: the worst severity open beneath that asset at that moment. The alarm itself stays on the device and the rule that raised it, where it can still be acknowledged — copying it up the hierarchy would turn one bearing into five alarms, four of which nobody can acknowledge meaningfully.
Unknown is not clear. An asset with nothing beneath it has not been observed to be fine; it has not been observed at all. A map somebody has not finished wiring up must not read as a quiet plant.
A thing is contained by one thing. A second parent makes a rollup count the same alarm twice and leaves “where is this” with no answer, so the platform refuses it. Move it instead.
Inspect asks the rollup itself. The State column is a summary computed for the whole map in one pass; Inspect asks for one asset and gets the severity breakdown and the chain it hangs from. That chain is the answer to the question somebody standing in front of a sensor actually has, which is not “is anything wrong” but “what is this part of”.
| Asset | Contained by | Beneath it | State |
|---|
Devices under nothing
TWN · reporting, alarming, on no map
These devices are named somewhere in the graph and are contained by no asset. They still
report and they still raise alarms — they simply appear beneath nothing here, so
nobody watching a site rollup will see them. That is the failure this panel exists to
make visible rather than to hide.
| Device |
|---|
Field captures waiting on you
TWN · nothing here has reached the registerYou cannot accept your own capture, and no photograph is read by a model in this deployment. A capture is a proposal and not a change; a failed check digit is dropped rather than shown at a low number, a typed field carries no confidence at all, and the figure is the WEAKEST field rather than an average. Why each.
An engineer standing in front of a machine photographs it, scans its tag and types what
is on the rating plate. What arrives here is a proposal, not a change: the asset
register is exactly as it was until somebody on this screen accepts it.
You cannot accept your own capture. The whole of this control is that somebody who was not standing in front of the asset checks what was read off it. An operator can capture and cannot accept at all; an administrator who captured a thing is refused on that row by name.
Read from says how each field was obtained, and it is what the confidence is computed from. A scanned code that passed its own check digit is the strongest thing here; a code that FAILED one is dropped rather than shown at a low number, because a failed check digit is a misread and not an uncertain read. Typed carries no confidence at all — it is a person’s eyesight, on the record and attributed, and not something this platform measured. So a capture containing anything typed shows “—” rather than a figure, and the figure you do see is the weakest field in the proposal, not an average: accepting is one act over all of them.
No photograph is read by a model in this deployment. The capability line below says so. The seam exists and is empty, and a field claiming to have come from a model is refused rather than accepted — nothing here called one.
Declining asks why. The next engineer is sent back to the same asset with the same phone, and without a reason they take the same photograph again.
You cannot accept your own capture. The whole of this control is that somebody who was not standing in front of the asset checks what was read off it. An operator can capture and cannot accept at all; an administrator who captured a thing is refused on that row by name.
Read from says how each field was obtained, and it is what the confidence is computed from. A scanned code that passed its own check digit is the strongest thing here; a code that FAILED one is dropped rather than shown at a low number, because a failed check digit is a misread and not an uncertain read. Typed carries no confidence at all — it is a person’s eyesight, on the record and attributed, and not something this platform measured. So a capture containing anything typed shows “—” rather than a figure, and the figure you do see is the weakest field in the proposal, not an average: accepting is one act over all of them.
No photograph is read by a model in this deployment. The capability line below says so. The seam exists and is empty, and a field claiming to have come from a model is refused rather than accepted — nothing here called one.
Declining asks why. The next engineer is sent back to the same asset with the same phone, and without a reason they take the same photograph again.
| Capture | Read from | Confidence | Captured by |
|---|
Bulk import from an engineering register
ECO-024 · dry run first, alwaysThe dry run is not optional, nothing is ever deleted, and one conflict stops all of it. An import never creates a device, and a column naming a person is refused whole by name rather than skipped quietly (PRD-001). Why each, and the columns.
Paste or open the plant's CSV register. One row per tag, repeating the asset id, with
the columns listed below. It creates assets, containment and the tags' limit
attributes.
The dry run is not optional. The Commit button is dead until a dry run has been taken, and it sends that dry run's digest back with the artefact — so if anything moved in between, the commit is refused rather than applying differences nobody looked at.
Nothing is deleted, ever. Not an asset, not an edge, not a measurement key this artefact happens not to mention. An import is the register arriving, not an authority over what is already here, so the keys it leaves alone are listed rather than removed.
It never creates a device. A row naming a device this tenant has not registered is a conflict. Registering one mints a credential that is handed over once, so an import that created devices could not be rolled back exactly — and an exact rollback is the whole point.
A conflict stops all of it. There is no “import the good rows”: that builds a hierarchy quietly missing branches, which is the failure a bulk tool is most able to hide.
No column for a person — owner, operator, contact, engineer. The import refuses the whole artefact and names the column (PRD-001). It is not dropped quietly, because a column the platform skipped is a column you believe was imported.
The dry run is not optional. The Commit button is dead until a dry run has been taken, and it sends that dry run's digest back with the artefact — so if anything moved in between, the commit is refused rather than applying differences nobody looked at.
Nothing is deleted, ever. Not an asset, not an edge, not a measurement key this artefact happens not to mention. An import is the register arriving, not an authority over what is already here, so the keys it leaves alone are listed rather than removed.
It never creates a device. A row naming a device this tenant has not registered is a conflict. Registering one mints a credential that is handed over once, so an import that created devices could not be rolled back exactly — and an exact rollback is the whole point.
A conflict stops all of it. There is no “import the good rows”: that builds a hierarchy quietly missing branches, which is the failure a bulk tool is most able to hide.
No column for a person — owner, operator, contact, engineer. The import refuses the whole artefact and names the column (PRD-001). It is not dropped quietly, because a column the platform skipped is a column you believe was imported.
| Import | When | By | What it wrote | State |
|---|
Sites
EDG · a site that survives its linkErasing a tenant does not reach these machines: readings already buffered on the hardware at the site stay on that hardware (ADR-009 §6.4). Last handover is not last contact, so a stale cursor is a question and not a verdict, and a tenant with no nodes is the normal state rather than a fault. Why the scope list is the security boundary and why changing it bumps the node's generation.
An edge node runs the same platform at a site that may lose its link, buffers what it
observes while the link is down, and hands it over when the link returns. Entitle a
tenant to edge and register the site here; a tenant with no nodes is the normal
state, not a fault.
A node is scoped to the devices it serves. That list is the security boundary: an unscoped node could forge readings for the whole tenant, so it is required at registration and changing it bumps the node’s generation. The site does not know about the change until it next pulls its configuration, which is why the row shows what the site has actually collected rather than only what it has been told.
Last handover is not last contact. The cursor below is the last sequence this centre accepted from that node. A node that is up and has nothing new to say does not move it, and a node that has been off for a week does not either — so a stale cursor is a question, not a verdict.
Erasing a tenant does not reach these machines. Deleting Devices removes a node’s credential, so it can no longer sync and this centre can no longer reach it — and the readings already buffered on the hardware at the site stay on that hardware. Data is erased here, not everywhere (ADR-009 §6.4).
A node is scoped to the devices it serves. That list is the security boundary: an unscoped node could forge readings for the whole tenant, so it is required at registration and changing it bumps the node’s generation. The site does not know about the change until it next pulls its configuration, which is why the row shows what the site has actually collected rather than only what it has been told.
Last handover is not last contact. The cursor below is the last sequence this centre accepted from that node. A node that is up and has nothing new to say does not move it, and a node that has been off for a week does not either — so a stale cursor is a question, not a verdict.
Erasing a tenant does not reach these machines. Deleting Devices removes a node’s credential, so it can no longer sync and this centre can no longer reach it — and the readings already buffered on the hardware at the site stay on that hardware. Data is erased here, not everywhere (ADR-009 §6.4).
| Node | State | Last handover | Gaps | Records lost |
|---|
What a site could not hand over
EDG · a gap is a statement, not a log lineA gap marker is the one thing a centre must never quietly discard: lose it and the centre believes it holds a complete series for a period it does not. Episodes and records are different numbers and the small one lies, because one marker can cover forty thousand observations. Why both columns are above, and why this table is sorted by what was lost rather than by when.
A gap is the node’s own account that observations existed at the site and no
longer do — its buffer filled while the link was down, and the oldest records
were dropped to keep taking new ones. It is the one thing a centre must never quietly
discard: a centre that loses gap markers believes it holds a complete series for a
period it does not, and every question asked of that series afterwards gets a
confident wrong answer.
Episodes and records are different numbers, and the small one lies. One gap marker can cover forty thousand observations. A screen showing “1 gap” beside a node that lost a day of readings is telling you the opposite of what happened, which is why both columns are above and why this table is sorted by what was lost rather than by when.
Episodes and records are different numbers, and the small one lies. One gap marker can cover forty thousand observations. A screen showing “1 gap” beside a node that lost a day of readings is telling you the opposite of what happened, which is why both columns are above and why this table is sorted by what was lost rather than by when.
| Node | From | To | Why | Records lost |
|---|
Edge AI models
AII-009 · a version, a digest and an evaluationNo model artefact ships with this platform, and a site with a version assigned and no engine to run it says so in words rather than producing nothing. A version whose signature did not verify is handed to no site, the frames never cross to this centre, and the metrics are as declared: this platform holds no evaluation set and cannot reproduce a figure somebody reported.
A model runs at the site, over that site’s own readings or its own camera
stream, and keeps running with the link down. What crosses to this centre is the
output and a reference to the evidence — never the frames, which is the
point: edge inference is how bulk video stays where it was recorded.
No model artefact ships with this platform. The registry, the deployment record, the rollback path and the refusals are built; the engine that actually runs is supplied by the deployment. A site with a version assigned and no engine to run it says so, in words, rather than producing nothing — see the table below.
A version is deployable only if its artefact was signed. The bytes travel the same path firmware does, which verifies a composite signature before it stores one. A version whose artefact this platform has never seen, or whose signature did not verify, stays on the record and is handed to no site. A model running unattended at a site is code, and the reason it is checked this hard is that a bad one is not recoverable from the next reading.
The metrics are as declared. This platform holds no evaluation set for an edge artefact and cannot reproduce a figure somebody reported, so what is shown is the claim with the method beside it. If you need it verified, there is somebody to ask.
No model artefact ships with this platform. The registry, the deployment record, the rollback path and the refusals are built; the engine that actually runs is supplied by the deployment. A site with a version assigned and no engine to run it says so, in words, rather than producing nothing — see the table below.
A version is deployable only if its artefact was signed. The bytes travel the same path firmware does, which verifies a composite signature before it stores one. A version whose artefact this platform has never seen, or whose signature did not verify, stays on the record and is handed to no site. A model running unattended at a site is code, and the reason it is checked this hard is that a bad one is not recoverable from the next reading.
The metrics are as declared. This platform holds no evaluation set for an edge artefact and cannot reproduce a figure somebody reported, so what is shown is the claim with the method beside it. If you need it verified, there is somebody to ask.
| Model | Task | Runs on | Source | Deployable | Rolled out |
|---|
What each site’s model said
AII-011 · decision support, never a measurementAn empty list here is not a quiet estate: it is also what a site nobody deployed a model to, a site whose model will not load, and a site nothing has ever asked all look like. Three of those are faults and one is good news, so the first table says what each site last said. Nothing acts on any of it: no alarm instructs, no case is opened and no actuation is proposed.
An empty list here is not a quiet estate. It is also what a site nobody deployed a
model to looks like, what a site whose model will not load looks like, and what a site
nothing has ever asked looks like. Three of those are faults and one is good news, so
the first table says what each site last said rather than leaving you to read the
silence.
Every row below is a model’s output, not a reading. Each carries the whole distribution over the labels its version declared, how much of that mass the model committed at all, the version that produced it, and the time the site took it — which is not when it arrived here. Nothing on this platform acts on any of it: no alarm instructs, no case is opened and no actuation is proposed. Accepting or rejecting one is recorded against your name.
Every row below is a model’s output, not a reading. Each carries the whole distribution over the labels its version declared, how much of that mass the model committed at all, the version that produced it, and the time the site took it — which is not when it arrived here. Nothing on this platform acts on any of it: no alarm instructs, no case is opened and no actuation is proposed. Accepting or rejecting one is recorded against your name.
| Site | Task | Last said | Model | Inferred | No model | Failed |
|---|
| When (at the site) | Site | About | Model | What the model said | Decision |
|---|
Rules
§7 Flow · a rule is data, not code| Rule | Watches | Condition | Severity | State |
|---|
Open alarms
§8 Pulse · state, not events
Read-only here, deliberately. Acknowledging an alarm records who took
responsibility for it, so it belongs to the operator on duty in that city's own
console — not to a platform administrator looking in from outside. Nothing on this
screen clears an alarm either: an alarm ends when its condition ends.
| Alarm | About | Severity | Open for | Assigned to | Acknowledged by |
|---|
Rule chains
§7 Flow · in progress, pilotedA chain can never acknowledge an alarm, because acknowledging is a person's act. The document below is checked on the server when it is saved — every relation, every label, every node's configuration and whether the graph has a cycle — and refused, naming the node, if anything is wrong. Simulate runs one message through every plan and performs nothing.
A chain is a graph of nodes a message passes through. The tenant’s root chain
receives every telemetry and attribute post, beside the threshold rules on
Rules & alarms — never instead of them. A chain’s alarms are ordinary
Pulse alarms with the chain as their provenance, and a chain can never acknowledge
one: acknowledging is a person’s act.
This is a JSON editor with validation on the server, not a visual editor. The document below is checked when it is saved — every relation, every label, every node’s configuration, and whether the graph has a cycle — and refused, naming the node, if anything is wrong. Simulate runs one message through every plan and performs nothing.
This is a JSON editor with validation on the server, not a visual editor. The document below is checked when it is saved — every relation, every label, every node’s configuration, and whether the graph has a cycle — and refused, naming the node, if anything is wrong. Simulate runs one message through every plan and performs nothing.
| Chain | Version | Nodes | Saved by |
|---|
The chain
nothing open
Open a chain to see its nodes and relations.
Simulate one message
plan only · nothing is performedTests and replays
open a chain aboveNOT-EVALUATED is not a pass, and a window whose history cannot be read to the end is refused rather than judged in part. A test replays against a shadow of alarm state as it was when the window opened, not as it is today, and nothing is performed. With requires a passing test, making this chain the root is refused unless the latest run of every test against exactly that chain passed.
A test replays synthetic messages, or a recorded window of this tenant’s own
history, through the chain in simulation: every plan, nothing performed, against a
shadow of alarm state as it was when the window opened — not as it is today. Each
assertion is PASS, FAIL or NOT-EVALUATED with its evidence, and NOT-EVALUATED is not a
pass. A window whose history cannot be read to the end is refused, not judged in part.
With requires a passing test run on, making this chain the root — or saving it, or a chain it enters, while it is the root — is refused unless the latest run of every test against exactly that chain passed. To save a change, run the tests against the draft in the editor first.
With requires a passing test run on, making this chain the root — or saving it, or a chain it enters, while it is the root — is refused unless the latest run of every test against exactly that chain passed. To save a change, run the tests against the draft in the editor first.
| Test | Version | Input | Assertions |
|---|
| Run | Chain | Verdict | Ran by |
|---|
Open a run to see its report and the evidence for every assertion.
Arming AI-authored logic
open a chain aboveApproving an AI-authored chain saved it; it did not arm it, and Make root and Save refuse to arm it for you. Arming is a separate act: replay it over every device's recent history, read what it would have done, then arm it. A replay is held in memory, so a restart loses one still running; the report it writes cannot be edited and arms only the chains it replayed, for a day after its window ended.
A chain the AI layer wrote is AI-authored for good: editing it later does not change where it came
from. Approving it saved it; it did not arm it. Arming — letting AI-authored logic
process this tenant’s live readings, as the root chain or inside what the root reaches — is a
separate act: replay it over every device’s recent history, read what it would have done, then arm it.
Make root and Save refuse to do it for you. Stop sending readings to a chain always works.
The replay runs on the server in the background, one at a time, and is held in memory: a restart loses a replay that was still running, and this panel says so. The report it writes is kept, hashed, and cannot be edited. A report arms only exactly the chains it replayed, and only for a day after its window ended.
The replay runs on the server in the background, one at a time, and is held in memory: a restart loses a replay that was still running, and this panel says so. The report it writes is kept, hashed, and cannot be edited. A report arms only exactly the chains it replayed, and only for a day after its window ended.
Replay the chain to see what it would have done.
| Armed | What | Version | By | Report |
|---|
Debug events
only while the chain has debug on · bounded, in memory| When | Node | Message | Went | Failure |
|---|
Queues and findings
reading the queue store…
Where a waiting message lives depends on this deployment, and the line above says which.
With a database, a message waiting in a queue is a row: a deploy hands its leases back and
the next process picks them up, and a crash leaves every message to be claimed again —
at least once, so a chain may run twice over one reading. With no database the
queue lives in this process: a deploy drains it for a few seconds and counts what it could
not finish; a crash loses what was queued without a count. Either way the readings
themselves are already stored — what a loss costs is the chain’s reaction to them.
A queue that fills refuses and records how many readings it refused and over what
interval, because a count nobody can read is not a record.
Ask for a draft
ECO-002 · AII-002A draft does nothing, and approving one saves a new chain without arming it: no reading reaches it until somebody arms it on Rule chains. Every finding from the sixteen fixed checks needs a resolution in your words before it can be approved, and everything the model wrote is shown as text and never run on this page. What the validator asks and what it does not.
Describe what a rule chain should do and the AI layer drafts one. A draft does nothing. It is
checked by the chain service’s own validator, then reviewed by the platform — sixteen fixed
checks that do not ask the model — and the model’s own notes are added beside them, marked as its own.
Every finding needs a resolution in your words before it can be approved.
Approving saves a new chain. It does not arm it. An approved chain is not the root and no reading reaches it until somebody arms it on Rule chains, after replaying it over recent history. Everything the model wrote is shown as text and never run on this page.
Approving saves a new chain. It does not arm it. An approved chain is not the root and no reading reaches it until somebody arms it on Rule chains, after replaying it over recent history. Everything the model wrote is shown as text and never run on this page.
Drafted chains
the queue| Draft | Review | Status | Drafted |
|---|
The draft and its review
nothing open
Open a draft to read its chain and its findings.
Destinations
§7 Flow · the one way outThe platform cannot verify which kind a destination really is: it cannot tell a gateway that opens a valve from one that stores a reading. What it does is record that you declared it, under your name, and keep that record. A chain never holds an address or a credential, and no rule chain can reach an actuation destination — only a response proposal a named person has authorised.
A destination is a place outside this platform that a rule chain may send to. A chain
names a destination and never holds its address or its credential; the credential is
kept in the secret store and is never shown again — not here, not in a
chain, not in an export.
Every destination says what it does when it is called, and you choose:
• data-feed — this platform tells another system what it observed (a warehouse, a dashboard, a message channel). Rule chains may send to it.
• actuation — the other system does something in the world when called: opens a valve, moves a barrier, sounds a siren. No rule chain can reach it. It is reached only by a response proposal that a named person has authorised.
The platform cannot verify which one a destination really is. It cannot tell a gateway that opens a valve from one that stores a reading. What it does is record that you declared it, under your name, and keep that record. Declaring an actuation endpoint as a data feed lets every chain in this tenant drive it.
Every destination says what it does when it is called, and you choose:
• data-feed — this platform tells another system what it observed (a warehouse, a dashboard, a message channel). Rule chains may send to it.
• actuation — the other system does something in the world when called: opens a valve, moves a barrier, sounds a siren. No rule chain can reach it. It is reached only by a response proposal that a named person has authorised.
The platform cannot verify which one a destination really is. It cannot tell a gateway that opens a valve from one that stores a reading. What it does is record that you declared it, under your name, and keep that record. Declaring an actuation endpoint as a data feed lets every chain in this tenant drive it.
| Destination | Kind | Endpoint | Purpose | Credential | Declared by |
|---|
Register a destination
checked on save, and again on every sendWhat happens when this destination is called?
The credential box also replaces the credential of a destination in the list above
(Replace credential). A credential is the whole Authorization value — Bearer …
or Basic … — or, for Slack, the part of the webhook URL after
/services.
Claim codes
§5 · a device is built before anybody knows whose it is
The codes are shown once. Only a hash is kept, so this listing can never show
them again — a listing that carried the codes would be a list of keys to every
unshipped device in the warehouse. A code that is lost is replaced by minting a new
one and revoking the old.
A used claim cannot be revoked. The device belongs to the tenant that claimed it, and a revoke reaching back through a completed claim would be taking a customer’s device away from them.
A used claim cannot be revoked. The device belongs to the tenant that claimed it, and a revoke reaching back through a completed claim would be taking a customer’s device away from them.
Claim codes — shown once
The platform stores only a hash of each, so nobody — including you — can
read them back. Closing this box is the last time they exist.
| Device | Batch | State | Claimed by | Actions |
|---|
Providers, in the order they are tried
ADR-007 §2 · failover on refusal, never on silence| Order | Provider | Gateway | Credential |
|---|
Tenants pinned to a carrier
ADR-007 §2.2 · one provider to the front, not a reordering
A pin moves one provider to the front for that tenant. Everything after it keeps
the order above, so a pinned carrier having a bad night still leaves somewhere to go.
Use it where a customer’s traffic must go via a particular carrier — a local
A2P rule, a regulator, a contract — and not as a preference.
| Tenant | First provider |
|---|
Notification groups
ADR-006 §1.3 · a roster, not a field on thirty rules| Group | Reaches | Routing | Limits & escalation |
|---|
Where a vertical’s alarms go
ADR-021 §7 · the routing, the widen target, and who changed itAn alarm raised by a vertical — a corridor’s congestion, a Skywatch sensor going offline, a flood advisory, a predicted crowd crossing, a schedule that has stopped keeping a place current — is not raised by a rule somebody wrote, so there is no rule to write a roster on. This is where that roster is recorded. Until it is, those alarms are a row on the alarm board and a row on the bell: no email, no SMS, and nobody chased when nobody acknowledges one.
Most specific wins, and the order is fixed. A route for one vertical’s one
alarm type beats a route for everything that vertical raises, which beats a route for
every vertical in this tenant, which beats the deployment-wide setting. The order is a
property of the KEY, never of when a row was written — so re-stating the
tenant-wide default cannot silently un-route the one alarm type that had its own
roster, and what you read here is what happens.
What this does NOT change. It decides where a notice goes and nothing else. No threshold moves. No severity moves — the thing that raised the alarm counted the vehicles or read the gauge, and a configuration screen cannot make an alarm more alarming than its raiser said it was. Nothing here raises an alarm, clears one, acknowledges one, or changes a word of what the message says.
And if nobody picks it up. The chase is the GROUP’s own escalation policy, set above. This table is what lets the escalation sweep find that group again an hour later — which it could not do before, because the group is not written on the alarm. The widens to column is read off each group’s policy, so a group with no policy is shown as what it is: an alarm announced once and never chased.
Stopping is recorded like starting. Withdrawing a route writes a new version carrying whoever withdrew it. Nothing here is ever edited or deleted, because the question this table gets asked is “an advisory was raised at 02:40 and nobody came — who was it meant to reach?”, and that is asked after somebody has already fixed it.
What this does NOT change. It decides where a notice goes and nothing else. No threshold moves. No severity moves — the thing that raised the alarm counted the vehicles or read the gauge, and a configuration screen cannot make an alarm more alarming than its raiser said it was. Nothing here raises an alarm, clears one, acknowledges one, or changes a word of what the message says.
And if nobody picks it up. The chase is the GROUP’s own escalation policy, set above. This table is what lets the escalation sweep find that group again an hour later — which it could not do before, because the group is not written on the alarm. The widens to column is read off each group’s policy, so a group with no policy is shown as what it is: an alarm announced once and never chased.
Stopping is recorded like starting. Withdrawing a route writes a new version carrying whoever withdrew it. Nothing here is ever edited or deleted, because the question this table gets asked is “an advisory was raised at 02:40 and nobody came — who was it meant to reach?”, and that is asked after somebody has already fixed it.
AI token usage
AII-013 · input vs output
Input · prompt
Output · completion
| Feature | Input | Output | Total | Calls |
|---|
Video storage charge
ADR-002 §4 · per camera / month
The terms in force for each tenant, and what a month costs at the cameras they actually run — not the
cameras their plan allows. Indicative: the invoice is computed from metered usage, and repricing appends a
new record rather than editing this one, so an invoice raised last month can still be explained.
| Tenant | Per camera / month | Retention included | Extra day | In force since | Indicative / month |
|---|
Usage against plan quota
REQ-112 · AII-013Loading…
Correcting a meter is a commercial act. It changes what this tenant is billed.
Both figures, your name and your reason go on the permanent record, and nothing here
can be undone by editing it again — a second correction is a second record.
| Tenant | Plan | Devices now | Messages this month | AI tokens this month | Cameras now | Correct |
|---|
Cross-tenant data sharing
REQ-114 · DEF-013No data share yet moves anything: nothing on this platform serves one tenant's rows to another under one of these agreements, so a share here authorises a flow that does not exist. Corrected 24 Sep 2026 — there is now exactly one cross-tenant read, a parent authority's consolidated view of AGGREGATE figures (CIV-053), authorised on the Tenants screen and carrying counts and no rows.
One-way, explicit, and a platform decision: neither side of an agreement can authorise it alone.
These could be created through the API and then seen by nobody, including whoever created them.
Revoking is recorded rather than deleted, because that data was shared for a period stays
true after the sharing stops.
No data share yet moves anything. Nothing on this platform serves one tenant's rows to another under one of THESE agreements, so a share here authorises a flow that does not exist. It is the gate a future one has to pass through, not a switch that is currently on.
Corrected 24 Sep 2026. This paragraph used to say that nothing reads across tenants at all, and CIV-080 made that untrue. There is now exactly one cross-tenant read on the platform: a state or regional parent's consolidated view of its cities' AGGREGATE figures (CIV-053), authorised by the relation on the Tenants screen rather than by a share here, carrying counts and no rows. Leaving the old sentence standing would have been this console asserting an isolation property the platform no longer has in that absolute form.
No data share yet moves anything. Nothing on this platform serves one tenant's rows to another under one of THESE agreements, so a share here authorises a flow that does not exist. It is the gate a future one has to pass through, not a switch that is currently on.
Corrected 24 Sep 2026. This paragraph used to say that nothing reads across tenants at all, and CIV-080 made that untrue. There is now exactly one cross-tenant read on the platform: a state or regional parent's consolidated view of its cities' AGGREGATE figures (CIV-053), authorised by the relation on the Tenants screen rather than by a share here, carrying counts and no rows. Leaving the old sentence standing would have been this console asserting an isolation property the platform no longer has in that absolute form.
| From | To | Scope | Expires | State | Action |
|---|
Model availability
AII-012 · sovereign deliveryPer-tenant Intelligence posture
AII-011 · 013
Entitlement decides who may use the copilot; the proposal queue is where its output waits for a named
human. Both are shown here because “the AI proposed something and nobody looked” is the failure
this platform is meant to make visible.
| Tenant | Intelligence | Predictive | AI tokens used | Proposals awaiting a human |
|---|
Tickets
ADR-008 · a record that somebody is dealing with it
Closing a ticket does not clear its alarm. An alarm is a state of the world and only
the world clears it; a ticket is a record of human attention. A ticket the platform opened
by itself carries no name, because nobody made a judgement.
| Ticket | Status | Priority | Raised | Owner | Next |
|---|
Ticket
Who may see what
CIV-093 · a lender sees the assets you granted it, and nothing operational| Financier account | Asset | Granted |
|---|
A grant is one line on a loan schedule. It names one account and one asset, and it
records which machine that asset WAS: asset ids are yours to choose, so a replacement
registered as pump-3 is a different machine wearing the same
name, and this platform refuses to show it under the old grant rather than quietly
reporting on a machine nobody financed.
Your underwriting baselines
CIV-093 · the number is yours, and we do not have one| Asset | Expected | Series | Per | Source |
|---|
An asset with no baseline is not a passing asset. It is reported as measured and
compared with nothing, and the portfolio counts it as unmeasurable rather than folding it
in with the ones that met their number. Supplying a default here — nameplate capacity,
last year’s median, the fleet average — would be this platform inventing the figure
it then tells your lender you fell short of.
Issued reports
CIV-093 · the register, so a copy can be checked against what was sent| Report | Account | Period | Sealed | Digest |
|---|
The digest is the evidence, and the document is not kept here. A sealed report
proves it has not been carelessly edited; anybody who doctors one can re-seal it and that
check agrees again. What separates the real report from a forgery is whether its digest is
the one in this table, which is why nothing ever rewrites a row of it.
Accounts
REQ-115 · 116Password — shown once
Give this to them now. The platform stores only a hash of it, so nobody — including
you — can read it back, and they should change it after signing in. If it is lost the
account needs a new one.
A lockout backs off geometrically — five wrong attempts, then a minute, doubling with each
further miss. The attempts left under each name are what one more guess costs before that
starts. Unlocking clears the counter with the lock, because leaving it set means the next single
mistake re-locks instantly and the unlock looks like it failed.
Disabling revokes every session that account currently holds; it does not change the
password, so enabling it again lets the same person straight back in.
| User | Scope | Roles | State | Last sign-in | Actions |
|---|
Recent sign-in events
why a login failed
bad-password means the password was genuinely wrong.
locked means it never got that far — and the person trying could not
tell the difference from the error they saw.
| When | User | Event | Reason | From |
|---|
Incident & maintenance center
REQ-113How long a detection state series is kept
migration 105/117 · the decision, the authority, and every version of itNothing is evicted from a detection state series until every tenant with a site in that vertical has decided how long it is kept. There is no default and this platform will not choose one. A partition is a month across every tenant, so a month may only go when every claim on it has expired — which means one tenant with no decision stops eviction for all of them, and the series grows. That is a cost, not a loss.
What is being decided. The states a track’s path is drawn from — the
positions, velocities and headings a replay reconstructs a history out of. Retention is
enforced by dropping WHOLE MONTHLY PARTITIONS with DROP TABLE: there is nothing
to undelete, no count of what went, and a replay over a destroyed month draws the hole
rather than a shorter path that looks complete.
Decided by is the AUTHORITY, not you. It is the instrument the number comes from — the regulation, the contract clause, the ministerial instruction — in your own words, because no list of the world’s retention instruments exists. It is copied onto every eviction record, so “under which decision was this month destroyed” has an answer. There is no name field on this form: the person recording a decision is read from the verified session and goes into the audit trail and the chain of custody.
There is no suggested number on this screen. Not in the field, not as a placeholder, not as a “recommended” beside it. A number this platform offered would be the number every deployment accepted, and what it decides is how much of a track’s recorded path is destroyed.
A change is a new version, and it can only be made LONGER. Recording again writes a new version carrying the new authority; nothing here is ever edited or deleted, because the question this record gets asked is “what was the retention when those states were evicted” and it is asked afterwards. A SHORTER window is refused: every state older than the new window and newer than the old one was protected a moment ago and would become evictable at the next sweep, and there is no instant at which switching destroys nothing — so no delay makes it safe. Destroying states this platform already holds is an erasure act, which is audited and refuses under a legal hold.
Decided by is the AUTHORITY, not you. It is the instrument the number comes from — the regulation, the contract clause, the ministerial instruction — in your own words, because no list of the world’s retention instruments exists. It is copied onto every eviction record, so “under which decision was this month destroyed” has an answer. There is no name field on this form: the person recording a decision is read from the verified session and goes into the audit trail and the chain of custody.
There is no suggested number on this screen. Not in the field, not as a placeholder, not as a “recommended” beside it. A number this platform offered would be the number every deployment accepted, and what it decides is how much of a track’s recorded path is destroyed.
A change is a new version, and it can only be made LONGER. Recording again writes a new version carrying the new authority; nothing here is ever edited or deleted, because the question this record gets asked is “what was the retention when those states were evicted” and it is asked afterwards. A SHORTER window is refused: every state older than the new window and newer than the old one was protected a moment ago and would become evictable at the next sweep, and there is no instant at which switching destroys nothing — so no delay makes it safe. Destroying states this platform already holds is an erasure act, which is audited and refuses under a legal hold.
Configuration snapshots
ECO-004 · atomic restore“Point-in-time” is not what this promises, and the document says so: the five components live in five stores with no isolation between them, so if anything moved between the two reads the capture is refused and names what moved. A restore installs every component or none, because one that reports success having put back four of five is worse than one that refuses. Take the dry run first.
Device profiles, the Modbus and SNMP tag maps, server-scope calibration, alarm rules
and the edge assignments — captured together and restored together.
“Point-in-time” is not what this promises, and the document says so. The five components live in five stores with no isolation between them, so everything is read, read again, and compared. If anything moved in between the capture is refused and names what moved. That is weaker than snapshot isolation and it is written into every document as reread-verified rather than dressed up.
A restore installs every component or none. It runs as one unit of work, not component by component with an undo — an undo can itself fail, and a restore that reports success having put back four of five things is worse than one that refuses, because the operator walks away. Take the dry run first: it names everything that would change and carries a digest, and the restore refuses if anything has moved since.
A restore moves this centre’s generation and nothing else, so every site reads as pending until it calls in and says what it is running.
“Point-in-time” is not what this promises, and the document says so. The five components live in five stores with no isolation between them, so everything is read, read again, and compared. If anything moved in between the capture is refused and names what moved. That is weaker than snapshot isolation and it is written into every document as reread-verified rather than dressed up.
A restore installs every component or none. It runs as one unit of work, not component by component with an undo — an undo can itself fail, and a restore that reports success having put back four of five things is worse than one that refuses, because the operator walks away. Take the dry run first: it names everything that would change and carries a digest, and the restore refuses if anything has moved since.
A restore moves this centre’s generation and nothing else, so every site reads as pending until it calls in and says what it is running.
| Snapshot | Taken | Kind | Digest |
|---|
Bring one in from outside
sealed export · verified before it is stored
Paste a sealed export exactly as it was produced. The seal is over the bytes, so
anything that reformats it on the way in is a signature over something else. An export
belonging to another tenant is refused rather than installed: one customer’s
profiles, limits and calibration in another customer’s platform is not a restore.
What each site can run
ECO-025 · accelerator capabilityA site nobody has described receives nothing, not even a plain-CPU model, because an undeclared node is a node nobody has looked at rather than one somebody decided was ordinary. A node may not widen its own capability, and a cabinet that contradicts its declaration is withheld rather than sent on. An int8 graph built for an accelerator does not run slowly on a plain processor; it fails to load.
A model artefact is compiled for something. An int8 graph built for a neural
accelerator does not run slowly on a plain processor — it fails to load. So which
sites may receive which model version is a question about hardware, and it is answered
here rather than at the cabinet.
A site nobody has described receives nothing. Not even a plain-CPU model. An undeclared node is not a node somebody decided was ordinary; it is a node nobody has looked at, and assuming a processor for it puts an artefact on the one board whose hardware is unknown while the rollout reports success. Declare it and it joins the next plan.
Two columns, and only the first decides anything. Declared is what an operator has stated; cabinet reports is what the node’s own probe found. A node may not widen its own capability — it could then pull an artefact it cannot run — but a cabinet that contradicts its declaration is withheld rather than sent on, and a cabinet reporting more than its declaration is the row that says go and re-declare it.
A site nobody has described receives nothing. Not even a plain-CPU model. An undeclared node is not a node somebody decided was ordinary; it is a node nobody has looked at, and assuming a processor for it puts an artefact on the one board whose hardware is unknown while the rollout reports success. Declare it and it joins the next plan.
Two columns, and only the first decides anything. Declared is what an operator has stated; cabinet reports is what the node’s own probe found. A node may not widen its own capability — it could then pull an artefact it cannot run — but a cabinet that contradicts its declaration is withheld rather than sent on, and a cabinet reporting more than its declaration is the row that says go and re-declare it.
| Site | Declared | Cabinet reports | Running | State |
|---|
Deploy a model version
the plan is shown first · and it is the plan that is executed
The plan says which sites will receive this version, which will not and why, and what
each of the others goes on running instead. Nothing is written by taking it.
A site that cannot run a version keeps what it has. It is not failed, it is not retried at the cabinet, and it appears here by name with its reason. A site that has never had a compatible version is shown as running no model — which is its own state and is never drawn as up to date.
The deploy button carries the digest of the plan on screen. If anything moved since — a capability re-declared, a site that has called in or gone quiet — it is refused and you take the plan again. There is no flag that skips this.
A site that cannot run a version keeps what it has. It is not failed, it is not retried at the cabinet, and it appears here by name with its reason. A site that has never had a compatible version is shown as running no model — which is its own state and is never drawn as up to date.
The deploy button carries the digest of the plan on screen. If anything moved since — a capability re-declared, a site that has called in or gone quiet — it is refused and you take the plan again. There is no flag that skips this.
| Site | Will receive | Reason | Keeps running |
|---|
What was decided, and what each site was said to have
AII-010 · append-only
Which node ran which version when — including the rows that say a node was
withheld, because a site left behind is the outcome this feature exists to make
visible. Beside it, every capability statement ever made about a site: without that,
a site correctly excluded in March and a site whose capability somebody typed in wrongly
read exactly the same.
A rollback is a person’s act with a written reason, and a rollback to a version this platform no longer holds is refused rather than answered with the nearest artefact it can still find.
A rollback is a person’s act with a written reason, and a rollback to a version this platform no longer holds is refused rather than answered with the nearest artefact it can still find.
| When | Site | What happened | Version | Who |
|---|
Robot fleet
ECO-021 · escalated firstAn intervention rate over a truncated page is not a rate, so if any unit's transition page was cut short the figure is withheld and says which units were truncated. No missions in the window is not a rate of zero either. A unit is escalated when its machine is in ESCALATED, and “escalation due” is the separate fact that the sweep is late. Nobody's name appears on this screen (PRD-001).
Per-unit task progress, idle time and the blocked ladder, folded from the flight
recorder rather than reported by the robots.
A unit is escalated when its machine is in ESCALATED — not when this page works out that a deadline has passed. Those are two different facts and both are shown: the second, escalation due, means the sweep is late, which is something to see rather than something to paper over.
An intervention rate over a truncated page is not a rate. If any unit’s transition page was cut short the figure is withheld and says which units were truncated. No missions in the window is not a rate of zero either.
Nobody’s name appears on this screen. The recorder carries who moved each unit and it has to; a fleet screen is about places, assets and patterns (PRD-001).
A unit is escalated when its machine is in ESCALATED — not when this page works out that a deadline has passed. Those are two different facts and both are shown: the second, escalation due, means the sweep is late, which is something to see rather than something to paper over.
An intervention rate over a truncated page is not a rate. If any unit’s transition page was cut short the figure is withheld and says which units were truncated. No missions in the window is not a rate of zero either.
Nobody’s name appears on this screen. The recorder carries who moved each unit and it has to; a fleet screen is about places, assets and patterns (PRD-001).
| Unit | State | Progress | Idle | Teleoperation |
|---|
The fleet-ops dashboard
ECO-020 · the family this binds to
A standing document over the robot profile family: the open geofence alarms first and
largest, then charge, actuator health and the teleoperation link. Installing it once is
all it needs — pressing this again keeps whatever you have edited rather than
writing the template over it.
What a meter is holding
CIV-090 · a balance is telemetry
Tessila is not the vending, billing or payment system. What a vending system DID
arrives here and nothing leaves: this platform never moves money, never issues a token
and never authorises a vend (CIV-092).
A credit balance is a reading, with all of a reading’s problems. A balance taken before the last vend is not this meter’s credit, and a balance that stopped moving is not a credit of zero. Both are said out loud below rather than rounded into a number somebody would act on.
A credit balance is a reading, with all of a reading’s problems. A balance taken before the last vend is not this meter’s credit, and a balance that stopped moving is not a credit of zero. Both are said out loud below rather than rounded into a number somebody would act on.
Vend against consumption
CIV-091 · advisory, feeder-level
This is an indicator, not a finding, and it names no household. The gap is
computed per feeder from aggregates with the meters already removed — the function
that computes it is never handed anything that resolves to an individual, which is why
it cannot be read back to one. Small cohorts produce no number at all rather than a
suppressed one.
Which meters sit on which feeder is the asset tree’s question, so the aggregates are handed in rather than gathered here. Paste them below.
Which meters sit on which feeder is the asset tree’s question, so the aggregates are handed in rather than gathered here. Paste them below.
| Feeder | Window | Meters | Gap | Status |
|---|
Actuation proposals
ADR-017 · proposes, never drives
A command to a pump, a valve, a setpoint or a barrier is never sent by a rule chain. A chain,
a person or the Civitas response board proposes it; a named person with the tenant
administrator role authorises it here, under their own name; and only then is it sent,
once, to the actuation destination it names.
What you authorise is exactly what is sent. Each row shows the request body and the first characters of its SHA-256. The request cannot be changed after it was proposed; a different command is a new proposal, authorised again.
A proposal expires — a stale command is worse than none. If a send is refused before anything left this server it stays authorised, not sent and you may retry it. If the destination did not answer, or answered without accepting, the command may have acted: check the plant before you retry, and the retry records that you did.
What you authorise is exactly what is sent. Each row shows the request body and the first characters of its SHA-256. The request cannot be changed after it was proposed; a different command is a new proposal, authorised again.
A proposal expires — a stale command is worse than none. If a send is refused before anything left this server it stays authorised, not sent and you may retry it. If the destination did not answer, or answered without accepting, the command may have acted: check the plant before you retry, and the retry records that you did.
| Proposal | Destination & target | Exactly this request | Why | Proposed by | State |
|---|
Propose a command
somebody else authorises itRules for this tenant
four eyes by defaultLetting one person both propose and authorise is a platform administrator's
decision, with a written reason, and is not offered here.