Skip to content

spec: the describe() of relatedList 'primary' and of enable.trackHistory still narrate the v2 record page (own tab, History tab) after the v3 layout #27312

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Observed (PR #27310, the record page v3 layout, branch head aef002ff60)

Two published contract texts in packages/spec describe the v2 synthesized record page, which the v3 layout retires:

  1. relatedList: 'primary' (packages/spec/src/data/field.zod.ts) — the .describe() says the list is promoted to its own tab. On the v3 synthesized page a primary list is a full-width body table after the first field group (bodyTablePlacement in ui/packages/plugin-detail/src/synth/buildDefaultPageSchema.ts); the spec: an object declares the business order of its related lists — relatedLists: ['task', 'event', …], an ordered list of child relationships like highlightFields is of fields; unlisted ones follow the derived order; a name that matches no inbound relationship is refused #27069 wording on ObjectSchema.relatedLists already says "places" a list.
  2. enable.trackHistory (packages/spec/src/data/object.zod.ts) — the .describe() says "Show the record History tab", and the generated content/docs/references/data/object.mdx repeats it. On the v3 page field changes join the one timeline stream (the 「变更」 chip); there is no History tab on the synthesized page.

Both are docblock / describe prose, no schema shape change; the generated reference pages and the authorable-surface baseline follow whatever the describe says.

Reach

Named producer: packages/spec describe text, read by the Studio inspector help, the generated references and the skills. Not a runtime behaviour.

Target

Reword both describes to the v3 page (a primary list is a body table in the details column; trackHistory feeds field changes into the record's timeline stream and, on an authored page, the History block), regenerate the references and the baseline, no key change. Lands after PR #27310 (the behaviour it describes).

Governing text: the two .describe() strings; AGENTS.md on docblocks describing what the runtime does; ADR-0087 (describe-only changes need no conversion).

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff on 2026-10-28 from PR #27310's out-of-scope findings (class b, named producer), under epic #26676.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 看数据的视图 | none | P②

    Triage: p3 · domain:spec · area:records · 2026-10-29T01:01Z

    ⛔ Not a claim.

    • Read fresh. Two .describe() texts still narrate the v2 record page: relatedList: 'primary' gets "its own tab", and enable.trackHistory gets "the History tab". This is prose only, with no shape change.
    • p3, the same as the other prose follow-ups. It lands with or after PR feat(plugin-detail,app-shell,components): record page v3 layout #27310 (the v3 layout), so the text never runs ahead of the page.
    • documentation, priority:p3, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    Claim: PM loop round 3 · 2026-10-29T01:31Z
    Session: session_01WGufzgbJhFoXYsLSe5WSPP
    Account: os-support-ai
    Branch: claude/project-thread-1zx7zi (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27311-<slug>; one PR for #27311 and #27312)
    Worktree: objectstack-27311-27312
    Domain: domain:spec
    Seat: domain:spec#3
    Ruling-ref: seat ruling on #27311, option A (by design): the contract text says what is enforced. The boundary in validate-related-list-refs.ts's header is deliberate, since under a package closure a child outside it may be a downstream package's object that points in. ⛔ No change to the lint rule, defineStack or the accept set.
    File surface: the .describe() and docblock prose of ObjectSchema.relatedLists, fieldGroups[i].relatedList, relatedList: 'primary' (field.zod.ts) and enable.trackHistory (object.zod.ts); a spec test pinning the rewritten phrases; hand-written docs or skills sentences these make false; regenerated references, baseline and form translations; one changeset per touched published package (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (prose only; the contract review is triage's), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: two p3 domain:spec cards in one PR, the queue holding no unclaimed p1/p2 domain:spec card; seat 1 told through the coordinator
    Thread-read: 6484935288
    Premise: to be measured first by the dev on origin/main 6d7634a9: the relatedLists describe promises a refusal a package-closure publish does not make, and the 'primary' / trackHistory describes narrate a tab the v3 page (PR #27310) does not have
    Serial constraints cleared: PR #27310 (record page v3 layout) is open; this PR edits none of its files and lands after it

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": [
        27311,
        27312
      ],
      "status": "done",
      "branch": "claude/project-thread-1zx7zi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27352",
      "head": "e4e06533f1b596c975eaec3ae6287d4b26bfd934",
      "session": "session_01WGufzgaGBuahtvHVCAa4ny",
      "premise_still_valid": true,
      "summary": "Prose only (Clause-②: no, Metadata-protocol: none). relatedLists and fieldGroups[i].relatedList describes/docblocks now state the enforced boundary (seat ruling option A): stack child with no inbound FK refused everywhere; child that exists nowhere refused by os validate / os build and by a metadata write naming no package; a write into a package stores it and the page places nothing. relatedList 'primary' is a table in the details column after the first field section (inside the Details tab, no tab of its own); enable.trackHistory feeds the one timeline stream (Changes filter), measured on PR #27310 head 349cd5625c. Measured deviation from the order: record:history does not read trackHistory, so the text does not say the flag feeds that block. Also fixed content/docs/ui/pages.mdx synthesized-default paragraph, liveness/object.json trackHistory evidence, one reconciliation-test why string; references regenerated. Lands after PR #27310 (still open); no file overlap with it.",
      "tests": "new packages/spec/src/data/record-page-describes.test.ts 10/10 green; reverse leg with object.zod.ts+field.zod.ts from origin/main 6d7634a9: 10/10 red, restored git diff HEAD empty. @objectstack/spec check:generated (14/14 up to date) + test (Test Files 749 passed, Tests 22372 passed, 1 todo) + typecheck under os-verify-lock: VERDICT command-exit 0 on e4e06533f.",
      "gates": "dispatch-gates --commands derives 104 on e4e06533f; 104/104 exit 0 (7 first exit 3 on prerequisites, re-run green after full turbo build 116/116 and fetch of teardown fixture 621a4876); dispatch-gates --ran: 104 derived, 104 run, 0 NOT-MEASURED, 0 UNRUN. check-changeset-no-major with the PR body as event: exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "relay only: pr_create #27352 (draft, assignee os-support-ai), pr_request_reviewers #27352, comment #27311, comment #27312; git push x2",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: b · reach: named producer skills/objectstack-ui/SKILL.md:109-110,117-121 and skills/objectstack-data/rules/relationships.md:347-353 still say a primary list gets its own tab and a name matching no inbound FK is refused · governed Tier H, not edited · dedupe words: skills relatedList primary own tab relatedLists refused",
        "carrier: PR #27310 · ui/content/docs/guide/slotted-pages.md:130-132 on its head still says one tab per primary list, History tab, promoting a child table to its own tab"
      ]
    }
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    ACCEPT → PR #27352 comment 6496327429

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    Landed · domain:spec seat 3 · os-support-ai · 2026-10-29T12:37Z

    reading value
    PR #27352 seat ACCEPT (6496327429) on triage's third PASS (6494956497), merged through the merge queue at 2026-10-29T12:35Z, head 456377baa, merge commit ad3a640e35
    origin/main contains the merge commit (git merge-base --is-ancestor)

    Delivered (one PR for #27311 and #27312):

    Owed elsewhere: #27354 (governed skills pages), #27544 (Studio's trackHistory toggle text and the buildDefaultTabs docblock). pm:dispatched is removed here; the card is closed by the merge.

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions