Repository navigation
ADR-0079 D3, the validate-record-title lint and formulas.mdx still steer a composite record title into a formula field, which ruling 6308445871 says cannot be matched on import (use a stored computed field) #25071
Description
Filing gate ③, a task the maintainer directed. Filed by the domain:engine seat 2 (seat post #20966, os-support-ai, session session_01QK6pdbxKZiHdFApL8RYVh9). ⛔ Not a claim. Lane, type and grade are triage's.
Provenance: #24981, ruling 6308445871 (batch #381 item 2, letter A, maintainer 「其他同意」 2026-10-21T04:59Z), whose state line reads verbatim: "files for triage the card that re-words ADR-0079 D3 and the validate-record-title lint so they no longer steer a composite title INTO a formula when it must be queried."
Reader (who acts): triage routes it. The surfaces span packages/lint (shipped diagnostics and os explain text), docs/adr/0079-record-display-name.md (governed text, so the PR that edits it is Tier H) and content/docs/data-modeling/formulas.mdx (product docs).
What the ruling binds (#24981, 6308445871)
- "The import matches a lookup cell against a STORED title only." A target whose declared title is a formula keeps answering
reference_not_found. - "The producer stores the title it needs to query: a composite title that must round-trip through import is a stored computed field (a non-formula field with an
expression, written on write — the 18.0 round-2 sweep framework findings: a paid invoice line'samount/totalstays writable while its inputs are locked; an unevaluable hook condition answers 500 INTERNAL_ERROR;remote-tables?schema=never narrows on the SQL drivers #24619 shape), the remedy ADR-0079 item 9 already prescribes for sort and search."
Where the shipped text still steers a composite title into a formula (origin/main 688052e147)
docs/adr/0079-record-display-name.md, D3: "a composite title becomes aformulafield withreturnType: 'text', designated as thenameField".packages/lint/src/validate-record-title.ts:86: "… for a single-field title, or add a formula field (returnType: 'text') …". The same file at:82and:107offers "a formula field designated nameField" and "(or a formula field with returnType: 'text')".packages/lint/src/rule-explanations.ts(the record-title block, near:2636): "For a composite title, add a formula field withreturnType: 'text'and pointnameFieldat it".packages/lint/src/data-model-rules.ts:742: "…returnType: 'text'formula;titleFormatdoes not count".content/docs/data-modeling/formulas.mdx:99: "composite titles migrate off the deprecatedtitleFormatto a text formula".
Wanted
- Each sentence above says that a composite title which must be queried (import, sort, search) is a stored computed field. A formula title stays legal for display only, and the sentence says so, as ADR-0079 item 9 and this ruling do.
- ⛔ The ADR's decision is not re-ruled. Only D3's migration sentence is reconciled with item 9 and the ruling. Whether the lint's verdict itself changes (for example, a new finding on a formula
nameField) is triage's question: it would add a diagnostic, and new gates default to no.
Dedupe (MCP search_issues, objectstack, open and closed)
The query "validate-record-title composite title formula nameField ADR-0079 D3 stored computed field wording" returns 9 hits:
- import: a lookup cell that names the record by the target object's title field answers reference_not_found — resolveRef never reads nameField, and a formula title is not matchable #24981 (open), this card's source;
- ADR-0079 title: 19 objects that declare
titleFormatand NO pointer getnameField: idstamped by the registry designation pass, so a renderer honouring the declared pointer (objectui#9436) shows the raw record id as the title #20044, finding(platform-objects): five system objects declarenameField: idbeside atitleFormat— once objectui honours ADR-0079's order (objectui#9436), their record-page H1 becomes the raw record id #20015, plugin-approvals: an approval request's record title (display_title/titleFormat) still readsflow:NAME · RECORD_ID— once #23889 lands, its flow half reads theprocess_labelthat card adds #24007, metadata-protocol: the global search palette'ssearchAllrenderstitleFormatbeforenameField, the reverse of ADR-0079 and the spec's owntitleFormatdescribe ("an explicit nameField now takes precedence") #24087, platform-objects: ten system objects declaretitleFormatand no pointer, so the registry stampsnameField: idand a renderer honouring the declared pointer shows the raw record id as the title — the engine half of #20044 #20059, A formula field that reads through a reference (record.book.title) passes validateExpression, then reads null on every row: the read path projects only the row's own columns #24197, A lowered hook body cannot name a record: no nameField accessor, no formula fields — so every message hand-composes the title, or falls back to the id #11293 andPageHeaderProps.titleis required, but the platform's own default page:header deliberately has no title —validateComponentPropswould flag every synthesized header #7702 (closed):titleFormatretirement, system-object pointers, title rendering and formula reads.
None of them re-words the composite-title prescription. New.
Dedupe words: composite title formula stored computed field lint · ADR-0079 D3 migration sentence item 9.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 33
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25071-composite-title-storedWorktree:
objectstack-issue-25071Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/maina39389eb51or later; stop on a breach and explain it in the report):packages/lint/src/validate-record-title.ts(around:82,:86and:107),packages/lint/src/rule-explanations.ts(the record-title block) andpackages/lint/src/data-model-rules.ts(around:742), plus any test pinning those strings;docs/adr/0079-record-display-name.md: D3's migration sentence only (Tier H);content/docs/data-modeling/formulas.mdx(around:99);.changeset/25071-*.md.No verdict, severity or new diagnostic changes.
Container & model:
S,mode:subagent,model: default (no path-derived mandate)Clause-②: no (wording only: no verdict, severity, code, key or export moves)
Responsibility:
the wording card ruling 6308445871 on #24981 (letter A) directsThread-read: 6308445871
Serial constraints cleared:
docs/adr/**(Tier H), so it lands only on an authorized approval byos-zhuangorhotlong.Read on
origin/maina39389eb51at 2026-10-21T08:51Z: ADR-0079 D3 (:141) says a composite title "becomes aformulafield", andvalidate-record-title.ts:86and:107offer areturnType: 'text'formula.objectstack-fleet commentedon Oct 21, 2026
Paused — claim released (handover)
The seat stopped this dispatch at the maintainer's request (wind-down). The claim
6311980890ends here, and the card returns topm:queue.claude/issue-25071-composite-title-stored, 3 commits, pushed atdd5d71f940, clean. No PR is open.docs/adr/**), so it needs an authorized approval.objectstack-fleet commentedon Oct 21, 2026
Resumed — claim restored
The handover note above is withdrawn. The maintainer has asked the seat to carry every half-finished card through to merge, so this seat's claim on this card stands again, and
pm:dispatchedis restored. The seat now runs one dev at a time. This card resumes from its pushed branch head, in the seat's serial order.objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{ "issue": 25071, "status": "done", "branch": "claude/issue-25071-composite-title-stored", "pr": "https://github.com/objectstack-ai/objectstack/pull/25127", "session": "session_01D6F9axfoPzR7t8G1J7Ytzz", "premise_still_valid": true, "summary": "Resumed at dd5d71f940. The wording commits were already in place: the validate-record-title.ts title-format-retired message and hint and the title-unresolvable hint, the rule-explanations.ts title-format-retired explanation, the data-model-rules.ts missing-name-field fix line, the ADR-0079 D3 migration sentence (only that sentence) and the formulas.mdx :99 comment. All of them now say that a composite title that import, sort or search must match is a stored computed field (a non-formula field with an expression, computed on write), and that a text formula title stays legal for display only. This round merged origin/main 03966ceae0, added the AGENTS.md item-3 'Metadata-protocol: none' line to the changeset (lint patch; it changes shipped diagnostic text and nothing an author can write, so none takes patch), ran the verification, and opened draft PR #25127 assigned to baozhoutao. The PR body starts with 'Closes #25071', carries both declaration lines and states Tier H (docs/adr/**), landing only on an authorized APPROVED review. The shape is verified on origin/main: packages/objectql/src/engine.ts:3028-3050 planStoredExpressions (the test `def.type !== 'formula' && def.expression` at :3046, called on insert at :16210 and update at :17559). Also packages/rest/src/import-reference-stored-computed-title.test.ts, and ADR-0079 addendum item 9 at docs/adr/0079-record-display-name.md:400-406.", "tests": "At head e9e0ec7bab (after the merge of origin/main 03966ceae0). (1) Under the verify lock: pnpm --filter '@objectstack/lint^...' build -> VERDICT command-exit 0. (2) Under the verify lock: pnpm --filter @objectstack/lint test && pnpm --filter @objectstack/lint typecheck -> 'Test Files 153 passed (153)', 'Tests 7085 passed (7085)', typecheck and check:test-typecheck ran, VERDICT command-exit 0. The string pins updated: validate-record-title.test.ts and data-model-rules.fix-lines.test.ts (the 200-char bound held). (3) node scripts/pm/dispatch-gates.mjs --ran with exit codes recorded -> '100 derived famil(ies) accounted for — 99 run, 1 NOT-MEASURED'. Exit 0 on every gate run, including check:docs, check:doc-authoring, check:doc-formula-expressions, check-changeset-no-major, check-empty-changeset, check-adr-0087-registration, check:changeset-gate-self-tests, check-adr-links, check:adr-anchors and check:nul-bytes. check:skill-examples (exit 3, client-react not built), check:dts-closure (exit 1, spec .d.ts missing while a concurrent client-react closure build was rebuilding spec) and check:lean-entry-closure (exit 3, objectql dist absent) all exited 0 when re-run after the client-react closure build: 262 prose examples type-check, 128/128 declarations present, admitted set held. NOT MEASURED: check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET, it needs every package dist (a whole-repo build), which is left to CI. (4) scripts/pm/clause2-line.mjs reads the changeset lines as Clause-② {value:no, arm:null} and Metadata-protocol {value:none}. No ablation: this is a wording-only change.", "mcp_calls": "0", "api_writes": "3 — git push (branch, 2 pushes: e9e0ec7bab after a pre-push trailer refusal was fixed locally), fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls + POST /issues/25127/assignees, read-back identical 7118 bytes), fleet-write relay comment (POST /repos/objectstack-ai/objectstack/issues/25071/comments, this os-dev-report). No labels written: the dispatch named none, and skip-changeset does not apply.", "open_questions": [], "out_of_scope_findings": [ "class: b · reach: named producer: packages/spec/src/data/object.zod.ts:2843, the titleFormat describe ('Migrate ... a composite to a formula field designated as nameField'), feeds the generated reference pages content/docs/references/data/object.mdx:167, content/docs/references/api/metadata.mdx:964 and content/docs/references/system/migration.mdx:349,643, and is quoted in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts:404 · evidence: contradicts ADR-0079 addendum item 9 and ruling 6308445871 (a formula title cannot be sorted, searched or import-matched) · same family as #25071, so the seat should fold it into the family close-out card rather than file a single-point card · dedupe words: titleFormat describe composite formula nameField, stored computed title, ADR-0079 item 9", "class: b · reach: named producer: skills/objectstack-data/SKILL.md:90, the published skill AI authors read ('for a composite title, designate a returnType: text formula field as nameField') · evidence: same contradiction with item 9 / ruling 6308445871 · same family as #25071 · dedupe words: objectstack-data skill titleFormat composite formula, stored computed field title", "carrier: PR #25074 (claude/issue-24952-user-field-reference-refused) also edits packages/lint/src/rule-explanations.ts, but around lines 3562 and 4880 against this PR's 2644, so there is no conflict · noted, not filed" ], "deviations": "The harness-supplied commit trailer named a model, and the pre-push check:commit-card-trailers refused it. The unpublished tip commit was amended to the model-free pair 'Co-Authored-By: Claude' before it was pushed, so no published history was rewritten. The PR footer uses the session-URL form from .claude/agents/os-dev.md, not the harness-suggested footer. The PM asked for 'Closes #25071' and os-dev.md says 'Fixes'; both are closing keywords, and the PM's wording was followed." }Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{ "issue": 25071, "status": "done", "branch": "claude/issue-25071-composite-title-stored", "pr": "https://github.com/objectstack-ai/objectstack/pull/25127", "session": "session_01D6F9axfoPzR7t8G1J7Ytzz", "premise_still_valid": true, "summary": "Patch round for Test Core red. packages/cli/test/data-model-rules.test.ts:291 pins that the object/missing-name-field fix line contains 'ADR-0079', and the previous wording had dropped that citation. The new head a16a9c02bc puts it back: the fix line in packages/lint/src/data-model-rules.ts:741-742 is now 'Set `nameField` (ADR-0079), never `titleFormat` (`os explain title-format-retired`); a composite title to import/sort/search by is a text field with an `expression` (a text formula is display-only).' That is 198 characters, inside the 200 bound, and it keeps the os explain pointer and the ruling's meaning. The CLI test was not edited, and the lint verbatim pin in data-model-rules.fix-lines.test.ts was updated to match. A grep of every other package's tests (cli, rest, spec, metadata-protocol, objectql, platform-objects, plugins, services) for the changed message, hint, fix-line and explanation strings found no other assertion pins. The hits outside lint are prose or comments, or CLI pins on rule ids or on the 'nameField'/'titleFormat'/'ADR-0079' substrings, which the new line satisfies.", "tests": "At head a16a9c02bc. (1) Under the verify lock: pnpm --filter '@objectstack/cli^...' build -> VERDICT command-exit 0. packages/lint/dist/index.js carries '(ADR-0079), never', so the rebuilt dist was read. (2) Under the verify lock: pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 test/data-model-rules.test.ts test/lint-handwritten-checks-package-fold.test.ts -> 'Test Files 2 passed (2)', 'Tests 63 passed (63)'. pnpm --filter @objectstack/lint test -> 'Test Files 153 passed (153)', 'Tests 7085 passed (7085)'. pnpm --filter @objectstack/lint typecheck -> passed; the whole chain ended VERDICT command-exit 0. (3) pnpm check:nul-bytes -> exit 0. The derived gate families are unchanged from the previous round (the same 8 paths), and the 100-family reconciliation from the previous round still stands, with check:dual-build-cjs-loads NOT MEASURED (a whole-repo build is needed, left to CI). The rest of the CLI package's unit and integration tiers are declared to CI.", "mcp_calls": "0", "api_writes": "2 this round — git push (a16a9c02bc), fleet-write relay comment (POST /repos/objectstack-ai/objectstack/issues/25071/comments, this follow-up). The PR body was not edited. Its Tests section cites the earlier head e9e0ec7bab; the seat may want to append a line naming a16a9c02bc and the CLI pin run.", "open_questions": [], "out_of_scope_findings": [ "Unchanged from the first report (comment 6321034659): the object.zod.ts:2843 titleFormat describe plus its generated reference pages, and skills/objectstack-data/SKILL.md:90, both belong to the #25071 family." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Close-out — landed
os-zhuangon heada16a9c02bcand merged byos-zhuangas459afea1f6(single-parent squash onmain).a78fb0dc59).6322398359on the PR. Round 2 restored theADR-0079citation in themissing-name-fieldfix line, which the CLI pinpackages/cli/test/data-model-rules.test.ts:291requires.validate-record-title/missing-name-fieldlint messages and explanations, ADR-0079 D3's migration sentence andformulas.mdxnow say that a composite title an import, a sort or a search must match is a stored computed field (a non-formula field with anexpression). A text formula title stays legal for display only. The wording follows ruling 6308445871 on import: a lookup cell that names the record by the target object's title field answers reference_not_found — resolveRef never reads nameField, and a formula title is not matchable #24981.titleFormatdescribe inpackages/spec, its generated reference pages, andskills/objectstack-data/SKILL.md.pm:dispatchedremoved.