Body composition, and the charter rule we wrote against it
Charter rule C6 banned body composition framing at every age. Then we specified a product built on exactly those numbers. Here is the whole argument.
Blog Privacy
Every platform we looked at exposes workplace wellbeing data per named employee, behind a permission. Permissions get granted — a senior person asks, an administrator finds the toggle, and the control that existed on paper is gone in an afternoon. So we removed the view instead of guarding it.
An employer can see that a named employee's activity dropped sharply in March. That is workplace wellbeing data about a person, and it is health information about a person, inferred from a wellbeing benefit they were encouraged to use, sitting in a dashboard belonging to the people who decide their promotion.
It does not matter that the intent was supportive. The capability is the problem, and a role-based permission is not a control — it is a setting, and settings change when somebody senior asks.
There is no API that returns per-person activity to an organisation. Not restricted, not audited, not available to a super-admin. The response type has no field for it, so a client asking for one does not compile.
Cohort metrics require at least eight contributing people. Below that the value is replaced with a suppression marker, and the suppression is enforced in the query planner and again as a database constraint.
k-anonymity of eight is not sufficient on its own. Filter by department, then by site, then by age band, and each filter is above the threshold while the intersection is one person.
So the check runs across filter combinations rather than per query, and a combination that would narrow to fewer than eight is suppressed even when every individual filter looks safe. This makes some legitimate questions unanswerable in small organisations, which is the correct outcome.
The workplace wellbeing data an employer does receive: participation, aggregate movement trend, sedentary-risk distribution by cohort, and a return-on-investment model with its assumptions written down. Enough to run a programme. Not enough to manage an individual.
The usual objection is that a permission is fine as long as nobody grants it. In practice a permission is a conversation waiting to happen: a senior person asks, an administrator finds the toggle, and the control that existed on paper is gone in an afternoon with no code review and no record.
Removing the capability changes the conversation entirely. There is no toggle to find. Adding one means a schema change, a migration, a code review and a deliberate decision by named engineers — which is exactly the amount of friction a decision like that deserves.
It also changes the sales conversation, and not always in our favour. Some buyers want the individual view and go elsewhere when told it does not exist. That is a cost we have decided to keep paying.
When a cohort falls below the threshold the response carries a suppression marker rather than a number, and the marker is a distinct value in the type rather than a zero or a null. A client cannot accidentally render it as "0 people moved this week", which would be both wrong and worse than saying nothing.
The dashboard shows it as "too few people to report", with the threshold stated. Administrators of small organisations see a lot of it, and the honest answer to their complaint is that an eleven-person company cannot have anonymous reporting, and a product that pretends otherwise is selling them a risk rather than a feature.
Participation and engagement at cohort level. Aggregate sedentary-risk distribution. Trend over time against a baseline. A return-on-investment model with its assumptions written down and adjustable, so nobody has to take our multiplier on faith.
That is enough to decide whether to renew, where to run a campaign, and which sites need attention. It is not enough to have a conversation with one employee about their activity, and it is not supposed to be.
No. There is no API that returns per-person activity to an organisation — not restricted, not audited, not available to a super-admin. The response type has no field for it, so a client asking for one does not compile.
Eight contributing people. Below that the value is replaced with a suppression marker, enforced in the query planner and again as a database constraint, and the check runs across filter combinations rather than per query so an intersection cannot narrow to one person.
Participation and engagement at cohort level, aggregate sedentary-risk distribution, trend over time against a baseline, and a return-on-investment model with its assumptions written down and adjustable. Enough to run a programme, not enough to manage an individual.
This article sits in the workplace cluster and links up to /industries. Clusters are how the editorial agent decides what to write next — the thinnest one wins.
Reading this page records the time it was visible and how far it was scrolled. No cookie, no identifier, and the connecting address is hashed with a salt that regenerates daily. How that works.
Other pages here that point at this one. Internal links are the part of “backlinks” a site actually controls — nothing on this platform buys or exchanges the other kind.
Read next
Charter rule C6 banned body composition framing at every age. Then we specified a product built on exactly those numbers. Here is the whole argument.
We moved the platform invariants into database constraints. Postgres rejected four writes the same afternoon that the services had been allowing.
Accessible interface design as a settings toggle produces a worse product for everyone. Six modes change register, density, mechanics and guardrails together.
Everything described here is running. An account is free, takes about two minutes, and the writing stays free whether or not you make one.
Free to create. 150 AI credits a month for 2 months, then AI features need a plan — everything that is not AI carries on either way. Premium is £5.99 a month and cancels in one click. Under 18 a guardian confirms before the account opens.