Repository navigation
fix(core,drivers,formula,metadata,objectql,platform-objects): refusals, field help and log lines state each decision in words instead of a tracker number (stage 5) - #20924
Conversation
…ts tracker number on both faces at once The refusal already says why it refuses (limit: 1 would hand back an arbitrary, plausible-looking row no null-check can catch), so the citation goes and the sentence stays. The engine's requireFindOnePredicate and metadata-core's engineFindOnePredicateRefusalMessage are byte twins compared by objectql's engine-findone-predicate.test.ts, so both move in this one commit. Ledger recomputed with --census-ledger: the objectql row and metadata-core's pair for this id leave. Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
…thor-visible refusals and metadata text state each decision in words instead of a tracker number Stage 5 of the per-package burn-down, author-visible part. Refusals, prescriptions and thrown messages in core, driver-memory, driver-mongodb, formula, metadata and metadata-core drop their tracker citations; where a sentence did not already carry the decision it now says it (the register contract refuses loudly and names the mismatch; registration order is not a contract; the retired aggregate left AggregationFunction because no SQL backend compiled it; the undeclared aggregate used to be summed before this refusal existed). Where an ADR stood beside the number, the ADR stays. The two in-process drivers' tenancy refusals end with a "Tracking:" line that linked a tracker card by URL; the consequence sentence above it already states the decision, so the line and its URL constants go. Metadata text: the sys_account token help, the sys_email headers help and the SCIM credential store's protection reason drop their numbers in the source; the three hand-written translated values of the token help drop theirs too (keys untouched). The en bundle is regenerated in the next commit. Pins that asserted a number are re-pinned onto the sentence. Ledger recomputed with --census-ledger. Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
…ited field help `node scripts/check-i18n-bundles.mjs --write --filter=platform-objects` after the source edits in the previous commit: the generator rewrote the four en leaves from the source and kept the translated locales' values verbatim (merge mode), so the only moves are the three sys_account token helps and the sys_email headers help. Ledger recomputed with --census-ledger: the en bundle's row leaves. Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
…bers, last per the ruling The superseded-registration warning, the authz cache posture line, the endpoint matcher's excluded-item error, the history-seq and loader-read failure errors, and the two fresh-datastore attestation info lines each already say the decision; the citation goes and any ADR beside it stays. The authz posture pin that asserted the number is re-pinned onto the sentence. Ledger recomputed with --census-ledger. Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
…es in stage 5 Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
…age5-seven-packages
📓 Docs Drift CheckThis PR changes 8 package(s): 11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 48 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 011803aa25faed5ae77bbc5d95b0c0cd44537c7f && git checkout 011803aa25faed5ae77bbc5d95b0c0cd44537c7f
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d78a0bda07c4bed2e3b71e051ac5db2632b82741 1432546ac85aa5a7b150f27d0c7c8a5bb22d3dcb && git checkout -B drift-repro d78a0bda07c4bed2e3b71e051ac5db2632b82741 && git merge --no-ff 1432546ac85aa5a7b150f27d0c7c8a5bb22d3dcb
node scripts/docs-audit/affected-docs.mjs --json d78a0bda07c4bed2e3b71e051ac5db2632b82741
|
Contract reviewServed-tier: Read-only, at tier, adversarial to the dispatch. Inputs: card #20513 (body and all 29 comments — the census 5900801368, the ruling 5902360492 「20513 A」 A / A, the services pointer 5903999785, the stage-5 claim 5916824275, the stage-5 Check-runs on ① Derived judgmentsScope against the ruling and the claim — right. The ruling orders stages per package until the ledger is empty, all three categories, form D, Text only — right, checked line by line, with the two exceptions the dev names. The net diff changes 151 lines in the 29 source files; a filter for changed lines without a string delimiter returns 4, all removals in the two tenancy guards: a blank line and The tenancy-guard removal — text only in effect, and the widening is right. What leaves is two module-private Accept-set and public surface — nothing moves — right. No schema, filter grammar, route, wire Ledger diff — right, exact, recounted independently. Parsing The Form D, string by string — right. Of the 38 cited cards, 36 read
Where only the citation goes (the other literals): each sentence already carried the decision and is otherwise unchanged — the three retired health-check keys (12032), the plugin-ordering violation and the Generated translations — right, and it follows the repo's i18n rule. AGENTS.md's guardrail row for Pins — right, 8 assertions in 8 files, each phrase on the head. Review faces — right, with one wording note. The changeset (below) reads as a CHANGELOG entry: every family it names is in the diff and each sentence it summarises matches the string, including the MongoDB retirement reason and the ② Semver level
Clause-②: no — right. Nothing an author can write is widened or narrowed; the PR body carries ③ Boundary flagsDev flags (report 5918105255), each answered:
Implemented-by: VERDICT: PASS Generated by Claude Code |
…rness text state each case in words instead of a tracker number (stage 5b) (objectstack-ai#21139) Fixes objectstack-ai#20513 Clause-②: no **Stage 5b, the last stage of this lane under the maintainer's A / A ruling on the card (5902360492): the `src/`-shipped test strings.** These are the 28 literals (32 occurrences in 6 files) that PR objectstack-ai#20924's body inventoried as stage 5b and release 5922539397 restates: shared case labels, a suite title, two contract `why` texts and the mongod test-harness text. After this PR the `domain:engine` packages hold zero rows in `scripts/doc-authoring-prose-id.baseline.json`. Text only: no error `code`, export, HTTP status, case value or control flow moves. ## What this does Each label or harness line sent the reader to a tracker number for the reason behind it. In form D, as stages 1 to 5a applied it, the number goes. Where the sentence already stated the case, only the citation goes (17 literals). Where the sentence leaned on the number, it now says the case in words (11 literals): | Where | Cited | The text now says | |---|---|---| | `driver-mongodb` `test-mongod.ts` skip reason | 5517 | "retired from default test runs because concurrent downloads made green runs exit 1" | | `driver-mongodb` `test-mongod.ts` abandoned-download warning | 5517 | "Ignoring the MongoDB binary download abandoned by a concurrent-download race" | | `ENGINE_DELETE_DISPATCH_CASES`: where.id plus a CAS operator, `multi: false` | 11009 | "refused, the by-id path would drop the CAS guard" | | `ENGINE_FINDONE_PREDICATE_CASES`: an empty `where` object | 3896 | "read as match-every-row, so NOT a predicate" | | `ENGINE_UPDATE_DISPATCH_CASES`: payload id beside a DIFFERENT scalar where.id | 11142, 5748 | "refused; the payload id no longer silently wins over a where.id naming another row" | | same table: payload id beside an `$in` where.id, no multi | 11230 | "refused; the by-id write would silently drop the declared row SET" | | same table: payload id beside a NULL where.id | 11230 | "refused; a declared where.id that is not one primary key is never silently dropped" | | same table: payload id beside a FALSY scalar where.id | 11142, 11230 | "(it is a scalar, so neither the different-row nor the non-scalar refusal applies)" | | same table: where.id plus a CAS operator, `multi: false` | 11009 | "the redeliver shape, refused rather than dropping its CAS guard" | | same table: payload id plus an extra where predicate, no multi | 11009 | "refused; the by-id write would silently drop the predicate, through the payload door" | | `OBJECT_SCHEMA_MASK_CASES` `write-capable-caller/exempt` `why` | 7020, 6603 | "D4 is DERIVED from the schema write gate (`manage_metadata`)" | Citation only: the contract suite's `serialized-form identity` group title; 3 delete, 2 findOne and 9 update labels; the empty-readable-set `why`; the mongod acquisition-timeout message. Each new clause was read against today's code: `resolveEngineUpdateDispatch` (the different-row refusal fires only on a truthy scalar where.id, the non-scalar refusal only on a declared non-scalar), `ObjectQL.requireFindOnePredicate` (absent, null and an empty object are read as match-every-row), and `OBJECT_SCHEMA_WRITE_CAPABILITIES` (`manage_metadata`, the key the D4 exemption is derived from). The `test-mongod.ts` docblock "Names the issue and the switch" now says "Names the reason and the switch", so it stays true. No other comment or docblock moves; code comments still cite ids, as in every earlier stage. **Re-pins (H4).** The two `objectstack-ai#5517` number pins in `mongodb-memory-server-gate.test.ts` now assert the text that replaced the number: the skip line contains "retired from default test runs because concurrent downloads made green runs exit 1", and the guard's warning contains "download abandoned by a concurrent-download race". Neither pin was deleted. Both were proven able to fail (below). ## Ledger (`scripts/doc-authoring-prose-id.baseline.json`) Recomputed with `node scripts/check-doc-authoring.mjs --census-ledger` (exit 0: no growth refusal) and copied into place. The diff is 25 deleted lines, nothing added. | File | Before | After | |---|---|---| | `drivers/driver-mongodb/src/test-mongod.ts` | 3 | 0 | | `metadata-core/src/contract-suite.ts` | 1 | 0 | | `metadata-core/src/engine-delete-dispatch.ts` | 4 | 0 | | `metadata-core/src/engine-findone-predicate.ts` | 3 | 0 | | `metadata-core/src/engine-update-dispatch.ts` | 18 | 0 | | `metadata-core/src/object-schema-fls-contract.ts` | 3 | 0 | | **This stage** | **32 in 6 files** | **0** | Whole ledger: files 175 → 169, pairs 441 → 428, occurrences 653 → 621. Gate pinned sites 549 → 521. No other file's row moves. After each of the four merges of `origin/main` (below) the recomputed ledger was byte-identical to the committed one. ## Hypotheses, measured - **H1, held.** At `origin/main` `9c8b65aa2` the six files held exactly the inventory: `objectstack-ai#5517` ×3; `objectstack-ai#7856` ×1; `objectstack-ai#11009` ×4 (delete); `objectstack-ai#11767`, `objectstack-ai#3896`, `objectstack-ai#4346` (findOne); `objectstack-ai#11009` ×6, `objectstack-ai#11142` ×4, `objectstack-ai#11230` ×4, `objectstack-ai#5748` ×4 (update); `objectstack-ai#3545`, `objectstack-ai#6603`, `objectstack-ai#7020` (FLS). The gate's census listed 28 literals carrying 32 occurrences. - **H2, held.** The recomputed ledger has 0 rows under `packages/objectql`, `core`, `formula`, `metadata*`, `platform-objects`, `drivers/driver-*` and `plugins/plugin-pinyin-search` (the `domain:engine` path set). The lane's ledger is empty. The whole ledger is not, so the gate's stale-baseline arm keeps its blindness floor. - **H3, nothing keys on the old labels.** Each of the 28 old literals was searched byte for byte across the repo (`dist` excluded). Each was found only in this stage's own source files (two delete labels have update twins), with two exceptions. The tail `download — objectstack-ai#5517)` also sits in a comment in `mongodb-pipeline-evaluator.testkit.ts`. `serialized-form identity (objectstack-ai#7856)` also titles an independent `describe` in `metadata-core/test/canonicalize.test.ts`, a test file outside the ledger. Both are left alone. No CI workflow, `package.json` script, vitest config, snapshot or skip list carries the labels or a `-t` filter on them. The cited numbers appear elsewhere only in workflow comments, an ADR anchor's invariant prose and a merge-parent sha. The labels reach other code only as test names: objectql's `engine-*-dispatch` / `engine-findone-predicate` parity loops, `service-queue`'s `it.each`, and `assertObjectSchemaMaskCase`'s failure text. Each label stays unique within its table (35 / 19 / 18). - **H4, held.** See Re-pins. ## Changeset `.changeset/20513-metadata-core-case-labels-state-the-case.md`: `patch` for `@objectstack/metadata-core`. Its case tables ship in `dist/index.*`, and the contract suite and FLS table ship in `dist/testing.js` (measured after build: the new labels found in those files). There is **no `@objectstack/driver-mongodb` entry**, because `test-mongod.ts` is not published. The package builds `src/index.ts` only, and only test files import `test-mongod.ts`. Measured after build: `mongodSkipReason`, "retired from default test runs", "concurrent-download race" and "waiting for the MongoDB binary" are each in 0 files under `packages/drivers/driver-mongodb/dist`. The positive control `MongoDBDriver` is in 4. ## Text-only proof A TypeScript-AST skeleton of each changed `.ts` file compares merge base `670680e93` with head `24b72b809`. In the skeleton, every string literal and template text is one placeholder, pure-literal `+` operands collapse, and comments are never read. Result: 7 of 7 SAME, with token and literal-slot counts identical per file. Control: the same tool reports DIFF on `rest` `import-template.ts` across `6f1f1c103`, a real code change. ## Tests (head `24b72b809` unless noted) - Build: `turbo run build` over `./packages/*` and `./packages/*/*` under the verify lock, 71/71, after the last merge. - `@objectstack/metadata-core`: 16 files / 298 tests passed; `typecheck` exit 0. - `@objectstack/driver-mongodb`: 30 files passed and 5 skipped, 675 tests passed and 172 skipped (the skips need a MongoDB server); `typecheck` exit 0, including `check:test-typecheck`. - Consumers of the case tables, against the rebuilt `metadata-core` `dist`: - `objectql`, 7 files / 181 tests: `engine-delete-dispatch`, `engine-update-dispatch`, `engine-findone-predicate`, `engine-update-by-id-payload-id`, `engine-update-multi-payload-id`, `engine-write-not-found-gate` and `validation/operator-object-write-value`; - `service-queue` `db-queue-adapter`, 38; - `rest` `meta-object-fls`, 95; - `runtime` `domains/meta-object-fls`, 85; - `metadata-fs` `contract`, 31; - `metadata-protocol` `sys-metadata-repository.contract` and `protocol.update-path-id-wins`, 64. - A verbose run before the merges showed the parity loops naming the new labels. objectql's tests resolve `metadata-core` through `dist`, so this shows they read the rebuilt build. - Re-pin mutations, one-off, on the committed head (`2729901db`), through `scripts/ablation-replace.mjs` in WRAP mode (restore armed on EXIT/INT/TERM): - Skip-reason anchor ×1 → ×0: `mongodb-memory-server-gate.test.ts` 1 failed / 7 passed. - Warning anchor ×1 → ×0: 1 failed / 7 passed. - Each restore: blob equals HEAD's (`22a95643c8`), and `git diff HEAD` is empty. After both, `git diff HEAD` was 0 bytes and `git status --porcelain` 0 lines. ## Gates `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) at `24b72b809` derived 69 commands. All 69 ran one at a time from the worktree, each exit 0. `--ran` reports "69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN". Among them: - `check:doc-authoring`: 521 pinned sites across 169 files, no growth, no burn-down unrecorded; - `check:driver-conformance`: 50 covered cells, 0 DEBT, 0 exempt, the same reading as before the change; - `check:engine-double-contract`, `check:dual-build-cjs-loads` (105 require entry points across 66 packages load, read from the post-merge build), `check:nul-bytes`, `check:type-check-coverage` and `check:type-check-debt`. After the first merge (`packages/spec` moved on main): `pnpm --filter @objectstack/spec check:generated` reported all 15 artifacts up to date. Narrowed lint: `eslint --no-inline-config --format json` over the 7 changed `.ts` files reported 7 files, 0 errors and 0 warnings, none ignored (counts from eslint's JSON). The resolved `parserOptions` are `ecmaVersion: latest, sourceType: module`, with no `project` or `projectService`. So no type-aware rule runs, and this diff cannot move an untouched file's verdict. Repo-wide `pnpm lint` is CI's. NOT MEASURED locally (CI's): the live MongoDB cells of `driver-mongodb`, the Test Core shards, Dogfood, and the workspace type-check lanes. ## Acceptance notes - `origin/main` was merged four times while this was open (`1d55ee66e`, `4f1c99822`, `4516a0643`, `24b72b809`; the third brings in objectstack-ai#21097). None of the incoming commits touches a file this PR changes. They touch `objectql`, `rest`, `runtime` and `metadata-protocol`, so those consumer suites were re-run at the final head. `main` moved again after the gate union; the queue rebuilds on it. - PR objectstack-ai#21105, in `driver-mongodb`'s filter and temporal suites, landed before the first merge and shares no file with this PR. - `metadata-core/test/canonicalize.test.ts` titles its own `describe` `serialized-form identity (objectstack-ai#7856)`, and `mongodb-memory-server-gate.test.ts` titles two `describe` blocks `[objectstack-ai#5517] …`. Both are `*.test.ts` files, which the ruling's third category (`src/`-shipped test strings) and the ledger do not cover. They are left as they are: noted, not filed. - The lane children objectstack-ai#20749, objectstack-ai#20751 and objectstack-ai#20753 carry `Blocked-by:` lines naming this card. They unlock when it leaves the open state on merge. --- _Generated by [Claude Code](https://claude.ai/code/session_01Ujdtvqs7ree7WyQmEDwEnG)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Part of #20513
Clause-②: no
Stage 5 of this lane (the other seven packages, plus the
objectqlfindOnerefusal stage 3 held), under the maintainer's A / A ruling on the card: the author-visible text and the log lines. The stage is over the ~80-string stop line (94 ledgered literals plus 2 URL-form messages), so it lands in two parts: this PR carries every refusal, prescription, metadata text and log line, and the 28src/-shipped test strings are reported as stage 5b below. #20513 remains open for stage 5b, so this PR carries no closing keyword. Text only: no errorcode, field name, HTTP status, export or control flow moves.What this does
Refusals, prescriptions, field help and log lines in
core,driver-memory,driver-mongodb,formula,metadata,metadata-coreandplatform-objects(and the one heldobjectqlstring) sent the reader to a tracker number for the reason behind them. Each rewritten string now says the reason in words (form D, as the migration-entry rewrite and stages 1 to 4 applied it). Where the sentence already stated the decision, only the citation goes; where an ADR stood beside the number, the ADR stays. Where the sentence did not carry the decision, it now does:coreIMetadataService.registerrefusals (thrown, 400)coreinit-order fault suffix on agetServicemiss duringinit()(thrown)coreadmin standing surface ledger reasonsactive, which this resolver honours"; "RECLASSIFIED fromreads-onlywhen the config anchor landed"driver-mongodbretired aggregate function (thrown, 400)driver-mongodbundeclared aggregate function (thrown, 400)metadataroute ledger note (HMR POST route)metadatahistory-seq failure (error log)driver-memory/driver-mongodbmulti-tenancy refusals (MEMORY_MULTI_TENANT_UNSUPPORTED,MONGODB_MULTI_TENANT_UNSUPPORTED)Tracking:line and its URL constants go; the consequence sentence above it already says the driver refuses rather than run (or answer) unisolated.Every other rewritten literal loses only its citation.
The
findOnepair.objectqlengine.tsrequireFindOnePredicateandmetadata-coreengineFindOnePredicateRefusalMessageare byte twins compared byobjectql'sengine-findone-predicate.test.ts, so both drop the citation in one commit (0a25891e6d) and the parity pin stays byte-exact.Metadata text. The
sys_accounttoken help, thesys_emailheaders help and the SCIM credential store's protection reason drop their numbers in the source. Theenbundle is regenerated withnode scripts/check-i18n-bundles.mjs --write --filter=platform-objects: the generator rewrote the fourenleaves from the source and kept every translated-locale value verbatim (merge mode). So the number inside the three translatedsys_accounttoken helps (es-ES, ja-JP, zh-CN) leaves only by editing those values, which AGENTS.md permits for translated-locale values (keys and structure untouched). None of those leaves has a source-hash companion entry (they are translations, not source copies), so nothing falls back;check:i18nandcheck:i18n-stale-fillare green.The URL-form ids (bounded in-place fix). The claim names
driver-memory's URL-form id (the per-call seam's dead card link). The sameTracking:line carries a second URL on both seams, anddriver-mongodb's twin guard carries the same line. All three go together: same defect class as this card, a mechanical fix, files inside this stage's surface, and no new verification surface (each package's own tests, re-pinned). These are the only changes that move code shape (two module constants and one ternary that only composed the removed line).Ledger (
scripts/doc-authoring-prose-id.baseline.json), per file, occurrences before → afterRecomputed with
node scripts/check-doc-authoring.mjs --census-ledgerin each text commit. Only these packages' rows move; every other file's row is identical (0 moved). Measured at merge base4d0b9cd542(the ledger is byte-identical atcb4c31dd52, where the work started, and at599cc8c5f).core/src/health-monitor.tscore/src/metadata-service-contract.tscore/src/plugin-order.tscore/src/plugin-registration.tscore/src/security/admin-standing-surface.tscore/src/security/authz-cache-posture.tsdrivers/driver-memory/src/filter-refusal.tsdrivers/driver-mongodb/src/mongodb-aggregation.tsdrivers/driver-mongodb/src/mongodb-filter.tsdrivers/driver-mongodb/src/test-mongod.tsformula/src/matches-filter.tsmetadata-core/src/contract-suite.tsmetadata-core/src/engine-delete-dispatch.tsmetadata-core/src/engine-dispatch-unhonoured-predicate.tsmetadata-core/src/engine-findone-predicate.tsmetadata-core/src/engine-update-dispatch.tsmetadata-core/src/object-schema-fls-contract.tsmetadata/src/endpoint-matcher.tsmetadata/src/loaders/database-loader.tsmetadata/src/metadata-manager.tsmetadata/src/metadata-route-ledger.tsmetadata/src/plugin.tsobjectql/src/engine.tsplatform-objects/src/apps/translations/en.objects.generated.tsplatform-objects/src/apps/translations/es-ES.objects.generated.tsplatform-objects/src/apps/translations/ja-JP.objects.generated.tsplatform-objects/src/apps/translations/zh-CN.objects.generated.tsplatform-objects/src/audit/sys-email.object.tsplatform-objects/src/identity/sys-account.object.tsplatform-objects/src/identity/sys-scim-connection-credential.object.tsplatform-objects/src/plugin.tsWhole ledger: files 200 → 175, pairs 485 → 441, occurrences 722 → 653. Gate census sites 615 → 549; every other package's (file, ids) sequence is identical before and after.
Stage 5b (the rest of this stage, not in this PR)
The
src/-shipped test strings, 28 literals carrying 32 occurrences in 6 files, all case labels or suite titles:metadata-corecontract-suite.ts(1describetitle),engine-delete-dispatch.ts(4 case labels),engine-findone-predicate.ts(3 case labels),engine-update-dispatch.ts(15 case labels, 18 occurrences),object-schema-fls-contract.ts(2 casewhytexts, 3 occurrences), anddriver-mongodbtest-mongod.ts(3: a skip reason, a warning and a thrown message), whose number two assertions inmongodb-memory-server-gate.test.tspin. After 5b these packages leave the ledger entirely and the card can close.Text-only proof
A TypeScript-AST skeleton of each changed source file (every string literal and template text one placeholder, pure-literal
+operands collapsed, comments never read) at merge base4d0b9cd542and head1432546ac8: 27 of 29 files SAME; 2 DIFF, the two tenancy guards, whose diff is exactly the removed URL constants, the removedtrackingternary and the removedTracking:line. Control: the same tool reports DIFF onrestimport-template.tsacross6f1f1c1035(a real code change).Tests (head
1432546ac8unless noted)turbo run buildover./packages/*and./packages/*/*, 71/71, after the merge oforigin/main.@objectstack/objectqlvitest run --project local, three shards after the merge: 116 + 116 + 115 files, 2260 + 2011 + 2528 tests passed.typecheckexit 0 (test layer: 40 files / 234 errors / 65 signatures held in the debt ledger, unchanged).214951a19c(the incomingmaincommits touch none of these packages):core61 files / 1795 tests;driver-memory65 / 1413;driver-mongodb29 passed, 5 skipped / 661 passed, 172 skipped (the skips need a MongoDB server);formula42 / 1240;metadata55 / 828;metadata-core16 / 298;platform-objects59 / 948. Each package'stypecheckexit 0.plugin-devdev-plugin-optional-load-failure.test.ts(reads thedriver-memoryrefusal) 10 / 10.Re-pins (8 assertions in 8 test files), each proven able to fail. The number pins in
health-monitor.test.ts,authz-cache-posture.test.ts,mongodb-aggregation.test.ts,mongodb-unrecognised-aggregate-function.test.ts,mongodb-tenancy-guard.test.ts,memory-tenancy-guard.test.ts,memory-tenant-scope-refusal.test.tsandobjectqlengine-update-dispatch.test.tsnow assert the sentence that states the decision.Ablation and mutations, one-off, on the committed head (
214951a19c), under a restore trap, throughscripts/ablation-replace.mjs:metadata-coreface alone (objectql's tests resolve it throughdist/): thefindOnetwin and the id-predicate message each marked,pnpm --filter @objectstack/metadata-core build,ablation-dist-preflightmarker present in 2 built files.engine-findone-predicate.test.ts+engine-update-dispatch.test.ts: 10 failed / 83 passed (9 parity cases, 1 re-pin). Restore: blob == HEAD andgit diff HEADempty for both, rebuild, preflight--absent(absent from all 12 built files), rerun 93 / 93.git diff HEADempty. After the run:git diff HEAD0 bytes,git status --porcelain0 lines.Gates
node scripts/pm/dispatch-gates.mjs --commands(no paths) at1432546ac8: 78 commands, 39 paths vs merge base4d0b9cd542, 309 changed lines. All 78 run one at a time from the worktree, each exit 0;--ran: "78 derived famil(ies) accounted for — 78 run, 0 NOT-MEASURED (a DERIVED zero)". Among them:check:doc-authoring(549 pinned sites across 175 files, no growth, no burn-down unrecorded),check:i18n(9 packages in sync),check:i18n-stale-fill,check:nul-bytes,check:driver-conformance,check:driver-memory-census,check:engine-double-contract,check:type-check-debt. Also run after the merge:pnpm --filter @objectstack/spec check:generatedexit 0.Narrowed lint:
eslint --no-inline-config --format jsonover the 37 changed.tsfiles: 37 files, 0 errors, 0 warnings (count read from eslint's JSON; none ignored). The resolvedparserOptionsareecmaVersion: latest, sourceType: modulewith noprojectorprojectService, so no type-aware rule runs and this diff cannot move an untouched file's verdict. Repo-widepnpm lintis CI's.NOT MEASURED locally (CI's): the live MongoDB cells of
driver-mongodb, the Test Core shards, Dogfood, the workspace type-check lanes.Acceptance notes
origin/mainwas merged once before opening (1432546ac8); its only overlap isobjectqlengine.ts, in disjoint hunks, andobjectqlwas re-tested after the merge.#20822group 1b (branchclaude/issue-20822-g1b-f3-route-then-delete) editsmetadatadatabase-loader.tsinqueryHistory; this PR touches that file only at the history-seq error line, in a different hunk. Whichever lands later mergesmain. It does not touchfilter-refusal.ts.sys_email.headers_jsonhelp values were translated from an older source revision and lack its last sentence (never returned on the generic data path). They carry no source-hash entry, so they are legacy-trusted and never reported. Noted, not filed; no carrier.$nulldiagnostics indriver-memoryanddriver-mongodbstill describe the backends' old disagreement in the past tense, while the Turso diagnostic (stage 4) says every driver now refuses it. Both are true; only the wording differs. Noted, not filed.Generated by Claude Code