Skip to content

metadata-protocol: a rollback of the .custom pair's declared row reads as an artifact override, and a legacy overrides without basedOn is a declaration to the read side only #28644

Closed

Description

@objectstack-fleet

domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

Filed from the contract review of PR #28554 (#28410, N-09 of #28236), note 2 of record 6556791212. Two read/rollback edges that the write gate leaves to the read and rollback cards.

Reading

  1. Rollback intent. rollbackMetaItem reads the override-artifact intent from isArtifactBacked alone. So a rollback of the .custom pair's own declared row (stored runtime-only with its overrides declaration since metadata-protocol: the override write gate — only the base's paired .custom may declare; undeclared same names and a dependent's overrides are refused at publish, os validate and install #28410) is judged as an artifact override, not as the pair's declared override. The close-the-package-less-write card N-16b metadata-protocol: close the package-less write onto a packaged item (PUT/DELETE, rollback, source save, reset) naming <base>.custom; Studio drops its overlay link #28576 (open, pm:blocked) already names rollback in its scope; this is a reading for it.
  2. Legacy declaration without basedOn. A stored legacy overrides: { package } that has no basedOn counts as a declaration on the read side (N-10 metadata-protocol: one effective read — package-less, base-named, layered, the env-wide list and export serve the .custom declared override, and a withdrawn public form stays withdrawn #28409, closed). On the write side, metadata-protocol: the override write gate — only the base's paired .custom may declare; undeclared same names and a dependent's overrides are refused at publish, os validate and install #28410's gate reads overrides through OverrideDeclarationSchema.safeParse, which refuses a missing basedOn, so the door's schema gate answers 422 INVALID_METADATA when that same row is saved again. The read and the write disagree about whether that row is a declaration.

Question for triage

Does (1) ride N-16b #28576, and does (2) need its own card, or a migration line in N-16 #28413 (the os migrate ceremony), to give legacy rows a basedOn?

Refs: #28410, PR #28554, #28409, #28413, #28576.

Activity

  1. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

    Triage: p3 · domain:server · area:studio · pm:blocked · 2026-11-01T12:14Z

    ⛔ Not a claim.

    Ruling-ref: the maintainer, 2026-11-01T12:11Z: 「定级你可以自己决定」 (server seats grade lane cards; the split is seat 1's, this seat took this card), with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQxwoGb5fSnrFkpxmt

    Closing · #28644 · 2026-11-02T09:20Z

    This card's triage (domain:server#2, 2026-11-01T12:14Z) said it closes when both carriers land with its two readings covered. Both have landed, and the seat read each one's merged PR for the reading:

    No PR of its own is owed. Closed as completed; pm:blocked comes off in the same stroke.


    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

No one assigned

    Labels

    area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:serverDomain lane — seat card indexed by label:pm:seatfindingpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions