You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* feat(spec,objectql): IObjectQLEngine -- the objectql slot's contract exists, the class implements it, the seven local stand-ins are deleted (#4251 B3)
The ledger can finally say what each of ObjectQL's two registration names
means: `data` stays IDataEngine (the data plane); `objectql` resolves to
IObjectQLEngine -- schema access (getSchema/getObject/registry), actions
(registerAction/removeActionsByPackage/executeAction), hook & middleware
seams (registerHook/unregisterHooksByPackage/registerFunction/
registerMiddleware/bindHooks), the first-wins default runners and hook
metrics, boot wiring (registerDriver/setDatasourceMapping/registerApp),
and ops probes (checkDriversHealth/wasDatastoreCreatedFromEmpty/
invalidateDataMigrationFlags). The ledger test pins the relation:
objectql strictly WIDENS data, deliberately no longer equal.
Why implements is the point: the honest state for two batches -- recorded
on DomainHandlerContext.getObjectQL -- was that the wider surface had no
contract, so seven consumer-local stand-ins accumulated
(AppEngineSurface, EngineRegistrySurface, EngineExtensionSurface,
SecurityEngineSurface, FreshDatastoreEngine, the dispatcher's inline
checkDriversHealth slice, getObjectQL: any). Each was honest and each was
an UNCHECKED claim: getService<Surface>() is an assertion, so an engine
rename would break every consumer at runtime with zero compile errors.
`ObjectQL implements IObjectQLEngine` turns all of them into one
compiler-verified claim; all seven are deleted, and getObjectQL is typed
Promise<IObjectQLEngine | null> end to end.
Evidence bar unchanged: every member has a cross-package consumer through
the slot; triggerHooks (cross-package only in tests) stays off.
_registry never leaves the engine package now: plugin-security's five
declared-metadata readers reached the private field through `any` -- the
same reach /me/apps had in B2 -- all migrated to the public getter the
contract declares, test doubles included.
IMetadataService gains subscribe?/loadMany? -- implemented by
MetadataManager beside watch all along, reached only via `any` by
ObjectQLPlugin's metadata bridge. With them declared, that bridge's six
lookups and metadata-protocol's objectql lookup carry contract types and
both files leave the grandfather list: baseline 167 -> 159 sites,
36 -> 34 files.
Verified: spec build + 7198/282; objectql build (the implements check) +
1464/89; runtime 1015/70; plugin-security 677/32; plugin-hono-server
135/12; plugin-auth 579/26; platform-objects 254/8; metadata 281/13;
metadata-protocol 136/21; all eight dts builds; ratchet holds 159/34
none new; eslint clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(spec,objectql,plugin-security): CI round-trip fixes -- and the implements check caught a second spec-internal double (#4251 B3)
Three fixes, all caught by gates:
1. security-plugin:880 -- the contract's getSchema returns `unknown`;
narrow to EngineOwnedSchemaLike at the guard call (CI Build Core; my
local batch had been aborted by an earlier failure and I re-ran only
the failed package -- the DEBT-package lesson, second verse).
2. objectql plugin.ts:1583 -- optional-member narrowing does not survive
into a closure (TS2722); take a bound reference under the guard.
3. IMetadataService.subscribe -- the first draft reused `watch`'s
callback type, and `MetadataManager implements IMetadataService`
REJECTED it: subscribe relays the persistence-side MetadataWatchEvent
(add/changed/deleted + path/stats), not watch's registration-level
events. The check working exactly as intended, on its first day.
Fixing it exposed that spec carries TWO types named MetadataWatchEvent
with different shapes (system/metadata-persistence.zod vs
kernel/metadata-loader.zod) -- the same double-source shape as the
http-server shadow, both alive this time. Reported on #4251; merging
them is its own change. The contract now imports the persistence one
the implementation uses, with the trap documented at the import.
Verified: all nine touched packages' dts builds in ONE uninterrupted
batch; spec 7198/282, objectql 1464/89, metadata 281/13,
plugin-security 677/32; eslint clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* chore(spec): regenerate the api-surface snapshot for the two new contract exports (#4251 B3)
`check:api-surface` is spec's public-API snapshot gate, and it reported
exactly what this PR does: "0 breaking (removed/narrowed), 2 added". The
two are IObjectQLEngine and EngineSchemaRegistryView; the regenerated
snapshot diff is +2 lines, -0 -- purely additive, matching the gate's own
count.
Missed because I ran spec's build and tests but not its check:* gates.
#4361 ran all of them; this PR did not. All 16 now pass locally
(check:exported-any included -- the contract's deliberate `any`s at the
framework-handle and engine-local-shape edges are within its allowance).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
feat(spec,objectql): `IObjectQLEngine` — the `objectql` slot's contract exists, the class `implements` it, and the seven consumer-local stand-ins are deleted (#4251 B3)
14
+
15
+
ObjectQL registers one instance under two names, and the ledger can finally say
16
+
what each name means: `data` stays `IDataEngine` (the data plane), `objectql`
17
+
now resolves to **`IObjectQLEngine`** — the full engine: schema access
0 commit comments