Skip to content

[Decision] the package boot seed set is never updated by enable/disable, so a flag-absent re-install durably reverts an operator later enable once #18752 lands — and the obvious producer fix re-opens #18058 F1 pins #18877

Description

@os-litant

Filed by the domain:spec execution seat, session_01LvwGppdonww4zGLWZo5rho, as the card its ruling (ii) on PR #18752 owes. Measured by the isolated at-tier delta review of that PR (record 5724766809, Finding 2). ⛔ Not a defect in #18752's diff — that PR faithfully implements decision batch #148 item 4 letter A. This card is the producer defect the remedy made durable.

The defect

SchemaRegistry.initialDisabledPackageIds is written by exactly one function, setInitialDisabledPackageIds (packages/objectql/src/registry.ts:1997), and read by the install path at :4172. Neither enablePackage (:4316) nor disablePackage (:4328) updates it.

⇒ once an id is in the boot seed set, every re-install within that boot re-lands it DISABLED, whatever the operator most recently did. An operator's PATCH /packages/:id/enable succeeds, is honoured in the registry, clears the record — and is then silently reverted by the next re-install.

Why it needs a card NOW, rather than having needed one all along

The quirk is pre-existing and, on the released door, memory-only: the install branch at the merge base calls setPackageDisabled 0 times, so the stale row never reached disk and a restart still honoured the operator.

PR #18752 correctly makes the durable write follow the ROW the door returned (the ruled remedy (a), which closes a real defect where the request's intent was persisted instead). The stale-seed row is one of the rows it now faithfully persists. ⇒ the quirk stops being memory-only and becomes durable when #18752 lands.

Measured, {row / registry / disk} after: operator disable in an earlier boot → this boot seeded and installed disabled → operator PATCH /packages/:id/enable (200, registry true, disk cleared) → flag-absent overwrite re-install (the SDK's install(m, {overwrite: true})):

handler re-install reading restart
merge base (released) false / false / false enabled — the operator's enable is honoured
#18752 pre-delta false / false / false enabled
#18752 at head false / false / true disabled — the operator's enable is lost

The row is false in all three; only the durable half moves. ⇒ a flag-absent install overrides the operator's most recent persisted lifecycle action — the dual of the behaviour the seat refused as remedy (b) on #18058.

Reachable in the composed runtime without anything exotic: disable → restart → enable in Studio → SDK upgrade with overwrite.

⚠️ Why this is a ruling and not a repair — the mechanical reason

The obvious fix is at the producer: enablePackage deletes from the seed set, disablePackage adds to it. The review measured that this flips PR #18752's F1 arm red. The pins establishing 「re-installing with the flag ABSENT clears the durable disable」 — which are the ruled remedy's own acceptance criteria — would fail.

⇒ the two behaviours are in genuine tension and cannot both be pinned:

  • F1's rule: a flag-absent re-install should clear a disable recorded earlier in this boot.
  • This card's rule: a flag-absent re-install should NOT override an operator's later explicit enable.

⭐ No amount of further measurement decides which wins — they are the same request shape with different histories, and the door cannot see the history the seed set forgot. That is a caliber question.

os-decision-facets

  • ① 项目长远合理性 — a lifecycle record whose most recent explicit write can be silently reverted by an unrelated operation is not a record. The long-term shape is that the seed set is derived state that tracks the live registry, not a boot-time snapshot that outlives the truth. But that shape is exactly what re-opens F1, so 「correct」 here costs a pinned behaviour.
  • ② 实际业务拉动 — ⛔ zero today and that is measured, not assumed: on the released door the quirk never reaches disk. The pull begins only when fix(spec,runtime): bind the package-install contract to the door that serves, and honour enableOnInstall #18752 lands, which is what makes this a sequencing question as much as a design one.
  • ③ 防 AI 犯错 — decisive and cuts one way: the failure is silent and durable. An operator (or an agent) enables a package, sees 200, sees the registry agree, and a later routine upgrade reverts it across a restart with no error anywhere. ⚠️ But note the symmetric risk: whichever rule is chosen, the OTHER one becomes the silent surprise, so this axis argues for choosing explicitly and pinning both directions, ⛔ not for a particular letter.
  • ④ 创业阶段不扩散 — the producer fix is small in lines (two set mutations) but its blast radius is every consumer of the install door's disable semantics plus [finding] PackageInstallRequestSchema is a published, route-bound request contract that no layer parses — the install door is declared and enforced nowhere (ADR-0049) #18058's pins. ⛔ Not a drive-by.

The question, in one line: should the boot seed set become derived state that enablePackage / disablePackage keep current — accepting that #18058's F1 pins are re-opened and must be re-ruled — or should it stay a boot snapshot, accepting that a flag-absent re-install durably reverts an operator's later enable?

⛔ The filing seat does not grade this: it is the seat that ruled remedy (a) on #18058, so the letter that vindicates its own ruling is the one it would be grading. Conflict declared in the open.

Refs and fences

Dedupe words: initialDisabledPackageIds stale seed, enablePackage does not update seed set, re-install reverts operator enable, boot seed snapshot vs derived state, package disable durable override.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions