Skip to content

Releases: objectstack-ai/objectstack

objectstack-vscode@17.0.0-rc.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now finds the migration it was
    promised.

create-objectstack@17.0.0-rc.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:11
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now finds the migration it was
    promised.

  • 7309c81: chore(cli,create-objectstack): scaffolds no longer name a driver (#4065)

    os init and the create-objectstack blank template both listed
    @objectstack/driver-memory in the generated dependencies. 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, no NOT NULL and no column types.

    It was also redundant: @objectstack/runtime already depends on driver-sql,
    driver-sqlite-wasm and driver-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 dev still resolves SQLite by default,
    and OS_DATABASE_URL still 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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 whose default needs a driver the shared factory cannot build —
    the cloud distribution's turso, 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-built DriverPlugin path, whose
    connect verdict lives in ObjectQLEngine.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:

    • DefaultDatasourcePlugin accepts an injected IDatasourceDriverFactory
      (defaults to the shared open-core factory, byte-for-byte unchanged when
      omitted). The factory only changes what create() returns — the policy-free
      init connect, bootCritical fail-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 — a default
      expressible as { driver, config } should stay a plain definition.

    The @objectstack/verify dogfood harness now boots through
    DefaultDatasourcePlugin (declared sqlite-wasm definition) instead of a
    pre-built DriverPlugin — so the dogfood gate exercises the same declared
    -default connect path objectstack dev/serve use, 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, DriverPlugin escape-hatch drivers,
    and the cloud compositions until they converge onto this seam.

  • 64f8cbe: feat(platform-objects,service-settings,verify): sys_secret is platform infrastructure — registered by PlatformObjectsPlugin, 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 own secret-field encryption
    (encryptSecretFields/resolveSecret — the generic write path of ANY
    business object carrying a Field.secret()), and the datasource credential
    binder. Unlike the sys_migration precedent (#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 plugin os serve already
    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_secret stays in @objectstack/platform-objects and in
    PLATFORM_OBJECTS_BY_PACKAGE); the settings service remains a producer and
    consumer through its sys_secret-backed secret store.

    Consequences:

    • @objectstack/service-settings no longer contributes sys_secret to the
      manifest (settingsObjects is now [SysSetting, SysSettingAudit]). An
      embedder composing SettingsServicePlugin on a hand-built kernel that
      relied on it for the sys_secret table 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 composes PlatformObjectsPlugin,
      mirroring os serve's auto-inject — which also means harness kernels now
      carry the sys_migration ledger + 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...

Read more

@objectstack/types@17.0.0-rc.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

Minor Changes

  • 2a37694: fix(plugin-dev,types): the production escape hatch stops being silent (#3900)

    DevPlugin.init() refuses to run under NODE_ENV=production (ADR-0115 D6), and
    OS_ALLOW_DEV_PLUGIN overrides 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_TENANCY boots degraded and brands
    it everywhere an operator looks
    , and OS_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 own authSecret, and the driver
    line when the driver toggle is off. The dev-admin seed is deliberately absent
    plugin-auth's maybeSeedDevAdmin is 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 bare process.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=1 keeps working unchanged.
    OS_ALLOW_DEV_PLUGIN=true (and on / 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=true being 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, initPluginWithTimeout does not catch,
    bootstrap() rethrows, and os serve's outer handler prints the message and
    exits 1. The throw is genuinely fatal here, so it needs none of the
    process.exit(1) the tenancy guard required for sitting inside a broad catch.

  • d5749d7: refactor(types,rest,services,plugin-sharing): one shared writer for the response envelope, and error.code is enforced at compile time (#3973)

    BaseResponseSchema declares 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-line sendOk / sendError pair — so the envelope's
    shape lived in fourteen places rather than one.

    pnpm check:route-envelope proved 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.ts was found already drifting by the
    repo-wide scan, and its drift had broken client.shareLinks.create() and
    .list() through unwrapResponse (#3983).

    What moved

    sendOk / sendError now live once, in @objectstack/types
    (response-envelope.ts), and all seven modules import them:

    Module
    service-storage/storage-routes.ts
    service-settings/settings-routes.ts
    service-datasource/admin-routes.ts
    rest/external-datasource-routes.ts
    rest/package-routes.ts
    service-i18n/i18n-service-plugin.ts
    plugin-sharing/share-link-routes.ts

    Placement was the open question in #3973, not design. packages/spec is
    schemas-only (Prime Directive #2), and the callers span rest, four
    services/* and one plugins/*, which rules out anything depending on them.
    @objectstack/types depends 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: IHttpResponse satisfies it, and so does the
    any-typed res the older modules carry.

    error.code is now checked by the compiler

    All seven copies typed the parameter code: string. ADR-0112 (#3841) closed the
    vocabulary — ErrorCode is StandardErrorCode ∪ 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 sendError types code as ErrorCode, 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.

    extra is closed at the same place

    sendError's last parameter is Pick<ApiError, 'category' | 'httpStatus' | 'details' | 'requestId'> — exactly what ApiErrorSchema declares beside code
    and message.

    It was Record<string, unknown> while settings-routes still hung namespace /
    key / reason / fields beside code. Those bodies passed every gate anyway:
    ApiErrorSchema is a plain z.object, so unknown keys were STRIPPED rather than
    rejected, and envelopeViolations inspects only the body's top level —
    conformant by stripping rather than by declaration. #4224 moved that module
    onto details, 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 status and extra
    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-routes passed details positionally and now passes
    { details }, producing the same error.details it always did.

    The guard got stronger

    scripts/check-route-envelope.mjs counts response write sites per module. A
    module that routes everything through the shared pair builds none itself, so
    the seven now declare 0 / 0 / 0 where they used to declare 2 / 1 / 1, and the
    shared pair is pinned separately at 2 / 1 / 1 so 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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now finds the migration it was
    promised.

  • c20b875: **Correct the stale premise left behind by #4012: the degraded-boot stderr copy
    survives...

Read more

@objectstack/trigger-schedule@17.0.0-rc.1

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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 lowercase snake_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/unauthenticatedUNAUTHENTICATED, forbidden
    PERMISSION_DENIED, not_foundRESOURCE_NOT_FOUND, internal
    INTERNAL_ERROR, unavailableSERVICE_UNAVAILABLE, not_supported
    NOT_IMPLEMENTED, bad_requestINVALID_REQUEST. Domain conditions get codes
    registered in ERROR_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.code values 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 two rest routes answered
    { success: false, error: '<code>', message } — the code occupying error, the
    declared object envelope nowhere. They now emit error: { code, message }, and
    three API-trigger branches gained a message they never had. Clients reading
    body.error as a string on those routes must read body.error.code.

    ConnectorErrorCategory / ConnectorRetryStrategy (ADR-0112 D9a):
    @objectstack/spec exported two mutually incompatible ErrorCategory types and
    two RetryStrategy types. The connector-side pair is renamed; importers of the
    integration subpath update the name. Side effect: the api-side ErrorCategory
    and RetryStrategy now appear in the generated API reference at all — the name
    collision had been silently dropping them.

    OAUTH_REGISTER_FAILED replaces an unbounded code source. The OAuth client
    registration route put better-auth's arbitrary body.error string straight into
    error.code. The code is now ours and the upstream discriminator moved to
    details.upstreamError.

    Not swept, deliberately. sys_metadata_audit.code keeps 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
    --json output contract.

    A check:error-code-casing CI 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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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 files field, so npm fell back to packing the
    whole package directory. npm pack --dry-run on @objectstack/plugin-webhooks
    listed 21 files — 15 under src/, three of them unit tests
    (auto-enqueuer.test.ts, bootstrap-declared-webhooks.test.ts, …), plus the
    build-time scripts/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: every main / types /
    exports target in all 20 already resolved inside dist/, which the new
    check:published-files guard verifies rather than assumes. The visible change
    is a smaller install and a smaller dependency-scanning surface — npm pack on
    @objectstack/plugin-webhooks now yields 2 files plus dist/.

    The other half of the fix is the gate. Half the packages declaring files and
    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-required lint job) holds every non-private
    workspace package to four invariants: files is 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 beyond dist + README.md is
    registered with a reason, reconciled in both directions so a stale exemption
    is an error rather than dead text. @objectstack/spec is the one package with
    registered extras — its .zod.ts sources, JSON Schemas, liveness ledgers and
    CHANGELOG.md are 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...

Read more

@objectstack/studio@17.0.0-rc.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:10
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:10
2bafe62

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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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

Choose a tag to compare

@github-actions github-actions released this 31 Jul 14:13
2bafe62

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-references flag 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 the sys_file lifecycle'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 beyond sys_attachment join rows to the
    ownership columns: a tombstoned file whose ref_* 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-references and adr-0104-value-shapes at 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_IDS in
    @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 --apply as before. Importing legacy values
    into an attested deployment is rejected loudly at the write path;
    OS_ALLOW_LAX_MEDIA_VALUES=1 re-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 as CHANGELOG.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 packs package.json / README* / LICENSE* unconditionally but — unlike
    older npm versions — not CHANGELOG.md, and the canonical
    "files": ["dist", "README.md"] whitelist never named it. Measured on npm
    10.9.7: npm pack --dry-run on @objectstack/types shipped 3 files while its
    70KB CHANGELOG.md stayed behind. Only @objectstack/spec listed it
    explicitly.

    The tombstone-error scenario is precisely the one where the repo is out of
    reach — the upgrading agent has node_modules and nothing else — so the
    migration text has to ride in the tarball. Every publishable package now
    declares CHANGELOG.md in files, and the canonical whitelist is
    ["dist", "README.md", "CHANGELOG.md"].

    The other half is the gate: check:published-files gains a fifth invariant,
    COMPLETE — a whitelist that fails to cover CHANGELOG.md fails 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), and grep -r "removed key" node_modules/@objectstack/*/CHANGELOG.md now 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 growing offset while 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:

    • rebuildApproverIndex built its desired state by walking
      sys_approval_request WHERE status = 'pending' with no orderBy at 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 by created_at — not unique, so its pages were never a partition
      either.)
    • verifyFileReferences decides which files nothing references. A record it
      never visits is reported as an unreferenced file.
    • backfillFileReferences and 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.
    • scanValueShapes exists 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
    by id to seek — changing what the user asked for to fix a cost. Its pages are
    already a partition since #4363; only the depth cost remains.

    keysetWalk merges the cursor with $and rather than spreading it into the
    caller's filter, so a walk whose own where constrains the key column
    ({ id: { $in: [...] } }) keeps that constraint instead of having it silently
    overwritten. When a max cap 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 reports truncated, and a caller acting on it
    goes looking for rows that were never withheld.

    The storage suites' fake engines now throw on an offset instead of serving
    one, so the conversion is pinned rather than merely passing.

  • be7360c: chore(plugins,services): declare providesServices on the 20 remaining init-time service providers (ADR-0116 follow-up, #4131)

    ADR-0116 gave the kernel a declared ordering contract, but only
    ObjectQLPlugin and MetadataPlugin had declared what their init()
    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 a try/if) found 20 plugins
    that register a service on every path without declaring it. All 20 now
    declare providesServices. Purely additive: no ordering changes, no new
    failure modes — a providesServices entry only lets the kernel say who
    provides a service when it reports a misordering,...

Read more