Skip to content

metadata-protocol: an object_extension item's refusal sentences, row comment and folded target spelling misfit the item door #28834

Closed

Description

@objectstack-fleet

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

Filing gate: ① should-fix findings 1, 3 and 4 of the PR #28811 contract review (card #28574, record 6565271420, triage#1), carried to their own card by this seat. Filed by domain:server seat 1. ⛔ Not a claim. Graded by this seat p3 under 「定级你可以自己决定」 (Leehom, 2026-11-01): two misfitting refusal sentences, one stale code comment and one legacy-only phantom entry. No wrong write on a current store.

Reach: an author saving an object_extension item through /api/v1/meta (the door PR #28811 opens), into a writable package.

What happens (read by the review at head d05c1863)

  1. Refusal sentences (finding 1). judgeOverrideWrite (packages/metadata-protocol/src/protocol-packaged-base-refusal.ts):
    • It refuses a body that carries overrides on this type as declared_type_not_overridable, with the D6 text "create your own object_extension under a new name". An extension has no new name: its name is its target.
    • The declared_object refusal points at the manifest entry only, not at the item door.
  2. Stale comment (finding 3). The object_extension registry row's comment says the artifact loader stores extensions under this type. It does not. The PR feat(metadata-protocol,objectql): an object extension is an authorable item of a writable package, saved, published and exported through the existing doors (#28574) #28811 body's probe also shows objects: [] where the code omits the key.
  3. Phantom entry (finding 4). A short target name that getObject folds to a legacy ns__name key passes the gate, and registerObject then opens a second entry under the short name. computeFQN is the identity today, so only legacy keys reach this.

Wanted

  1. Both sentences fit an object_extension write. The non-overridable sentence says to edit the extension itself (it has no override channel), and declared_object names the item door beside the manifest entry. No new error code; the codes stay.
  2. The registry row comment states what the loader actually does. If the comment is in packages/spec/**, this item goes to the spec seat.
  3. The save gate pins extend to the key getObject resolved, and refuses a spelling that differs. Measure first whether any stored or shipped row reaches this.

Dedupe: searched declared_type_not_overridable object_extension, object_extension extend getObject fold. New.

Links back: #28574, PR #28811 (record 6565271420), #28236 (epic), ADR-0146 D10.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 1, 2026
  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Claim: PM loop round 1 · card thread · 2026-11-01T23:34Z
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC (the seat); the card thread is session_01FEkQ5kkSYvKhs52WGfTj3c (the #28574 card thread, continuing)
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-i6gtvk (the card thread's harness-pinned branch, restarted from main after PR #28811; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#1
    Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z); seat 1 filed and graded the card p3 from the PR #28811 review.
    File surface: judgeOverrideWrite's two sentences in packages/metadata-protocol/src/protocol-packaged-base-refusal.ts, and the object_extension save/publish gate (target spelling check); their tests and a changeset. ⛔ Wanted 2 (the registry row comment in packages/spec/**) is left for the spec seat. ⛔ No change to the manifest loop or computeFQN.
    Container & model: S, mode:thread, model and effort as the thread was opened
    Clause-②: no (narrowing) (expected: the spelling check refuses an admitted save; the dev measures it)
    Metadata-protocol: narrowed (expected, if the spelling check lands)
    Responsibility: the code is the object_extension item door of @objectstack/metadata-protocol · the platform path is a refusal sentence that misdirects and a folded target spelling that opens a phantom entry · reached by an author saving an object_extension through /api/v1/meta
    Thread-read: none
    Premise: holds; #28574 (PR #28811, 0c1829a28a) is on main
    Serial constraints cleared: #28835 (two extenders declaring one field, unclaimed) touches the objectql fold; #28809 (PR #28836, seat 1) touches the field-patch fold in registry.ts. Neither touches this surface. Merge origin/main once if one lands first.
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

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

    os-dev-report
    {
    "issue": 28834,
    "status": "done",
    "branch": "claude/project-thread-i6gtvk",
    "pr": "#28853",
    "head": "461552acedd0d0070debccf845de1350d307af6b",
    "session": "session_01FEkQ5kkSYvKhs52WGfTj3c",
    "premise_still_valid": true,
    "summary": "Wanted 1 and 3 landed; Wanted 2 (the object_extension registry row comment in packages/spec/src/kernel/metadata-plugin.zod.ts) is left for the spec seat per ruling 3, untouched. judgeOverrideWrite: a new object_extension branch ahead of the D6 sentence says an extension takes no override and is stored under its target's name, so edit the extension itself (rule declared_type_not_overridable, 403 NOT_OVERRIDABLE unchanged); declared_object now names the object_extension item door /api/v1/meta/object_extension beside the manifest's objectExtensions entry. Every other type's sentence is byte-identical (permission control). objectExtensionItemRefusal step 4 refuses, VALIDATION_ERROR 400 on extend, an extend that getObject resolves to an object whose name (its registered key, computeFQN is identity) differs; the sentence names both spellings. Asked by save, per-item publish and restore (the existing gate). No new rule, rule member, error code or gate; no packages/spec, engine.ts manifest loop or computeFQN change. Measured first: non-test manifests extend sys_sso_provider (plugin-auth) and showcase_account (showcase), both their own keys; no non-test object named ns__name in objectstack or hotcrm; no deployed store readable; boot/read hydration never runs this gate, so a stored row of that spelling is not refused at rest. Stop condition not met.",
    "tests": "New packages/runtime/src/domains/meta-object-extension-item-door-fit.test.ts, 5 tests over the real SqlDriver + ObjectQL + protocol rig: object_extension sentence exact; object sentence exact; permission D6 sentence byte-for-byte (control); short name 'case' folded to legacy key crm__case refused in draft and publish mode, issue path extend, no row, no contributor under 'case'; crm__case admitted and published with the pair as extend contributor (control). Head 461552a: 5/5 (24/24 with the #28574 file). Base 0c1829a (both production files restored, test kept, metadata-protocol rebuilt without the turbo cache; a first base run read the turbo-restored HEAD dist and was discarded): 3 red, 2 green (the two controls). Ablations via ablation-replace.mjs from committed HEAD, package rebuilt without cache, marker counted in dist: sentence branch (ABL_A) 1 red = the extension sentence; item door in declared_object (ABL_B) 1 red = the object sentence (first attempt removed the constant and the DTS build refused the unused local, exit 9, nothing measured, re-run with the constant kept); spelling check (ABL_C) 1 red = the folded-spelling test. Each restored blob == HEAD, git diff HEAD empty; final rebuild 0 markers in dist, 24/24. Suites at head under the lock: metadata-protocol 22090 passed / 26 skipped (297 files), objectql 10009 (522), runtime 9261 / 19 skipped (514). pnpm --filter typecheck: metadata-protocol exit 0; runtime exit 0 incl. check:test-typecheck (first run exit 1 TS2307 on the turso-remote kernel test because driver-turso had no dist in the fresh worktree; built it, exit 0, ledger unchanged). eslint --no-inline-config on the 3 changed TS files exit 0.",
    "gates": "dispatch-gates --commands at head after a full pnpm build: 61 families, each run with exit captured before any pipe, all 61 exit 0; --ran: 61 run, 0 NOT-MEASURED. Changeset/ADR-0087/citation families re-run after the final amend: exit 0. check:type-check-debt exit 0. CI check-runs: not waited on (the seat holds PR events).",
    "dogfood_battery": "461552ac · os-verify-lock VERDICT command-exit 1 (held 1435s) · Test Files 4 failed / 376 passed / 3 skipped (383) · Tests 4 failed / 3115 passed / 28 skipped (3147). Failures: audit-key-material (rewritten 4 vs 8), audit-mail-bodies (2 vs 4), identity-mail-read-gate (sys_activity mirror rows 0), upgrade-18x-harness (no such table: sys_activity__r20261019). The same 4 files on base 0c1829a with metadata-protocol rebuilt at base: the same 4 red, 45 passed. Pre-existing on main, tracked by #28849; not this diff.",
    "mcp_calls": "2 — reads only: issue_read 2 (#28834 get and comments); no MCP write. Plus 5 gh api search/issues reads for dedupe of the dogfood reds",
    "api_writes": "2 — relay fleet-write pr_create #28853 (draft, no labels, no assignees; read-back identical, 10231 bytes); this os-dev-report on #28834 via post-stamped. git push to claude/project-thread-i6gtvk (fresh branch, plain push) is not a REST write.",
    "declarations": "Clause-②: no (narrowing); Metadata-protocol: narrowed; Skills-docs: none (reason in the PR body); changeset minor on @objectstack/metadata-protocol with the ADR-0087 not-required (no-migration-prescription) marker and BREAKING banner; PR title carries ! ; body opens Fixes #28834 (Wanted 1 and 3 landed, Wanted 2 is the spec seat item named in the body).",
    "open_questions": [
    {
    "question": "Wanted 2 (registry row comment in packages/spec) and the merged PR #28811 body probe line objects: [] (the export omits the key) remain. Does the card stay open for the spec seat, or should Fixes be narrowed to Refs before landing?",
    "options": [
    "A — keep Fixes; seat 1 carries Wanted 2 to the spec seat as its own small card",
    "B — rewrite the first line to Refs #28834 so the card stays open until the spec seat lands the comment"
    ],
    "recommendation": "A, because the order said Fixes only if Wanted 1 and 3 land, and both did; the comment is a spec-seat item by ruling 3"
    }
    ],
    "out_of_scope_findings": [
    "class: CI red on main · reach: dogfood 18.0-upgrade battery · four sys_activity reshaping dogfoods red on main 0c1829a · dedupe words: sys_activity__r20261019, upgrade-18x-harness · carrier: #28849 (open), not refiled"
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Landing record · #28834 · PR #28853

    PR #28853 merged by the merge queue as 45efba2a5b on main (Fixes #28834; contract review PASS 6567063545 at CONTRACT_REVIEW_TIER, narrowing face; ACCEPT 6567083032). The card closed on the merge.

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28853-*' 0 refs
    origin/main by content git diff --quiet 45efba2a5b origin/main -- the PR's 4 files all 4 identical
    Ancestry git merge-base --is-ancestor 45efba2a5b origin/main holds

    Release: branch claude/project-thread-i6gtvk merged; nothing unpushed. pm:dispatched removed and the card unassigned.


    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 portalbugSomething isn't workingdomain: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