Skip to content

[finding] form-view.ts spec bridge also reads spec.defaultSort — the same dormant-read shape as #3901, on the sibling key #3901's scope explicitly excluded #3974

Closed

Description

@os-project-manager

Observation-class finding from the axis-③ liveness audit (ledger claims vs measured objectui readers). Nothing breaks today — filed so it is recorded rather than rediscovered, unassigned for triage. #3901 covers the spec.aria read at :193 and states under "Not in scope": "Other spec.* reads in this bridge; only aria was measured." This card is that measurement for the sibling key. Ledger verdict vs measured reader disagree — not prescribing which side is right (same delete-vs-document fork, and the same unmeasured non-validated-input precondition, as #3901).

Audited revisions (E24)

  • objectui origin/main @ 5bfaabde05c3876c9604a2aa47f4822f9e6de8b5
  • objectstack origin/main @ 4ac12ef4cfe4a1925fb7e950c56d7aff0bbc5381

Both read via git fetch + git archive of origin/main, not working trees.

The finding

packages/react/src/spec-bridge/bridges/form-view.ts:188:

  if (spec.defaultSort) node.defaultSort = spec.defaultSort;

(the local FormViewSpec mirror still declares it at :81, defaultSort?: any;)

objectstack's ledger row packages/spec/liveness/view.json → props.form.children.defaultSort (status: "dead", verifiedAt: "2026-07-30"):

"REMOVED 2026-07-30 (#3896 close-out sweep) — tombstoned at the schema (retiredKey carries the prescription; authoring it is a tsc error and a parse error) and stripped from sources by the protocol-17 close-out conversion. … a related list sorts by its own list view's sort."

Same dormancy analysis as #3901: retiredKey() rejects at parse, so spec.defaultSort is always undefined for any validated FormView and the guard is unreachable — unless some path feeds the bridge a non-validated object (stored pre-17 documents, fixtures), which was not measured here either.

One difference from the aria sibling

Downstream is also empty as far as measured: no object-form renderer consumer of node.defaultSort was found (plugin-view/src/ObjectView.tsx:848 and plugin-grid/src/ObjectGrid.tsx:637 read defaultSort on the table/grid schema surface, not the form node; plugin-detail/src/RelatedList.tsx takes it as a component prop). So the bridge line copies a parse-rejected key onto a node key nothing reads — dormant at both ends.

Dedup

Suggested direction (non-binding)

Whatever disposition #3901 gets after its promotion gate ("measure the non-validated-input paths") almost certainly applies verbatim here; cheapest is to handle both lines in the same card/PR.

Suggested lane: same as #3901 (spec-bridge hygiene, objectui react package).

Provenance: cross-repo read-only audit, session https://claude.ai/code/session_018ffcE95NaMJcL9XJ9VDYgk

Activity

  1. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Finding-triage ruling: Hold (why still held): verbatim sibling of #3901 — spec.defaultSort at form-view.ts:188 beside #3901's spec.aria at :193, the same dormant-read shape — cheapest resolved together. Restart: #3901's recorded promotion gate (measure non-validated-input paths), then one XS card deletes both lines.

    Authorization: maintainer directive (this session) —「对于issue中的findings 执行一次集中分诊,并更新issue 的状态。」Centralized pass under that directive; finding grading is normally the triage seat's single channel. Round: objectstack#4949 finding-triage, 2026-08-10.
    Session: 01JaVVMrSxt7Tgi1uwEuDtH7


    Generated by Claude Code

  2. claude commented on Aug 10, 2026

    @claude
    Contributor

    Findings triage (re-verify @ origin/main da81093): HOLD — form-view.ts:188 still reads spec.defaultSort while the objectstack ledger row says the key is tombstoned; the delete-vs-document fork and the unmeasured non-validated-input precondition are the same as sibling #3901, so the two should be graded together. finding stands.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. claude commented on Aug 11, 2026

    @claude
    Contributor

    Findings cadence (triage seat): HOLD — re-verified on origin/main @ e1ade8f: the bridge still reads spec.defaultSort (packages/react/src/spec-bridge/bridges/form-view.ts:188) with the local mirror declaring it (:81), while objectstack's ledger row says dead. Ledger-vs-measured-reader fork unresolved; grade together with ui#3901 (same file, same shape) — one ruling decides both.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. claude commented on Aug 11, 2026

    @claude
    Contributor

    Maintainer ruling — 2026-08-11. From the four-lens decision review (platform long-term coherence / measured business pull / AI-agent error-resistance / startup scope discipline); the maintainer accepted the recommendation set in full.

    Ruling: enforce-or-remove. Same ruling as pair card objectui#3901, applied to spec.defaultSort: verify the ledger's dead verdict producer-side, then remove the bridge read at form-view.ts:188 and the FormViewSpec mirror at :81. One PR, both keys, Fixes both cards. State: finding → pm:queue.

    Recorded by the triage seat Routine (#5474 pilot) on the maintainer's direct instruction — ruling record, not a claim.


    Generated by Claude Code

  5. self-assigned this
    on Aug 16, 2026
  6. yinlianghui commented on Aug 16, 2026

    @yinlianghui
    Collaborator

    【认领】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt)批次 11 派发,与 #3901 一 PR 双关(维护者 2026-08-11 裁定),分支与执行序见 #3901 认领评论。


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions