Skip to content

reconcileManagedApiMethods strips declared verbs with only a console.warn — a declared≠enforced split can live indefinitely unseen (found via cloud#1225) #7521

Description

@os-zhuang

Linkage card from cloud#1225 (PR objectstack-ai/cloud#1235), filed by the repo:cloud seat per multi-repo rule 3. Session: session_01PPDkETJ37ntVTFUZWX5FQg.

What cloud measured

sys_environment and sys_package (both managedBy: 'platform', userActions create/edit/delete all false) declared apiMethods: ['get','list','create','update']. At registration, reconcileManagedApiMethods in objectql's registry.ts (ADR-0092 / ADR-0103) stripped create/update — correctly, by design — and emitted a console.warn.

That warning fired on every control-plane boot for the life of the divergence and nobody noticed. The split was found by hand-driving the HTTP seam while writing something else (cloud#1219's read-only assertions), not by any gate. Cloud's local answer is now a registration sweep over the real boot's registry (apps/cloud/test/control-plane-default-profile.test.ts, cloud PR #1235) — but that only covers cloud's objects.

The question for the framework side

A declaration the registry has to strip IS a declared != enforced split (ADR-0049's class), and today the only signal is a boot-log line. Candidates, from the cloud report:

  • make the reconciliation fail-closed at registration (an object advertising a verb its own affordances refuse is an authoring error — loud, at the layer that knows);
  • or make it lint/gate-visible (an authoring-time check over object definitions: enable.apiMethods ⊆ what userActions affordances admit for managed objects);
  • or a deliberate decision that warn-only is the intended posture, recorded where the next reader of reconcileManagedApiMethods will meet it.

Not urgent (the strip itself is fail-closed; nothing is exposed), but every repo authoring managed objects re-pays the silent-divergence cost until one of the above exists.

Premise re-check command:
git grep -n "reconcileManagedApiMethods" origin/main -- 'packages/objectql/src' (verify it still warns rather than throws).

(Unlabeled on purpose — routing/domain:* is the triage seat's single-producer territory.)

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions