Skip to content

Commit 3d83bec

Browse files
committed
wip: retired slot at four test callers; census and package counts follow the tree
Claude-Session: https://claude.ai/code/session_013RWUA7bNq5bRhehLPqXwMg Co-authored-by: Claude <noreply@anthropic.com>
1 parent 62171c2 commit 3d83bec

9 files changed

Lines changed: 37 additions & 41 deletions

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

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

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

@@ -186,10 +186,10 @@ reproduce them. Where it disagrees, it disagrees on the page:
186186

187187
| carried figure | where it survives | this census |
188188
| :--- | :--- | ---: |
189-
| 175 write call sites | quoted in the merged changeset | **227** |
189+
| 175 write call sites | quoted in the merged changeset | **218** |
190190
| 24 carrying no tenant context | quoted in the merged changeset | **9** provable and tenancy-enabled; **34** more whose options argument is unreadable |
191-
| 127 of 175 statically decidable, 48 runtime-parameter-name sites | restated on the `isSystem`-scoping card | **153 of 227** decidable, **74** undecidable |
192-
| 135 (77%) silenced by the `isSystem` guard before the posture gate | the lost issue body — **no surviving corroboration** | **not reproduced**: 108 decidably elevated, 0 decidably not, 102 undecidable |
191+
| 127 of 175 statically decidable, 48 runtime-parameter-name sites | restated on the `isSystem`-scoping card | **144 of 218** decidable, **74** undecidable |
192+
| 135 (77%) silenced by the `isSystem` guard before the posture gate | the lost issue body — **no surviving corroboration** | **not reproduced**: 99 decidably elevated, 0 decidably not, 102 undecidable |
193193
| 141 and 132, two independent re-derivations | the card that filed this work | — |
194194

195195
**The differences are not reconciled, and deliberately so.** The old census's
@@ -206,11 +206,11 @@ would report a smaller number and would not say so.
206206

207207
The fourth row is the one worth flagging to anyone citing it. **The 135 / 77%
208208
figure has no surviving corroboration anywhere in the tree.** This census reads
209-
108 of 227 (48%) as decidably elevated, with 102 more whose elevation is a
209+
99 of 218 (45%) as decidably elevated, with 102 more whose elevation is a
210210
run-time fact — so the claim is neither confirmed nor refuted, and the honest
211211
answer is that a static reading cannot settle it.
212212

213-
⇒ **Cite `9 / 227`, and say what it is**: the sites whose options argument was
213+
⇒ **Cite `9 / 218`, and say what it is**: the sites whose options argument was
214214
READ and holds no tenant context, against a decidably tenancy-enabled object.
215215
That is the control's provable yield surface. ⛔ Do not cite it as "the sites
216216
without tenant context" — **34 further sites** have an options argument this
@@ -222,28 +222,28 @@ cannot read, and they are neither in nor out.
222222

223223
| what | count |
224224
| :--- | ---: |
225-
| write call sites on the application surface | **227** |
226-
| …whose object name is statically decidable | 153 |
225+
| write call sites on the application surface | **218** |
226+
| …whose object name is statically decidable | 144 |
227227
| …whose object name is chosen at run time | 74 |
228-
| …against an object with tenancy ENABLED | 152 |
228+
| …against an object with tenancy ENABLED | 143 |
229229
| …against an object that declares tenancy off | 1 |
230-
| threading a tenant context | 143 |
230+
| threading a tenant context | 134 |
231231
| PROVABLY carrying none (options read, no context key) | **17** |
232232
| …of those, against a decidably tenancy-enabled object | **9** |
233233
| options argument UNREADABLE — may or may not carry one | 67 |
234234
| …of those, against a decidably tenancy-enabled object | 34 |
235-
| threading a decidably ELEVATED (`isSystem`) context | 108 |
235+
| threading a decidably ELEVATED (`isSystem`) context | 99 |
236236
| threading a context that is decidably NOT elevated | 0 |
237237
| threading a context whose elevation is a run-time fact | 102 |
238238

239239
| how the instrument reached the site | count |
240240
| :--- | ---: |
241-
| receiver carried a readable engine type | 183 |
241+
| receiver carried a readable engine type | 174 |
242242
| receiver erased, placed by the object NAME | 24 |
243243
| receiver erased, placed by an `object: string` PARAMETER | 15 |
244244
| receiver erased, placed by an `UNTYPED_RECEIVERS` row | 5 |
245245

246-
| object name spelled inline | 110 |
246+
| object name spelled inline | 101 |
247247
| object name spelled through a `const` | 43 |
248248
| object name is an `object: string` parameter | 17 |
249249
| object name is some other run-time expression | 57 |
@@ -296,13 +296,13 @@ holds still. They are required to be HERE and to say WHEN they were true;
296296
their values are not compared. The reasoning, and the measurement behind it,
297297
are in `scripts/check-tenant-audit-census.mjs`.
298298

