Releases: objectstack-ai/objectstack
Release list
objectstack-vscode@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised.
create-objectstack@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
7309c81: chore(cli,create-objectstack): scaffolds no longer name a driver (#4065)
os initand thecreate-objectstackblank template both listed
@objectstack/driver-memoryin the generateddependencies. It was the only
driver named, which read as an endorsement — "this is the driver your app runs
on" — when it is in fact the last-resort rung of the dev step-down (native
better-sqlite3→ WASM SQLite → mingo). A new project's first impression of the
data layer should not be the engine that enforces no primary keys, no
uniqueness, noNOT NULLand no column types.It was also redundant:
@objectstack/runtimealready depends ondriver-sql,
driver-sqlite-wasmanddriver-memory, and every script in both scaffolds runs
through the CLI, which carries all four. Removing the line changes nothing a
generated project can do —objectstack devstill resolves SQLite by default,
andOS_DATABASE_URLstill selects Postgres / MySQL / MongoDB.Docs updated to match: the "packages you depend on" table in Your first project
no longer lists a driver row (it now says where drivers come from), and the
Memory Driver section of Database Drivers documents the opt-in persistence
default, carries a migration callout for the old'auto'behaviour, and points
test authors at in-memory SQLite. That section also claimed "Data is lost when
the process exits", which was simply false while'auto'was the default — it
wrote a file into the working directory.
@objectstack/verify@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
c3bcb42: feat(runtime,datasource): the default-datasource connect seam accepts a host driver factory — adopt pre-built instances without forking the verdict (#3826)
ADR-0062 D1's open-core convergence (#3869/#3886) left one structural question
open: a host whosedefaultneeds a driver the shared factory cannot build —
the cloud distribution'sturso, or an instance pooled BEYOND one kernel (the
cloud control-plane driver doubles as the proxy base of every environment
kernel; per-environment drivers are cached across kernel rebuilds) — had only
two options, both bad: stay on the legacy pre-builtDriverPluginpath, whose
connect verdict lives inObjectQLEngine.init()(the second implementation
#3826 exists to retire), or fork the connect orchestration. Either re-opens the
#3741 → #3758 drift this whole line of work is about.Two additive pieces close it:
DefaultDatasourcePluginaccepts an injectedIDatasourceDriverFactory
(defaults to the shared open-core factory, byte-for-byte unchanged when
omitted). The factory only changes whatcreate()returns — the policy-free
init connect,bootCriticalfail-fast,OS_ALLOW_DRIVER_CONNECT_FAILURE
escape hatch, and the start() replay into retained admin state are identical
either way, and the new tests pin that (an adopted instance that cannot
connect takes the exact same verdict).createPrebuiltDriverFactory(driver, { driverId?, fallback? })in
@objectstack/service-datasource— the "adopt an existing driver" seam the
first #3826 pass found missing, landed AS a factory so it composes into the
one connect path instead of becoming a second entry point.create()returns
the SAME instance every call: construction, pooling, and reuse stay host
concerns; only the verdict converges. Not for the common case — adefault
expressible as{ driver, config }should stay a plain definition.
The
@objectstack/verifydogfood harness now boots through
DefaultDatasourcePlugin(declaredsqlite-wasmdefinition) instead of a
pre-builtDriverPlugin— so the dogfood gate exercises the same declared
-default connect pathobjectstack dev/serveuse, which is the §Risk
mitigation ADR-0062 promised ("behind the dogfood gate") and did not yet have.
The degraded-boot parity guard stays:ObjectQLEngine.init()'s verdict is
still live for the boot re-verification,DriverPluginescape-hatch drivers,
and the cloud compositions until they converge onto this seam. -
64f8cbe: feat(platform-objects,service-settings,verify):
sys_secretis platform infrastructure — registered byPlatformObjectsPlugin, not by the settings service (#4270)The environment's encrypted-secret store (
sys_secret, ADR-0066 D2/④) was
registered by@objectstack/service-settings, but it has three producer
classes and only one of them is settings: the settings service's encrypted
specifiers, the ObjectQL engine's ownsecret-field encryption
(encryptSecretFields/resolveSecret— the generic write path of ANY
business object carrying aField.secret()), and the datasource credential
binder. Unlike thesys_migrationprecedent (#4243), the failure posture is
fail-CLOSED: on a kernel composed without settings, every insert/update of an
object with a secret field threw — with an error message that told the
operator to "Ensure the platform-objects (sys_secret) are registered", naming
a package that did not register it.The registration now lives in
PlatformObjectsPlugin
(@objectstack/platform-objects/plugin) — the pluginos servealready
auto-injects into every served kernel — so the store exists with the
platform, independent of which optional services are composed, and the
engine's fail-closed error message is true. Definition ownership is unchanged
(sys_secretstays in@objectstack/platform-objectsand in
PLATFORM_OBJECTS_BY_PACKAGE); the settings service remains a producer and
consumer through itssys_secret-backed secret store.Consequences:
@objectstack/service-settingsno longer contributessys_secretto the
manifest (settingsObjectsis now[SysSetting, SysSettingAudit]). An
embedder composingSettingsServicePluginon a hand-built kernel that
relied on it for thesys_secrettable must compose
PlatformObjectsPlugin(the plugin every supported assembly path already
includes). The move REPLACES the registration — nothing registers the
object twice.@objectstack/verify's boot harness now composesPlatformObjectsPlugin,
mirroringos serve's auto-inject — which also means harness kernels now
carry thesys_migrationledger + fresh-datastore attestation (#4243) the
served assembly always had.
-
Updated dependencies [bc35e00]
-
Updated dependencies [6a67d7a]
-
Updated dependencies [6e141bc]
-
Updated dependencies [48fcf70]
-
Updated dependencies [0ecc656]
-
Updated dependencies [a4e2684]
-
Updated dependencies [06772eb]
-
Updated dependencies [0c90ece]
-
Updated dependencies [195ad76]
-
Updated dependencies [c2bbd97]
-
Updated dependencies [3ec8186]
-
Updated dependencies [698cbc2]
-
Updated dependencies [b1863a5]
-
Updated dependencies [270650f]
-
Updated dependencies [956e7f9]
-
Updated dependencies [3aef718]
-
Updated dependencies [ffb003c]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [e5e8b10]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [bb1ce2e]
-
Updated dependencies [b4be309]
-
Updated dependencies [6fa1827]
-
Updated dependencies [05154a1]
-
Updated dependencies [7a55913]
-
Updated dependencies [0f12193]
-
Updated dependencies [7a55913]
-
Updated dependencies [f5ab1c7]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [3abd233]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [ea24593]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [fccec22]
-
Updated dependencies [2af1988]
-
Updated dependencies [0af50a3]
-
Updated dependencies [fce14ab]
-
Updated dependencies [2e836de]
-
Updated dependencies [7309c81]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [7df7c64]
-
Updated dependencies [fae74b5]
-
Updated dependencies [545d931]
-
Updated dependencies [a225ef5]
-
Updated dependencies [7bf5349]
-
Updated dependencies [366105c]
-
Updated dependencies [c9d254a]
-
Updated dependencies [c8124e5]
-
Updated dependencies [c3bcb42]
-
Updated dependencies [a1a4140]
-
Updated dependencies [c20b875]
-
Updated dependencies [f4d7f1d]
-
Updated dependencies [217e2e6]
-
Updated dependencies [4dc14cc]
-
Updated dependencies [0373d52]
-
Updated dependencies [4f30943]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [bb192c4]
-
Updated dependencies [98e7cc7]
-
Updated dependencies [4cf7c61]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [347f460]
-
Updated dependencies [8a341a4]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [c39d713]
-
Updated dependencies [dc530b4]
-
Updated dependencies [f0d6594]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [385c4b0]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [45dc446]
-
Updated dependencies [d4720ca]
-
Updated dependencies [43ff598]
-
Updated dependencies [e5a4d26]
-
Updated dependencies [839982e...
@objectstack/types@17.0.0-rc.1
Minor Changes
-
2a37694: fix(plugin-dev,types): the production escape hatch stops being silent (#3900)
DevPlugin.init()refuses to run underNODE_ENV=production(ADR-0115 D6), and
OS_ALLOW_DEV_PLUGINoverrides that refusal. As shipped, the override returned
early with no output at all: the process ran the development assembly while
every log line and the ready banner read like an ordinary production start.That reproduces, one level up, the defect the guard exists to close. The guard's
own precedent says so —OS_ALLOW_DEGRADED_TENANCYboots degraded and brands
it everywhere an operator looks, andOS_ALLOW_DRIVER_CONNECT_FAILURE's
contract is "logged loudly at startup". An escape hatch that says nothing leaves
the operator's only evidence of a degraded state in an env var they may not have
set themselves.The override now brands itself, twice. A warning at
init()— emitted
before any assembly work, so it survives an assembly step that later throws —
and a repeat on the ready banner, which is the surface an operator actually
reads:⚠ DEV ASSEMBLY UNDER NODE_ENV=production (OS_ALLOW_DEV_PLUGIN is set) — the boot guard was explicitly overridden. This process is running the DEVELOPMENT assembly, which is not hardened for production traffic (ADR-0115 D6). • Auth secret is the default published inside @objectstack/plugin-dev. It is public, so anyone can mint a session this stack accepts. Pass `authSecret` explicitly. • Data goes to the in-memory driver with persistence disabled — every record is lost when this process exits.Only hazards that are live for that configuration are named: the secret line
is suppressed when the operator passed their ownauthSecret, and the driver
line when thedrivertoggle is off. The dev-admin seed is deliberately absent
—plugin-auth'smaybeSeedDevAdminis hard-gated to
NODE_ENV === 'development'and cannot fire on this path, so warning about it
would spend the attention the real hazards need.New export —
resolveAllowDevPlugin()(@objectstack/types). The flag moves
off a bareprocess.env['OS_ALLOW_DEV_PLUGIN'] === '1'and joins the
OS_ALLOW_*family's shared truthy vocabulary, next to
resolveAllowDegradedTenancy/resolveAllowDriverConnectFailure.FROM → TO for operators:
OS_ALLOW_DEV_PLUGIN=1keeps working unchanged.
OS_ALLOW_DEV_PLUGIN=true(andon/yes, case-insensitive, surrounding
whitespace ignored) now takes effect where the strict comparison previously
ignored it and failed the boot. That is a widening, in the direction an operator
setting the flag already intended; falsy and unrecognised values still refuse to
boot, and unset still means "fail fast". If you were relying on
OS_ALLOW_DEV_PLUGIN=truebeing inert as a way to keep the guard armed, unset
the variable instead.No change to the refusal path, which this issue re-verified end to end:
kernel.use()only registers,initPluginWithTimeoutdoes not catch,
bootstrap()rethrows, andos serve's outer handler prints the message and
exits1. Thethrowis genuinely fatal here, so it needs none of the
process.exit(1)the tenancy guard required for sitting inside a broadcatch. -
d5749d7: refactor(types,rest,services,plugin-sharing): one shared writer for the response envelope, and
error.codeis enforced at compile time (#3973)BaseResponseSchemadeclares one envelope for every REST body the platform
emits. It declared it once; the code that wrote it was copied per route
module. After #3843 and #3983 converted the last drifting one, seven modules
each carried their own two-linesendOk/sendErrorpair — so the envelope's
shape lived in fourteen places rather than one.pnpm check:route-envelopeproved those seven copies agreed, which is why this
is a cleanup rather than a bug fix. But a guard proves agreement; it does not
create it. An eighth module starts by copying the pair again — not
hypothetically:share-link-routes.tswas found already drifting by the
repo-wide scan, and its drift had brokenclient.shareLinks.create()and
.list()throughunwrapResponse(#3983).What moved
sendOk/sendErrornow live once, in@objectstack/types
(response-envelope.ts), and all seven modules import them:Module service-storage/storage-routes.tsservice-settings/settings-routes.tsservice-datasource/admin-routes.tsrest/external-datasource-routes.tsrest/package-routes.tsservice-i18n/i18n-service-plugin.tsplugin-sharing/share-link-routes.tsPlacement was the open question in #3973, not design.
packages/specis
schemas-only (Prime Directive #2), and the callers spanrest, four
services/*and oneplugins/*, which rules out anything depending on them.
@objectstack/typesdepends on nothing but@objectstack/spec, so every caller
can reach it, and it is already where the repo puts a helper the HTTP boundaries
share —looksLikeInternalErrorLeak(#3867) sits one file over and made the
same argument first.The builders take a structural
{ status(n), json(body) }, so the package
imports no HTTP contract at all:IHttpResponsesatisfies it, and so does the
any-typedresthe older modules carry.error.codeis now checked by the compilerAll seven copies typed the parameter
code: string. ADR-0112 (#3841) closed the
vocabulary —ErrorCodeisStandardErrorCode ∪ ERROR_CODE_LEDGER— but an
invented code was still caught only at runtime, by a conformance suite parsing a
driven body, i.e. only on routes some test happened to drive.The shared
sendErrortypescodeasErrorCode, so an unregistered code now
fails to compile, at every call site at once:sendError(res, 400, "NOT_A_REGISTERED_CODE", "invented"); // Argument of type '"NOT_A_REGISTERED_CODE"' is not assignable to parameter of type 'ErrorCode'.
This cost no call-site churn: every code the seven modules emit was already
registered.extrais closed at the same placesendError's last parameter isPick<ApiError, 'category' | 'httpStatus' | 'details' | 'requestId'>— exactly whatApiErrorSchemadeclares besidecode
andmessage.It was
Record<string, unknown>whilesettings-routesstill hungnamespace/
key/reason/fieldsbesidecode. Those bodies passed every gate anyway:
ApiErrorSchemais a plainz.object, so unknown keys were STRIPPED rather than
rejected, andenvelopeViolationsinspects only the body's top level —
conformant by stripping rather than by declaration. #4224 moved that module
ontodetails, which is what lets the parameter close here. Closing it at the
shared builder is the part that lasts: an undeclared sibling is now a compile
error in every module at once, rather than a key that quietly evaporates in
whichever module reintroduces it.Nothing changes on the wire
The seven pairs were identical modulo the optional
statusandextra
parameters this one unions, and each module's driven conformance suite still
parses its real bodies against the real spec schemas. One internal call site was
rewritten:package-routespasseddetailspositionally and now passes
{ details }, producing the sameerror.detailsit always did.The guard got stronger
scripts/check-route-envelope.mjscounts response write sites per module. A
module that routes everything through the shared pair builds none itself, so
the seven now declare0 / 0 / 0where they used to declare2 / 1 / 1, and the
shared pair is pinned separately at2 / 1 / 1so the invariant stays total for
the surface rather than per-module. What the count asserts is no longer "your two
builders are the enveloped ones" but "you have no builders" — and a new route
that hand-rolls a body still moves it off zero and fails.
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
c20b875: **Correct the stale premise left behind by #4012: the degraded-boot stderr copy
survives...
@objectstack/trigger-schedule@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
Updated dependencies [6a67d7a]
-
Updated dependencies [0ecc656]
-
Updated dependencies [06772eb]
-
Updated dependencies [270650f]
-
Updated dependencies [3aef718]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [05154a1]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [2af1988]
-
Updated dependencies [0af50a3]
-
Updated dependencies [2e836de]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [c8124e5]
-
Updated dependencies [a1a4140]
-
Updated dependencies [217e2e6]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [dc530b4]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [45dc446]
-
Updated dependencies [c1d44f7]
-
Updated dependencies [ab9fb5c]
-
Updated dependencies [f985b3f]
-
Updated dependencies [9a4932a]
-
Updated dependencies [f9fc874]
-
Updated dependencies [011b386]
-
Updated dependencies [7777e8f]
-
Updated dependencies [507b92a]
-
Updated dependencies [7309c81]
-
Updated dependencies [20bc1ec]
-
Updated dependencies [90c2b15]
-
Updated dependencies [42eeb7d]
-
Updated dependencies [01e124d]
-
Updated dependencies [7ce02eb]
-
Updated dependencies [a13827e]
-
Updated dependencies [7733604]
-
Updated dependencies [40e420f]
-
Updated dependencies [d13004a]
-
Updated dependencies [be7360c]
-
Updated dependencies [5b47ab5]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [8675db6]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [3eb1b2b]
-
Updated dependencies [59b85c0]
-
Updated dependencies [6e357ed]
-
Updated dependencies [d6938bf]
-
Updated dependencies [31e0be9]
-
Updated dependencies [4bfd455]
-
Updated dependencies [ffd2ce2]
-
Updated dependencies [62f8017]
-
Updated dependencies [a831df1]
-
Updated dependencies [f752ee3]
-
Updated dependencies [a1b61e0]
-
Updated dependencies [cd6b9f2]
-
Updated dependencies [2cb6d3c]
-
Updated dependencies [af2a095]
-
Updated dependencies [ec796d5]
-
Updated dependencies [e87fea1]
-
Updated dependencies [c65e529]
-
Updated dependencies [3ca34c1]
-
Updated dependencies [239c3a3]
-
Updated dependencies [94a0bbc]
-
Updated dependencies [d6bfb3d]
-
Updated dependencies [a2266a6]
-
Updated dependencies [d25a0ec]
-
Updated dependencies [667b83e]
-
Updated dependencies [627b188]
-
Updated dependencies [8d4eae7]
-
Updated dependencies [857a6cf]
-
Updated dependencies [65a3a84]
-
Updated dependencies [ccd9397]
-
Updated dependencies [bca935b]
-
Updated dependencies [d92c72d]
-
Updated dependencies [c54c822]
-
Updated dependencies [8dcc0f5]
-
Updated dependencies [75b9e51]
-
Updated dependencies [0a2f233]
-
Updated dependencies [8621cdd]
-
Updated dependencies [6f23667]
-
Updated dependencies [5d21a48]
-
Updated dependencies [19365b7]
-
Updated dependencies [b7ed26d]
-
Updated dependencies [b3a3d83]
-
Updated dependencies [7a55913]
-
Updated dependencies [35accbf]
-
Updated dependencies [6038de7]
-
Updated dependencies [eb95d97]
-
Updated dependencies [e4c2dc8]
-
Updated dependencies [1bd2795]
-
Updated dependencies [8186a70]
-
Updated dependencies [a329cca]
-
Updated dependencies [6eec18c]
-
Updated dependencies [4d7bebf]
-
Updated dependencies [821ac7a]
-
Updated dependencies [8f81731]
-
Updated dependencies [8b50cb3]
-
Updated dependencies [8c2db68]
-
Updated dependencies [22b5e54]
-
Updated dependencies [0166bd5]
-
Updated dependencies [9b702dc]
-
Updated dependencies [ab16331]
- @objectstack/spec@17.0.0-rc.1
- @objectstack/core@17.0.0-rc.1
@objectstack/trigger-record-change@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
Updated dependencies [6a67d7a]
-
Updated dependencies [0ecc656]
-
Updated dependencies [06772eb]
-
Updated dependencies [270650f]
-
Updated dependencies [3aef718]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [05154a1]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [2af1988]
-
Updated dependencies [0af50a3]
-
Updated dependencies [2e836de]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [c8124e5]
-
Updated dependencies [a1a4140]
-
Updated dependencies [217e2e6]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [dc530b4]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [45dc446]
-
Updated dependencies [c1d44f7]
-
Updated dependencies [ab9fb5c]
-
Updated dependencies [f985b3f]
-
Updated dependencies [9a4932a]
-
Updated dependencies [f9fc874]
-
Updated dependencies [011b386]
-
Updated dependencies [7777e8f]
-
Updated dependencies [507b92a]
-
Updated dependencies [7309c81]
-
Updated dependencies [20bc1ec]
-
Updated dependencies [90c2b15]
-
Updated dependencies [42eeb7d]
-
Updated dependencies [01e124d]
-
Updated dependencies [7ce02eb]
-
Updated dependencies [a13827e]
-
Updated dependencies [7733604]
-
Updated dependencies [40e420f]
-
Updated dependencies [d13004a]
-
Updated dependencies [be7360c]
-
Updated dependencies [5b47ab5]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [8675db6]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [3eb1b2b]
-
Updated dependencies [59b85c0]
-
Updated dependencies [6e357ed]
-
Updated dependencies [d6938bf]
-
Updated dependencies [31e0be9]
-
Updated dependencies [4bfd455]
-
Updated dependencies [ffd2ce2]
-
Updated dependencies [62f8017]
-
Updated dependencies [a831df1]
-
Updated dependencies [f752ee3]
-
Updated dependencies [a1b61e0]
-
Updated dependencies [cd6b9f2]
-
Updated dependencies [2cb6d3c]
-
Updated dependencies [af2a095]
-
Updated dependencies [ec796d5]
-
Updated dependencies [e87fea1]
-
Updated dependencies [c65e529]
-
Updated dependencies [3ca34c1]
-
Updated dependencies [239c3a3]
-
Updated dependencies [94a0bbc]
-
Updated dependencies [d6bfb3d]
-
Updated dependencies [a2266a6]
-
Updated dependencies [d25a0ec]
-
Updated dependencies [667b83e]
-
Updated dependencies [627b188]
-
Updated dependencies [8d4eae7]
-
Updated dependencies [857a6cf]
-
Updated dependencies [65a3a84]
-
Updated dependencies [ccd9397]
-
Updated dependencies [bca935b]
-
Updated dependencies [d92c72d]
-
Updated dependencies [c54c822]
-
Updated dependencies [8dcc0f5]
-
Updated dependencies [75b9e51]
-
Updated dependencies [0a2f233]
-
Updated dependencies [8621cdd]
-
Updated dependencies [6f23667]
-
Updated dependencies [5d21a48]
-
Updated dependencies [19365b7]
-
Updated dependencies [b7ed26d]
-
Updated dependencies [b3a3d83]
-
Updated dependencies [7a55913]
-
Updated dependencies [35accbf]
-
Updated dependencies [6038de7]
-
Updated dependencies [eb95d97]
-
Updated dependencies [e4c2dc8]
-
Updated dependencies [1bd2795]
-
Updated dependencies [8186a70]
-
Updated dependencies [a329cca]
-
Updated dependencies [6eec18c]
-
Updated dependencies [4d7bebf]
-
Updated dependencies [821ac7a]
-
Updated dependencies [8f81731]
-
Updated dependencies [8b50cb3]
-
Updated dependencies [8c2db68]
-
Updated dependencies [22b5e54]
-
Updated dependencies [0166bd5]
-
Updated dependencies [9b702dc]
-
Updated dependencies [ab16331]
- @objectstack/spec@17.0.0-rc.1
- @objectstack/core@17.0.0-rc.1
@objectstack/trigger-api@17.0.0-rc.1
Minor Changes
-
f5a4ef0: refactor!: ADR-0112 batch 2 — sweep the lowercase error-code emitters (#4003)
Continues #3841 per ADR-0112. Batch 1 (#3988) settled the vocabulary and closed
the set; this batch moves the emitters that still spoke lowercasesnake_case
onto it.Wire-visible change. Error codes on these surfaces change spelling. Generic
conditions collapse onto the standard catalog rather than keeping a synonym:
unauthorized/unauthenticated→UNAUTHENTICATED,forbidden→
PERMISSION_DENIED,not_found→RESOURCE_NOT_FOUND,internal→
INTERNAL_ERROR,unavailable→SERVICE_UNAVAILABLE,not_supported→
NOT_IMPLEMENTED,bad_request→INVALID_REQUEST. Domain conditions get codes
registered inERROR_CODE_LEDGER(MARKETPLACE_STORAGE_FAILED,
PLUGIN_MANIFEST_INVALID,ITEM_LOCKED,DELIVERY_NOT_ELIGIBLE, …). Swept:
cloud-connection,plugin-auth,hono,metadata-protocol,rest,
service-messaging,service-automation,trigger-api.Branch on
error.codevalues rather than pattern-matching their case: the
console's fix for the same rename (objectui#2977) reads codes case-insensitively
for exactly this reason, and that is the pattern to copy in your own consumers if
you support servers on both sides of the change.Four routes stop putting a code in the message slot. The webhook redeliver
route, the API-trigger webhook, and tworestroutes answered
{ success: false, error: '<code>', message }— the code occupyingerror, the
declared object envelope nowhere. They now emiterror: { code, message }, and
three API-trigger branches gained a message they never had. Clients reading
body.erroras a string on those routes must readbody.error.code.ConnectorErrorCategory/ConnectorRetryStrategy(ADR-0112 D9a):
@objectstack/specexported two mutually incompatibleErrorCategorytypes and
twoRetryStrategytypes. The connector-side pair is renamed; importers of the
integrationsubpath update the name. Side effect: the api-sideErrorCategory
andRetryStrategynow appear in the generated API reference at all — the name
collision had been silently dropping them.OAUTH_REGISTER_FAILEDreplaces an unbounded code source. The OAuth client
registration route put better-auth's arbitrarybody.errorstring straight into
error.code. The code is now ours and the upstream discriminator moved to
details.upstreamError.Not swept, deliberately.
sys_metadata_audit.codekeeps its lowercase values
(ADR-0112 D6b): it is persisted audit history, and the same column holds
non-error outcomes (ok,lock_override). Diagnostics records that ship inside a
200 keep theirs (D6c), as do field-level codes (D6, #3977) and the CLI's
--jsonoutput contract.A
check:error-code-casingCI guard now fails on a new lowercase literal in a
code position, since the ledger's casing rule can only police codes that someone
registers.
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
cc2de0e: chore(packaging): 20 packages stop publishing their sources, tests and build tooling (#4248)
These 20 packages declared no
filesfield, so npm fell back to packing the
whole package directory.npm pack --dry-runon@objectstack/plugin-webhooks
listed 21 files — 15 undersrc/, three of them unit tests
(auto-enqueuer.test.ts,bootstrap-declared-webhooks.test.ts, …), plus the
build-timescripts/i18n-extract.config.ts.dist/lands on top of that at
publish time rather than instead of it, so consumers were installing the
TypeScript sources and the test suite alongside the artifact they asked for.Each now declares
"files": ["dist", "README.md"], matching the 29 packages
that already did. Nothing a consumer imports moves: everymain/types/
exportstarget in all 20 already resolved insidedist/, which the new
check:published-filesguard verifies rather than assumes. The visible change
is a smaller install and a smaller dependency-scanning surface —npm packon
@objectstack/plugin-webhooksnow yields 2 files plusdist/.The other half of the fix is the gate. Half the packages declaring
filesand
half not was the #3786 shape — a hand-copied convention with nothing enforcing
it, where whoever forgets the line gets no signal at all.check:published-files
(new, wired into the always-requiredlintjob) holds every non-private
workspace package to four invariants:filesis declared; it is
sufficient (covers every entry point, so tightening a whitelist cannot ship
a package that fails to resolve); it is minimal (admits no test, test-harness
config or build script); and anything beyonddist+README.mdis
registered with a reason, reconciled in both directions so a stale exemption
is an error rather than dead text.@objectstack/specis the one package with
registered extras — its.zod.tssources, JSON Schemas, liveness ledgers and
CHANGELOG.mdare product, not build input.This also closes an assumption #4206 was resting on. Excluding
<pkg>/scripts/**
from the docs-drift implementation test is sound only while no package publishes
scripts/as runtime code; that held, but it held because someone read all three
offenders by hand. It is now checked on every PR. -
Updated dependencies [6a67d7a]
-
Updated dependencies [0ecc656]
-
Updated dependencies [06772eb]
-
Updated dependencies [270650f]
-
Updated dependencies [3aef718]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [05154a1]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [2af1988]
-
Updated dependencies [0af50a3]
-
Updated dependencies [2e836de]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [c8124e5]
-
Updated dependencies [a1a4140]
-
Updated dependencies [217e2e6]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [dc530b4]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [45dc446]
-
Updated dependencies [c1d44f7]
-
Updated dependencies [ab9fb5c]
-
Updated dependencies [f985b3f]
-
Updated dependencies [9a4932a]
-
Updated dependencies [f9fc874]
-
Updated dependencies [011b386]
-
Updated dependencies [7777e8f]
-
Updated dependencies [507b92a]
-
Updated dependencies [7309c81]
-
Updated dependencies [20bc1ec]
-
Updated dependencies [90c2b15]
-
Updated dependencies [42eeb7d]
-
Updated dependencies [01e124d]
-
Updated dependencies [7ce02eb]
-
Updated dependencies [a13827e]
-
Updated dependencies [7733604]
-
Updated dependencies [40e420f]
-
Updated dependencies [d13004a]
-
Updated dependencies [be7360c]
-
Updated dependencies [5b47ab5]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [8675db6]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [3eb1b2b]
-
Updated dependencies [59b85c0]
-
Updated dependencies [6e357ed]
-
Updated dependencies [d6938bf]
-
Updated dependencies [31e0be9]
-
Updated dependencies [4bfd455]
-
Updated dependencies [ffd2ce2]
-
Updated dependencies [62f8017]
-
Updated dependencies [a831df1]
-
Updated depend...
@objectstack/studio@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
Updated dependencies [6a67d7a]
-
Updated dependencies [0ecc656]
-
Updated dependencies [06772eb]
-
Updated dependencies [270650f]
-
Updated dependencies [3aef718]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [05154a1]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [2af1988]
-
Updated dependencies [2e836de]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [c8124e5]
-
Updated dependencies [a1a4140]
-
Updated dependencies [217e2e6]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [dc530b4]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [c1d44f7]
-
Updated dependencies [ab9fb5c]
-
Updated dependencies [f985b3f]
-
Updated dependencies [9a4932a]
-
Updated dependencies [f9fc874]
-
Updated dependencies [011b386]
-
Updated dependencies [7777e8f]
-
Updated dependencies [507b92a]
-
Updated dependencies [7309c81]
-
Updated dependencies [20bc1ec]
-
Updated dependencies [90c2b15]
-
Updated dependencies [42eeb7d]
-
Updated dependencies [01e124d]
-
Updated dependencies [7ce02eb]
-
Updated dependencies [a13827e]
-
Updated dependencies [7733604]
-
Updated dependencies [40e420f]
-
Updated dependencies [d13004a]
-
Updated dependencies [5b47ab5]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [8675db6]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [3eb1b2b]
-
Updated dependencies [59b85c0]
-
Updated dependencies [6e357ed]
-
Updated dependencies [d6938bf]
-
Updated dependencies [31e0be9]
-
Updated dependencies [4bfd455]
-
Updated dependencies [ffd2ce2]
-
Updated dependencies [62f8017]
-
Updated dependencies [a831df1]
-
Updated dependencies [f752ee3]
-
Updated dependencies [a1b61e0]
-
Updated dependencies [cd6b9f2]
-
Updated dependencies [2cb6d3c]
-
Updated dependencies [af2a095]
-
Updated dependencies [ec796d5]
-
Updated dependencies [e87fea1]
-
Updated dependencies [c65e529]
-
Updated dependencies [3ca34c1]
-
Updated dependencies [239c3a3]
-
Updated dependencies [94a0bbc]
-
Updated dependencies [d6bfb3d]
-
Updated dependencies [a2266a6]
-
Updated dependencies [d25a0ec]
-
Updated dependencies [667b83e]
-
Updated dependencies [627b188]
-
Updated dependencies [8d4eae7]
-
Updated dependencies [65a3a84]
-
Updated dependencies [ccd9397]
-
Updated dependencies [bca935b]
-
Updated dependencies [d92c72d]
-
Updated dependencies [c54c822]
-
Updated dependencies [8dcc0f5]
-
Updated dependencies [75b9e51]
-
Updated dependencies [0a2f233]
-
Updated dependencies [8621cdd]
-
Updated dependencies [6f23667]
-
Updated dependencies [5d21a48]
-
Updated dependencies [19365b7]
-
Updated dependencies [b7ed26d]
-
Updated dependencies [68dea0b]
-
Updated dependencies [64f8cbe]
-
Updated dependencies [b3a3d83]
-
Updated dependencies [7a55913]
-
Updated dependencies [35accbf]
-
Updated dependencies [6038de7]
-
Updated dependencies [eb95d97]
-
Updated dependencies [e4c2dc8]
-
Updated dependencies [1bd2795]
-
Updated dependencies [8186a70]
-
Updated dependencies [a329cca]
-
Updated dependencies [6eec18c]
-
Updated dependencies [4d7bebf]
-
Updated dependencies [821ac7a]
-
Updated dependencies [8f81731]
-
Updated dependencies [8b50cb3]
-
Updated dependencies [8c2db68]
-
Updated dependencies [22b5e54]
-
Updated dependencies [0166bd5]
-
Updated dependencies [9b702dc]
-
Updated dependencies [ab16331]
- @objectstack/spec@17.0.0-rc.1
- @objectstack/platform-objects@17.0.0-rc.1
@objectstack/setup@17.0.0-rc.1
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
Updated dependencies [6a67d7a]
-
Updated dependencies [0ecc656]
-
Updated dependencies [06772eb]
-
Updated dependencies [270650f]
-
Updated dependencies [3aef718]
-
Updated dependencies [1ea6bce]
-
Updated dependencies [c1dcacd]
-
Updated dependencies [ad303ed]
-
Updated dependencies [32ccb23]
-
Updated dependencies [f5a4ef0]
-
Updated dependencies [2d3e255]
-
Updated dependencies [7d7521f]
-
Updated dependencies [5dc4d02]
-
Updated dependencies [05154a1]
-
Updated dependencies [9b6fe7c]
-
Updated dependencies [8c711fb]
-
Updated dependencies [09e4547]
-
Updated dependencies [91f4c78]
-
Updated dependencies [820eff9]
-
Updated dependencies [8d895ff]
-
Updated dependencies [f6472d7]
-
Updated dependencies [78caf51]
-
Updated dependencies [62a789b]
-
Updated dependencies [789ad63]
-
Updated dependencies [2af1988]
-
Updated dependencies [2e836de]
-
Updated dependencies [12a19a8]
-
Updated dependencies [41dcda3]
-
Updated dependencies [c8124e5]
-
Updated dependencies [a1a4140]
-
Updated dependencies [217e2e6]
-
Updated dependencies [86a71d1]
-
Updated dependencies [d5c75e2]
-
Updated dependencies [03d26f7]
-
Updated dependencies [4384921]
-
Updated dependencies [3c628ce]
-
Updated dependencies [7cb922e]
-
Updated dependencies [1d22114]
-
Updated dependencies [b5f9397]
-
Updated dependencies [ed77493]
-
Updated dependencies [58a03d2]
-
Updated dependencies [dc530b4]
-
Updated dependencies [e59786e]
-
Updated dependencies [bcf1112]
-
Updated dependencies [9774b78]
-
Updated dependencies [b07d829]
-
Updated dependencies [a648e96]
-
Updated dependencies [a47ac06]
-
Updated dependencies [e4c61a7]
-
Updated dependencies [cc60165]
-
Updated dependencies [081aa6f]
-
Updated dependencies [91f4c78]
-
Updated dependencies [e8d0c21]
-
Updated dependencies [c1d44f7]
-
Updated dependencies [ab9fb5c]
-
Updated dependencies [f985b3f]
-
Updated dependencies [9a4932a]
-
Updated dependencies [f9fc874]
-
Updated dependencies [011b386]
-
Updated dependencies [7777e8f]
-
Updated dependencies [507b92a]
-
Updated dependencies [7309c81]
-
Updated dependencies [20bc1ec]
-
Updated dependencies [90c2b15]
-
Updated dependencies [42eeb7d]
-
Updated dependencies [01e124d]
-
Updated dependencies [7ce02eb]
-
Updated dependencies [a13827e]
-
Updated dependencies [7733604]
-
Updated dependencies [40e420f]
-
Updated dependencies [d13004a]
-
Updated dependencies [5b47ab5]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [8675db6]
-
Updated dependencies [b09d8d9]
-
Updated dependencies [3eb1b2b]
-
Updated dependencies [59b85c0]
-
Updated dependencies [6e357ed]
-
Updated dependencies [d6938bf]
-
Updated dependencies [31e0be9]
-
Updated dependencies [4bfd455]
-
Updated dependencies [ffd2ce2]
-
Updated dependencies [62f8017]
-
Updated dependencies [a831df1]
-
Updated dependencies [f752ee3]
-
Updated dependencies [a1b61e0]
-
Updated dependencies [cd6b9f2]
-
Updated dependencies [2cb6d3c]
-
Updated dependencies [af2a095]
-
Updated dependencies [ec796d5]
-
Updated dependencies [e87fea1]
-
Updated dependencies [c65e529]
-
Updated dependencies [3ca34c1]
-
Updated dependencies [239c3a3]
-
Updated dependencies [94a0bbc]
-
Updated dependencies [d6bfb3d]
-
Updated dependencies [a2266a6]
-
Updated dependencies [d25a0ec]
-
Updated dependencies [667b83e]
-
Updated dependencies [627b188]
-
Updated dependencies [8d4eae7]
-
Updated dependencies [65a3a84]
-
Updated dependencies [ccd9397]
-
Updated dependencies [bca935b]
-
Updated dependencies [d92c72d]
-
Updated dependencies [c54c822]
-
Updated dependencies [8dcc0f5]
-
Updated dependencies [75b9e51]
-
Updated dependencies [0a2f233]
-
Updated dependencies [8621cdd]
-
Updated dependencies [6f23667]
-
Updated dependencies [5d21a48]
-
Updated dependencies [19365b7]
-
Updated dependencies [b7ed26d]
-
Updated dependencies [68dea0b]
-
Updated dependencies [64f8cbe]
-
Updated dependencies [b3a3d83]
-
Updated dependencies [7a55913]
-
Updated dependencies [35accbf]
-
Updated dependencies [6038de7]
-
Updated dependencies [eb95d97]
-
Updated dependencies [e4c2dc8]
-
Updated dependencies [1bd2795]
-
Updated dependencies [8186a70]
-
Updated dependencies [a329cca]
-
Updated dependencies [6eec18c]
-
Updated dependencies [4d7bebf]
-
Updated dependencies [821ac7a]
-
Updated dependencies [8f81731]
-
Updated dependencies [8b50cb3]
-
Updated dependencies [8c2db68]
-
Updated dependencies [22b5e54]
-
Updated dependencies [0166bd5]
-
Updated dependencies [9b702dc]
-
Updated dependencies [ab16331]
- @objectstack/spec@17.0.0-rc.1
- @objectstack/platform-objects@17.0.0-rc.1
@objectstack/service-storage@17.0.0-rc.1
Minor Changes
-
b1863a5: feat(storage): released field files enter collection on deployments that verified their file migration — ADR-0104 D3 wave 2 PR-5b (#3459)
The gated, final step of the file-as-reference sequence. On a deployment whose
adr-0104-file-referencesflag is verified (os migrate files-to-references --apply, #3617), releasing a field file's ownership — clearing the field, or
deleting the owning record — now also tombstones the file
(status='deleted'+deleted_at), which starts thesys_filelifecycle's
declared 30-day grace window and, at its end, hands the row to the reap sweep.
Re-referencing the id inside the window revives it, exactly like re-attaching
an attachment.The two halves ship together, deliberately. The same change extends the
reap guard's sweep-time re-verify beyondsys_attachmentjoin rows to the
ownership columns: a tombstoned file whoseref_*columns name a current
owner (re-claimed in the window, or a release/claim race) is un-tombstoned and
vetoed. Tombstoning released files without that re-verify would have turned
every release into a guaranteed byte delete — the guard's old check consults
a table that is always empty for field files. This pairing was the standing
hard constraint on #3459, locked by regression tests on both halves.Nothing changes for a deployment that has not migrated. Release keeps
clearing the ownership columns only, and released files are retained forever.
Every way of not knowing — no flag row, an unreadable table, an engine that
cannot be asked — reads as "not verified": the gate fails closed, toward
retention. And the guard re-reads the flag fresh at sweep time (not the
release path's memoized read), so a later failing migration run — a database
that has drifted — closes the gate for already-written tombstones too, without
a restart. Attachments-scope collection is unchanged and needs no flag.The irreversible moment is therefore per deployment: day 30 after that
deployment verified its migration and released a file — never the upgrade
itself. -
270650f: feat(migrate): a datastore created from empty attests its data migrations at creation (#3438, ADR-0104 2026-07-30 addendum)
Deployment-level migration flags could only be recorded by running
os migrate. That left a hole at the other end of a deployment's life: a
database created on a version that already ships the migrations started lax
and stayed lax until someone thought to run a command that, for them, converts
nothing and finds nothing. Every new deployment re-entered the warn regime, so
the warn regime would never die out — and, since #3459, every new deployment
also kept every released file forever.A store the platform creates from empty now records
adr-0104-file-referencesandadr-0104-value-shapesat that moment. Nothing
to run; enforcement and collection are live from the first boot.This is not version-gating in disguise. The fact recorded — no legacy value
is stored here — is observed: the store had no history at all. The platform
attests only what it watched itself create, and the test is deliberately
strict: every table made by this boot and none found already present. One
pre-existing table anywhere, one datasource that was already there, one driver
that cannot account for its schema sync — any of those and the deployment
attests nothing and produces its evidence by scan, exactly as before. "Found
empty" and "created empty" are not the same claim, and only the second is an
observation.New surfaces.
IDataDriver.getSchemaSyncStats?()(optional, purely
observational: tables created vs found since connect — implemented by the SQL
and in-memory drivers),engine.wasDatastoreCreatedFromEmpty(),
attestFreshDatastore()in@objectstack/platform-objects/system, and
VALUE_SHAPES_MIGRATION_ID/CREATION_ATTESTED_MIGRATION_IDSin
@objectstack/spec/system. Attestation never overwrites an existing flag row
and never throws into a boot: a failure leaves the deployment lax, which a
migration run can still fix.Upgrading changes nothing for an existing database. It is non-empty when
the platform reaches it, so it is never attested — run
os migrate files-to-references --applyas before. Importing legacy values
into an attested deployment is rejected loudly at the write path;
OS_ALLOW_LAX_MEDIA_VALUES=1re-opens leniency while you diagnose.
Patch Changes
-
2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
The AGENTS.md post-task checklist requires breaking changesets to carry their
FROM → TO migration because "this text ships to consumers asCHANGELOG.md
inside the npm package and is what an upgrading agent greps after the tombstone
error." That delivery path was severed for 68 of the 69 publishable packages:
npm packspackage.json/README*/LICENSE*unconditionally but — unlike
older npm versions — notCHANGELOG.md, and the canonical
"files": ["dist", "README.md"]whitelist never named it. Measured on npm
10.9.7:npm pack --dry-runon@objectstack/typesshipped 3 files while its
70KBCHANGELOG.mdstayed behind. Only@objectstack/speclisted it
explicitly.The tombstone-error scenario is precisely the one where the repo is out of
reach — the upgrading agent hasnode_modulesand nothing else — so the
migration text has to ride in the tarball. Every publishable package now
declaresCHANGELOG.mdinfiles, and the canonical whitelist is
["dist", "README.md", "CHANGELOG.md"].The other half is the gate:
check:published-filesgains a fifth invariant,
COMPLETE — a whitelist that fails to coverCHANGELOG.mdfails the
always-required lint job, so the next package cannot silently sever the path
again.@objectstack/spec's per-package EXTRA_ENTRIES exemption dissolves
into the canonical set.Consumer-visible change: one more file per install (the package's changelog,
e.g. 70.8KB for@objectstack/types), andgrep -r "removed key" node_modules/@objectstack/*/CHANGELOG.mdnow finds the migration it was
promised. -
9881074: fix(batch): the background walks seek instead of counting, so they stop skipping rows (#4363)
#4363 made a single paged read a partition of its result set. It could not make
a walk one: seven background scans paged with a growingoffsetwhile writing
to the very rows they were reading, and an offset counts into a set those writes
are changing. Rows slide past the cursor and are never visited.That is not a slow page in any of these — it is a wrong answer wearing the shape
of a clean run:rebuildApproverIndexbuilt its desired state by walking
sys_approval_request WHERE status = 'pending'with noorderByat all, then
deleted every index row that state did not explain. A skipped request
meant an approver silently dropped from someone's queue. (The loop beside it
ordered bycreated_at— not unique, so its pages were never a partition
either.)verifyFileReferencesdecides which files nothing references. A record it
never visits is reported as an unreferenced file.backfillFileReferencesand the pinyin companion backfill rewrite
each row they read, so their own writes were shifting the set out from under
the cursor. Records were left unconverted and unsearchable by a run that
reported success.scanValueShapesexists to vouch that no stored value is off-shape, and
it opens a migration gate on that evidence.
All of them now go through
keysetWalk(@objectstack/types): order by a
unique key, and seek past the last one instead of counting from the start. A
row's key does not move when the row is updated, and cannot be shifted when
another is deleted, so the walk is stable under exactly the mutation these
functions perform. It is also O(n) rather than O(n²/page) — measured on
Postgres over 2M rows, deep pages cost ~1.1 s by offset against ~0.09 s by seek.One deliberate non-conversion: the REST export stream keeps its offset. It
honors a caller-chosen sort, and a keyset walk would have to re-order the export
byidto seek — changing what the user asked for to fix a cost. Its pages are
already a partition since #4363; only the depth cost remains.keysetWalkmerges the cursor with$andrather than spreading it into the
caller's filter, so a walk whose ownwhereconstrains the key column
({ id: { $in: [...] } }) keeps that constraint instead of having it silently
overwritten. When amaxcap is set it reads one row beyond the cap to tell
"the cap stopped us" from "the source ended exactly there" — without that, a
walk that read everything still reportstruncated, and a caller acting on it
goes looking for rows that were never withheld.The storage suites' fake engines now throw on an
offsetinstead of serving
one, so the conversion is pinned rather than merely passing. -
be7360c: chore(plugins,services): declare
providesServiceson the 20 remaining init-time service providers (ADR-0116 follow-up, #4131)ADR-0116 gave the kernel a declared ordering contract, but only
ObjectQLPluginandMetadataPluginhad declared what theirinit()
registers. The pre-Phase-1 ordering check can only name a provider for
services someone declared, so its coverage was two plugins wide.An audit of every plugin's
init()body (brace-matched, comments stripped,
each call classified by whether it sits inside atry/if) found 20 plugins
that register a service on every path without declaring it. All 20 now
declareprovidesServices. Purely additive: no ordering changes, no new
failure modes — aprovidesServicesentry only lets the kernel say who
provides a service when it reports a misordering,...