Skip to content

fix(engine-core): propagate package disable to metadata listings and the data plane (#7557) - #7700

Merged
os-help merged 2 commits into
mainfrom
claude/issue-7557-package-disable-uninstall-propagation
Aug 11, 2026
Merged

fix(engine-core): propagate package disable to metadata listings and the data plane (#7557)#7700
os-help merged 2 commits into
mainfrom
claude/issue-7557-package-disable-uninstall-propagation

Conversation

@os-help

@os-help os-help commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Part of #7557 — ships half (A) in full plus the envelope half of (B). The persistence half of (B) is located with evidence and reported for transfer, not patched from the consumer side (see "Half (B): what shipped and what is transferred").

Verification record

Every premise re-measured against origin/main (5db0dca at branch point) on a real running server (pnpm dev --fresh, showcase app), not from the working tree.

Premise (A) — CONFIRMED, and the asymmetry located

With a runtime-installed package holding two package-bound sys_metadata objects and three rows:

Surface before disable disabled (pre-fix)
GET /api/v1/data/reprob_a 200, rows=3 200, rows=3 ← served anyway
GET /api/v1/meta/objects (from pkg) 2 2 ← still listed
nav / views present correctly gone

The PM's pointer to registry.ts:2157 (isPackageDisabled) and the disable-hiding read at :2139 is accurate, and the asymmetry is one line above the filter: listItems returns early for object/objects at registry.ts:2128-2131 (return this.getAllObjects(packageId)) before ever reaching its own disable filter at :2145. The protocol-level filter then exempts the same two types explicitly (protocol.ts:4330-4334).

Only two call sites consult the predicate repo-wide: registry.ts:2145 and protocol.ts:4336. That is the whole enforcement surface.

Premise (B) — the envelope producer is NOT where the card expected

The card pointed at packages/rest/src/package-routes.ts:376. Falsified by measurement: that route already handles the failure correctly — it answers 400 PACKAGE_DELETE_PARTIAL when result.failedCount !== 0 (package-routes.ts:381-390) and 400 PACKAGE_DELETE_FAILED otherwise. It never produces a persisted key at all.

The real producer is the dispatcher twin, packages/runtime/src/domains/packages.ts — reproduced live, byte-for-byte the shape in the issue:

DELETE /api/v1/packages/com.repro.b  ->  HTTP 200
{"success":true,"data":{"success":true,"registryRemoved":true,
  "persisted":{"success":false,"deletedCount":0,"failedCount":0,...}}}

…with the package-bound sys_metadata rows still present afterwards. DELETE /packages/:id has two doors (this dispatcher and the direct-mount REST registrar, which shadows it only when a package service is registered); they disagreed, and the dispatcher is the one that was lying. That door is packages/runtime — engine-core territory, in lane.

Half (A): the fix

The two skips were deliberate and both gave the same reason — filtering objects "would break data queries that depend on their schema". That conflated two classes of reader, and this PR separates them explicitly:

  • Resolution readers keep serving. registry.getObject and registry.listItems('object') still return a disabled package's objects. That is load-bearing, not caution: protocol.ts:3119 resolves the runtime authoring gate's object universe through listItems('object'), so blanking it would make unrelated authoring fail reference validation. Migrations and cross-package references resolve through getObject. Untouched.
  • API readers now stop. getMetaItems drops the object/objects exemption. package is still never filtered — filtering it would make disable irreversible, since the Packages page is the only surface that can re-enable.

Nothing in the repo reads getMetaItems({type:'object'}) internally, so the exemption bought no safety and cost the enforcement.

The "refuse loudly vs hide" choice — settled by measurement, not escalated

Recorded here per the three-axis discipline; it did not diverge on product semantics, so no needs_decision.

  • Consistency: the closest existing sibling is OBJECT_API_DISABLED (enable.apiEnabled: false) → 404 with a distinct code (rest-server.ts:1602-1610). "This object exists but is switched off" already had a house answer; this follows it rather than inventing a second one. It also keeps the data plane consistent with the listing, which now drops the object too — the object is absent everywhere on the API.
  • AI-error resistance: a bare OBJECT_NOT_FOUND sends a caller — an AI agent especially — hunting for a typo or re-creating an object that is merely switched off. The distinct code names the cause and therefore the fix. This is why "hide silently" was rejected even though the status is the same.
404  {"error":"Object 'reprob_a' belongs to a disabled package and is not being served.
              Re-enable the package to restore access.",
      "code":"OBJECT_PACKAGE_DISABLED","object":"reprob_a"}

Verified on the wire for the list, single-record and write paths. Registered in the ADR-0112 ledger under @objectstack/metadata-protocol. Note the data-plane envelope keeps code as a sibling of error — that is the existing shape OBJECT_NOT_FOUND uses in mapDataError; flattening it to error.code per ADR-0112 D5 is pre-existing and out of scope here.

The gate lands in assertObjectRegistered — the single seam every findData/getData entry point already funnels through (protocol.ts:6252, :6730, :6794, :6802, :6848, :6906, :7004), so one gate covers every data entry point. It is optional-called (typeof registry.isObjectPackageDisabled === 'function') because registry doubles across the suites implement isPackageDisabled but not this.

SchemaRegistry.isObjectPackageDisabled resolves names through the same private resolveObjectKey the read path uses — #6808's lesson applied to enforcement, so the gate and the read cannot disagree about which contributor entry a bare name addresses. It asks about the owner, so an overlay from a disabled package cannot take the object it decorates offline.

Live after-state

Surface before disabled after re-enable
GET /data/reprob_a 200 rows=3 404 OBJECT_PACKAGE_DISABLED 200 rows=3
/meta/objects from pkg 2 0 2
sys_metadata rows 2 2 2

The card's honest negative is preserved and pinned: disable destroys no data — rows and metadata identical before, during and after, and re-enable restores service completely.

Half (B): what shipped and what is transferred

Shipped (in lane): the dispatcher door now answers 400 PACKAGE_DELETE_PARTIAL on per-item failures, carrying the failed items and the uninstall cleanup outcomes (a failed permission revocation is a ghost grant — it must survive the failure path). The rule is copied deliberately from the REST door of the same route so the two doors stop disagreeing, including its carve-out: zero metadata rows is still a successful uninstall (a runtime-registered package that never published metadata has nothing in sys_metadata), so the predicate is failedCount > 0, not !persisted.success. Checked before the not-found test, because an all-rows-failed uninstall also has deletedCount === 0 and answering 404 for rows that are demonstrably present and stuck is the same lie one layer over.

Transferred (out of lane) — domain:metadata. The persistence defect is separate and untouched: protocol.deletePackage (protocol.ts:11486-11488) runs

const where = { package_id: request.packageId };
if (request.organizationId) where.organization_id = request.organizationId;
const rows = await this.engine.find('sys_metadata', { where });

and found zero rows while three rows with exactly that package_id demonstrably existed — the same predicate returns 3 through the data plane (GET /data/sys_metadata?filters=[["package_id","=","com.repro.b"]] → 3 records). So the where clause is not intrinsically wrong; the scoping the protocol's engine applies to it is. The strongest candidate is the strict organization_id equality against rows stored env-wide (organization_id IS NULL) — the same defect class this package already fixed once, in sys-metadata-repository.ts:887-901, where the identical strict equality "silently dropped" env-wide drafts and was replaced by an $or over [{organization_id: oid}, {organization_id: null}] (the "orphaned draft" bug). Patching that from here would be papering over the producer, so it is reported rather than fixed.

Note this half is invisible to the envelope fix by construction: it yields failedCount: 0, so it legitimately still reads as success at the dispatcher. It stops being a lie only once the producer stops missing rows.

Open finding #7221 (unregisterPackage removes only object contributors) was read for shape; the measured fix path does not run through it, so it is untouched.

Tests

One table walks every reader rather than one test per surface, since the bug is a divergence between readers of a shared predicate. packages/objectql/src/package-disable-enforcement.test.ts enumerates all six readers with the class each belongs to, and asserts the whole table in a single toEqual — deliberately not expect() inside the loop, which would throw on the first failing reader and hide the rest, in a file whose purpose is showing which readers diverged. Adding a reader means adding a row and declaring its class. Real SchemaRegistry + real protocol over an in-memory sys_metadata engine; a registry double would be measuring the double.

The refusal is asserted on code + status per ADR-0112, never "it threw" — plus a control that a genuinely absent object still answers OBJECT_NOT_FOUND, so the two cases stay distinguishable.

Reverse verification — direction predicted before running, both halves independently

reverted result
getMetaItems object exemption restored exactly the two /meta object rows red; data-plane and both resolution rows green
isObjectPackageDisabled branch removed from assertObjectRegistered exactly the data-plane row red + the loud-code test; listing rows green
failedCount > 0 branch removed the 3 failure cases red (200/404 where 400 required); the 3 success cases green

The success cases cannot distinguish the versions on their own — that asymmetry is intended: they exist to stop the fix over-reaching into "any non-empty failed array 400s", which would break the never-published-metadata uninstall.

Gates

gate result
pnpm check:durability-log-level
pnpm check:engine-double-contract ✅ 150 pinned
node scripts/check-engine-split-ratio.mjs ✅ 100.0%
pnpm check:nul-bytes ✅ 7092 files
pnpm check:error-code-casing ✅ (new code added)
pnpm build (closure) ✅ 71/71
typecheck (spec, objectql, runtime)
@objectstack/objectql ✅ 3230
@objectstack/metadata-protocol ✅ 1062
@objectstack/runtime ✅ 2022
@objectstack/spec ✅ 9867
@objectstack/rest ✅ 1403

Changeset included (user-visible behaviour on both halves).


Generated by Claude Code

…the data plane (#7557)

Half (A) of #7557: a package at `status: 'disabled'` had its nav and views
correctly dropped while `GET /api/v1/data/<object>` still answered 200 with
every row and `GET /meta/objects` still listed the object. Reproduced on a
real server before the change, over two disable/enable cycles.

Both skips were deliberate and gave the same reason — filtering objects
"would break data queries that depend on their schema". That conflated two
classes of reader, which are now separated:

  * RESOLUTION readers keep serving. `registry.getObject` and
    `registry.listItems('object')` still return a disabled package's objects;
    migrations, cross-package references and the runtime authoring gate's
    object universe all resolve through them. Disable stays reversible and
    still destroys no data.

  * API readers now stop. `getMetaItems` drops the `object`/`objects`
    exemption (`package` is still never filtered, or a disable could never be
    undone), and the data plane refuses in `assertObjectRegistered` — the one
    gate every findData/getData entry point funnels through.

The data-plane refusal is loud rather than silent: a new
`OBJECT_PACKAGE_DISABLED` / 404 naming the cause and the remedy, instead of a
bare `OBJECT_NOT_FOUND` that sends a caller hunting for a typo. The 404 status
matches the closest sibling switch, `OBJECT_API_DISABLED`. Registered in the
ADR-0112 ledger.

`SchemaRegistry.isObjectPackageDisabled` resolves names through the same
`resolveObjectKey` the read path uses, so the gate and the read cannot
disagree about which contributor entry a bare name addresses (#6808's lesson).

Half (B), envelope only: `DELETE /packages/:id` on the dispatcher door stated
`success: true` unconditionally and forwarded the protocol's own
`{ success: false, deletedCount: 0 }` underneath it. Per-item failures now
answer 400 `PACKAGE_DELETE_PARTIAL` with the failed items and the uninstall
cleanup outcomes, matching the direct-mount REST door of the same route —
including its carve-out that zero metadata rows is still a successful
uninstall. The remaining half of (B), a persistence defect where
`deletePackage` finds zero rows while package-bound rows exist, is reported
for transfer rather than patched from the consumer side.

Tests: one table-driven test walks every reader of the disable predicate and
states which class each belongs to, so a new reader that forgets to consult it
fails there rather than in one test per surface. Both halves reverse-verified
independently.
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 11, 2026 11:07am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/metadata-protocol, @objectstack/objectql, @objectstack/runtime, @objectstack/spec.

113 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata-protocol, @objectstack/objectql, @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol, @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/objectql, packages/runtime, packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/metadata-protocol, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/objectql, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/objectql, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @objectstack/spec)

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

`OBJECT_PACKAGE_DISABLED` joins the ADR-0112 ledger, so the generated
`content/docs/references/` pages move with it: the ledger page gains the
entry, and every page rendering the ErrorCode union bumps its
"+259 more" count to "+260". Regenerated with
`gen:schema && gen:docs`, never hand-edited.

Release-owned `content/docs/releases/` is untouched.

os-help commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator Author

CI status on c6b1684 — one real failure fixed, two infrastructure failures that never reached this diff.

Fixed and pushed (c6b1684). TypeScript Type Check was a genuine miss of mine: check:docs found content/docs/references/ out of date, because adding OBJECT_PACKAGE_DISABLED to the ADR-0112 ledger changes generated output. Regenerated with gen:schema && gen:docs; the whole diff is the new ledger entry plus the ErrorCode union count moving +259 more+260 on every page that renders it. check:docs passes locally. Release-owned content/docs/releases/ untouched.

Not mine — runner network/TLS, both before any repo code executes. Not retried yet: GitHub refuses rerun-failed-jobs while the workflow is still running (403 This workflow is already running). I'll re-run them once the run settles.

  • filter (run 31484974048) — dorny/paths-filter died calling the GitHub API to list changed files: self-signed certificate; if the root CA is installed locally, try running Node.js with --use-system-ca. The immediately preceding PR run passed the same job in 11s. Superseded anyway by the push.

  • Dogfood Regression Gate (3/3) (run 31485193978) — died at the pnpm --version step, before install, before build, before any test:

    ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-10.31.0.tgz
    AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
      assert(!this.paused)
        at Parser.finish (node:internal/deps/undici/undici:6157:9)
        at TLSSocket.<anonymous> (node:internal/deps/undici/undici:6491:36)
    

    A Node/undici internal assertion while corepack fetched pnpm over TLS. Shards 1/3 and 2/3 of the same gate were unaffected.

For the record, the suites this change actually touches were run locally and are green: objectql 3230, metadata-protocol 1062, runtime 2022, spec 9867, rest 1403, plus pnpm build 71/71 and the card's gates.


Generated by Claude Code

os-help commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator Author

Ready + queued by the engine-core seat (session_01PemxJmMZT9JphrsNx886Ce) at 11:5xZ. 26/26 checks completed/success — the Dogfood Regression Gate (3/3) red was the known Corepack/undici transient (died in 13s at pnpm --version, before the test step; identical signature to #7285's) and cleared on a plain re-run, which is what a transient does. Queue entry verified by the gh-readonly-queue/main/pr-7700-* branch, not by the auto-merge field (notes-21: the enable call returns the empty-field form on an all-green PR; a disable/enable flip was needed here as well).

Review verdict and follow-up bookkeeping are on the issue: #7557. On merge, that card goes pm:blocked behind #7705 (the transferred persistence half) rather than closing — hence the Part of first line.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants