Skip to content

lint: the object publish door does not run validateSortableFields, so an object whose listViews sort a sortable:false field saves #30095

Closed

Description

@objectstack-fleet

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

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

Business reason: validateSortableFields names the runtime types view and page, but not object. So an object write that declares sortable: false on a field and also sorts on that field in one of its own listViews.*.sort saves through the publish door, and that list view then fails at read with 400 INVALID_SORT. os validate already catches it. The runtime door does not.

Reader who acts: packages/lint owner (reference-integrity-suite.ts, authoring-rules.ts).

What to do

Dedupe: object door validateSortableFields, listViews sort sortable false. 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:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 4, 2026
  3. 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_01Utp6CXQyiKbpV3REQxogrr
    Account: os-bill
    Branch: claude/project-thread-e4pw2l
    Worktree: objectstack-issue-30095
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/lint/** + its tests + metadata-protocol door tests — 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) expected — BREAKING, CONTRACT_REVIEW_TIER review owed
    Metadata-protocol: none
    Responsibility: ours — packages/lint is the lane's, no other owner
    Thread-read: 6632461997
    Premise: holds
    Serial constraints cleared: after PR #30270 merges (in merge queue); measure-only until then

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CXQyiKbpV3REQxogrr
    os-dev-report

    {
      "issue": 30095,
      "status": "done",
      "branch": "claude/project-thread-e4pw2l",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30564",
      "session": "session_01Utp6CXQyiKbpV3REQxogrr",
      "premise_still_valid": true,
      "summary": "validateSortableFields now declares object in its runtimeTypes (packages/lint/src/reference-integrity-suite.ts), so the object publish door refuses 422 INVALID_METADATA an object whose built-in listViews.*.sort names a sortable:false field, a formula, or an unknown name (sort-field-unsortable / sort-field-unknown, error, at objects.NAME.listViews.KEY.sort[i]); nothing is stored. Reproduced on fa9c0aa2 and c045c341 first: the door saved such an object while validateReferenceIntegrity reported sort-field-unsortable. Rollout measured per the #15254 note on c045c341: 127 objects from 122 *.object.ts files, 45 with 102 list views and 113 sort keys, 0 findings through runRuntimeAuthoringRules (type object, other objects as context); synthetic probe drew the rule and not the door. authoring-rules.ts untouched (the entry already lists object). Head 0e5a281c.",
      "tests": "head 0e5a281c. lint test: 195/195 files, 8086/8086 tests; lint typecheck exit 0. metadata-protocol test: 316 passed 4 skipped files, 22434 passed 26 skipped; typecheck exit 0. New pins: runtime-gate.object-writes.test.ts member-surface pin + 3 refusals + CONTROL (41/41); protocol.runtime-authoring-gate.test.ts #30095 describe through saveMetaItem: sortable:false 422 INVALID_METADATA, rule sort-field-unsortable at error at the sort key path, rulesRun has validateReferenceIntegrity, no active row; unknown name 422 sort-field-unknown; CONTROL sortable fields save (3/3). Ablation (ablation-replace.mjs, object -> marker ablate30095, lint rebuilt, dist-preflight marker in 4 built files): object-writes 4 failed/37 passed, door -t 30095 2 failed/1 passed; restored blob==HEAD, git diff HEAD empty, lint rebuilt, preflight --absent clean on 20 files, tree clean, door 3/3 green.",
      "gates": "dispatch-gates --ran: 58 derived, 58 run, 0 NOT-MEASURED, all exit 0 (dts-closure, dual-build-cjs-loads, lean-entry-closure, type-check-debt first exit 3/1 while the dogfood closure build ran beside them and before a full build; re-run after turbo run build --filter=!@objectstack/docs: exit 0; plugin-teardown-shape --self-test exit 3 on shallow history, 0 after fetching 621a4876). spec check:liveness exit 0. pnpm lint exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "0e5a281c · os-verify-lock VERDICT command-exit 0 · Test Files 420 passed, 3 skipped (423) · Tests 3496 passed, 36 skipped (3532) · no failures",
      "mcp_calls": "12 — read-only: issue_read x4 (get, get_comments x3), pull_request_read x3 (get x2, get_status), list_pull_requests x3, get_job_logs x2; no write tool",
      "api_writes": "2 landed — relay pr_create POST /repos/objectstack-ai/objectstack/pulls (#30564), post-stamped os-dev-report comment POST /repos/objectstack-ai/objectstack/issues/30095/comments. Two earlier relay pr_create dispatches (runs 42060906539, 42060996453) each failed HTTP 500 at GitHub with nothing stored (pulls?head= read back [] both times); the third (42061079909) landed.",
      "open_questions": [
        {
          "question": "Metadata-protocol: none (the claim's line, copied) vs narrowed (#30270's choice for the same family)?",
          "options": [
            "A keep none: os validate/build/lint already refused this sort, so what an author may write is unchanged; only the runtime door's accept set narrows, which the (narrowing) arm and BREAKING banner carry; patch",
            "B narrowed: the door refuses a value it accepted; changeset goes minor and the PR body line changes"
          ],
          "recommendation": "A, because the authorable set is defined by the CLI verdict and that did not move"
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Report taken 2026-11-05T16:05Z.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    ACCEPT → PR #30564 comment 6663480689 · 2026-11-05T16:35Z · ready + auto-merge (BREAKING narrowing, not governed, 180 lines; contract review 6663292380 PASS at 0e5a281c; dogfood battery pinned to the head). Follow-up: #30574 (four-doors table in validating-metadata.mdx).

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    Landing

    Probe Reading
    PR #30564 merged 2026-11-05T17:03Z, merge commit c133cfe14
    Head reviewed 0e5a281c; contract review PASS 6663292380, seat record 6663480689; dogfood battery pinned to the head
    Card closed completed by the merge; pm:dispatched removed
    Wrongly closed cards none
    Follow-ups #30574 (four-doors table in validating-metadata.mdx)

    Landed · 2026-11-05T17:05Z.

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:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions