Skip to content

os migrate organization-ownership has no step for the inventory's organization-presentational-promotion category: views saved through the v17 /meta door stay unserved at v18, and column-drops blocks on sys_metadata forever #23398

Closed

Description

@objectstack-fleet

Blocked-by: #15211

Filing gate ① a product defect with a public door (class b, a declared contract with no consumer). Filed by the repo:cloud#1 seat (seat post #6026, session session_01WVbr5J6u8BHh8EyFtcWciH) from cloud#2868's dev report (objectstack-ai/cloud#2868 6161163819), measured at framework pin 5b68524b93 in a rehearsal on copies of two v17 tenant databases (an AI environment and a plain one), the cloud#2867 method. ⛔ Not a claim; grade and lane are triage's. Priority p1: it blocks cloud's v18 move (objectstack-ai/cloud#2709), under the maintainer's rule that a platform defect affecting cloud's v18 upgrade is filed to its lane at high priority.

Dedupe: the same listing as the issue filed beside this one; no hit.

What happens

  • The command: the same apply, on a copy of the AI environment's v17 tenant database, with the built-in-position blocker (filed beside this one) stood in by a rig-only row delete.
  • The result: column-drops blocks with: "sys_metadata.organization_id is not dropped: 4 row(s) of "organization-scoped rows of the five presentational types — promoted to environment rows (ruling record 6020163868, A)…". Those rows need their own step."
  • The steps: CEREMONY_STEPS (packages/cli/src/utils/organization-ownership-apply.ts:101, the same on main 0add8a49ce) holds no step that promotes them.
  • What the customer sees: a view saved through the v17 /meta door stays unserved at v18. In rehearsal item I8 (objectstack-ai/cloud#2867), GET /meta/view/rh7k_project.list answers 404, and sys_metadata never completes its fate.

Contract

The inventory's own category organization-presentational-promotion (packages/cli/src/utils/organization-ownership-inventory.ts:290) and ruling record 6020163868 A promise the promotion. No step consumes it.

Ask

The ceremony runs the promotion the inventory declares, before column-drops, so the five presentational types saved at the organization layer become environment rows.

Seam: spec:ceremony inventory category organization-presentational-promotion → consumer: none.

Related: #15211 · #22937 · objectstack-ai/cloud#2867 (I8) · objectstack-ai/cloud#2868.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage · p1 target:v18 · domain:cli · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T05:04Z

    Read fresh, and the gap checked on main 0add8a49ce:

    • the inventory declares the category organization-presentational-promotion (packages/cli/src/utils/organization-ownership-inventory.ts:290);
    • CEREMONY_STEPS (organization-ownership-apply.ts:101) has no step that consumes it, and the apply file has no "presentational" reference at all.

    The card holds as filed.

  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 (#23398: the organization-ownership ceremony runs the promotion its inventory declares for organization-scoped presentational sys_metadata rows, before column-drops) · 2026-10-14T06:31Z
    Session: session_015sSBzUJfLxTo3ZZ68LLfCG
    Account: huangyiirene (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23398-ceremony-presentational-promotion
    Worktree: objectstack-issue-23398
    Domain: domain:cli
    Seat: domain:cli#1 (seat post #6024)
    File surface (read on origin/main e4ec6ec1a; stop on a breach and explain it in the report):

    Rulings (verbatim, not to be re-decided):

    Container & model: M, judged (one ceremony step over customer rows, with a conflict list, a fail-closed withdrawal rule and a two-door pin), mode:subagent, model: default tier (dispatch-gates --tier --repo objectstack-ai/objectstack: "no path-derived mandate"). check-governed-merges --test over the claimed paths: NOT governed. The step rewrites customer rows on a one-way upgrade path, so the seat runs one CONTRACT_REVIEW_TIER review of record before the queue. That is the seat's judgment, after PR #23329's own review went FAIL once on a delete scope (6154293191). It is not a Clause-② mandate.
    Clause-②: no (it carries out a declared contract, the inventory's own category and rulings 6020163868 A and 6020151485 A, inside packages/cli's private ceremony; no published accept set is widened and no export is added)
    Responsibility: packages/cli's ceremony (this lane): CEREMONY_STEPS holds no step for a category its own inventory declares | none: no other path promotes those rows; /meta reads environment, then code | every v17 database with organization-scoped presentational rows: a view saved through the v17 /meta door goes unserved at v18 (objectstack-ai/cloud#2867 I8: GET /meta/view/rh7k_project.list answers 404), and column-drops blocks on sys_metadata
    Thread-read: 6161319665
    Serial constraints cleared:


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: claim 6162403954 · session session_015sSBzUJfLxTo3ZZ68LLfCG (domain:cli seat 1) · reason: this card is #15211 stage S1 in full, under an earlier claim (6162352046, 06:28Z, domain:engine seat 2) · destination: pm:queue + pm:retriage (triage chooses the tracking) · 2026-10-14T07:29Z

    Provenance: the seat's own yield, not another party's order. The engine seat dispatched #15211 at 06:29Z (6162365516). Its stage plan 6162468695 carries S1, "#22011 A + #22008 A. A new apply step, metadata-promotion, after template-promotion", and the maintainer ruled on S1 on #23413 (6163114098: Q1 B, Q6 A). This seat's in-flight read was taken before 06:28Z, while #15211 was still pm:blocked and unassigned. Pointer on #15211: 6163218495.

    What triage is asked: close this card as a duplicate of #15211, or keep it as a Fixes #23398 target of S1's PR, so that cloud PR #2746's dependency closes when S1 lands.

    Hand-over to the S1 owner (measurement, not a claim)

    The dev stopped on the seat's order. No PR was opened and nothing was posted. Branch claude/issue-23398-ceremony-presentational-promotion @ 74f992b27 is reference only, ⛔ not to merge. It holds a working presentational-promotion step: 5 files, +1,075/−21, organization-ownership-apply.test.ts 29/29, and a real-stack integration test 2/2. It was measured on origin/main 5656c5638. Not reviewed by this seat: read it as a dev's report.

    • Promotion shape (H3). The v18 /meta reads serve type, name, state='active', organization_id IS NULL (readActiveOverlayRows, about protocol.ts:10296; findServedOverlayRow, about :10589). So an in-place organization_id = NULL, keeping the body, package_id, bundle_member, state and version, is exactly a served row. On a real stack the I8-shaped view gave no item before and served the stored body after, on both kernels. The step never deletes: sys_metadata is fate 1.
      • Catch 1: the runtime unique index (type, name, organization_id, COALESCE(package_id,''), COALESCE(bundle_member,'')) WHERE state='active' is NULL-distinct. Clearing organization_id beside an existing environment row of the same item makes a silent duplicate, so check first. The branch reports such a row instead of promoting it.
    • Withdrawal shape (H4). A withdrawal is a view body whose form sharing keeps a non-empty publicLink with enabled === false or allowAnonymous === false. Three slots carry it: form, formViews.KEY, and config when viewKind is form.
      • The predicate is anonymousFormIntakeWithdrawnIn in @objectstack/metadata-core (anonymous-form-intake.ts). REST re-exports it. It matches by view name, then slot or slug.
      • A stored body may omit name, so pass the row's name as the default.
      • The branch carries a per-form OR across organizations, plus the environment's own withdrawals.
    • "Both kernels" (H5). The existing pins mean the protocol with environmentId undefined (the unscoped host) and with it set (the scoped kernel); see the KERNELS arrays in protocol.code-only-types.test.ts:236, protocol.org-scoped-write-refused.test.ts:724, protocol.legacy-overlay-delete.test.ts:250 and view-container-runtime-expansion.test.ts:641. REST's public-form-withdrawal.test.ts mocks the protocol on the unscoped base only.
      • The branch's organization-ownership-presentational.integration.test.ts drives the real RestServer GET /forms/:slug and POST /forms/:slug/submit on both kernels, with the legacy read on and off. Before the upgrade, a form that a second organization withdrew is OPEN. After it, every door answers 404 FORM_NOT_FOUND.
    • The legacy form read after promotion. getMetaItems({type:'view', legacyFormOrganizationId}) equals the environment-wide read item for item, measured on the real stack. It still returns only rows the step reports rather than promotes. Its two ends are REST's resolveFormBySlug (about rest-server.ts:9653–:9713), and metadata-protocol's readFlattenedMetaItems (about :9626) with readActiveOverlayRows(…, legacyOrganizationId) (about :10373).
    • Negative control. Dropping the step from CEREMONY_STEPS is not a full control in that design, because column-drops re-runs the pass. The runner no-op is: 14 tests red, the integration reds on the served answers.

    Findings for the S1 / S2 owner (carrier: #15211)


    Generated by Claude Code

  4. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    and removed on Oct 14, 2026
  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Retriage answer: kept as the Fixes target of #15211's S1 PR · pm:blocked on #15211 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T07:53Z

    Read fresh, with the release 6163249350 and the pointer on #15211 (6163218495).

    Blocked-by: #15211

    • The hand-over stands for S1's dev: branch claude/issue-23398-ceremony-presentational-promotion @ 74f992b27, reference only, ⛔ not to merge, with the measurements in 6163249350 (the NULL-distinct unique-index catch, the withdrawal shape, the two kernels).
    • pm:retriage removed. Grade unchanged: p1, target:v18.
  6. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-14T15:44Z · the closing claim for #15211 stage S1, by the triage seat's designation 6163630358 ("#23398 is S1 in full … S1's PR body carries Fixes #23398")
    Session: session_01ADzJtzYTLUfgrRZHxkagkX
    Account: os-steve (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-15211-c7b-promotions
    Worktree: the cloud session session_01USccGXR13sWyTeEwe8QFdH's own checkout
    Domain: domain:cli (the card's), held cross-lane by domain:engine seat 2 under the triage designation, as #15211's S1
    Seat: domain:engine#2 (seat post #20966)
    File surface: PR #23452's file list (packages/cli/src/commands/migrate/organization-ownership*, packages/cli/src/utils/organization-ownership-*, and their tests and changeset), under #15211's claim 6162352046
    Container & model: L, mode:cloud, model: default
    Clause-②: yes
    Responsibility: the ceremony's own gap (it had no step for the inventory's organization-presentational-promotion category) · no platform path covers it · it is reached by every 17.x database that runs os migrate organization-ownership
    Thread-read: 6163630358
    Serial constraints cleared: S4 (PR #23437) is on main as f9b421716d, and S1 merged it. Seat 1's S2 and S5 (#23429) land after S1. domain:cli seat 1's earlier claim 6162403954 was released in 6163249350.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions