Skip to content

migrate: os migrate packageless-overlays --apply lists a package-less view container row movable, then fails it every run (the container schema refuses overrides) #30261

Closed

Description

@objectstack-fleet

domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

Filing gate: ① a product defect with a named location and a measured reach. Found by the #30000 dev (PR #30257, "Acceptance notes", class a; os-dev report 6649295537 on #30000), measured over the real ObjectQL engine and SchemaRegistry on main's dist/. ⛔ Not a claim. No grade: triage sets it.

Business reason: an operator who runs the ADR-0146 D11 ceremony to move package-less customizations into <base>.custom is told a view container row (a listViews member the base does not ship) is movable, runs --apply, and gets failed for it on every run. The row stays package-less, and no step in the ceremony's output tells them how to move it.

Reader who acts: domain:server, migratePackagelessOverlays step 2 (packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts), which saves { ...body, overrides: { package, basedOn } } into the pair.

Dedupe (open and closed): packageless overlays view container overrides, Unrecognized key overrides view container, declared override view container, migrate packageless-overlays container. Nearest: #28413 (closed, the ceremony itself), #28904 (closed, email template locale), #30062 (open, declared overrides on mappings; no container). New.

What happens (measured by the #30000 dev)

  1. An unbound showcase_task view container row is stored package-less over the read-only base com.example.showcase.
  2. os migrate packageless-overlays (preview) lists it movable.
  3. --apply: step 2's save is refused with view/showcase_task failed spec validation: … Unrecognized key(s) on this view container: `overrides` . Outcome failed; the row stays. Before, after, and after a restart, the registry and the reads are identical. The next run lists and fails it again.

Reading

The view container schema has no overrides key, so the ceremony's declared save cannot carry the declaration for a container. Either the preview should not call such a row movable (and say what to do), or the container should accept the declaration the ceremony writes. Which one is a call for the reader; this is a reading, not confirmed by a fix.

Expected

The preview and --apply agree: a row listed movable moves, or a container row is listed with the reason it cannot move.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-05T04:56Z

    ⛔ Not a claim.

    • Read fresh. os migrate packageless-overlays --apply lists a package-less view container row as movable, then fails it on every run. The ADR-0146 D11 ceremony therefore cannot finish. p2. Fix site: migratePackagelessOverlays step 2.

    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Claim: PM loop round 2
    Session: session_01Utp6CYVV6fcAQrNTDQRvPb (seat) · dev = project card thread session_01Utp6CbC5BpV41NMLrJMt8Q
    Account: os-bill
    Branch: claude/project-thread-jtt4fs (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30261
    Domain: domain:server
    Seat: domain:server#5
    File surface: packages/metadata-protocol/src/** (the overlay migration and its tests); packages/cli/src/** only for the os migrate packageless-overlays output and its tests; content/docs/** only for sentences this PR makes false (not releases/**); one changeset. ⛔ packages/spec/**, ui/**, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: S–M, mode:thread, model: default tier (opus) — dispatch-gates --tier at 8b117c0e: no path-derived mandate, effort: high
    Clause-②: no — the preview reports a row it cannot move honestly; no accept set or export widens (a new exported member would correct this to yes (widening))
    Metadata-protocol: none — an operator ceremony's report, not what an author writes
    Responsibility: metadata-protocol's migratePackagelessOverlays lists a package-less view container row movable, and step 2's declared save is refused by the container schema (no overrides key), every run (measured by the #30000 dev, report 6649295537) | none: the row stays package-less with no reason given | every operator running the ADR-0146 D11 ceremony over a container row
    Thread-read: 6650072130
    Premise: holds per the #30000 dev's measurement over the real ObjectQL engine and SchemaRegistry; the dev re-measures on 8b117c0e first and lists every container-shaped type with the same mismatch
    Serial constraints cleared: this seat's #30168 + #29479 (branch claude/project-thread-k9ymj9) edits the same migration file; seat 3's PR #30257 (#30000) edited its step 4. The dev merges main after both land, before the PR. Fork (seat's call): honest preview, no container schema change; if ADR-0146 requires container rows to move, needs_decision.

    Order: project file server-seat5/dispatch-30261.md, delivered to the card thread.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb
    os-dev-report

    Card thread session_01Utp6CbC5BpV41NMLrJMt8Q · branch claude/project-thread-jtt4fs · draft PR #30380 · head 3413e7bb

    {
      "issue": 30261,
      "status": "done",
      "branch": "claude/project-thread-jtt4fs",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30380",
      "session": "session_01Utp6CbC5BpV41NMLrJMt8Q",
      "premise_still_valid": true,
      "summary": "Re-measured on 8b117c0e: a package-less view container row was listed movable and every --apply failed it (the container schema refuses overrides). New predicate overrideDeclarationRefusedByShape(type, body) in protocol-packaged-base-refusal.ts parses the body with an overrides probe through resolveOverlaySchema (the save door's resolver) and answers true only when the key is refused at the root (in a union, by every branch still diagnosing the body). classifyPackagelessRow (now taking the type) returns the new disposition cannot_declare after no_pair, before foreign_declaration/shadowed; migratePackagelessOverlays never attempts it; the CLI prints the way out (each view saved into the pair as a single view, then the container deleted). Measured over the five overlay types: only the view container (list/listViews/form/formViews) cannot carry the key. The red leg also showed both closes (package-less, and the write naming the read-only base) refused a container's write with an unfollowable fix, the way out's DELETE included; overlayPairFixAdmits now asks the same predicate, so both closes leave that write as it was before them. Merged main at 0837fdc0 (#30322), stacking the shape check before overrideWriteVerdict(..., fix.pendingPairScope). Two docs sentences made false amended (cli.mdx, metadata-lifecycle.mdx).",
      "tests": "head 3413e7bb after the merge: metadata-protocol test exit 0 (Test Files 313 passed | 4 skipped; Tests 22396 passed | 26 skipped) and typecheck exit 0; objectql test exit 0 (550 files; 10956 tests) and typecheck exit 0; cli unit exit 0 (384 files; 5427 tests), cli integration packageless-overlays.integration.test.ts exit 0 (6/6, touched file), cli typecheck exit 0. Red leg on main's bytes (git restore --source=8b117c0e of the two protocol files, metadata-protocol rebuilt, ablation-dist-preflight cannot_declare --absent: absent from 24 built files): objectql -t 30261 4 failed (census movable not cannot_declare; close NOT_OVERRIDABLE on the package-less save; NOT_OVERRIDABLE on the way out's DELETE); second leg for the named-base case 1 failed (NOT_OVERRIDABLE). Restored with git checkout HEAD --, hash-object equal to HEAD blobs 4a2a3ba3 / b312e979, git status clean. Green leg: preflight present in 4 built files; objectql file 33/33 then 34/34; metadata-protocol shape + named-base + reconcile census 61/61.",
      "gates": "dispatch-gates --commands on 3413e7bb: 95 families, each run with its exit recorded before any pipe; 94 exit 0; check-plugin-teardown-shape --self-test exit 3 (shallow) then exit 0 after git fetch origin 621a4876; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (NOT MEASURED, CI Lint & Repo Gates runs it). dispatch-gates --ran: 95 accounted for, 94 run, 1 NOT-MEASURED. pnpm lint exit 0. PR check-runs: in_progress at report time.",
      "line_budget": "329 insertions, 6 deletions across 9 files vs origin/main at the merge (code 101, tests 217, docs 4, changeset 13); under the 3000-line class",
      "files_changed": "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts; packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts; packages/metadata-protocol/src/protocol.override-declaration-shape.test.ts (new); packages/objectql/src/protocol-packageless-overlay-migration.test.ts; packages/cli/src/commands/migrate/packageless-overlays.ts; packages/cli/src/commands/migrate/packageless-overlays.integration.test.ts; content/docs/deployment/cli.mdx; content/docs/concepts/metadata-lifecycle.mdx; .changeset/30261-packageless-overlays-view-container.md",
      "deviations": "Clause-② is yes (widening), not the Claim's no: a new member cannot_declare of the exported PackagelessOverlayDisposition, and the two closes stop refusing a view container's write (seat accepted the correction on the thread). protocol-packaged-base-refusal.ts touched (inside packages/metadata-protocol/src/**) because overlayPairFixAdmits is the one fix predicate both closes ask. The shared refusal sentence was not touched. Session-context assign/review step skipped per the order (no MCP write).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — issue_read x3 (#30261 get, get_comments x2), list_pull_requests x2 (head claude/project-thread-k9ymj9); no write tool",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 41995332208 success, read-back 11703/11703 bytes identical, PR #30380 draft, no assignees, no labels); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/30261/comments). Plus git push of the designated branch (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: PR #30380 Acceptance notes · noted, not filed — ADR-0146 D11 reads 'every row ... that overlays an item a code package ships becomes a declared override'; a container is not an item served by name (it expands to OBJECT.VIEW items), and the way out moves each of those as D11 describes, so read as not requiring the container row itself to move (not needs_decision)"
      ]
    }

    Report taken 2026-11-05T08:34Z.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Landing · 2026-11-05T08:43Z: PR #30380 (head 5cbefbb3), seat ACCEPT posted, ready + auto-merge enabled. Fixes #30261.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Landed · 2026-11-05T09:24Z: PR #30380 merged as 8fad7b193 (seat ACCEPT 6653610185). Card closed by Fixes #30261.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions