Skip to content

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

Closed

Description

@objectstack-fleet

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)

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 a formula field with returnType: 'text', designated as the nameField".
  • packages/lint/src/validate-record-title.ts:86: "… for a single-field title, or add a formula field (returnType: 'text') …". The same file at :82 and :107 offers "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 with returnType: 'text' and point nameField at it".
  • packages/lint/src/data-model-rules.ts:742: "… returnType: 'text' formula; titleFormat does not count".
  • content/docs/data-modeling/formulas.mdx:99: "composite titles migrate off the deprecated titleFormat to 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:

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

  1. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 33
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25071-composite-title-stored
    Worktree: objectstack-issue-25071
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main a39389eb51 or later; stop on a breach and explain it in the report):

    • message and explanation text only in packages/lint/src/validate-record-title.ts (around :82, :86 and :107), packages/lint/src/rule-explanations.ts (the record-title block) and packages/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) directs
    Thread-read: 6308445871
    Serial constraints cleared:

    • The PR touches docs/adr/** (Tier H), so it lands only on an authorized approval by os-zhuang or hotlong.
    • No in-flight PR of this seat touches these files. The dev re-checks open PRs before opening its own.

    Read on origin/main a39389eb51 at 2026-10-21T08:51Z: ADR-0079 D3 (:141) says a composite title "becomes a formula field", and validate-record-title.ts:86 and :107 offer a returnType: 'text' formula.

  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Paused — claim released (handover)

    The seat stopped this dispatch at the maintainer's request (wind-down). The claim 6311980890 ends here, and the card returns to pm:queue.

    • Work on the branch: claude/issue-25071-composite-title-stored, 3 commits, pushed at dd5d71f940, clean. No PR is open.
    • Not done: the dev had not finished the lint tests under the verify lock, the gates, or the PR. The next dev picks up from the branch, re-runs the verification and opens the draft PR. The PR is Tier H (docs/adr/**), so it needs an authorized approval.
  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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:dispatched is restored. The seat now runs one dev at a time. This card resumes from its pushed branch head, in the seat's serial order.

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out — landed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdocumentationImprovements or additions to documentationdomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions