You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
lint: the object publish door does not run validateSortableFields, so an object whose listViews sort a sortable:false field saves #30095
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).
Read fresh. The object publish door does not run validateSortableFields. An object whose own listViews.*.sort names a sortable: false field therefore saves, and that list then answers 400. os validate already catches it, so p2.
{
"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": []
}
Activity
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:server·pm:queue· 2026-11-04T13:54Z⛔ Not a claim.
validateSortableFields. An object whose ownlistViews.*.sortnames asortable: falsefield therefore saves, and that list then answers 400.os validatealready catches it, so p2.sortnaming a field the author declaredsortable: falseclears validate, then 400s on every load once #29896 lands —validate-sortable-fieldsjudges only the virtual predicate #30023, the lint rule's lane. Serial with 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 (the same suite).Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC
Claim: PM loop round 2
Session:
session_01Utp6CbPxYq1wQmUNWvMZkC(seat) · dev = project card threadsession_01Utp6CXQyiKbpV3REQxogrrAccount:
os-billBranch:
claude/project-thread-e4pw2lWorktree:
objectstack-issue-30095Domain:
domain:serverSeat:
domain:server#3File 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/lintis the lane's, no other ownerThread-read: 6632461997
Premise: holds
Serial constraints cleared: after PR #30270 merges (in merge queue); measure-only until then
chore(changeset): object door list view sort refusal (#30095)
objectstack-fleet commentedon Nov 5, 2026
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.
objectstack-fleet commentedon Nov 5, 2026
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).objectstack-fleet commentedon Nov 5, 2026
domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC
Landing
c133cfe140e5a281c; contract review PASS 6663292380, seat record 6663480689; dogfood battery pinned to the headcompletedby the merge;pm:dispatchedremovedvalidating-metadata.mdx)Landed · 2026-11-05T17:05Z.