299-
Measured on 2026-09-23 at `8f8828bf6`.
299+
Measured on 2026-09-25 at `62171c25e`.
300300

301301
| corpus scale (not enforced) | count |
302302
| :--- | ---: |
303-
| tracked non-test sources scanned | 576 |
304-
| engine-shaped types recognised | 63 |
305-
| declared objects in the registry | 117 |
303+
| tracked non-test sources scanned | 572 |
304+
| engine-shaped types recognised | 61 |
305+
| declared objects in the registry | 115 |
306306
| same-named calls subtracted as non-engine | 144 |
307307

308308
{/* END GENERATED: tenant-audit-census */}

‎content/docs/protocol/backward-compatibility.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Read the **Breaking?** column, not the version number: during the launch window
111111
1. **RFC (Request for Comments)** — Breaking changes are proposed as GitHub issues with the `protocol:breaking` label.
112112
2. **Deprecation** — The old behavior is deprecated in a MINOR release (see timeline above).
113113
3. **Migration Guide** — A detailed migration guide is published before the removal lands, in the release notes for the version that carries it.
114-
4. **Release** — During the launch window the breaking change ships in the next **MINOR** version, carrying a changeset entry marked `**BREAKING**`. `scripts/check-changeset-no-major.mjs` fails any pull request that declares a `major` bump, because under lockstep one `major` would promote all 70 published packages.
114+
4. **Release** — During the launch window the breaking change ships in the next **MINOR** version, carrying a changeset entry marked `**BREAKING**`. `scripts/check-changeset-no-major.mjs` fails any pull request that declares a `major` bump, because under lockstep one `major` would promote all 69 published packages.
115115

116116
---
117117

@@ -189,7 +189,7 @@ The `@objectstack/spec` package provides additional stability guarantees:
189189

190190
### Which surfaces this covers
191191

192-
**All of them.** This is not scoped to an experimental corner or a pre-release channel: all **70** packages published from this repository belong to a single Changesets `fixed` group, so they share one version number and one policy. No published surface is exempt.
192+
**All of them.** This is not scoped to an experimental corner or a pre-release channel: all **69** packages published from this repository belong to a single Changesets `fixed` group, so they share one version number and one policy. No published surface is exempt.
193193

194194
The convention is enforced rather than informal — `scripts/check-changeset-no-major.mjs` fails any pull request that introduces a `major` bump, because under lockstep a single `major` on one package would promote the entire stack.
195195

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

Lines changed: 9 additions & 15 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 | 227 |
37-
| Object name statically decidable | 153 |
36+
| Write call sites | 218 |
37+
| Object name statically decidable | 144 |
3838
| Object name chosen at run time | 74 |
39-
| Against a tenancy-enabled object | 152 |
39+
| Against a tenancy-enabled object | 143 |
4040
| Against an object declaring tenancy off | 1 |
41-
| Threading a tenant context | 143 |
41+
| Threading a tenant context | 134 |
4242
| Provably carrying none | 17 |
4343
| …and decidably tenancy-enabled | 9 |
4444
| Options argument unreadable | 67 |
4545
| …and decidably tenancy-enabled | 34 |
46-
| Threading a decidably elevated context | 108 |
46+
| Threading a decidably elevated context | 99 |
4747
| Threading a decidably non-elevated context | 0 |
4848
| Threading a context of undecidable elevation | 102 |
4949

@@ -90,13 +90,13 @@ 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-09-23 at `8f8828bf6`.
93+
Measured on 2026-09-25 at `62171c25e`.
9494

9595
| corpus scale (not enforced) | count |
9696
| :--- | ---: |
97-
| tracked non-test sources scanned | 576 |
98-
| engine-shaped types recognised | 63 |
99-
| declared objects in the registry | 117 |
97+
| tracked non-test sources scanned | 572 |
98+
| engine-shaped types recognised | 61 |
99+
| declared objects in the registry | 115 |
100100
| same-named calls subtracted as non-engine | 144 |
101101

102102
## Every site
@@ -153,12 +153,6 @@ Measured on 2026-09-23 at `8f8828bf6`.
153153
| `packages/plugins/plugin-email/src/email-plugin.ts` | `insert` | `sys_email_template` | enabled | elevated | 1 |
154154
| `packages/plugins/plugin-email/src/email-plugin.ts` | `update` | `sys_email_template` | enabled | elevated | 1 |
155155
| `packages/plugins/plugin-pinyin-search/src/companion-projection.ts` | `update` | `schema.name` | undecidable | elevated | 1 |
156-
| `packages/plugins/plugin-reports/src/report-service.ts` | `delete` | `sys_report_schedule` | enabled | elevated | 2 |
157-
| `packages/plugins/plugin-reports/src/report-service.ts` | `insert` | `sys_report_schedule` | enabled | elevated | 1 |
158-
| `packages/plugins/plugin-reports/src/report-service.ts` | `update` | `sys_report_schedule` | enabled | elevated | 2 |
159-
| `packages/plugins/plugin-reports/src/report-service.ts` | `delete` | `sys_saved_report` | enabled | elevated | 1 |
160-
| `packages/plugins/plugin-reports/src/report-service.ts` | `insert` | `sys_saved_report` | enabled | elevated | 1 |
161-
| `packages/plugins/plugin-reports/src/report-service.ts` | `update` | `sys_saved_report` | enabled | elevated | 2 |
162156
| `packages/plugins/plugin-security/src/auto-org-admin-grant.ts` | `delete` | `object` | undecidable | elevated | 1 |
163157
| `packages/plugins/plugin-security/src/auto-org-admin-grant.ts` | `insert` | `object` | undecidable | elevated | 1 |
164158
| `packages/plugins/plugin-security/src/bootstrap-builtin-positions.ts` | `insert` | `object` | undecidable | context, elevation undecidable | 1 |

‎packages/rest/src/execctx-consumer-census.test.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ function makeServer(protocol: any) {
190190
const provider = async () => anyService();
191191
const rs: any = new RestServer(
192192
server, protocol as any, {} as any, undefined, undefined, () => 'env_census',
193-
provider, provider, provider, provider, provider, provider, provider,
193+
// index 10 is the retired saved-report slot (#20102): typed `undefined`.
194+
provider, provider, provider, provider, undefined, provider, provider,
194195
provider, provider, provider, () => true, provider, undefined, provider,
195196
);
196197
return { rs, table: server.table as Map<string, Handler> };

‎packages/rest/src/ui-view-environment-ownership.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ function makeServer(kernelManager: RestKernelManager, defaultEnvironmentId: stri
186186
/* 8 objectQLProvider */ provider,
187187
/* 9 emailServiceProvider */ provider,
188188
/* 10 sharingServiceProvider */ provider,
189-
/* 11 reportsServiceProvider */ provider,
189+
/* 11 (retired saved-report slot) */ undefined,
190190
/* 12 approvalsServiceProvider */ provider,
191191
/* 13 sharingRulesServiceProvider */ provider,
192192
/* 14 i18nServiceProvider */ provider,

‎packages/rest/src/ui-view-route-identity.measurement.test.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ function makeServer(protocol: any) {
118118
// covers this file, which is what turned that into a compile error
119119
// rather than a quietly different harness.
120120
server, protocol as any, {} as any, undefined, undefined, () => 'env_13214',
121-
provider, provider, provider, provider, provider, provider, provider,
121+
// index 10 is the retired saved-report slot (#20102): typed `undefined`.
122+
provider, provider, provider, provider, undefined, provider, provider,
122123
provider, provider, provider, () => true, provider, undefined, provider,
123124
);
124125
return { rs, table: server.table as Map<string, Handler> };

‎packages/rest/src/ui-view-route-tenancy.measurement.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ function makeServer(wiring: Wiring) {
261261
/* 8 objectQLProvider */ provider,
262262
/* 9 emailServiceProvider */ provider,
263263
/* 10 sharingServiceProvider */ provider,
264-
/* 11 reportsServiceProvider */ provider,
264+
/* 11 (retired saved-report slot) */ undefined,
265265
/* 12 approvalsServiceProvider */ provider,
266266
/* 13 sharingRulesServiceProvider */ provider,
267267
/* 14 i18nServiceProvider */ provider,

‎packages/spec/llms.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ function registerObject(rawConfig: unknown) {
178178

179179
---
180180

181-
## 7. Package Ecosystem (69 packages)
181+
## 7. Package Ecosystem (68 packages)
182182

183-
The workspace publishes 69 packages under the `@objectstack` scope. The table
183+
The workspace publishes 68 packages under the `@objectstack` scope. The table
184184
below is a curated entry-point list, not the full set — drivers, connectors,
185185
triggers, plugins and kernel-managed services each form their own family.
186186

‎scripts/publish-smoke-pack.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* a future exclusion cannot re-open the hole silently.
3434
*
3535
* Source of truth: the workspace itself. The Changesets `fixed` group in
36-
* .changeset/config.json enumerates the same 70 names, but it is a DERIVED
36+
* .changeset/config.json enumerates the same 69 names, but it is a DERIVED
3737
* declaration validated against the workspace by scripts/check-changeset-fixed.mjs
3838
* (which reddens both when a public package is missing from the group and
3939
* when a group name no longer exists) — deriving from the group would mean

0 commit comments

Comments
 (0)