Skip to content

Commit 3fbf3ca

Browse files
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)
Part of #20513 Clause-②: no **Stage 5 of this lane (the other seven packages, plus the `objectql` `findOne` refusal 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 28 `src/`-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 error `code`, 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-core` and `platform-objects` (and the one held `objectql` string) 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: | Where | Cited | The sentence now says | |---|---|---| | `core` `IMetadataService.register` refusals (thrown, 400) | 7378 rows 3 and 1 | "... so the contract refuses loudly and never coerces a value into storability" / "... so the contract refuses loudly and names the mismatch" | | `core` init-order fault suffix on a `getService` miss during `init()` (thrown) | 4131 | "a composition/ordering fault; registration order is not a contract." | | `core` admin standing surface ledger reasons | 8613, 11663 | "`active`, which this resolver honours"; "RECLASSIFIED from `reads-only` when the config anchor landed" | | `driver-mongodb` retired aggregate function (thrown, 400) | 6188, 5907 | "was REMOVED from @objectstack/spec AggregationFunction (ADR-0049 enforce-or-remove: no SQL backend compiled it)" | | `driver-mongodb` undeclared aggregate function (thrown, 400) | 5907, 12818 | "before this refusal, this builder answered any unrecognised name with a $sum of that column ..." | | `metadata` route ledger note (HMR POST route) | 12140 | "CHANGED when the development-only mount gate landed" | | `metadata` history-seq failure (error log) | 4825 | "numbering it from 1 (what this code once did) would collide ..." | | `driver-memory` / `driver-mongodb` multi-tenancy refusals (`MEMORY_MULTI_TENANT_UNSUPPORTED`, `MONGODB_MULTI_TENANT_UNSUPPORTED`) | 6915, 16589, 3724 as tracker URLs | The trailing `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 `findOne` pair.** `objectql` `engine.ts` `requireFindOnePredicate` and `metadata-core` `engineFindOnePredicateRefusalMessage` are byte twins compared by `objectql`'s `engine-findone-predicate.test.ts`, so both drop the citation in one commit (`0a25891e6d`) and the parity pin stays byte-exact. **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 `en` bundle is regenerated with `node scripts/check-i18n-bundles.mjs --write --filter=platform-objects`: the generator rewrote the four `en` leaves from the source and kept every translated-locale value verbatim (merge mode). So the number inside the three translated `sys_account` token 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:i18n` and `check:i18n-stale-fill` are 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 same `Tracking:` line carries a second URL on both seams, and `driver-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 → after Recomputed with `node scripts/check-doc-authoring.mjs --census-ledger` in each text commit. Only these packages' rows move; every other file's row is identical (0 moved). Measured at merge base `4d0b9cd542` (the ledger is byte-identical at `cb4c31dd52`, where the work started, and at `599cc8c5f`). | File | Before | After | |---|---|---| | `core/src/health-monitor.ts` | 3 | 0 | | `core/src/metadata-service-contract.ts` | 2 | 0 | | `core/src/plugin-order.ts` | 3 | 0 | | `core/src/plugin-registration.ts` | 1 | 0 | | `core/src/security/admin-standing-surface.ts` | 3 | 0 | | `core/src/security/authz-cache-posture.ts` | 1 | 0 | | `drivers/driver-memory/src/filter-refusal.ts` | 12 | 0 | | `drivers/driver-mongodb/src/mongodb-aggregation.ts` | 7 | 0 | | `drivers/driver-mongodb/src/mongodb-filter.ts` | 5 | 0 | | `drivers/driver-mongodb/src/test-mongod.ts` | 3 | 3 (stage 5b) | | `formula/src/matches-filter.ts` | 1 | 0 | | `metadata-core/src/contract-suite.ts` | 1 | 1 (stage 5b) | | `metadata-core/src/engine-delete-dispatch.ts` | 4 | 4 (stage 5b) | | `metadata-core/src/engine-dispatch-unhonoured-predicate.ts` | 1 | 0 | | `metadata-core/src/engine-findone-predicate.ts` | 4 | 3 (stage 5b) | | `metadata-core/src/engine-update-dispatch.ts` | 20 | 18 (stage 5b) | | `metadata-core/src/object-schema-fls-contract.ts` | 3 | 3 (stage 5b) | | `metadata/src/endpoint-matcher.ts` | 1 | 0 | | `metadata/src/loaders/database-loader.ts` | 1 | 0 | | `metadata/src/metadata-manager.ts` | 1 | 0 | | `metadata/src/metadata-route-ledger.ts` | 2 | 0 | | `metadata/src/plugin.ts` | 1 | 0 | | `objectql/src/engine.ts` | 1 | 0 | | `platform-objects/src/apps/translations/en.objects.generated.ts` | 4 | 0 | | `platform-objects/src/apps/translations/es-ES.objects.generated.ts` | 3 | 0 | | `platform-objects/src/apps/translations/ja-JP.objects.generated.ts` | 3 | 0 | | `platform-objects/src/apps/translations/zh-CN.objects.generated.ts` | 3 | 0 | | `platform-objects/src/audit/sys-email.object.ts` | 1 | 0 | | `platform-objects/src/identity/sys-account.object.ts` | 3 | 0 | | `platform-objects/src/identity/sys-scim-connection-credential.object.ts` | 1 | 0 | | `platform-objects/src/plugin.ts` | 2 | 0 | | **This stage** | **101 in 31 files** | **32 in 6 files** | Whole 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-core` `contract-suite.ts` (1 `describe` title), `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 case `why` texts, 3 occurrences), and `driver-mongodb` `test-mongod.ts` (3: a skip reason, a warning and a thrown message), whose number two assertions in `mongodb-memory-server-gate.test.ts` pin. 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 base `4d0b9cd542` and head `1432546ac8`: 27 of 29 files SAME; 2 DIFF, the two tenancy guards, whose diff is exactly the removed URL constants, the removed `tracking` ternary and the removed `Tracking:` line. Control: the same tool reports DIFF on `rest` `import-template.ts` across `6f1f1c1035` (a real code change). ## Tests (head `1432546ac8` unless noted) - Build: `turbo run build` over `./packages/*` and `./packages/*/*`, 71/71, after the merge of `origin/main`. - `@objectstack/objectql` `vitest run --project local`, three shards after the merge: 116 + 116 + 115 files, 2260 + 2011 + 2528 tests passed. `typecheck` exit 0 (test layer: 40 files / 234 errors / 65 signatures held in the debt ledger, unchanged). - At `214951a19c` (the incoming `main` commits touch none of these packages): `core` 61 files / 1795 tests; `driver-memory` 65 / 1413; `driver-mongodb` 29 passed, 5 skipped / 661 passed, 172 skipped (the skips need a MongoDB server); `formula` 42 / 1240; `metadata` 55 / 828; `metadata-core` 16 / 298; `platform-objects` 59 / 948. Each package's `typecheck` exit 0. - Consumer check: `plugin-dev` `dev-plugin-optional-load-failure.test.ts` (reads the `driver-memory` refusal) 10 / 10. - Consumer pins: every string fragment of every removed source line was searched across all 4298 test files in the repo; no test pins a fragment that no longer exists, other than the number pins re-pinned here. **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.ts` and `objectql` `engine-update-dispatch.test.ts` now assert the sentence that states the decision. **Ablation and mutations, one-off, on the committed head (`214951a19c`), under a restore trap, through `scripts/ablation-replace.mjs`:** - `metadata-core` face alone (objectql's tests resolve it through `dist/`): the `findOne` twin and the id-predicate message each marked, `pnpm --filter @objectstack/metadata-core build`, `ablation-dist-preflight` marker 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 and `git diff HEAD` empty for both, rebuild, preflight `--absent` (absent from all 12 built files), rerun 93 / 93. - Source-imported re-pins (no build leg): health-monitor 1 failed / 25; authz posture 1 failed / 21; the two MongoDB retired-aggregate files 4 failed / 31; MongoDB tenancy 1 failed / 16; driver-memory boot 1 failed / 19; driver-memory per-call 1 failed / 10. Every restore: blob == HEAD, `git diff HEAD` empty. After the run: `git diff HEAD` 0 bytes, `git status --porcelain` 0 lines. ## Gates `node scripts/pm/dispatch-gates.mjs --commands` (no paths) at `1432546ac8`: 78 commands, 39 paths vs merge base `4d0b9cd542`, 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:generated` exit 0. Narrowed lint: `eslint --no-inline-config --format json` over the 37 changed `.ts` files: 37 files, 0 errors, 0 warnings (count read from eslint's JSON; none ignored). 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, the workspace type-check lanes. ## Acceptance notes - `origin/main` was merged once before opening (`1432546ac8`); its only overlap is `objectql` `engine.ts`, in disjoint hunks, and `objectql` was re-tested after the merge. - `#20822` group 1b (branch `claude/issue-20822-g1b-f3-route-then-delete`) edits `metadata` `database-loader.ts` in `queryHistory`; this PR touches that file only at the history-seq error line, in a different hunk. Whichever lands later merges `main`. It does not touch `filter-refusal.ts`. - The es-ES, ja-JP and zh-CN `sys_email.headers_json` help 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. - The `$null` diagnostics in `driver-memory` and `driver-mongodb` still 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. - Code comments and docblocks in these files still cite ids; they are outside this ruling. --- _Generated by [Claude Code](https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 31c3996 commit 3fbf3ca

39 files changed

Lines changed: 120 additions & 189 deletions
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
'@objectstack/core': patch
3+
'@objectstack/driver-memory': patch
4+
'@objectstack/driver-mongodb': patch
5+
'@objectstack/formula': patch
6+
'@objectstack/metadata': patch
7+
'@objectstack/metadata-core': patch
8+
'@objectstack/objectql': patch
9+
'@objectstack/platform-objects': patch
10+
---
11+
12+
Refusals, log lines and field help in core, the in-memory and MongoDB drivers, formula, metadata, metadata-core, objectql and platform-objects no longer cite tracker numbers; each states the reason in words
13+
14+
Clause-②: no
15+
16+
Many messages these packages show to authors, administrators and operators ended with an issue-tracker
17+
number where the reason belonged. The number goes, and where the sentence did not already say what was
18+
decided, it now does. Where an ADR stood beside the number, the ADR stays.
19+
20+
- Refusals and prescriptions: the retired health-check keys, the `IMetadataService.register` refusals
21+
(the contract refuses loudly and names the mismatch, never coerces a value into storability), the
22+
kernel's plugin-ordering errors (registration order is not a contract), the in-memory and MongoDB
23+
filter and aggregation refusals, formula's empty field constraint, the retired `artifact-api`
24+
source, and the by-id update and delete refusals. The MongoDB retired-aggregate refusal now says the
25+
function left `AggregationFunction` because no SQL backend compiled it; its undeclared-aggregate
26+
refusal says the builder used to sum an unrecognised name before this refusal existed.
27+
- The `findOne` no-predicate refusal loses its citation in `objectql` and in `metadata-core`'s
28+
`engineFindOnePredicateRefusalMessage` together, so the two still read byte for byte the same.
29+
- The in-memory and MongoDB drivers' multi-tenancy refusals (`MEMORY_MULTI_TENANT_UNSUPPORTED`,
30+
`MONGODB_MULTI_TENANT_UNSUPPORTED`) no longer end with a `Tracking:` line linking a tracker card;
31+
the sentence above it already says the driver refuses rather than run or answer unisolated.
32+
- Field help and protection text: the `sys_account` token help (and its es-ES, ja-JP and zh-CN
33+
translations), the `sys_email` headers help and the SCIM credential store's protection reason.
34+
- Log lines: the superseded-registration warning, the authz cache posture line, the endpoint matcher's
35+
excluded-item error, the metadata history and loader-read failure errors, and the fresh-datastore
36+
attestation info lines.
37+
38+
Text only: no error code, field name, status or behaviour changes.

‎packages/core/src/health-monitor.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ describe('PluginHealthMonitor', () => {
543543

544544
const message = caught?.message ?? '';
545545
expect(message).toContain(`'${key}' was removed`);
546-
expect(message).toContain('#12032');
546+
expect(message).toContain('in @objectstack/spec 17.3.0 (ADR-0049 enforce-or-remove)');
547547
expect(message).toContain('ADR-0049');
548548
expect(message).toContain('Delete the key');
549549
// The affordance that exists, named in place of the one that did not.

‎packages/core/src/health-monitor.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const RETIRED_HEALTH_CHECK_KEYS: ReadonlyArray<readonly [string, string]> = [
8282
[
8383
'autoRestart',
8484
"'autoRestart' was removed from PluginHealthCheck in @objectstack/spec 17.3.0 "
85-
+ '(#12032, ADR-0049 enforce-or-remove) — it never restarted a plugin. '
85+
+ '(ADR-0049 enforce-or-remove) — it never restarted a plugin. '
8686
+ '`attemptRestart` called `plugin.destroy()` and stopped there, then '
8787
+ "logged 'Plugin restarted' and set status `recovering`, and the periodic "
8888
+ 'checks carried on against the destroyed instance — which the default '
@@ -94,14 +94,14 @@ const RETIRED_HEALTH_CHECK_KEYS: ReadonlyArray<readonly [string, string]> = [
9494
[
9595
'maxRestartAttempts',
9696
"'maxRestartAttempts' was removed from PluginHealthCheck in "
97-
+ '@objectstack/spec 17.3.0 (#12032, ADR-0049 enforce-or-remove) — it capped a '
97+
+ '@objectstack/spec 17.3.0 (ADR-0049 enforce-or-remove) — it capped a '
9898
+ 'restart that never happened, so it only counted `destroy()` calls. '
9999
+ 'Delete the key.',
100100
],
101101
[
102102
'restartBackoff',
103103
"'restartBackoff' was removed from PluginHealthCheck in @objectstack/spec "
104-
+ '17.3.0 (#12032, ADR-0049 enforce-or-remove) — it delayed a restart that '
104+
+ '17.3.0 (ADR-0049 enforce-or-remove) — it delayed a restart that '
105105
+ 'never happened, so it only moved when the `destroy()` landed. Delete '
106106
+ 'the key.',
107107
],

‎packages/core/src/metadata-service-contract.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ export function assertMetadataRegisterContract(
160160
throw registerRefusal(
161161
`IMetadataService.register('${type}', '${name}'): data is ${shape}, not a metadata document. ` +
162162
`register() stores plain-object documents only — accepting a value the service cannot key was measured as ` +
163-
`accept-then-drop on document-keyed stores (#7378 row 3: refuse loudly, never coerce into storability). ` +
163+
`accept-then-drop on document-keyed stores, so the contract refuses loudly and never coerces a value into storability. ` +
164164
`Wrap the value in a document object whose shape the '${type}' type's schema accepts, or store it under a type that declares one.`,
165165
);
166166
}
@@ -169,7 +169,7 @@ export function assertMetadataRegisterContract(
169169
throw registerRefusal(
170170
`IMetadataService.register('${type}', '${name}'): data.name is '${String(documentName)}', which disagrees with the ` +
171171
`name argument '${name}'. A disagreement is almost always an authoring bug, and resolving it silently in either ` +
172-
`direction can file the item under a key the caller never wrote (#7378 row 1: refuse loudly, locate the mismatch). ` +
172+
`direction can file the item under a key the caller never wrote, so the contract refuses loudly and names the mismatch. ` +
173173
`Register under one name: pass the intended key as the argument and make data.name match it, or omit data.name.`,
174174
);
175175
}

‎packages/core/src/plugin-order.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export function validateInitServiceContract<P extends OrderablePlugin>(
151151

152152
if (violations.length > 0) {
153153
throw new Error(
154-
`[Kernel] Plugin ordering contract violated (#4131):\n - ${violations.join('\n - ')}`
154+
`[Kernel] Plugin ordering contract violated:\n - ${violations.join('\n - ')}`
155155
);
156156
}
157157
}
@@ -178,7 +178,7 @@ export function describeInitOrderFault(
178178
}
179179
}
180180
return ` (while plugin '${currentlyInitializing}' was initializing — a composition/` +
181-
`ordering fault, #4131.${providerHint})`;
181+
`ordering fault; registration order is not a contract.${providerHint})`;
182182
}
183183

184184
/**
@@ -200,7 +200,7 @@ export function assertInitServiceRequirements(
200200
`service is registered at this point of the boot. No composed plugin that initializes ` +
201201
`earlier provides it — compose a provider (and, if it initializes later without declaring ` +
202202
`'${service}' in providesServices, order it ahead via this plugin's dependencies/` +
203-
`optionalDependencies) (#4131).`
203+
`optionalDependencies).`
204204
);
205205
}
206206
}

‎packages/core/src/plugin-registration.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export function describeSupersededRegistration(
9898
`REPLACED the earlier one (${versionLabel(previous)}). Only the later instance is ` +
9999
`initialized and started; the earlier one is discarded without ever running init(). ` +
100100
`Duplicate registration by name is last-one-wins on both kernels by declared contract ` +
101-
`(#9864) — register the plugin once if that is not what you meant.`
101+
`— register the plugin once if that is not what you meant.`
102102
);
103103
}
104104

‎packages/core/src/security/admin-standing-surface.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ export const ADMIN_STANDING_SURFACE: Readonly<Record<string, AdminStandingTable>
110110
reason:
111111
'The row `admin_full_access` is resolved BY NAME from (§6b) — `platform_admin` is the '
112112
+ "POSITION that row derives, not the row's own name. Renaming it, deleting it or switching "
113-
+ 'it off (ADR-0049 `active`, read here since #8613) un-makes every GRANT-derived platform '
113+
+ 'it off (ADR-0049 `active`, which this resolver honours) un-makes every GRANT-derived platform '
114114
+ 'admin at once, with no identity table touched. ⚠️ It does NOT un-make a CONFIG-derived '
115-
+ 'one (§6b-config, #11970): that route sets the same standing from '
115+
+ 'one (§6b-config): that route sets the same standing from '
116116
+ "`ADMIN_FULL_ACCESS_CAPABILITIES` in `@objectstack/spec` and matches the caller's own "
117117
+ 'stored `sys_user` row, so it touches an identity table and never reads this one. With '
118118
+ '`OS_PLATFORM_OWNER_EMAIL` unset the first sentence is the whole truth; with it declared, '
@@ -176,7 +176,7 @@ export const ADMIN_STANDING_SURFACE: Readonly<Record<string, AdminStandingTable>
176176
sys_user: {
177177
role: 'derives',
178178
reason:
179-
'[#11663 L2] RECLASSIFIED from `reads-only`. This table used to be read only for the '
179+
'RECLASSIFIED from `reads-only` when the config anchor landed. This table used to be read only for the '
180180
+ '`current_user.email` RLS fallback and the cloud ADR-0024 `ai_seat` synthesis (§7), and the '
181181
+ 'note here said so: "Neither confers administrator standing." That sentence is now FALSE. '
182182
+ 'The config anchor (§6b-config) matches the row\'s own `email` against the deployment\'s '

‎packages/core/src/security/authz-cache-posture.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ describe('#11968 authz cache posture — the loud arm', () => {
6464
expect(message).toContain('7500ms');
6565
expect(message).toContain(AUTHZ_GRANTS_CACHE_TTL_ENV);
6666
expect(message).toMatch(/not an error/i);
67-
expect(message).toContain('#4785');
67+
expect(message).toContain('a silently-absent invalidation bridge is how a security control gets disabled without anyone noticing.');
6868
});
6969
});
7070

‎packages/core/src/security/authz-cache-posture.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ export function resolveAuthzCachePosture(
123123
`another replica is honoured by this one for up to ${ttlMs}ms. That is a ` +
124124
'supported configuration, not an error: the TTL is the correctness bound ' +
125125
'and it still holds. It is stated because a silently-absent invalidation ' +
126-
'bridge is how a security control gets disabled without anyone noticing ' +
127-
`(#4785). To narrow the typical window, configure a remote cluster driver; ` +
126+
'bridge is how a security control gets disabled without anyone noticing. ' +
127+
`To narrow the typical window, configure a remote cluster driver; ` +
128128
`to remove it entirely, set ${AUTHZ_GRANTS_CACHE_TTL_ENV}=0.`,
129129
};
130130
}

‎packages/drivers/driver-memory/src/filter-refusal.ts‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export function refusePerAggregationFilter(alias: string): never {
9090
`Per-aggregation \`filter\` on "${alias}" is not supported by this backend (driver-memory). ` +
9191
`The query is spelled correctly and @objectstack/spec AggregationNodeSchema declares the key — ` +
9292
`this backend compiles no conditional-aggregate (SQL FILTER (WHERE …) / CASE WHEN) expression ` +
93-
`for it, so it is refused rather than silently aggregating the UNFILTERED rows (#10413), which ` +
93+
`for it, so it is refused rather than silently aggregating the UNFILTERED rows, which ` +
9494
`is why it answers NOT_IMPLEMENTED/501 rather than a 400. \`engine.aggregate\` lowers filtered ` +
9595
`aggregations in memory for every driver without native support — route the query through the ` +
9696
`engine, or drop the \`filter\` key.`,
@@ -219,7 +219,7 @@ export function filterArrayReachedDriverError(filters: unknown[]): Error {
219219
`A filter ARRAY reached the driver: ${JSON.stringify(filters)}. ` +
220220
`'where' is a FilterCondition object; the array form ('FilterArray') is input-only ` +
221221
`authoring sugar and is lowered by @objectstack/spec parseFilterAST() at the engine ` +
222-
`and protocol doors before any driver sees it (#5158). This driver no longer carries a ` +
222+
`and protocol doors before any driver sees it. This driver no longer carries a ` +
223223
`second compiler for it — call through ObjectQL, or lower the value yourself with ` +
224224
`parseFilterAST(). Note the INFIX join form ([condA, "or", condB]) has no lowering at ` +
225225
`all: write the prefix form ["or", condA, condB].`,
@@ -280,7 +280,7 @@ export function emptyFieldConstraintError(field: string, path: string): Error {
280280
`comparand (e.g. { "${field}": "value" }). It is refused rather than evaluated because the ` +
281281
`backends disagreed on what it means — driver-sql dropped it inside $and/$or/$not (matching ` +
282282
`EVERY row) while refusing it at the top level, and this driver / @objectstack/formula ` +
283-
`answered "matches nothing". #5240.`,
283+
`answered "matches nothing".`,
284284
);
285285
}
286286

@@ -447,8 +447,8 @@ export function uncompilableFieldOperatorError(
447447
`but cannot be compiled by ${capabilities.face}. Supported operators on this surface: ` +
448448
`${supported}. It is refused rather than dropped: a predicate that compiles to nothing does ` +
449449
`not narrow the query, it WIDENS it — the aggregate is then computed over rows the filter ` +
450-
`excluded, and a chart drawn over them looks like a working chart (#3948, #4286/ADR-0078, ` +
451-
`#5345). Rewrite the predicate with a supported operator, or run it through find().`,
450+
`excluded, and a chart drawn over them looks like a working chart (ADR-0078). ` +
451+
`Rewrite the predicate with a supported operator, or run it through find().`,
452452
);
453453
}
454454

@@ -474,7 +474,7 @@ export function uncompilableCombinatorError(
474474
`It is refused rather than ignored: dropping a combinator discards a whole branch of the ` +
475475
`filter and WIDENS the result set, and "$not" is what compileCelToFilter emits for a CEL ` +
476476
`"!expr" RLS read scope — a dropped one is an over-permissive read, not an inaccurate ` +
477-
`number (#3948, #5345).`,
477+
`number.`,
478478
);
479479
}
480480

@@ -522,7 +522,7 @@ export function unknownFieldOperatorError(op: string, field: string, path: strin
522522
`Supported operators: ${SUPPORTED_FIELD_OPERATOR_LIST}. ` +
523523
`Refused at ${path} rather than handed to the query engine, which answers an unknown ` +
524524
`operator with an error carrying no code and no status — a 500-shaped body for what is a ` +
525-
`400-class client mistake (#5324).`,
525+
`400-class client mistake.`,
526526
);
527527
}
528528

@@ -540,7 +540,7 @@ export function unknownLogicalOperatorError(key: string, path: string): Error {
540540
`declared logical operators $and, $or and $not (@objectstack/spec LOGICAL_OPERATORS); every ` +
541541
`other key is a field name. It is refused rather than passed through to the query engine, ` +
542542
`which would answer with an uncoded error — or, worse, evaluate an operator the Filter ` +
543-
`Protocol never declared (#5324).`,
543+
`Protocol never declared.`,
544544
);
545545
}
546546

@@ -568,7 +568,7 @@ export function malformedBetweenError(field: string, value: unknown, path: strin
568568
`It is refused rather than skipped: a range that compiles to no predicate answers with a ` +
569569
`row count the author never asked for, and this driver's faces did not even agree on ` +
570570
`WHICH — the live query path returned NO rows, the reference matcher returned EVERY row, ` +
571-
`and a dropped AST comparison would have matched every record (#5328).`,
571+
`and a dropped AST comparison would have matched every record.`,
572572
);
573573
}
574574

@@ -614,7 +614,7 @@ export function nonBooleanNullComparandError(field: string, value: unknown, path
614614
`compiled IS NULL (anything but false), this driver's query path and driver-mongodb ` +
615615
`compiled IS NOT NULL (anything but true), and this driver's matcher dropped the ` +
616616
`constraint entirely. Note "false" the STRING is truthy, so it landed on the side opposite ` +
617-
`the false it was written to mean (#5347).`,
617+
`the false it was written to mean.`,
618618
);
619619
}
620620

0 commit comments

Comments
 (0)