Repository navigation
Description
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)
- Refusal sentences (finding 1).
judgeOverrideWrite(packages/metadata-protocol/src/protocol-packaged-base-refusal.ts):- It refuses a body that carries
overrideson this type asdeclared_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_objectrefusal points at the manifest entry only, not at the item door.
- It refuses a body that carries
- Stale comment (finding 3). The
object_extensionregistry 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 showsobjects: []where the code omits the key. - Phantom entry (finding 4). A short target name that
getObjectfolds to a legacyns__namekey passes the gate, andregisterObjectthen opens a second entry under the short name.computeFQNis the identity today, so only legacy keys reach this.
Wanted
- Both sentences fit an
object_extensionwrite. The non-overridable sentence says to edit the extension itself (it has no override channel), anddeclared_objectnames 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
extendto the keygetObjectresolved, 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
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