Skip to content

Commit f849aa5

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-20929-grid-column-consumers
2 parents 4e6e551 + 3fbf3ca commit f849aa5

48 files changed

Lines changed: 169 additions & 199 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
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.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"@objectstack/spec": minor
3+
"@objectstack/platform-objects": patch
4+
---
5+
6+
Clause-②: no
7+
8+
The field form offers `useGrouping` on `number` fields: one plain boolean row beside `scale`, gated to `number` as `scale` is, whose control copies the field form's `allowCreate` row (the same `z.boolean().optional()` node, no default). The key was declared by `FieldSchema` and graded `live` by the liveness ledger once the console's number display began to answer an authored value first, but no form offered it, so an author's only door was the Source tab. The help text follows the key's own description: unset lets the renderer decide, off never groups (a year or an ID), on always groups. It also says that an untouched switch writes nothing, so it reads off even where the renderer groups.
9+
10+
⛔ **No schema accept set moves and no export changes.** What changes is the **form payload** `getMetaTypes()` serves and the translation keys `os i18n extract` walks, hence the regenerated `platform-objects` metadata-form bundles, whose two new leaves are authored in `zh-CN`, `ja-JP` and `es-ES` rather than left as extractor fills.

‎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
}

0 commit comments

Comments
 (0)