Skip to content

Commit 362f6c4

Browse files
committed
docs(census): re-derive the tenant-audit census after the SMS seed's write site retired
node scripts/tenant-audit-census.mjs --write regenerated the census tables (232 write call sites, one fewer: the retired seedPhoneSmsTemplates insert), and the page's hand-written figures follow the census. Claude-Session: https://claude.ai/code/session_01WMQprn46CND82KmY8sZWBu Co-authored-by: Claude <noreply@anthropic.com>
1 parent a93579f commit 362f6c4

2 files changed

Lines changed: 23 additions & 24 deletions

File tree

‎content/docs/permissions/tenant-audit-census.mdx‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ are reported as `undecidable` rather than assumed either way.
122122

123123
The same holds twice over for the context. An options argument spelled as a
124124
literal can be read; one spelled `options`, `{ ...opts }`, or handed through a
125-
forwarding shim cannot, and **54 of the 233 sites are spelled that way**. A
125+
forwarding shim cannot, and **54 of the 232 sites are spelled that way**. A
126126
context resolved from an inline literal or a local `const` can be tested for
127127
`isSystem`; one arriving from a helper call cannot.
128128

@@ -187,10 +187,10 @@ reproduce them. Where it disagrees, it disagrees on the page:
187187

188188
| carried figure | where it survives | this census |
189189
| :--- | :--- | ---: |
190-
| 175 write call sites | quoted in the merged changeset | **233** |
190+
| 175 write call sites | quoted in the merged changeset | **232** |
191191
| 24 carrying no tenant context | quoted in the merged changeset | **2** provable and tenancy-enabled; **31** more whose options argument is unreadable |
192-
| 127 of 175 statically decidable, 48 runtime-parameter-name sites | restated on the `isSystem`-scoping card | **155 of 233** decidable, **78** undecidable |
193-
| 135 (77%) silenced by the `isSystem` guard before the posture gate | the lost issue body — **no surviving corroboration** | **not reproduced**: 123 decidably elevated, 0 decidably not, 102 undecidable |
192+
| 127 of 175 statically decidable, 48 runtime-parameter-name sites | restated on the `isSystem`-scoping card | **154 of 232** decidable, **78** undecidable |
193+
| 135 (77%) silenced by the `isSystem` guard before the posture gate | the lost issue body — **no surviving corroboration** | **not reproduced**: 122 decidably elevated, 0 decidably not, 102 undecidable |
194194
| 141 and 132, two independent re-derivations | the card that filed this work | — |
195195

196196
**The differences are not reconciled, and deliberately so.** The old census's
@@ -201,17 +201,17 @@ at any commit.
201201

202202
Two structural facts do plausibly widen this reading against any hand or regex
203203
one, and both are counted in the generated tables below: the 48 sites reached
204-
through an erased (`any`) receiver, and the 51 that name their object through a
204+
through an erased (`any`) receiver, and the 50 that name their object through a
205205
`const` rather than inline. An instrument that read either the way a person does
206206
would report a smaller number and would not say so.
207207

208208
The fourth row is the one worth flagging to anyone citing it. **The 135 / 77%
209209
figure has no surviving corroboration anywhere in the tree.** This census reads
210-
123 of 233 (53%) as decidably elevated, with 102 more whose elevation is a
210+
122 of 232 (53%) as decidably elevated, with 102 more whose elevation is a
211211
run-time fact — so the claim is neither confirmed nor refuted, and the honest
212212
answer is that a static reading cannot settle it.
213213

214-
⇒ **Cite `2 / 233`, and say what it is**: the sites whose options argument was
214+
⇒ **Cite `2 / 232`, and say what it is**: the sites whose options argument was
215215
READ and holds no tenant context, against a decidably tenancy-enabled object.
216216
That is the control's provable yield surface. ⛔ Do not cite it as "the sites
217217
without tenant context" — **31 further sites** have an options argument this
@@ -223,29 +223,29 @@ cannot read, and they are neither in nor out.
223223

224224
| what | count |
225225
| :--- | ---: |
226-
| write call sites on the application surface | **233** |
227-
| …whose object name is statically decidable | 155 |
226+
| write call sites on the application surface | **232** |
227+
| …whose object name is statically decidable | 154 |
228228
| …whose object name is chosen at run time | 78 |
229-
| …against an object with tenancy ENABLED | 154 |
229+
| …against an object with tenancy ENABLED | 153 |
230230
| …against an object that declares tenancy off | 1 |
231-
| threading a tenant context | 171 |
231+
| threading a tenant context | 170 |
232232
| PROVABLY carrying none (options read, no context key) | **8** |
233233
| …of those, against a decidably tenancy-enabled object | **2** |
234234
| options argument UNREADABLE — may or may not carry one | 54 |
235235
| …of those, against a decidably tenancy-enabled object | 31 |
236-
| threading a decidably ELEVATED (`isSystem`) context | 123 |
236+
| threading a decidably ELEVATED (`isSystem`) context | 122 |
237237
| threading a context that is decidably NOT elevated | 0 |
238238
| threading a context whose elevation is a run-time fact | 102 |
239239

240240
| how the instrument reached the site | count |
241241
| :--- | ---: |
242-
| receiver carried a readable engine type | 185 |
242+
| receiver carried a readable engine type | 184 |
243243
| receiver erased, placed by the object NAME | 28 |
244244
| receiver erased, placed by an `object: string` PARAMETER | 15 |
245245
| receiver erased, placed by an `UNTYPED_RECEIVERS` row | 5 |
246246

247247
| object name spelled inline | 104 |
248-
| object name spelled through a `const` | 51 |
248+
| object name spelled through a `const` | 50 |
249249
| object name is an `object: string` parameter | 19 |
250250
| object name is some other run-time expression | 59 |
251251

@@ -297,12 +297,12 @@ holds still. They are required to be HERE and to say WHEN they were true;
297297
their values are not compared. The reasoning, and the measurement behind it,
298298
are in `scripts/check-tenant-audit-census.mjs`.
299299

300-
Measured on 2026-10-07 at `e1171ca48`.
300+
Measured on 2026-10-07 at `a93579f45`.
301301

302302
| corpus scale (not enforced) | count |
303303
| :--- | ---: |
304304
| tracked non-test sources scanned | 612 |
305-
| engine-shaped types recognised | 70 |
305+
| engine-shaped types recognised | 69 |
306306
| declared objects in the registry | 116 |
307307
| same-named calls subtracted as non-engine | 160 |
308308

‎docs/audits/2026-08-tenant-audit-write-call-sites.counts.md‎

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ silent, and `node scripts/tenant-audit-census.mjs --write` is the resolution.
3333

3434
| Measure | Value |
3535
|---|---:|
36-
| Write call sites | 233 |
37-
| Object name statically decidable | 155 |
36+
| Write call sites | 232 |
37+
| Object name statically decidable | 154 |
3838
| Object name chosen at run time | 78 |
39-
| Against a tenancy-enabled object | 154 |
39+
| Against a tenancy-enabled object | 153 |
4040
| Against an object declaring tenancy off | 1 |
41-
| Threading a tenant context | 171 |
41+
| Threading a tenant context | 170 |
4242
| Provably carrying none | 8 |
4343
| …and decidably tenancy-enabled | 2 |
4444
| Options argument unreadable | 54 |
4545
| …and decidably tenancy-enabled | 31 |
46-
| Threading a decidably elevated context | 123 |
46+
| Threading a decidably elevated context | 122 |
4747
| Threading a decidably non-elevated context | 0 |
4848
| Threading a context of undecidable elevation | 102 |
4949

@@ -90,12 +90,12 @@ holds still. They are required to be HERE and to say WHEN they were true;
9090
their values are not compared. The reasoning, and the measurement behind it,
9191
are in `scripts/check-tenant-audit-census.mjs`.
9292

93-
Measured on 2026-10-07 at `e1171ca48`.
93+
Measured on 2026-10-07 at `a93579f45`.
9494

9595
| corpus scale (not enforced) | count |
9696
| :--- | ---: |
9797
| tracked non-test sources scanned | 612 |
98-
| engine-shaped types recognised | 70 |
98+
| engine-shaped types recognised | 69 |
9999
| declared objects in the registry | 116 |
100100
| same-named calls subtracted as non-engine | 160 |
101101

@@ -143,7 +143,6 @@ Measured on 2026-10-07 at `e1171ca48`.
143143
| `packages/plugins/plugin-auth/src/objectql-adapter.ts` | `delete` | `objectName` | undecidable | PROVABLY NONE | 5 |
144144
| `packages/plugins/plugin-auth/src/objectql-adapter.ts` | `insert` | `objectName` | undecidable | options unreadable | 2 |
145145
| `packages/plugins/plugin-auth/src/objectql-adapter.ts` | `update` | `objectName` | undecidable | options unreadable | 5 |
146-
| `packages/plugins/plugin-auth/src/phone-sms-texts.ts` | `insert` | `sys_notification_template` | enabled | elevated | 1 |
147146
| `packages/plugins/plugin-auth/src/reconcile-membership.ts` | `insert` | `sys_member` | enabled | context, elevation undecidable | 1 |
148147
| `packages/plugins/plugin-auth/src/scim-connection-service.ts` | `insert` | `sys_scim_connection_credential` | enabled | PROVABLY NONE | 1 |
149148
| `packages/plugins/plugin-auth/src/session-tombstone.ts` | `update` | `objectName` | undecidable | options unreadable | 1 |

0 commit comments

Comments
 (0)