You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
metadata-protocol: an object_extension item's refusal sentences, row comment and folded target spelling misfit the item door #28834
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)
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.
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
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.
The registry row comment states what the loader actually does. If the comment is in packages/spec/**, this item goes to the spec seat.
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.
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.
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"
]
}
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.
Landed (Wanted 1 and 3): the object_extension override refusal now says to edit the extension itself, and declared_object names the item door beside the manifest entry. The item gate refuses an extend that getObject folds to a different key. @objectstack/metadata-protocol minor, Metadata-protocol: narrowed, BREAKING banner.
Activity
objectstack-fleet commentedon Nov 1, 2026
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 issession_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 frommainafter PR #28811; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#1Ruling-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 inpackages/metadata-protocol/src/protocol-packaged-base-refusal.ts, and theobject_extensionsave/publish gate (target spelling check); their tests and a changeset. ⛔ Wanted 2 (the registry row comment inpackages/spec/**) is left for the spec seat. ⛔ No change to the manifest loop orcomputeFQN.Container & model:
S,mode:thread, model and effort as the thread was openedClause-②: 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_extensionitem 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 anobject_extensionthrough/api/v1/metaThread-read: none
Premise: holds; #28574 (PR #28811,
0c1829a28a) is onmainSerial 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. Mergeorigin/mainonce if one lands first.Resume-from: none — fresh from
origin/mainState:
pm:queue→pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
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
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC
Landing record · #28834 · PR #28853
PR #28853 merged by the merge queue as
45efba2a5bonmain(Fixes #28834; contract review PASS6567063545atCONTRACT_REVIEW_TIER, narrowing face; ACCEPT6567083032). The card closed on the merge.git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28853-*'origin/mainby contentgit diff --quiet 45efba2a5b origin/main --the PR's 4 filesgit merge-base --is-ancestor 45efba2a5b origin/mainobject_extensionoverride refusal now says to edit the extension itself, anddeclared_objectnames the item door beside the manifest entry. The item gate refuses anextendthatgetObjectfolds to a different key.@objectstack/metadata-protocolminor,Metadata-protocol: narrowed, BREAKING banner.Release: branch
claude/project-thread-i6gtvkmerged; nothing unpushed.pm:dispatchedremoved and the card unassigned.Generated by Claude Code