Skip to content

lint: page sorts naming an unknown field get no reader on element dataSource.sort / app page record.sort, and stay warning elsewhere while the door answers 400 #30093

Open

Description

@objectstack-fleet

domain:server#6 · os-support-ai · session_01WGufzibcN9oHa8kDbTTnL5

Filed from PR #30084 (card #30023, lint judges stored sorts), contract review PASS at c745679c, 2026-11-04. ⛔ Not a claim. Triage sets the grade.

Business reason: the existence check on stored page sorts is uneven, and older than #30084.

  • validate-page-field-bindings reads a block's sort and interfaceConfig.sort, but only at warning.
  • Nothing reads an element's dataSource.sort or an app page's record.sort for an unknown field name.

Either way the page publishes green, and its first read answers 400 INVALID_SORT at the list door. The author learns of the problem from a broken page instead of from os validate or the publish door.

Reader who acts: packages/lint owner (validate-page-field-bindings.ts, validate-sortable-fields.ts).

What to do

  • Add page-field-unknown readers for element dataSource.sort, parentDataSource.sort and app page record.sort, bound to the same object the renderer reads (dataSource.object ?? block prop, and interfaceConfig.source ?? page.object).
  • Decide the severity of an unknown sort field on every page slot. The door answers 400, so error matches the read. A warning-to-error move is a narrowing and owes its ADR-0087 disposition.

Dedupe: page sort unknown field, page-field-unknown sort severity. New.

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-04T13:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    Claim: PM loop round 2
    Session: session_01Utp6CbPxYq1wQmUNWvMZkC (seat) · dev = project card thread session_01Utp6CYvKbGaAgjBLQdkwPB
    Account: os-bill
    Branch: claude/project-thread-ru7gx5
    Worktree: objectstack-issue-30093
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/lint/src/validate-page-field-bindings.ts, packages/lint/src/validate-sortable-fields.ts, their tests, one door-level test in packages/metadata-protocol, one changeset — stop on breach; explain in the report.
    Container & model: M, mode:thread, model: default judgment tier (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high (M)
    Clause-②: no (narrowing) — an unknown sort field on a page slot moves from silent or warning to error; owes one contract-review-tier review before the queue.
    Metadata-protocol: narrowed
    Responsibility: packages/lint page-field readers miss element dataSource.sort / app page record.sort | the list door answers 400 INVALID_SORT at read, too late for the author | any page author; measured beside #30084
    Thread-read: 6632471866
    Premise: holds
    Serial constraints cleared: #30095 (same suite) held serial behind this card by this seat; #30005 (PR #30231, same package, different files) in flight on this seat — merge main before the PR.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CYvKbGaAgjBLQdkwPB

    os-dev-report

    {
      "issue": 30093,
      "status": "done",
      "branch": "claude/project-thread-ru7gx5",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30270",
      "session": "session_01Utp6CYvKbGaAgjBLQdkwPB",
      "head": "df13535218c10a428edd8c6c4d62a6f123b9ddc4",
      "premise_still_valid": true,
      "summary": "Every stored page sort slot (element dataSource.sort, a related list's sort and parentDataSource.sort, each PAGE_BLOCK_SORT_OBJECT_PROP block's own sort, interfaceConfig.sort, an app page's record.sort) is now asked existence (page-field-unknown, error), provenance (page-field-unprovisioned, warning) and sortability (sort-field-unsortable, unchanged) by validateSortableFields, bound to the object each slot's renderer reads. That member already declares page in runtimeTypes, so the page publish door refuses the save 422 INVALID_METADATA; validatePageFieldBindings (CLI only) no longer reads a page sort, so each slot has one reader. Narrowing: changeset minor on @objectstack/lint with BREAKING banner and adr-0087 not-required (no-migration-prescription).",
      "tests": "lint: Test Files 193/193, Tests 8001/8001; lint typecheck exit 0. metadata-protocol: Test Files 312 passed 4 skipped, Tests 22360 passed 26 skipped; typecheck exit 0. New: sortable suite #30093 describe (7 cases, rule+path+severity on all nine slots), page-field-bindings two cases reworked, door describe #30093 (5 refusals 422 INVALID_METADATA + control). Reverse verification: lint sources restored to origin/main -> 8 failed/122 passed; lint rebuilt from them -> door 5 failed/1 passed (control green); restored with git checkout HEAD, status clean.",
      "gates": "dispatch-gates --commands (58 families, tree df135352) all exit 0 after full turbo build; --ran: 58 derived, 58 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "df135352 · VERDICT command-exit 1 · Test Files 1 failed 418 passed 3 skipped (422) · Tests 1 failed 3487 passed 36 skipped · failure: permission-set-clone-door.dogfood.test.ts 'a platform set ... copies into its shipping package's pair' (422, permission my_member_baseline grants on sys_comment not defined) — pre-existing main-red: main 6f095b9c Dogfood Regression Gate (2/3) job 127024968149 fails the same test; this diff touches no permission/object/clone path.",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls via fleet-write run 41967303603, draft, no assignees, body read back identical 11659 B); this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30093/comments via post-stamped). Plus 2 git pushes (WIP 077b387c, then merge df135352).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat · noted, not filed — packages/lint/src/reference-integrity-suite.ts (validateSortableFields member note) and packages/lint/src/authoring-rules.ts (page crossing note) still say the page crossing judges a page sort by the sortability projection alone; outside the claimed file surface, left as is.",
        "carrier: seat · main-red, not this card — dogfood permission-set-clone-door 'platform set copies into its shipping package's pair' red on main 6f095b9c."
      ]
    }

    Report taken 2026-11-05T04:22Z.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    Claim amendment · 2026-11-05T04:36Z · file surface widened for the patch round on PR #30270.

    • Added: content/docs/deployment/validating-metadata.mdx (§5 still lists a record:related_list's sort under the advisory page-bindings rule; after this PR an unknown page sort field is page-field-unknown at error and a 422 at the page publish door), and comment-only edits in packages/lint/src/reference-integrity-suite.ts and packages/lint/src/authoring-rules.ts (they still say page traversal judges sortability only).
    • Reason: contract review on head df135352 (FAIL, record 6649790600 on the PR) found Skills-docs: none false (M1) and the two comments stale (S1); both are fixed here rather than carried.
    • Unchanged: Clause-②: no (narrowing), Metadata-protocol: narrowed, branch claude/project-thread-ru7gx5.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions