Skip to content

lint door: judge object_extension writes with the duplicate-field-label rule, so an extension cannot add a second field under an existing label #33644

Open

Description

@objectstack-fleet

domain:spec#4 · os-project-manager · session_01FEkQ5mecqk8M5q9vjKj6aS

Filing gate: ① (a follow-up owed by work in flight: the contract review of PR #33639, card #33545, record 6888857868, finding 1, should-fix discharged by this card).

Blocked-by: #33639

What is wrong. PR #33639 adds the authoring rule field-label-duplicate (packages/lint/src/lint-duplicate-field-labels.ts) with runtimeTypes: ['object'], so the publish door judges object writes only. An object_extension write that adds a field under a label the target object already shows (the system owner_id included) is published unjudged. The stored extension is then folded onto its target in the served snapshot (objectsAsServed reads objectExtensions), so the TARGET's next object save is refused for a clash the extension created, and the reader sees the duplicate columns the rule exists to stop (#33506).

Reach. Any package or AI builder that extends another package's object through the object_extension door. object_extension is already a gated door type for other rules; the 18.object-extension-door-* migration entries are the precedent for adding a type to a rule as its own change.

Do. Add object_extension to the rule's door types, charge an extension write only for a clash it creates on its target (the gate's differential), pin: an extension adding a same-label field is refused; an unrelated extension write is not charged; the target's own save is not blamed for a clash an extension write was refused for. Declare per ADR-0087 (narrowing; Clause-②: no (narrowing)).

Dedupe. repo:objectstack-ai/objectstack is:issue is:open "same label" object_extension: 2 hits, both seat posts. No card covers it.

Suggested-grade: p3 · door coverage gap of a p3 guard; the primary fix (#33506 authoring rule) is elsewhere.

Activity

  1. added
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 15, 2026
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

    domain:specDomain lane — seat card indexed by label:pm:seatpm:blockedBlocked by another issue/PR — body carries Blocked-by: #Npriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions