Repository navigation
Commit 4bf4e7e
Part of #20595
Clause-②: no
## What changed
Stage 3 of the `domain:engine` lane of the dead-citation sweep:
`packages/objectql/**`, comment and docblock prose only, per the claim
(`5941871762`). Stages 1 and 2 (`packages/metadata-protocol`) landed as
`a7d9768ec` and `d150c3039`; #20595 stays open for the next stage
(`driver-sql`).
Every comment or docblock site in the package that cited a tracker
number answering 404 is rewritten in ruling C+D's form C (record
`5749154545` on #19123): the ADR when one records the decision,
otherwise the commit in this repository's history that made it. That is
**279 sites on 275 lines in 67 files, covering 70 numbers**:
- **136 census sites** (136 lines, 17 files under `src/`): the whole
`allocated-but-absent` population of the gate's own census in this
package at the base, the slash-joined `plugin.ts` `#10629` from the
post-landing census (`5923084795`, now at `:1543`) included;
- **1 site in `vitest.config.ts`** (`:61`, `#17853`): outside the census
glob, inside the claimed surface;
- **142 test-comment sites** (138 lines, 49 test files), which the
census defers. They carry 51 numbers: the census itself reads 36 of them
as dead elsewhere in the repository, and never judges the other 15 (they
stand only in test files here), which the board and a single read each
settle.
**Anchors: 66 numbers by commit, 4 by ADR, 0 by words alone.** 45
numbers reuse the anchor another lane or stage already measured for
them, 23 were measured here, and 2 are split between a reused and a
measured commit (see the table). Two depart from another lane's anchor
for a stated reason (`#10629`, `#10243`, under Wordings to check).
Only comments changed. Every file keeps its line count (275 lines out,
275 in, plus the changeset), so no line citation into any of them moves.
No code token moves (the guard below). **No citation number is added**:
on every changed line, the numbers on the new text are a subset of those
on the old, and the diff-scoped gate judged the 14 citations left on
changed lines: 13 resolve and 1 is a declared cross-repo reference.
**A `patch` changeset**: 54 of the 137 rewritten non-test lines are in
the published `dist` (the `.d.ts` keeps JSDoc on exported members, and
esbuild keeps some comments in the JS), and `dist` is not byte-identical
with the base text (see Changeset).
## Census: `objectql`, before and after
**Instrument (A1).** The gate's own `node
scripts/check-issue-citations.mjs --census --json`, read-only and
unchanged. The count is its `allocated-but-absent` findings under
`packages/objectql/`.
| reading | tree | board | whole-repo `allocated-but-absent` | sites |
lines | files | numbers |
|---|---|---|---|---|---|---|---|
| before | base `4727fcb22`, run 22:38:04Z to 22:41:42Z | enumerated,
191 pages, frontier #21252, 19,073 records (newest number read before
and after the run: #21252) | 592 | **136** | 136 | 17 | 50 |
| after | `8d6465457`, run 23:19:32Z to 23:22:54Z | enumerated, 191
pages, frontier #21261, 19,082 records (newest before and after: #21261)
| 456 | **0** | 0 | 0 | 0 |
The whole-repo drop is 136, and the two finding sets differ by exactly
the 136 rows of this package, removed; none was added. `resolves`
(34,638), `resolves-as-pull-request` (2,095) and `cross-repo-unjudged`
(1,144) did not move. The card's 135 was taken at `f11b5f20a2` with the
older extractor; the base here reads 136, the difference being
`plugin.ts` `#10629`. The same census at the first base `d150c3039`
(before a fast-forward to `4727fcb22`, which touched no `objectql` file)
read the identical 136 rows. The head's only later commit is a merge of
`main` that touches no file under `packages/objectql` (`git diff
8d64654 1e08958 -- packages/objectql` is empty).
**Supplementary instrument, the whole package.** The census reads
neither test files nor strings nor files outside `src`. A second reading
runs the gate's own exported `extractCitations` (whole-file and
comment-prose projections) and `namesThisRepository` over every tracked
file in the package (430 `.ts`, 6 `.json`, 2 `.md`, `LICENSE`), and
classifies each citation with the gate's `classifyCitation` against one
board enumerated by the gate's `enumerateBoard` (191 pages, frontier
#21252, 19,073 records, 22:43:50Z). Every one of the 70 numbers in the
population was then read on its own over the issues endpoint: **all 70
answer 404**, and the lit controls `#5286` and `#12624` answer 200.
| reading | citations | dead | src comment | test comment | test string
| changelog |
|---|---|---|---|---|---|---|
| before, `4727fcb22` | 9,338 | **388** | 137 | 142 | 43 | 66 |
| after, head | 9,059 | **109** | 0 | 0 | 43 | 66 |
`src comment` includes `vitest.config.ts`. The drop of 279 citations is
exactly the rewritten sites, and the live counts did not move (non-test
comment: 2,971 resolve, 80 as pull requests; test comment: 2,700 and
122). A third, raw reading (every `#` followed by 2 to 6 digits,
whatever surrounds it) counts 9,504 before and 9,225 after: the same
drop of 279.
**Comment ids.** Six distinct comment-id citations stand on 11 lines in
this package (`5237739551`, `5434929046`, `5791803339`, `5805782503`,
`5865053231`, `5865693155`). Each was read over the issue-comments
endpoint and each answers 200 (control `5941871762`, 200), so none is in
the population.
## Per-number table
`src` counts census sites (plus `vitest.config.ts` for `#17853`), `test`
counts test-comment sites. Every sha below matches exactly one commit
(`git rev-parse --disambiguate`, count 1) and is an ancestor of the base
(`git merge-base --is-ancestor`, exit 0 for all 67 shas; the clone is
not shallow, 15,432 commits at the base). The message or the diff of
each one names the number it replaces, with one exception, `#10629`,
explained under Wordings to check. Where a sentence credits a ruling, a
measurement or a note to the number, the anchor's own message or diff
carries it (checked per site; the ones that needed a reworded sentence
are listed below). `source` says whether another lane or stage already
used this anchor for this number (`reused`) or it was measured here
(`measured`).
| number | src | test | anchor | kind | source | what it decided |
|---|---|---|---|---|---|---|
| `#6037` | 2 | 1 | `18189983d` | commit | reused | validate-only data
operation — DataProtocol.validateData |
| `#6083` | 3 | 2 | `53068c130` | commit | reused | ADR-0122 phase 2 —
flip bare names to parsed semantics |
| `#6241` | 0 | 1 | `83a3b1f2e` | commit | reused | normalize the
`:type` segment once per handler so the plural spelling cannot skip the
§6.7 audience gate |
| `#6300` | 5 | 4 | `74155c735` | commit | reused |
IDataEngine.find/findOne accept the author state — engine fills
SortNode.order's declared default |
| `#6311` | 0 | 1 | `59b794f71` | commit | measured | narrow
`HookContext.api` from `z.unknown()` to the minimal `IScopedContext` |
| `#6478` | 0 | 1 | `474f131cf` | commit | reused | roll `flow`'s
`allowOrgOverride` back to `false` per ADR-0005's original call, the
write path refusing loudly |
| `#6483` | 0 | 9 | `ee58392e1` | commit | reused | enforce the ADR-0005
whitelist: nine unratified `allowOrgOverride: true` flags rolled back to
`false` (its message records the 2026-08-08 ruling) |
| `#6573` | 5 | 6 | `708431313` | commit | measured | `registerHook`
refuses an empty `object` target and a self-cancelling scope |
| `#6723` | 0 | 4 | `8ad609c69` | commit | reused | declare what
IMetadataService.getObject answers with |
| `#6725` | 3 | 7 | `1507ba356` | commit | reused | MetadataFacade
object writes now reach the map its reads use |
| `#6745` | 0 | 4 | `7a5ef0008` | commit | reused | pin getObject(n) =
get('object', n) across all three IMetadataService implementations |
| `#8454` | 1 | 0 | `427344c26` | commit | measured | the object catalog
loses to an explicitly-set scalar |
| `#8460` | 7 | 0 | ADR-0029 D9.2a | ADR | reused | ADR-0029 D9.2a, the
2026-08-13 amendment: an extender's scalar yields to a diverged base (it
names the number; executed as `01a7337fc`) |
| `#8648` | 1 | 4 | `e5eeb499c` | commit | reused | pin the SEARCH-axis
remedy agreement, and correct the three comments that claimed
word-identity |
| `#8672` | 6 | 4 | `ff08691e6` | commit | measured | a system-context
insert resolves the install's organization, or is refused — the runtime
producer of the autonumber fork |
| `#8818` | 0 | 1 | `fd6bdf89f` | commit | reused | saveMetaItem's
missing-item refusal declares 400 INVALID_REQUEST instead of answering
500 |
| `#8823` | 10 | 4 | `4dfa369a9` | commit | measured | drop the caller
value MySQL inlines in its duplicate-entry diagnostic |
| `#9030` | 2 | 1 | `27a567dd8` | commit | measured | teach the
internal-leak predicate MySQL's three error templates |
| `#10062` | 2 | 0 | `fa5d137ab` | commit | reused | gate undeclared
workspace imports in published src |
| `#10091` | 1 | 0 | `da891e0ef` | commit | reused | gate sys_attachment
beforeUpdate with the uploader-or-parent-editor rule |
| `#10165` | 2 | 1 | `801296050` | commit | reused | lifecycle
ttl.onlyWhen row filter with the canonical null predicate |
| `#10194` | 0 | 3 | `2306a765c` | commit | reused | validate theme /
analytics_cube at the /meta write door via UNREGISTERED_KIND_SCHEMAS |
| `#10243` | 1 | 1 | ADR-0126 §7.2 | ADR | measured | ADR-0126 §7.2: the
durable ledger row replaces the process-local `flowEnabled` map,
retiring the env-wide toggle leak's mechanism (it names the number) |
| `#10290` | 4 | 1 | `2570ab05c` | commit | measured | the primary key
is never a `__search` companion source |
| `#10347` | 5 | 3 | `530c1df65` | commit | reused | the Archiver
honours a declared `ttl` instead of archiving by `created_at` age alone
|
| `#10485` | 0 | 2 | `35ad101bc` | commit | reused | retire the `themes`
carrier key and ThemeSchema — `app.branding` is the one colour surface |
| `#10527` | 1 | 0 | `5649efbf9` | commit | reused | refuse a diverging
retention + ttl + archive lifecycle triple at parse time |
| `#10528` | 4 | 1 | `7d483e1e5` | commit | measured | the Archiver
resolves its window through P4 governance |
| `#10629` | 1 | 2 | `199ec4712` | commit | measured | bind federated
objects whatever the boot order, and report what could not be bound |
| `#10643` | 1 | 0 | `5649efbf9` | commit | measured | refuse a
diverging retention + ttl + archive lifecycle triple at parse time |
| `#10729` | 1 | 1 | `10485009a` | commit | measured | log a contributed
kind by its declared `id` |
| `#11065` | 1 | 0 | `20950404c` | commit | reused | count a boolean
aggregand as 1/0 in avg and sum |
| `#11311` | 1 | 0 | `1272f0a6b` | commit | reused | promote
resolveRecordOrganizationField to the shared platform-row resolver:
approvals and automation runs stamp the subject record's organization |
| `#11427` | 5 | 0 | `c3c72a4bc` | commit | reused | hydrate a
tombstoned sys_file that still has a live holder |
| `#11674` | 0 | 4 | `9a884c6e4` + `1cba33f16` | commit | reused | seed
pass 2 writes back by the internal id captured at insert time, healing
keyless datasets / warn at load time when a seed defers a required
column, and document the ordering constraint at the four pointer-pair
sites |
| `#12194` | 0 | 2 | `311433f6b` | commit | reused | Declare the
metadata item-name grammar in spec and refuse it loudly at the publish
door |
| `#13178` | 2 | 1 | `f087c376f` + `e49d98896` | commit |
reused+measured | scope the sys_file / sys_upload_session update and
delete doors to the acting organization / cut the tenant-audit control's
scope by the object's tenancy, not the caller's flag |
| `#13197` | 5 | 11 | `56c093c4d` | commit | reused | enforce
field-level `unique` so a colliding write is refused, not landed |
| `#13273` | 1 | 4 | `3a86a65e7` | commit | reused | pick the `find`
failure log level from the cause — "the table is not provisioned yet" is
not "the read failed" |
| `#13644` | 3 | 2 | `34ce8e7db` | commit | reused | declare
ctx.referentialFieldClear on HookContextSchema, populate every set_null
cleanup write, and carry it across the QuickJS sandbox boundary |
| `#13657` | 4 | 4 | `b003cf2e8` | commit | reused | Refuse an
undeclared field a before-hook writes — the post-hook half of the
declared-field door, one envelope on every driver |
| `#14163` | 0 | 1 | ADR-0130 D3 + `1dcb995f2` | ADR | measured |
ADR-0130 D3: the gate relaxation and the object-name uniqueness check
are one change; `1dcb995f2` landed it, and its changeset names the
number |
| `#14345` | 0 | 1 | `e89fa9233` | commit | measured | declare
aggregate? on IDataDriver with the signature the engine calls |
| `#14390` | 6 | 1 | `9d7f7259f` | commit | reused | `update` answers a
driver unique violation with the `DUPLICATE_RECORD` envelope, on every
driver |
| `#14399` | 3 | 8 | `3c1bbd2a8` | commit | measured | derive a view
container's object through the shared helper, so the row's own `name` is
LAST at every SOURCE registrar |
| `#14422` | 0 | 1 | `dc7c226b9` | commit | reused | give the
standalone-action owner-key ladder one spelling |
| `#14423` | 11 | 2 | `a56baa2bd` | commit | reused | the action audit
reads the store key and asks the plane by name, and listNames gains
loadMany fault parity |
| `#14472` | 1 | 1 | `00ff228fe` | commit | measured | decide the
insert-side runtime-owned strip by hook-write provenance |
| `#14474` | 1 | 3 | `df657d9df` | commit | reused | carry an ADR-0112
envelope on the install-time namespace conflict refusal |
| `#14484` | 1 | 0 | `3f64fe6c6` | commit | reused | stamp
organization_id on every sys_record_share write, backfill the stranded
rows, admit the object to the tenancy ledger |
| `#14535` | 0 | 1 | `1aba3159a` | commit | measured | declare the
recorded-by fixture's lookup with the canonical `reference` key |
| `#14666` | 1 | 6 | `d0ee598e6` | commit | measured | refuse a view
container whose `name` disagrees with its derived object key |
| `#14667` | 0 | 1 | `dc7c226b9` | commit | reused | give the
standalone-action owner-key ladder one spelling |
| `#14680` | 1 | 1 | `3bd9b3498` | commit | measured | a leaf
`/view-container` subpath keeps objectql's lean ADR-0076 closure free of
the manager, chokidar, glob and js-yaml |
| `#14683` | 0 | 4 | `96326040f` | commit | reused | apply the
allowOrgOverride read gate inside getMetaItems, so multi-type sweeps are
scoped per type |
| `#14723` | 1 | 0 | `65846bc46` | commit | reused | a batch/import ROW
reports a unique-constraint refusal as `UNIQUE_VIOLATION`, the route's
one wire spelling |
| `#14770` | 0 | 6 | `d5cbb44f3` | commit | reused | gate
`getMetaItem`'s overlay read on the metadata registry |
| `#14878` | 0 | 2 | `29db3cd2a` | commit | reused | widen the
deleted-member absence pin from one file to the tree |
| `#14957` | 1 | 0 | `26144c204` | commit | measured | Derive and gate
the platform-object tenancy census |
| `#15041` | 2 | 1 | ADR-0104, 2026-09-05 addendum | ADR | reused |
ADR-0104's 2026-09-05 addendum: the media column holds the bare
`sys_file` id; its execution order puts the driver card at step 2 (it
names the number) |
| `#15094` | 1 | 0 | `901773b21` | commit | measured |
check-react-page-adapter-contract names its class by shape, not by the
records spelling, and re-anchors its citation |
| `#16608` | 4 | 0 | `a016f08b8` | commit | reused | evaluate the
insert-side RLS `check` on the row that will be stored, after
`beforeInsert` |
| `#16711` | 1 | 0 | `7862fb711` | commit | measured | object-definition
parameters declare the keys they are read for, plus a gate that sees
subclass overrides |
| `#16729` | 1 | 0 | `0f38ab084` | commit | measured | an explicit
tenancy opt-out survives a partial `syncSchema` re-registration |
| `#16783` | 1 | 1 | `854639b31` | commit | reused | `findOne`, `update`
and `delete` declare what they answer, and their hook seams are guarded
|
| `#16786` | 3 | 2 | `5c8f5af50` + `6059b29c0` | commit |
measured+reused | `ObjectRepository` declares the `findOne` / `update`
shapes it already published / declare
IScopedObjectRepository.updateById's answer — the record or null, not
any |
| `#16805` | 2 | 0 | `a016f08b8` | commit | reused | evaluate the
insert-side RLS `check` on the row that will be stored, after
`beforeInsert` |
| `#17195` | 1 | 0 | `d2c1d1980` | commit | reused | beforeUpdate
receives the persist image; the caller submission moves to ctx.submitted
|
| `#17219` | 3 | 2 | `706ad0fcc` | commit | reused | name the withheld
read-only key when a hook faults reaching through it |
| `#17853` | 1 | 0 | `08f5f0e5a` | commit | reused | make a vitest
filter that selects no test file say so |
## Wordings to check
Most rewrites swap a tag in place (`[#N]` to `[commit SHA]`, `(#N)` to
`(commit SHA)`, `#N's X` to `commit SHA's X`, `PR #N` to its squash
commit), the form the landed stages use. These say more than the tag:
- **`#10629`, three sites** (`plugin.ts:1543`,
`skip-schema-sync-registers-object-metadata.test.ts:22`, `:153`): 「the
same ruling #7737/#10629 made for federated objects」 became 「the same
ruling #7737 made for federated objects (commit 199ec47)」. `199ec4712`
is #7737's fix, and its message states the ruling the sites paraphrase:
`OS_SKIP_SCHEMA_SYNC` is a DDL flag while the federated binding is
DDL-free, and the binding is reconciled on `kernel:ready`. Its message
and diff name #7737, **not #10629**: the only commit that names #10629
as its own (`13a6cb4ad`, the runtime lane's anchor for it) is an
expected-log-noise capture, a different subject, and `a037f7cbd`, which
wrote the 「#7737/#10629 ruling」 phrase, records nothing #10629 added. So
the dead number is dropped and the live #7737 carries the citation,
beside the commit that decided it. The same pair stands in `driver-sql`
(`sql-driver.ts`), the next stage.
- **`#10243`, two sites** (`action-activation.ts:185`,
`action-activation.test.ts:23`): 「the #10243 mechanism ADR-0126 retires」
became 「the env-wide toggle leak's mechanism ADR-0126 §7.2 retires」.
ADR-0126 §7.2 names that mechanism (the process-local `flowEnabled` map)
and the number (「the #10243 leak's mechanism」), so ruling C's ADR rung
applies; the dogfood lane anchored a similar sentence to `02b41232d`,
the measurement commit.
- **`#8672`, ten sites**: #8672 was an observation that no commit fixed.
`ff08691e6` is the first in-repo record of its reasoning: its diff
quotes 「an org-less row is defensible for `sys_permission_set`」 and
names #8672 five times. So 「#8672's reasoning」 became 「commit
ff08691's (recorded) reasoning」, and 「#8672 measured this primitive」
(`system-write-organization.test.ts:347`) became 「The card commit
ff08691 cites measured this primitive」.
`system-write-organization.test.ts:117` quotes what the file used to
read, 「platform namespace ⇒ deliberately org-less (#8672)」; the quoted
number is elided to 「(…)」 rather than re-spelled, so the quote stays
true.
- **`#13178`'s census figure** (`engine.ts:5450`,
`tenancy-by-object-classification.test.ts:26`): 「#13178 census measured
… 135 of 175」 became 「census cited in commit e49d988's message
measured … 135 of 175」. That message carries the figure; see Acceptance
notes for what `4ecafc78b` records about it.
`platform-object-tenancy.ts:144` (the `sys_upload_session` update
writer) takes `f087c376f`, the service-storage lane's anchor.
- **`#15094`** (`find-hook-result-shape.ts:30`): 「the ~70 … normalizer
limbs the #15094 census counted」 became 「… limbs a census counted
(commit 901773b records its band)」. `901773b21` wrote the header of
`scripts/check-react-page-adapter-contract.mjs`, which records that
census (104 blocks at `ca46f8f12`) and a re-measure band; it does not
restate 「~70」, so the sentence points at the band and claims nothing
more.
- **`#16805`** (`engine.ts:13014`, `:13218`): 「the contract review of PR
#16805 measured」 became 「the contract review commit a016f08 records
measured」. `a016f08b8` is that pull request's squash, and its message
records the review's finding.
- **`#16786`**: the `objectql` half (`engine.ts:18230`, `:18264`, two
tests) takes `5c8f5af50`, the commit that declared `ObjectRepository`'s
`findOne` / `update` shapes; `engine.ts:18272`'s 「stays open on #16786」
became 「(its spec half: commit 6059b29)」, the spec lane's anchor,
since that half has landed.
- **`#14163`** (`registry-ownership-refusal-envelope.test.ts:11`):
`(ADR-0130 D3, commit 1dcb995)`. The cited thing is the install-time
object-name check; ADR-0130 D3 decides it, and `1dcb995f2` landed it
with a changeset naming #14163.
- **`#8460`** (seven `registry.ts` sites): ADR-0029 D9.2a, the
2026-08-13 amendment, which names #8460; the dogfood and spec lanes used
the same. `:2508`'s 「every shape #8460 measured」 became 「every shape the
ADR-0029 D9.2a amendment records」.
- **`#15041`** (`engine.ts:7164`, `:9860`, one test): 「the ruling on
#15041 step 2」 became 「sequencing step 2 of ADR-0104's 2026-09-05
addendum」, the cli lane's spelling of the same record.
- **`#6241`** (`metadata-service-roundtrip-conformance.test.ts:41`):
「the gate's header carries #3984/#5881/#6241」 became 「… carries #3984,
#5881 and the third bypass, fixed in commit 83a3b1f」, because that
header (`scripts/`, another lane's surface) still carries the number
itself.
- **Tense, where the anchor is past**: 「the phantom read #14770 removes」
became 「… commit d5cbb44 removed」 (`protocol-meta.test.ts:100`) and
「the resurrection #14683 closes」 became 「… commit 9632604 closed」
(`:169`), as stage 1 wrote it. `:181`'s backticked `` `#14770` `` became
plain 「commit d5cbb44」; its message records the four raw-org callers
the line says it measured.
- **Card antecedents**: 「the whole subject of #14423」 became 「the whole
subject of the card commit a56baa2 closed」
(`action-governance.ts:406`); 「the C4 cell #14423's ruling left open」
became 「the C4 cell commit a56baa2 left open」
(`plugin-governance-scoped-metadata.test.ts:5`; that commit pins C4 as
「a BOUNDARY, not a defect」); 「route 3 of #8648」 became 「route 3 of the
card commit e5eeb49 fixed」
(`query-expression-conformance.test.ts:1070`, a line that commit wrote);
「filed #6573」 / 「#6573's ruling」 became 「filed the card commit 7084313
closed」 / 「The decision commit 7084313 records」
(`hook-exclude-objects.test.ts:501`, `:502`); 「(#11674, the card's
"Second, NOT measured" question)」 became 「(the "Second, NOT measured"
question on the card commit 9a884c6 fixed)」; 「measurement (#13644)」
became 「measurement (on the card commit 34ce8e7 closed)」.
- **Other single rewrites**: 「and #6573 is why」 became 「and commit
7084313 says why」 (`engine.ts:2433`; its message gives the reason);
「question at this line (#10527), since decided」 became 「question at this
line, since decided by that commit」 (`lifecycle-service.ts:1294`, where
`:1293` now cites `5649efbf9`); 「#14680 is what they cost」 became 「the
leak commit 3bd9b34 closed is what they cost」
(`core-boundary.ratchet.test.ts:52`); 「The #10165 acceptance criterion」
became 「The acceptance criterion behind commit 8012960」.
- **Reference lists**
(`metadata-service-getobject-equivalence.test.ts:51`,
`metadata-service-roundtrip-conformance.test.ts:68`,
`metadata-facade.test.ts:101`): the dead numbers became their commits,
in the spec lane's 「commits SHA (what), …」 form; the live numbers in
those lists stay, `PR #7211` beside its `1507ba356`.
- No line was reflowed, so some are longer than their block's wrap
(`eslint.config.mjs` declares no line-length rule, and a reflow would
move neighbouring lines and every line citation into the file).
## Sites left
- **In comments (src, test, `vitest.config.ts`): none.**
- **String literals: 43 test-string sites, 25 numbers, 23 files**
(describe and `it` titles, assertion arguments): `#14422` 4, `#13273` 3,
`#13657` 3, `#17219` 3, `#11674` 3, `#6573` 3, `#14423` 2, `#10165` 2,
`#14535` 2, `#10290` 2, `#8672` 2, and 14 more once each. Every one of
the 25 is in this stage's population, so the table above holds an anchor
for each. Non-test strings carry none. Strings are outside this stage's
surface.
- **Outside `src`:** the release-owned `CHANGELOG.md` names dead numbers
on 66 sites (44 numbers); left. `test-typecheck-debt.json`,
`tsconfig.test.json` and `tsconfig.scripts.json` cite only live numbers.
## Mechanical guard: no code token moves
The guard (stage 2's) compares, base `4727fcb22` against the working
tree, over all 67 touched files, with TypeScript 6.0.3:
- **Reading 1**: the parser's leaf nodes, from a `forEachChild` walk.
Comments are trivia there, and JSDoc is never visited.
- **Reading 2**: the full token stream in parser context, from a
`getChildren` walk, JSDoc nodes skipped. String, template and numeric
literals are compared in full on both readings.
Results:
- Real run at the head: 298,707 base tokens, **0 files with a token
change** (exit 0).
- Comment control (「The defaulting」 to 「The DEFAULTING」 on
`engine.ts:5`): 0 files changed (exit 0).
- Positive control, an identifier (`ARCHIVE_BATCH_SIZE` to
`ARCHIVE_BATCH_SIZEX`, `lifecycle-service.ts`): DIFFER on both readings
(exit 1).
- Positive control, a string literal (`'[value redacted]'` to `'[value
redactedX]'`, `driver-fault-redaction.ts`): DIFFER on both readings
(exit 1).
- Positive control, a numeric literal (`ARCHIVE_MAX_BATCHES_PER_SWEEP =
20` to `21`): DIFFER on both readings (exit 1).
Each mutation went through `scripts/ablation-replace.mjs` (wrap mode)
under a shell trap that restores by absolute path from `HEAD`. Each
landed (anchor 1 to 0, blob changed), and each restore was proven equal
to its `HEAD` blob (`71f6c9268aeb`, `34b1dd7989b8`, `9594cdd593c8`),
with `git diff HEAD` empty and a clean tree afterwards.
## Changeset: `patch` (`dist` measured)
`files[]` is `dist`, `README.md` and `CHANGELOG.md`, and the package is
not private. The dependency closure was built first (`turbo run build
--filter='@objectstack/objectql^...'`, 13 tasks). Then the package's own
`build` (tsup plus `check-dts-emitted`) ran three times in one script
under the shared verify lock (VERDICT command-exit 0):
- **Leg 1**, at `9d6a0a8d6`: 14 `dist` files hashed. Of the 137
rewritten non-test lines, 54 appear verbatim in `dist`: 25 from
`engine.ts`, 7 from `action-governance.ts`, 5 from
`platform-object-tenancy.ts`, and 17 from ten other files; in
`index.d.ts` / `index.d.mts`, the shared `util-*.d.ts` chunk, and
`index.js` / `index.mjs` / `core.js` / `core.mjs`.
- **Leg 2**, the base text put back in the 18 non-test files (18 of 18
proven equal to their base blob): 10 of the 14 files differ from leg 1
(`core` and `index` in `.d.ts`, `.d.mts`, `.js`, `.mjs`, and the
`util-*` chunk's two `.d` files).
- **Leg 3**, after the proven restore (18 of 18 equal to their `HEAD`
blob, `git diff HEAD` empty): all 14 files are byte-identical to leg 1,
so the build is deterministic and the difference is the rewrite.
So the rewrite ships, and
`.changeset/20595-objectql-provenance-anchors.md` declares a `patch` for
`@objectstack/objectql`, comment text only, with the claim's `Clause-②:
no` line.
## Gates (head `1e0895870d`)
- **Derived gates:** `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` at `1e0895870d` (68 paths against
merge base `8dea55d31`; no stale-tree warning) derived 68 commands. All
68 ran, each exit code captured before any pipe: 68 exit 0. `--ran`
reports 「68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN」 (a derived zero)
and exits 0. A full `turbo run build` over `./packages/*` and
`./packages/*/*` ran first under the verify lock (71 of 71 tasks,
VERDICT command-exit 0), so no gate read an unbuilt workspace.
- **Named in the dispatch:** `node scripts/check-issue-citations.mjs`
exits 0 (「every citation this change adds resolves (or is a declared
cross-repo reference)」, 14 judged across 17 files); `pnpm
check:issue-citations` exits 0 (self-test); `pnpm check:doc-authoring`
exits 0 (the sibling-package prose-id baseline holds, no growth); `pnpm
check:nul-bytes` exits 0, and a raw scan of the 68 changed files for
control bytes finds none.
- **Tests and typecheck, under the verify lock, at `1e0895870d`:** `pnpm
--filter @objectstack/objectql test`: 360 test files and 7,082 tests
pass. `pnpm --filter @objectstack/objectql typecheck` exits 0; its
`check:test-typecheck` step compiles all 361 tracked test files under
`tsconfig.test.json` (`tsc --listFiles`), the ledger holding (40 files,
234 errors, 65 pinned signatures).
- **Lint, as a proven narrowing:** eslint with inline config disabled,
over the 67 touched `.ts` files plus `dist/index.js` as the control: 68
results, 0 errors and 1 warning, the control's ignore notice; none of
the 67 is reported ignored. `eslint.config.mjs` never enables type-aware
linting (its lines 327-328 say so), so a comment edit cannot move the
verdict on an untouched file. The repo-wide `pnpm lint` is CI's run.
## Acceptance notes
- **Base.** The branch was cut at `d150c3039`, fast-forwarded to
`4727fcb22` before any edit (both census readings of this package
agree), and merged with `main` once at `8dea55d31` before the gates;
that merge touched no file under `packages/objectql` and neither
`check-issue-citations.mjs` nor `dispatch-gates.mjs`. Tests, typecheck
and gates ran on the merged head.
- **The `135 of 175` figure.** `engine.ts:5450` and
`tenancy-by-object-classification.test.ts:26` state that census figure
as measured. `4ecafc78b`, which re-derived the tenant-audit census as an
in-tree artifact after #13178 became unreachable, records that 「the
135/77% "silenced by the isSystem guard" figure has no surviving
corroboration and is not reproduced」. This stage moves the citation to
the commit whose message carries the figure and leaves the claim as
written; whether those two sentences should say so is outside a citation
sweep.
- **A board enumeration came back short, at exit 0.** One run of the
gate's own `enumerateBoard`, between two full ones, returned 91 pages,
9,000 records and frontier #9389, and raised nothing; the runs either
side of it read 191 pages and frontier #21252. Its only guard is a
zero-record check. This stage discarded that reading and re-enumerated;
nothing above rests on it. Noted only.
- **Wording only:** no line without a number was changed, except the
lines whose antecedent was the number itself, listed above.
---
_Generated by [Claude
Code](https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent b91e40b commit 4bf4e7e
68 files changed
Lines changed: 291 additions & 275 deletions
File tree
- .changeset
- packages/objectql
- src
- lifecycle
- tenancy
- validation
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
185 | | - | |
| 185 | + | |
186 | 186 | | |
187 | 187 | | |
188 | 188 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
264 | 264 | | |
265 | 265 | | |
266 | 266 | | |
267 | | - | |
| 267 | + | |
268 | 268 | | |
269 | 269 | | |
270 | 270 | | |
| |||
317 | 317 | | |
318 | 318 | | |
319 | 319 | | |
320 | | - | |
| 320 | + | |
321 | 321 | | |
322 | 322 | | |
323 | 323 | | |
| |||
336 | 336 | | |
337 | 337 | | |
338 | 338 | | |
339 | | - | |
| 339 | + | |
340 | 340 | | |
341 | 341 | | |
342 | 342 | | |
| |||
394 | 394 | | |
395 | 395 | | |
396 | 396 | | |
397 | | - | |
| 397 | + | |
398 | 398 | | |
399 | 399 | | |
400 | 400 | | |
| |||
403 | 403 | | |
404 | 404 | | |
405 | 405 | | |
406 | | - | |
| 406 | + | |
407 | 407 | | |
408 | 408 | | |
409 | 409 | | |
| |||
474 | 474 | | |
475 | 475 | | |
476 | 476 | | |
477 | | - | |
| 477 | + | |
478 | 478 | | |
479 | 479 | | |
480 | 480 | | |
| |||
522 | 522 | | |
523 | 523 | | |
524 | 524 | | |
525 | | - | |
| 525 | + | |
526 | 526 | | |
527 | 527 | | |
528 | 528 | | |
| |||
538 | 538 | | |
539 | 539 | | |
540 | 540 | | |
541 | | - | |
| 541 | + | |
542 | 542 | | |
543 | 543 | | |
544 | 544 | | |
| |||
Lines changed: 4 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
| 76 | + | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| |||
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
98 | | - | |
| 98 | + | |
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
| 52 | + | |
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
| 109 | + | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
139 | | - | |
| 139 | + | |
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
| |||
284 | 284 | | |
285 | 285 | | |
286 | 286 | | |
287 | | - | |
| 287 | + | |
288 | 288 | | |
289 | 289 | | |
290 | 290 | | |
| |||
761 | 761 | | |
762 | 762 | | |
763 | 763 | | |
764 | | - | |
| 764 | + | |
765 | 765 | | |
766 | 766 | | |
767 | 767 | | |
| |||
864 | 864 | | |
865 | 865 | | |
866 | 866 | | |
867 | | - | |
| 867 | + | |
868 | 868 | | |
869 | 869 | | |
870 | 870 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
63 | | - | |
| 63 | + | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| |||
108 | 108 | | |
109 | 109 | | |
110 | 110 | | |
111 | | - | |
| 111 | + | |
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
| |||
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
143 | | - | |
| 143 | + | |
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
| |||
266 | 266 | | |
267 | 267 | | |
268 | 268 | | |
269 | | - | |
| 269 | + | |
270 | 270 | | |
271 | 271 | | |
272 | 272 | | |
273 | | - | |
| 273 | + | |
274 | 274 | | |
275 | 275 | | |
276 | 276 | | |
| |||
295 | 295 | | |
296 | 296 | | |
297 | 297 | | |
298 | | - | |
| 298 | + | |
299 | 299 | | |
300 | 300 | | |
301 | 301 | | |
| |||
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
355 | | - | |
| 355 | + | |
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
| |||
405 | 405 | | |
406 | 406 | | |
407 | 407 | | |
408 | | - | |
| 408 | + | |
409 | 409 | | |
410 | 410 | | |
411 | 411 | | |
| |||
678 | 678 | | |
679 | 679 | | |
680 | 680 | | |
681 | | - | |
| 681 | + | |
682 | 682 | | |
683 | 683 | | |
684 | 684 | | |
| |||
716 | 716 | | |
717 | 717 | | |
718 | 718 | | |
719 | | - | |
| 719 | + | |
720 | 720 | | |
721 | 721 | | |
722 | 722 | | |
| |||
0 commit comments