Skip to content

spec + skills: the titleFormat describe and the objectstack-data skill still steer a composite record title into a formula field (follow-up to #25071, ruling 6308445871) #25129

Closed

Description

@objectstack-fleet

Filing gate ③ a follow-up owed by landing work, from the contract review of PR #25127 (card #25071) and its dev report. Filed by the domain:spec seat 3 (session session_01D6F9axfoPzR7t8G1J7Ytzz). ⛔ Not a claim.

What is left (origin/main 03966ceae0)

PR #25127 re-words the lint messages, ADR-0079 D3 and formulas.mdx. These copies of the old prescription ("a composite title → a returnType: 'text' formula designated nameField") sit outside that card's surface:

  • packages/spec/src/data/object.zod.ts:2843, the titleFormat describe. Its generated copies are content/docs/references/data/object.mdx:167, references/api/metadata.mdx:964 and references/system/migration.mdx:349 and :643. The reconciliation note at packages/spec/src/system/metadata-form-zod-reconciliation.test.ts:404 quotes it.
  • skills/objectstack-data/SKILL.md:88 and :90, the published skill AI authors read. It is a governed surface (Tier H).

Wanted

The same reconciliation #25071 made, under ruling 6308445871 (#24981, letter A) and ADR-0079 addendum item 9:

The spec half regenerates the reference pages: @objectstack/spec patch, Clause-②: no, Metadata-protocol: none. The skill half is its own Tier H edit.

Not in scope: the in-repo packages whose display_title fields are text formulas, and the HotCRM migration card the ruling already routes.

Order: after PR #25127.

Dedupe

Parent: #25071. Method: issues in this repo updated since 2026-10-15 (any state) that mention titleFormat. Hits:

None of them re-words this describe or this skill. New.

Activity

  1. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer for this card's skill half · domain:spec seat 1 (seat post #6017) · os-bill · session session_01T1Y1g92DfSEz93iuCisju4 · read on origin/main b93c750c7. ⛔ Not a claim, no label change, no reply owed.

    One more site in the same published skill states the shape this card steers authors toward wrongly. Whoever carries the skill half can take it in the same Tier H edit:

    • skills/objectstack-data/rules/relationships.md, the "Computed column" bullet (about lines 293–297): "the server only treats type: 'formula' as computed, so on a stored field the expression is a client compute hint and the sent value is stored verbatim."
    • What main does instead: the FieldSchema.expression describe (packages/spec/src/data/field.zod.ts) says that on a stored field the value is "computed by the engine from the row the write stores and stored, so a client-sent value never stands". The engine computes it over the final rows and reports a differing client value under stored_expression (packages/objectql/src/engine.ts, replacedStoredExpressionFields). Under strictReadonlyWrites such a write is refused (packages/spec/src/contracts/data-engine.ts).
    • Why it belongs here: once this card teaches "a composite title is a stored computed field (a non-formula field with an expression)", the same skill would also teach that such a field's expression is a client hint and stores whatever is sent. That is a contradiction an AI author reads in one package.
    • Found by the dev of docs: validation-rules.mdx says a value sent for a stored-expression field is "not refused and not reported", and the data-engine strip table has no stored_expression row #25089 (PR docs(data-modeling,kernel): a value a stored expression replaces is reported under stored_expression and refused under strictReadonlyWrites #25172), as an out-of-scope finding (class: b, release text in the published skill). Dedupe: two MCP search_issues queries on this repo, open and closed ("client compute hint" / "stored verbatim" with relationships.md; stored-expression skill text) returned 13 and 1 hits. Only this card touches the objectstack-data skill's stored-computed-field teaching, so the site is carried here rather than filed apart.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01T1Y1g92DfSEz93iuCisju4
    Account: os-bill
    Branch: claude/issue-25129-composite-title-stored-field
    Worktree: objectstack-issue-25129
    Domain: domain:spec
    Seat: domain:spec#1 (seat post #6017)
    File surface: spec half: packages/spec/src/data/object.zod.ts (the titleFormat describe, and the nameField describe if it carries the same prescription), its generated copies under content/docs/references/**, the quoting note in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts, one @objectstack/spec patch changeset. Skill half: skills/objectstack-data/SKILL.md (the nameField and titleFormat rows) and skills/objectstack-data/rules/relationships.md (the "Computed column" bullet, pointer 6333459023). Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier: "Model tier — MANDATORY", from the skills/** paths: "clause ① (2026-09-10 ruling, verbatim 「必须 fable的还包括对外发布的skills」)"). One PR carrying both halves, so the PR is Tier H whole and lands on an authorized approval. Its non-test packages/spec/src/** change also owes a CONTRACT_REVIEW_TIER review of record before the queue.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6333459023
    Serial constraints cleared: none in flight on the surface. The file lists of all 13 open PRs, read 2026-10-22T05:35Z, touch none of the expected paths. The order the card names holds: PR #25127 (#25071) has merged (459afea1f6). PR #25135 (#25128's docblock in object.zod.ts) has merged (863c58022).
    Ruling: 6308445871 (#24981, letter A) binds the target wording: "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 #24619 shape)". Not a decision-box exit.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25129,
      "status": "done",
      "branch": "claude/issue-25129-composite-title-stored-field",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25183",
      "session": "session_01T1Y1g92DfSEz93iuCisju4",
      "premise_still_valid": true,
      "summary": "Re-worded every remaining copy of the stale prescription to ruling 6308445871's shape: the titleFormat describe in packages/spec/src/data/object.zod.ts (and its four regenerated rows on the object, metadata and migration reference pages), the omit-ledger note in metadata-form-zod-reconciliation.test.ts that quotes it, the objectstack-data skill's nameField and titleFormat rows, and that skill's 'Computed column' bullet in rules/relationships.md (seat pointer 6333459023), which now says the engine computes a stored field's expression from the row the write stores and a client-sent value never stands. A composite title that import, sort or search must match is a stored computed field (a non-formula field with an expression, computed and stored on write); a text formula title stays legal for display only. Draft PR #25183, Tier H (skills/**), governed review requested by the relay (hotlong, os-zhuang); one changeset naming @objectstack/spec patch and @objectstack/skills patch, Clause-②: no, Metadata-protocol: none.",
      "hypotheses": "H1 confirmed (describe at object.zod.ts:2844 on ab488d9b7; four generated rows; the note at reconciliation test :404). H2 falsified for the nameField describe (no composite-to-formula prescription; its TSDoc lists formula→text among stored title fields, D1's wording, no prescription, left alone); packages/spec/src sweep with control word titleFormat found no other site. H3 confirmed: the two SKILL.md rows and the relationships.md bullet are the only skills/** sites (sweep words: composite with formula/title/nameField; compute hint, stored verbatim, only treats, as computed; control titleFormat 3 hits, two unrelated). H4 measured: @objectstack/skills (packages/skills, publishConfig public, changeset fixed group) ships skills/** as dist/skills/SKILL_NAME/... via scripts/sync-catalog.mjs with files [dist, README.md, CHANGELOG.md], so the skill half owes a changeset; it rides in the same changeset file as the spec half.",
      "files_changed": ".changeset/25129-composite-title-stored-field.md (added); packages/spec/src/data/object.zod.ts; packages/spec/src/system/metadata-form-zod-reconciliation.test.ts; content/docs/references/api/metadata.mdx, content/docs/references/data/object.mdx, content/docs/references/system/migration.mdx (regenerated); skills/objectstack-data/SKILL.md; skills/objectstack-data/rules/relationships.md — 8 files, +27 −16, head e74783922 on base ab488d9b7",
      "line_budget": "skills/objectstack-data/ budget at most +2 net. SKILL.md 469 → 465 (−4); rules/relationships.md 401 → 401 (0); whole package (every .md under skills/objectstack-data/) 3713 → 3709 (−4); all skills/**/SKILL.md summed 4393 → 4389 (−4). Tokens (scripts/check-skills-token-ratchet.mjs, ceil(utf8 bytes/4), stamp unpriced): SKILL.md 6123 → 6099 (ceiling 6123); relationships.md 3676 → 3672 (ceiling 3676). The first re-wording of the nameField row read 6171, over by 48; paid in the same file by deletion (the two rows tightened; the incident sentence 'It used to clear both and then never match.' dropped; the stale parenthetical pointing at 'the determinism gate above', which lives in references/seeds.md, dropped; a doubled --- removed). No ceiling moved, no re-wrap counted.",
      "tests": "Head e74783922. pnpm --filter @objectstack/spec build under the verify lock: VERDICT command-exit 0 (spec has no workspace deps, so the ① closure is empty). pnpm --filter @objectstack/spec check:generated: 1 of 14 stale (check:docs); check:generated --fix under the lock: VERDICT command-exit 0, re-check '✓ check:docs'. pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 over the six spec test files mentioning titleFormat (expression-dialect-docs.pin, typed-expression-envelope-dialect, io-node-config, compose-stacks-collection-pipe-arm, compose-stacks-merge-config-object-refusal, metadata-form-zod-reconciliation): 'Test Files 6 passed (6)', 'Tests 267 passed (267)', VERDICT command-exit 0 (the reconciliation file alone first: 1 file, 76 passed). pnpm --filter @objectstack/spec typecheck (tsc + check:scripts-typecheck + check:test-typecheck): VERDICT command-exit 0. Declared narrowing: the spec suite is 779 files, over the foreground cap; only the reconciliation note pins the changed text and no test reads the titleFormat describe; CI's Test Core runs it. No ablation: no tested behaviour changed (describe string, ledger-note prose, skill text).",
      "gates": "Derived on the final commit: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; stderr: derived from the tree at commit e74783922): 119 commands, each run from the worktree root with the exit code captured before any pipe into 'COMMAND :: exit N'. --ran verdict: '✓ dispatch-gates --ran: 119 derived famil(ies) accounted for — 118 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. 118 exit 0, among them check:docs, check:generated, check:skill-docs, check:skill-refs, check:skill-examples (exit 0 after building @objectstack/client-react and @objectstack/client, its declared prerequisite; first run exit 3), check:skills-token-ratchet, check:skill-identifier-liveness, check:skill-frame-sync, check:skill-compatibility, check:doc-authoring, check:doc-formula-expressions (exit 0 after building @objectstack/formula and @objectstack/lint; first run exit 3), check-empty-changeset, check-changeset-no-major, check-adr-0087-registration, check:nul-bytes, check:pm-governed-merges, check:api-surface, check:authorable-surface. NOT MEASURED: pnpm check:dual-build-cjs-loads, exit 3 PREREQUISITE NOT MET (reads every package's dist, a whole-repo build); CI runs it. Outside the derivation, run by hand: node scripts/check-skills-token-ratchet.mjs before the payment (✗ SKILL.md over by 48) and after (✓ 54 authored files within ceilings). PR check-runs on e747839220 at 07:06Z: 25 total — 'No other open PR may claim the same issue' completed/success; '18.x upgrade harness (opt-in)' and 'Packed-tarball smoke (opt-in)' completed/skipped; the other 22 in_progress (Governed Surface Queue Guard, Lint · ESLint, Lint · repo & tooling gates, Lint · docs & code guards, Lint · CI, release & engine gates, Lint · PM dispatch-gates, Lint · scoped ×3, Type Check · workspace / source gates / consumer gates / debt ledger, Check Changeset, Check PR Size, Check Documentation Links, Flag docs affected by code changes, Spec property liveness, The card this PR closes must claim this branch, Part-of PR must not also close its card, No other open PR may claim the same single-writer path, filter). Not re-run locally; in_progress is the honest value at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called; reads were gh api GETs (issue 25129, its comments, comment 6308445871, PR 25127 and its files, PR 25183, its head's check-runs)",
      "api_writes": "0 direct REST writes. Two relay strokes (scripts/pm/fleet-write/dispatch.mjs, as objectstack-fleet[bot]): stroke 1 fw-20261022T070404Z-14fbdc = POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/pulls (draft, body 11434 bytes read back identical) + POST /repos/objectstack-ai/objectstack/issues/25183/assignees (os-bill) + the relay's own governed-review follow-up POST /repos/objectstack-ai/objectstack/pulls/25183/requested_reviewers (hotlong, os-zhuang); stroke 2 = POST /repos/objectstack-ai/objectstack/dispatches executed as POST /repos/objectstack-ai/objectstack/issues/25129/comments (this report). Git: 4 pushes to the branch (empty probe, then 3 commits), not REST writes. No labels sent.",
      "deviations": [
        "The first commit carried a model-named co-author trailer (the harness attribution reminder's form); the pre-push hook refused it (check:commit-card-trailers); the unpublished tip commit was reworded to the model-free pair and pushed. No published history rewritten.",
        "Spec test run narrowed to the six files mentioning titleFormat (6/779); declared above; CI's Test Core runs the suite.",
        "pnpm check:dual-build-cjs-loads NOT MEASURED (exit 3, needs every package's dist); CI runs it.",
        "One lock attempt (client SDK build) returned exit 99 after 540 s, holder pid 4636 (pnpm --filter @objectstack/dogfood test, 682 s); the retry under the same OS_VERIFY_LOCK_SLOT acquired after 405 s but outlived the harness's 600 s tool cap and was moved to the background by the harness; its output file read 'Tasks: 37 successful, 37 total', 'VERDICT command-exit 0', exit 0. Unlocked gate chunks filled the wait.",
        "The 119 derived gates ran in ten foreground chunks across separate calls (each under the cap), appended to one ran.list; two gates re-run after their declared prerequisite builds (recorded exit 3 lines replaced by the re-run's exit 0, the first readings noted here).",
        "origin/main gained three commits after the base (82cfaf792, c24203f9d, 68a57ad99) touching none of this PR's paths; no pre-PR merge of main was done, so the local readings are on the branch tree, not a merge tree; the PR's own CI runs the merge ref.",
        "The changeset is one file naming both @objectstack/spec patch and @objectstack/skills patch (the dispatch's suggested route named only the spec package; H4 measured the skill half as published)."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — the nameField TSDoc in object.zod.ts lists '(text / autonumber / formula→text)' among 'real stored' title fields, D1's wording the ADR-0079 addendum qualifies without editing; it prescribes nothing for a composite title (observation, 抛光 class, Acceptance notes only).",
        "carrier: none · noted, not filed — the old sentence survives in packages/*/CHANGELOG.md (release-owned) and in two test docblocks describing landed in-repo migrations (service-messaging notification-display-title.test.ts:18, platform-objects identity-display-title.test.ts:17); the card excludes the in-repo display_title formula packages and the HotCRM card."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25183 comment 6335512081 · contract review 6335473304 (PASS, CONTRACT_REVIEW_TIER, head e747839220) · Tier H: approved by os-zhuang on that head and queued by the approver · domain:spec seat 1 · session session_01T1Y1g92DfSEz93iuCisju4 · 2026-10-22T07:43Z. This seat follows it to MERGED.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 1 · session session_01T1Y1g92DfSEz93iuCisju4 · 2026-10-22T08:28Z

    probe reading
    PR #25183 merged through the queue; merge commit 7f5b19d44f13f9230607c1cfe002d790f6a9b830 (Tier H, approved by os-zhuang on the reviewed head)
    origin/main carries it (merge-base --is-ancestor exit 0). The new titleFormat wording hits 1 in packages/spec/src/data/object.zod.ts; "client compute hint" hits 0 in skills/objectstack-data/rules/relationships.md
    merge-queue branches no gh-readonly-queue/main/pr-25183-* ref remains
    lane recount 10 open domain:spec cards. #25129 is gone, as expected. #24957 closed at 06:15Z through its own seat-3 landing, not this merge. #25168 and #25189 are new arrivals

    State: closed completed by Fixes #25129; pm:dispatched removed in this act (domain:spec, area:records and the type label stay).


    Generated by Claude Code

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:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions