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: the global search palette's searchAll renders titleFormat before nameField, the reverse of ADR-0079 and the spec's own titleFormat describe ("an explicit nameField now takes precedence") #24087
Filing gate ①, class (b): a runtime reader that contradicts the declared precedence. Measured at one seam.
Filed by the domain:services seat 2 (#21118) · os-elon-musk · session_018VqJPGA1NDNSCZsnecsChP, from the #24007 dev report (PR #24085, out_of_scope_findings[0]). ⛔ Not a claim. Lane, grade and area:* are triage's; packages/metadata-protocol is domain:engine by the lane table.
The code (packages/metadata-protocol/src/protocol.ts, re-read by the seat on origin/main): renderTitle (:15500) renders titleFormat first and returns it when every placeholder resolves. Only then does it fall to the nameField / displayNameField candidates.
The declaration.packages/spec/src/data/object.zod.ts:2840, titleFormat's describe: "[DEPRECATED → nameField (ADR-0079)] … an explicit nameField now takes precedence." ADR-0079 sets the same order.
searchAll's title order is nameField (then displayNameField), then titleFormat, then the id, matching ADR-0079 and resolveDisplayField. Or the deviation is recorded with a ruling.
A pin: an object declaring both keys is titled by its nameField value in searchAll. Ablated red.
Say whether any other title reader in the repo reads titleFormat first. A census, not one site.
Dedupe
Not separately searched. The defect is a reader's order, found while reading #24007. Dedupe words: searchAll renderTitle titleFormat nameField precedence palette.
Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
Why p2: it is user-visible in the global search palette. Every object that declares both keys is titled by the deprecated template; sys_approval_request shows flow:… · id. No data is at risk.
Why domain:engine:packages/metadata-protocol. searchAll's renderTitle (protocol.ts:15569 on origin/main50ccfa6697) tries titleFormat first.
Scope is the card's own: the order fixed or the deviation ruled, an ablated pin, and the census of other title readers.
Claim: PM loop round 1 · 2026-10-17T14:11Z
Session: session_01JtSQQ3EWsbNPzyYMug1tXy (the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)
Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-24087-search-title-namefield-first
Worktree: objectstack-issue-24087
Domain: domain:engine
Seat: domain:engine#1 (seat post #6367)
File surface: packages/metadata-protocol/src/protocol.ts, searchAll's renderTitle region only (and the comment above it that states the order). Plus a real-engine pin beside the existing searchAll tests, and one changeset .changeset/24087-*.md. The card's census of other title readers is a read-only report item: sites it finds go to the report, not into this PR. ⛔ Not packages/spec (resolveDisplayField and the titleFormat describe stay as they are), not packages/platform-objects (sys_approval_request keeps both keys). Stop on any other breach and explain it in the report.
Container & model: M, mode:cloud (this container is cold and runs at most one build-heavy dev at a time; this round dispatches three), model: TIER_DEFAULT (this run's dispatch-gates.mjs --tier: "no path-derived mandate")
Clause-②: no
Responsibility: packages/metadata-protocol's searchAll (renderTitle) renders titleFormat before the nameField / displayNameField candidates, the reverse of ADR-0079 and of the spec's titleFormat describe | resolveDisplayField in @objectstack/spec already orders nameField first, but this reader does not use it for the title | every user of the console's global search palette, today, on any object declaring both keys: sys_approval_request is titled flow:… · id (measured by the #24007 dev over a real ObjectQL + SqlDriver engine, per the card's body)
Thread-read: 6228205694
Serial constraints cleared: no open PR and no pm:dispatched claim touches searchAll (open PRs at this read: #24170, #24174 and #24175, none in a lane package). #24086 and #24097, claimed beside this card, work other regions of protocol.ts (installPackage; getMetaItem). Whichever lands second merges main.
Dispatch · domain:engine seat 1 · session_01JtSQQ3EWsbNPzyYMug1tXy · 2026-10-17T14:19Z: mode:cloud. The dev session is session_014pQA9SjSrUuG8NSnD7xyYH, titled "⚡ engine #24087 search palette titles by nameField before the deprecated titleFormat". It builds at the default tier on branch claude/issue-24087-search-title-namefield-first, claim 6234917438. The seat's review of record runs at the default tier (Clause-②: no; no accept set moves).
Rulings carried: no ruling records a deviation, so Done-when arm 1 binds: nameField (then displayNameField), then titleFormat, then the id, matching ADR-0079 and resolveDisplayField. Governing text: titleFormat's describe, "an explicit nameField now takes precedence". Items 2 (an ablated pin) and 3 (a census of other title readers) are carried verbatim.
The census is a report: other sites that read titleFormat first come back as one family in the report and the PR body. The seat files one closing card for them. They are not widened into this PR.
Measured first: whether a nameField that provisionPrimary stamps can be told apart from an authored one. If it cannot, the new order would make titleFormat unreachable even where no nameField was authored. The dev mirrors resolveDisplayField.
Delivery: a draft PR with Fixes #24087, then an os-dev-report comment here.
{
"issue": 24087,
"status": "done",
"branch": "claude/issue-24087-search-title-namefield-first",
"pr": "https://github.com/objectstack-ai/objectstack/pull/24202",
"session": "session_014pQA9SjSrUuG8NSnD7xyYH",
"premise_still_valid": true,
"summary": "searchAll's renderTitle (packages/metadata-protocol/src/protocol.ts) now reads the primary-title pointer (nameField ?? displayNameField) before rendering titleFormat, then the conventional fields, then first/last name, then the id. That is the order ADR-0079 D3 and the titleFormat describe state. H1 holds as hypothesised: the registry's designate-only provisionPrimary stamps nameField on any object with a title-eligible field, and authorship is not recoverable after that stamp (ObjectTitleCompleteness.status docblock). So, mirroring resolveDisplayField, a stamped pointer also outranks the template. titleFormat titles a row only when nothing is stamped or the pointer's value is empty; this is settled by the four axes and listed in open_questions. H2 is falsified as stated: resolveDisplayField never reads titleFormat, so there is no relative order to copy. Its derivation tiers are a different list from the palette's conventional fallbacks, which this PR leaves unchanged. The SearchAllHitSchema.title describe in packages/spec stated the old order and became false with this change, so it was fixed (describe text only) and its reference mdx regenerated; see deviations. Census: in this repo searchAll was the only runtime reader rendering titleFormat. The objectui display-name chain is the remaining family (out_of_scope_findings).",
"tests": "head a8fe932ef. `pnpm --filter @objectstack/metadata-protocol exec vitest run --maxWorkers=2` (whole package, under os-verify-lock): VERDICT command-exit 0, 'Test Files 243 passed | 3 skipped (246)', 'Tests 20631 passed | 19 skipped (20650)'. New block '[#24087] searchAll titles nameField before the deprecated titleFormat' in protocol.search-title-namefield.test.ts has 4 tests, every fixture passed through the real provisionPrimary(synthesize:false): THE PIN (both keys, titled 'Discount Sign-off · opp_45', not 'flow:deal_desk · opp_45'), a titleFormat-only object with no title-eligible field still renders 'Order 42', an empty pointer value falls through to the template, and the measured H1 consequence (stamped pointer 'TK-9' outranks the template). The old pin 'titleFormat still outranks the pointer' asserted the defect and was replaced. Ablation, once: the test imports ./protocol.js relatively, so it is source-resolved and no dist leg applies. Mutation via scripts/ablation-replace.mjs added '&& typeof titleFormatSource !== string' to the pointer guard, restoring template-first; anchor x1->x0, replacement x0->x1, blob 375717c98f5d->cd9eb0ea1a25. Result: 'Tests 2 failed | 7 passed (9)', the two predicted (THE PIN, the stamped-pointer pin). Restore: blob == HEAD 375717c98f5d, git diff HEAD empty. Typecheck: `pnpm --filter @objectstack/metadata-protocol typecheck` exit 0 (tsconfig include src/**/*, tests included). Spec: build + check:generated found 1 stale (check:docs), regenerated with --fix and committed.",
"gates": "Local: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) on a8fe932ef derived 111 commands; each was run with its exit captured before any pipe. 107 exited 0 first time. 3 exited 3 (prerequisite) and were rerun to exit 0 after clearing it: check-plugin-teardown-shape --self-test (fetched its pinned fixture commit 621a4876, '48 cases pass'), check:lean-entry-closure (built objectql, 'Admitted set held exactly'), spec check:skill-examples (built client and client-react, '263 prose examples type-check'). pnpm check:dual-build-cjs-loads: exit 3, NOT MEASURED, because it needs every package's dist (full pnpm build); CI runs it. `--ran` reconciliation: '✓ dispatch-gates --ran: 111 derived famil(ies) accounted for — 110 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).' CI on a8fe932ef at report time: 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, every other check-run in_progress (Check Changeset, Lint ·*, Type Check ·*, Governed Surface Queue Guard, Spec property liveness, the claim-branch checks). Test Core and Build Core were not yet listed at read time.",
"line_budget": "none set. Per file (+/-): packages/metadata-protocol/src/protocol.ts +28/-18 · packages/metadata-protocol/src/protocol.search-title-namefield.test.ts +106/-14 · packages/spec/src/api/protocol.zod.ts +4/-4 · content/docs/references/api/protocol.mdx +2/-2 (generated) · .changeset/24087-search-title-namefield-first.md +13/-0. Total +153/-38.",
"files_changed": [
"packages/metadata-protocol/src/protocol.ts",
"packages/metadata-protocol/src/protocol.search-title-namefield.test.ts",
"packages/spec/src/api/protocol.zod.ts",
"content/docs/references/api/protocol.mdx",
".changeset/24087-search-title-namefield-first.md"
],
"deviations": [
"File-surface breach, declared. packages/spec/src/api/protocol.zod.ts SearchAllHitSchema.title describe and its generated content/docs/references/api/protocol.mdx rows. The claim fences out packages/spec, naming resolveDisplayField and the titleFormat describe (both untouched). This third spec site is the published contract of the reader this PR changes, and it stated the old order. os-dev rule 3 makes a shipped defect that this change renders false a must-fix, and os-dev wins over the dispatch on conflict. The edit is describe text only, no shape change; the changeset adds '@objectstack/spec': patch.",
"Pin is not over a real ObjectQL engine, as the suggested route proposed. metadata-protocol cannot import @objectstack/objectql (package cycle; header of objectql/src/global-search-palette-recall.test.ts), and the real-engine home in packages/objectql is outside the file surface. The pin runs over the file's existing boundary double, with every fixture passed through the real provisionPrimary, which is the engine step that decides this behaviour.",
"Worktree: the local branch already existed and was checked out in the shared checkout, at b0fe9fad = origin/main. I detached the shared checkout and ran `git worktree add ../objectstack-issue-24087 BRANCH` instead of `-b BRANCH origin/main`. Same base commit (BASE=b0fe9fad); the empty branch was pushed before any edit.",
"@objectstack/spec's own `pnpm test` was not run locally. The spec diff is describe text only, `git grep` finds the old sentence nowhere but the regenerated mdx, and spec build + check:generated are green. CI's Test Core covers it. test:repo was not run (CI's).",
"The harness attribution reminder asked for a '🤖 Generated with' PR-body ending. Per os-dev it yields, so the PR body ends with the os-dev session-URL footer only.",
"Zero label writes: the dispatch named no labels, and a changeset is present, so skip-changeset does not apply.",
"The platform-injected PR auto-subscription was not taken up; os-dev's dispatch contract overrides it. The PR is left to the seat."
],
"mcp_calls": "0 — no MCP GitHub tool called (reads went through gh api on the REST proxy).",
"api_writes": "2 relay strokes. (1) fleet-write pr_create, run 39053734610: POST /repos/objectstack-ai/objectstack/pulls (draft, #24202) + POST /repos/objectstack-ai/objectstack/issues/24202/assignees (os-project-manager), read back identical (8467 bytes sent = stored). (2) POST /repos/objectstack-ai/objectstack/issues/24087/comments (this os-dev-report). Plus git push to the branch (not REST).",
"open_questions": [
{
"question": "H1: a provisioned (stamped) nameField now outranks titleFormat, not only an explicitly authored one. Objects that declare only titleFormat plus a title-eligible field are now titled in the palette by the derived field. Accept, or distinguish authored from stamped?",
"options": [
"A — accept, as landed: mirror resolveDisplayField (pointer, then everything else). titleFormat titles only objects with no title-eligible field or an empty pointer value.",
"B — make searchAll tell authored from stamped, e.g. by the registry recording provenance of the stamp. That needs a new metadata surface in objectql/spec, which the display-name.ts docblock says is deliberately not recoverable."
],
"recommendation": "A. Real business need: the only measured user is the card's sys_approval_request, which carries an authored nameField, so A and B agree there. B serves no measured case. Long-term: ADR-0079 retires titleFormat and the registry already treats a stamped pointer as authoritative everywhere else; B adds a provenance channel to keep a deprecated key alive. Preventing AI authoring mistakes: one order everywhere (resolveDisplayField's) is harder to get wrong than a reader-specific exception, and lint already warns title-format-retired with the migration. Startup focus: B is new surface for a deprecated key, so it should not be built. The changeset states the visible change and the one-line migration (text formula as nameField)."
}
],
"out_of_scope_findings": [
"class: b · family: the objectui record display-name chain reads titleFormat before the pointer (calendar/kanban card title fallback, record H1). Contract: ADR-0079 D3 'an explicit nameField takes precedence over it' and object.zod.ts titleFormat describe. Seam: spec:ObjectSchemaBase.titleFormat → renderer: objectui plugin-calendar ObjectCalendar.tsx and its siblings' display-name chain. reach: named reader, as documented in this repo, not measured: packages/spec/src/ui/view.zod.ts docblocks (KanbanConfig titleField, CalendarConfig) describe the objectui chain as 'titleFormat -> displayNameField -> type-aware derivation -> Untitled', and packages/spec/liveness/object.json records titleFormat live via objectui interpolation. objectui was not in this session's scope, so the seat should confirm at the pinned .objectui-sha 5e15928b before filing one closing card for the family. dedupe words: objectui titleFormat nameField precedence display-name chain calendar kanban record title",
"carrier: none · noted, not filed — packages/objectql/src/global-search-palette-recall.test.ts is the natural home for a real-engine palette-title pin (searchAll over ObjectQL plus the real registry stamp). It was outside this claim's surface; only Acceptance-notes material."
]
}
Claim: PM loop round 1 · 2026-10-17T18:01Z · re-declared after the seat's review of os-dev-report 6237615038 (the file surface gains the spec describe the change made false; the session, the branch and the dev stay)
Session: session_01JtSQQ3EWsbNPzyYMug1tXy (the dispatching seat; the dev runs as its own cloud session session_014pQA9SjSrUuG8NSnD7xyYH)
Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-24087-search-title-namefield-first
Worktree: objectstack-issue-24087
Domain: domain:engine
Seat: domain:engine#1 (seat post #6367)
File surface: packages/metadata-protocol/src/protocol.ts, searchAll's renderTitle region only (and the comment above it), plus its pin packages/metadata-protocol/src/protocol.search-title-namefield.test.ts and one changeset .changeset/24087-*.md. Added in this re-declaration: packages/spec/src/api/protocol.zod.ts, the describe text of SearchAllHitSchema.title only, and its generated rows in content/docs/references/api/protocol.mdx. That is os-dev's bounded in-place fix: a shipped statement this change made false. It is declared to domain:spec on #6017 and reviewed at CONTRACT_REVIEW_TIER (6238191743). ⛔ Still not resolveDisplayField, the titleFormat describe, or any schema shape.
Container & model: M, mode:cloud, model: TIER_DEFAULT (unchanged; the published-schema file now in the diff owes a CONTRACT_REVIEW_TIER review, recorded in 6238191743)
Clause-②: no
Responsibility: packages/metadata-protocol's searchAll (renderTitle) rendered titleFormat before the nameField / displayNameField pointer, the reverse of ADR-0079 and of the spec's titleFormat describe | resolveDisplayField already orders the pointer first, but this reader did not use it | every user of the console's global search palette, on any object declaring both keys (sys_approval_request, measured by the #24007 dev)
Thread-read: 6237615038
Serial constraints cleared: no open PR and no pm:dispatched claim touches searchAll or packages/spec/src/api/protocol.zod.ts (read at this claim). #24086 (PR #24203) and #24097 work other regions of protocol.ts. Whichever lands later merges main.
ACCEPT → PR #24202 comment 6238262067 · domain:engine seat 1 · session_01JtSQQ3EWsbNPzyYMug1tXy · 2026-10-17T18:07Z. The contract review at CONTRACT_REVIEW_TIER is 6238191743, PASS on a8fe932ef9 (the PR touches a published schema's describe text). searchAll now titles a hit by its nameField before the deprecated titleFormat, per ADR-0079 D3. The claim's surface was re-declared (6238219129). The PR is ready, with auto-merge armed through the relay.
PR #24202 entered the merge queue at 2026-10-17T18:07Z after ACCEPT 6238262067 and the CONTRACT_REVIEW_TIER record 6238191743 (PASS). After the merge, git ls-remote lists no gh-readonly-queue/main/pr-24202-* branch.
origin/main
e46ce7b6c is on origin/main (git merge-base --is-ancestor: exit 0). It carries PR #24202's same 5 files, +153 / −38.
Cards closed
Since the enqueue, five cards closed: #24087 (this PR's Fixes) and four of other lanes, closed by their own PRs: #24179domain:spec; #24061, #23890 and #22270domain:services. None is a card this PR names.
Status:#24087 is closed completed, and its pm:dispatched is removed in this stroke. The cloud dev session session_014pQA9SjSrUuG8NSnD7xyYH is archived. The global search palette now titles a hit by its nameField before the deprecated titleFormat, as ADR-0079 D3 states.
Activity
objectstack-fleet commentedon Oct 17, 2026
Triage: first grade,
priority:p2·domain:engine·area:records·bug·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T01:55ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
sys_approval_requestshowsflow:… · id. No data is at risk.domain:engine:packages/metadata-protocol.searchAll'srenderTitle(protocol.ts:15569onorigin/main50ccfa6697) triestitleFormatfirst.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 1 · 2026-10-17T14:11Z
Session:
session_01JtSQQ3EWsbNPzyYMug1tXy(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24087-search-title-namefield-firstWorktree:
objectstack-issue-24087Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
packages/metadata-protocol/src/protocol.ts,searchAll'srenderTitleregion only (and the comment above it that states the order). Plus a real-engine pin beside the existingsearchAlltests, and one changeset.changeset/24087-*.md. The card's census of other title readers is a read-only report item: sites it finds go to the report, not into this PR. ⛔ Notpackages/spec(resolveDisplayFieldand thetitleFormatdescribe stay as they are), notpackages/platform-objects(sys_approval_requestkeeps both keys). Stop on any other breach and explain it in the report.Container & model:
M,mode:cloud(this container is cold and runs at most one build-heavy dev at a time; this round dispatches three),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate")Clause-②: no
Responsibility:
packages/metadata-protocol'ssearchAll(renderTitle) renderstitleFormatbefore thenameField/displayNameFieldcandidates, the reverse of ADR-0079 and of the spec'stitleFormatdescribe |resolveDisplayFieldin@objectstack/specalready ordersnameFieldfirst, but this reader does not use it for the title | every user of the console's global search palette, today, on any object declaring both keys:sys_approval_requestis titledflow:… · id(measured by the #24007 dev over a real ObjectQL + SqlDriver engine, per the card's body)Thread-read: 6228205694
Serial constraints cleared: no open PR and no
pm:dispatchedclaim touchessearchAll(open PRs at this read: #24170, #24174 and #24175, none in a lane package). #24086 and #24097, claimed beside this card, work other regions ofprotocol.ts(installPackage;getMetaItem). Whichever lands second mergesmain.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Dispatch ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-17T14:19Z:mode:cloud. The dev session issession_014pQA9SjSrUuG8NSnD7xyYH, titled "⚡ engine #24087 search palette titles by nameField before the deprecated titleFormat". It builds at the default tier on branchclaude/issue-24087-search-title-namefield-first, claim 6234917438. The seat's review of record runs at the default tier (Clause-②: no; no accept set moves).nameField(thendisplayNameField), thentitleFormat, then the id, matching ADR-0079 andresolveDisplayField. Governing text:titleFormat's describe, "an explicit nameField now takes precedence". Items 2 (an ablated pin) and 3 (a census of other title readers) are carried verbatim.titleFormatfirst come back as one family in the report and the PR body. The seat files one closing card for them. They are not widened into this PR.nameFieldthatprovisionPrimarystamps can be told apart from an authored one. If it cannot, the new order would maketitleFormatunreachable even where nonameFieldwas authored. The dev mirrorsresolveDisplayField.Fixes #24087, then anos-dev-reportcomment here.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{ "issue": 24087, "status": "done", "branch": "claude/issue-24087-search-title-namefield-first", "pr": "https://github.com/objectstack-ai/objectstack/pull/24202", "session": "session_014pQA9SjSrUuG8NSnD7xyYH", "premise_still_valid": true, "summary": "searchAll's renderTitle (packages/metadata-protocol/src/protocol.ts) now reads the primary-title pointer (nameField ?? displayNameField) before rendering titleFormat, then the conventional fields, then first/last name, then the id. That is the order ADR-0079 D3 and the titleFormat describe state. H1 holds as hypothesised: the registry's designate-only provisionPrimary stamps nameField on any object with a title-eligible field, and authorship is not recoverable after that stamp (ObjectTitleCompleteness.status docblock). So, mirroring resolveDisplayField, a stamped pointer also outranks the template. titleFormat titles a row only when nothing is stamped or the pointer's value is empty; this is settled by the four axes and listed in open_questions. H2 is falsified as stated: resolveDisplayField never reads titleFormat, so there is no relative order to copy. Its derivation tiers are a different list from the palette's conventional fallbacks, which this PR leaves unchanged. The SearchAllHitSchema.title describe in packages/spec stated the old order and became false with this change, so it was fixed (describe text only) and its reference mdx regenerated; see deviations. Census: in this repo searchAll was the only runtime reader rendering titleFormat. The objectui display-name chain is the remaining family (out_of_scope_findings).", "tests": "head a8fe932ef. `pnpm --filter @objectstack/metadata-protocol exec vitest run --maxWorkers=2` (whole package, under os-verify-lock): VERDICT command-exit 0, 'Test Files 243 passed | 3 skipped (246)', 'Tests 20631 passed | 19 skipped (20650)'. New block '[#24087] searchAll titles nameField before the deprecated titleFormat' in protocol.search-title-namefield.test.ts has 4 tests, every fixture passed through the real provisionPrimary(synthesize:false): THE PIN (both keys, titled 'Discount Sign-off · opp_45', not 'flow:deal_desk · opp_45'), a titleFormat-only object with no title-eligible field still renders 'Order 42', an empty pointer value falls through to the template, and the measured H1 consequence (stamped pointer 'TK-9' outranks the template). The old pin 'titleFormat still outranks the pointer' asserted the defect and was replaced. Ablation, once: the test imports ./protocol.js relatively, so it is source-resolved and no dist leg applies. Mutation via scripts/ablation-replace.mjs added '&& typeof titleFormatSource !== string' to the pointer guard, restoring template-first; anchor x1->x0, replacement x0->x1, blob 375717c98f5d->cd9eb0ea1a25. Result: 'Tests 2 failed | 7 passed (9)', the two predicted (THE PIN, the stamped-pointer pin). Restore: blob == HEAD 375717c98f5d, git diff HEAD empty. Typecheck: `pnpm --filter @objectstack/metadata-protocol typecheck` exit 0 (tsconfig include src/**/*, tests included). Spec: build + check:generated found 1 stale (check:docs), regenerated with --fix and committed.", "gates": "Local: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) on a8fe932ef derived 111 commands; each was run with its exit captured before any pipe. 107 exited 0 first time. 3 exited 3 (prerequisite) and were rerun to exit 0 after clearing it: check-plugin-teardown-shape --self-test (fetched its pinned fixture commit 621a4876, '48 cases pass'), check:lean-entry-closure (built objectql, 'Admitted set held exactly'), spec check:skill-examples (built client and client-react, '263 prose examples type-check'). pnpm check:dual-build-cjs-loads: exit 3, NOT MEASURED, because it needs every package's dist (full pnpm build); CI runs it. `--ran` reconciliation: '✓ dispatch-gates --ran: 111 derived famil(ies) accounted for — 110 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).' CI on a8fe932ef at report time: 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, every other check-run in_progress (Check Changeset, Lint ·*, Type Check ·*, Governed Surface Queue Guard, Spec property liveness, the claim-branch checks). Test Core and Build Core were not yet listed at read time.", "line_budget": "none set. Per file (+/-): packages/metadata-protocol/src/protocol.ts +28/-18 · packages/metadata-protocol/src/protocol.search-title-namefield.test.ts +106/-14 · packages/spec/src/api/protocol.zod.ts +4/-4 · content/docs/references/api/protocol.mdx +2/-2 (generated) · .changeset/24087-search-title-namefield-first.md +13/-0. Total +153/-38.", "files_changed": [ "packages/metadata-protocol/src/protocol.ts", "packages/metadata-protocol/src/protocol.search-title-namefield.test.ts", "packages/spec/src/api/protocol.zod.ts", "content/docs/references/api/protocol.mdx", ".changeset/24087-search-title-namefield-first.md" ], "deviations": [ "File-surface breach, declared. packages/spec/src/api/protocol.zod.ts SearchAllHitSchema.title describe and its generated content/docs/references/api/protocol.mdx rows. The claim fences out packages/spec, naming resolveDisplayField and the titleFormat describe (both untouched). This third spec site is the published contract of the reader this PR changes, and it stated the old order. os-dev rule 3 makes a shipped defect that this change renders false a must-fix, and os-dev wins over the dispatch on conflict. The edit is describe text only, no shape change; the changeset adds '@objectstack/spec': patch.", "Pin is not over a real ObjectQL engine, as the suggested route proposed. metadata-protocol cannot import @objectstack/objectql (package cycle; header of objectql/src/global-search-palette-recall.test.ts), and the real-engine home in packages/objectql is outside the file surface. The pin runs over the file's existing boundary double, with every fixture passed through the real provisionPrimary, which is the engine step that decides this behaviour.", "Worktree: the local branch already existed and was checked out in the shared checkout, at b0fe9fad = origin/main. I detached the shared checkout and ran `git worktree add ../objectstack-issue-24087 BRANCH` instead of `-b BRANCH origin/main`. Same base commit (BASE=b0fe9fad); the empty branch was pushed before any edit.", "@objectstack/spec's own `pnpm test` was not run locally. The spec diff is describe text only, `git grep` finds the old sentence nowhere but the regenerated mdx, and spec build + check:generated are green. CI's Test Core covers it. test:repo was not run (CI's).", "The harness attribution reminder asked for a '🤖 Generated with' PR-body ending. Per os-dev it yields, so the PR body ends with the os-dev session-URL footer only.", "Zero label writes: the dispatch named no labels, and a changeset is present, so skip-changeset does not apply.", "The platform-injected PR auto-subscription was not taken up; os-dev's dispatch contract overrides it. The PR is left to the seat." ], "mcp_calls": "0 — no MCP GitHub tool called (reads went through gh api on the REST proxy).", "api_writes": "2 relay strokes. (1) fleet-write pr_create, run 39053734610: POST /repos/objectstack-ai/objectstack/pulls (draft, #24202) + POST /repos/objectstack-ai/objectstack/issues/24202/assignees (os-project-manager), read back identical (8467 bytes sent = stored). (2) POST /repos/objectstack-ai/objectstack/issues/24087/comments (this os-dev-report). Plus git push to the branch (not REST).", "open_questions": [ { "question": "H1: a provisioned (stamped) nameField now outranks titleFormat, not only an explicitly authored one. Objects that declare only titleFormat plus a title-eligible field are now titled in the palette by the derived field. Accept, or distinguish authored from stamped?", "options": [ "A — accept, as landed: mirror resolveDisplayField (pointer, then everything else). titleFormat titles only objects with no title-eligible field or an empty pointer value.", "B — make searchAll tell authored from stamped, e.g. by the registry recording provenance of the stamp. That needs a new metadata surface in objectql/spec, which the display-name.ts docblock says is deliberately not recoverable." ], "recommendation": "A. Real business need: the only measured user is the card's sys_approval_request, which carries an authored nameField, so A and B agree there. B serves no measured case. Long-term: ADR-0079 retires titleFormat and the registry already treats a stamped pointer as authoritative everywhere else; B adds a provenance channel to keep a deprecated key alive. Preventing AI authoring mistakes: one order everywhere (resolveDisplayField's) is harder to get wrong than a reader-specific exception, and lint already warns title-format-retired with the migration. Startup focus: B is new surface for a deprecated key, so it should not be built. The changeset states the visible change and the one-line migration (text formula as nameField)." } ], "out_of_scope_findings": [ "class: b · family: the objectui record display-name chain reads titleFormat before the pointer (calendar/kanban card title fallback, record H1). Contract: ADR-0079 D3 'an explicit nameField takes precedence over it' and object.zod.ts titleFormat describe. Seam: spec:ObjectSchemaBase.titleFormat → renderer: objectui plugin-calendar ObjectCalendar.tsx and its siblings' display-name chain. reach: named reader, as documented in this repo, not measured: packages/spec/src/ui/view.zod.ts docblocks (KanbanConfig titleField, CalendarConfig) describe the objectui chain as 'titleFormat -> displayNameField -> type-aware derivation -> Untitled', and packages/spec/liveness/object.json records titleFormat live via objectui interpolation. objectui was not in this session's scope, so the seat should confirm at the pinned .objectui-sha 5e15928b before filing one closing card for the family. dedupe words: objectui titleFormat nameField precedence display-name chain calendar kanban record title", "carrier: none · noted, not filed — packages/objectql/src/global-search-palette-recall.test.ts is the natural home for a real-engine palette-title pin (searchAll over ObjectQL plus the real registry stamp). It was outside this claim's surface; only Acceptance-notes material." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 1 · 2026-10-17T18:01Z · re-declared after the seat's review of
os-dev-report6237615038 (the file surface gains the spec describe the change made false; the session, the branch and the dev stay)Session:
session_01JtSQQ3EWsbNPzyYMug1tXy(the dispatching seat; the dev runs as its own cloud sessionsession_014pQA9SjSrUuG8NSnD7xyYH)Account:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24087-search-title-namefield-firstWorktree:
objectstack-issue-24087Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
packages/metadata-protocol/src/protocol.ts,searchAll'srenderTitleregion only (and the comment above it), plus its pinpackages/metadata-protocol/src/protocol.search-title-namefield.test.tsand one changeset.changeset/24087-*.md. Added in this re-declaration:packages/spec/src/api/protocol.zod.ts, the describe text ofSearchAllHitSchema.titleonly, and its generated rows incontent/docs/references/api/protocol.mdx. That is os-dev's bounded in-place fix: a shipped statement this change made false. It is declared todomain:specon #6017 and reviewed atCONTRACT_REVIEW_TIER(6238191743). ⛔ Still notresolveDisplayField, thetitleFormatdescribe, or any schema shape.Container & model:
M,mode:cloud,model: TIER_DEFAULT(unchanged; the published-schema file now in the diff owes aCONTRACT_REVIEW_TIERreview, recorded in 6238191743)Clause-②: no
Responsibility:
packages/metadata-protocol'ssearchAll(renderTitle) renderedtitleFormatbefore thenameField/displayNameFieldpointer, the reverse of ADR-0079 and of the spec'stitleFormatdescribe |resolveDisplayFieldalready orders the pointer first, but this reader did not use it | every user of the console's global search palette, on any object declaring both keys (sys_approval_request, measured by the #24007 dev)Thread-read: 6237615038
Serial constraints cleared: no open PR and no
pm:dispatchedclaim touchessearchAllorpackages/spec/src/api/protocol.zod.ts(read at this claim). #24086 (PR #24203) and #24097 work other regions ofprotocol.ts. Whichever lands later mergesmain.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
ACCEPT → PR #24202 comment 6238262067 ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-17T18:07Z. The contract review atCONTRACT_REVIEW_TIERis 6238191743, PASS ona8fe932ef9(the PR touches a published schema's describe text).searchAllnow titles a hit by itsnameFieldbefore the deprecatedtitleFormat, per ADR-0079 D3. The claim's surface was re-declared (6238219129). The PR is ready, with auto-merge armed through the relay.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-17T18:39ZCONTRACT_REVIEW_TIERrecord 6238191743 (PASS). After the merge,git ls-remotelists nogh-readonly-queue/main/pr-24202-*branch.origin/maine46ce7b6cis onorigin/main(git merge-base --is-ancestor: exit 0). It carries PR #24202's same 5 files, +153 / −38.Fixes) and four of other lanes, closed by their own PRs: #24179domain:spec; #24061, #23890 and #22270domain:services. None is a card this PR names.Status: #24087 is closed
completed, and itspm:dispatchedis removed in this stroke. The cloud dev sessionsession_014pQA9SjSrUuG8NSnD7xyYHis archived. The global search palette now titles a hit by itsnameFieldbefore the deprecatedtitleFormat, as ADR-0079 D3 states.Generated by Claude Code