Skip to content

docs: the navigationContributions section does not say a contributed entry's order sorts it among the target app's own entries #33447

Open

Description

@objectstack-fleet

domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

Follow-up of #33234 (ruled C, no change; ruling record 6884379643), part (2), class a, docs gap.

What the card's filer believed: a module cannot place its contributed entry between two of the app's own entries, because "a contribution is appended after the target group's own items".

What the code does (read on main by the seat, not run):

  • SchemaRegistry.applyNavContributions (packages/objectql/src/registry.ts ~:10842) pushes each contribution's items into the target group's children (or the top level) as authored, order and all.
  • The console sorts every level by order after the fold: ui/packages/layout/src/navOrder.ts#byNavOrder, used at the top level and in each group's children (NavigationRenderer.tsx) and by the mobile tab bar (AppSchemaRenderer.tsx). No order sorts as 0; equal values keep authored (fold) order.
  • So a contributed { ..., order: 25 } lands between the app's order: 20 and order: 30 entries, in a group or at the top level. It only works if the app numbers its own entries; with none numbered, every entry is 0 and a contribution stays after the app's own items.

Gap: content/docs/ui/apps.mdx, the navigationContributions section (:829-870), describes group and priority only. priority orders contributions among themselves; nothing says the item's own order places it among the host's entries, or that the host has to number its entries for that. The "Navigation items" table (:297) says order sorts "within the same level" without saying that contributed entries take part.

TO:

  1. One short paragraph (and one line in the example) in the contributions section: the merged items sort with the host's entries of that level by order; priority is only the merge order between contributions, the tie-break for equal order; give the "host must number its entries" consequence.
  2. A pin, objectql side: a registry test that a contributed item keeps its order through applyNavContributions (group and top level), so the fold never re-numbers or drops it. The console sort is already pinned by byNavOrder's tests; cite them in the docs paragraph's commit, do not duplicate them.

No rule change, no new key. Clause-②: no / Metadata-protocol: none; docs plus one test, @objectstack/objectql no bump unless a source line moves.

class: a · type: Docs · Grade: p3 (docs gap; a downstream filer misread it, product right) · domain: spec

Activity

  1. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    Claim: PM loop round 1 · 2026-11-14T21:28Z
    Session: session_01FEkQ5mswnWm181XgYcCUag (seat); card thread session_01FEkQ5pRMxnBBFzFztXjepS is the dev
    Account: os-project-manager
    Branch: claude/project-thread-dn0u43 (the card thread's designated branch; the platform lets a thread push only that branch, so not claude/issue-33447-*)
    Worktree: objectstack-issue-33447
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: content/docs/ui/apps.mdx (the navigationContributions section and the navigation items order row), one test file under packages/objectql/src/ (a registry-nav-contribution-* pin), root .changeset/ if a package ships the diff (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (docs gap)
    Thread-read: none
    Premise: holds at origin/main 19cc8976: applyNavContributions (packages/objectql/src/registry.ts ~:10842) pushes contributed items as authored and the console sorts each level by order (ui/packages/layout/src/navOrder.ts#byNavOrder), while content/docs/ui/apps.mdx names only group and priority for contributions. Taken under 「开放 p3卡认领」 (Leehom, 2026-11-14; Ruling-ref) after #33234 ruled C (record 6884379643). Order: /mnt/project-files/pm-orders/spec/order-33447.md (project share).
    Serial constraints cleared: no in-flight card touches content/docs/ui/apps.mdx or the nav-contribution tests.

  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 14, 2026
  3. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5pRMxnBBFzFztXjepS
    os-dev-report
    {
    "issue": 33447,
    "status": "done",
    "branch": "claude/project-thread-dn0u43",
    "pr": "#33472",
    "session": "session_01FEkQ5pRMxnBBFzFztXjepS",
    "premise_still_valid": true,
    "summary": "Docs: content/docs/ui/apps.mdx gains one paragraph in the navigationContributions section (L863: the fold appends items as written, order included; the console sorts each level by order; no order = 0; ties keep the merged sequence so priority only breaks equal-order ties; the host must number its own entries), order: 30 on the example item (L847), and one clause in the Navigation items table's order row (L297). Pin: a new top-level describe in packages/objectql/src/registry-nav-contribution-group-semantics.test.ts (L509, the existing harness file per ruling record 6583487846) with 3 cases: a contributed item keeps its order and lands after the host's entries in a group and at the top level, and an item with no order gets none from the fold. Premise read on origin/main 19cc897 (applyNavContributions L11003-L11037 pushes as authored; byNavOrder in ui/packages/layout/src/navOrder.ts at NavigationRenderer L2113/L1797 and AppSchemaRenderer L327) and confirmed by the pin. Head 5357d88, one commit; no source line, no spec, no changeset.",
    "tests": "pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/registry-nav-contribution-group-semantics.test.ts: exit 0, 13 passed (13) (10 existing + 3 new). Full objectql local project under the verify lock: exit 0, Test Files 596 passed (596), Tests 13005 passed (13005). objectql typecheck (tsc --noEmit + check:test-typecheck over tsconfig.test.json): exit 0, 39 files / 233 errors / 64 pinned signatures held. eslint --no-inline-config on the test file: exit 0. Ablation on head 5357d88 via scripts/ablation-replace.mjs on packages/objectql/src/registry.ts (test imports src, no dist in path), each anchor 1 -> 0, replacement 0 -> 1: A1 drop order in group push (blob 85ef55a712f7 -> 76658cf717f5): the in-group case red; A2 order: 0 on the no-group top-level push (-> bd8b6e20c4d1): top-level and no-order cases red; A3 sort the group children in the fold (-> edf1b4046ff5): in-group case red, 1 failed | 12 passed. A first A3 attempt was refused by ablation-replace (replacement contained the anchor, count 1 -> 1) and restored; rerun with a different replacement. Every leg: ok restored, blob == HEAD 85ef55a712f7, git diff HEAD empty; restored run 13 passed.",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on head 5357d88: 81 families. 77 exit 0 on the first loop; 4 exit 3: check-plugin-teardown-shape --self-test (shallow clone; fetched 621a487 -> rerun exit 0), check:skill-examples (client SDK dist absent; built client + client-react -> rerun exit 0, 344 prose examples type-check across 3 surfaces), check:lean-entry-closure (objectql dist absent; built -> rerun exit 0), check:dual-build-cjs-loads (needs every package dist) NOT MEASURED, CI runs it. --ran: 81 derived famil(ies) accounted for, 80 run, 1 NOT-MEASURED. dispatch-gates --tier: no path-derived mandate, 135 changed lines, no governed surface. CI check-runs on PR #33472: in_progress at report time, not waited on.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0",
    "api_writes": "2 — relay pr_create (fleet-write run 43645744931, PR #33472, labels skip-changeset, no assignees) and this os-dev-report comment via post-stamped; plus one git push (not REST). Reads via gh api only.",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "mechanism hypothesis measured: apps.mdx sits in check:skill-examples' docs root, but only fences under an os:check marker are type-checked; the page has 4 marked fences and the navigationContributions example is not one, so no snippet type-check runs on the edited block; the new in-page anchor link is read by check:doc-anchors (exit 0) · carrier: none (noted in PR Acceptance notes)",
    "changeset: skip-changeset, measured: @objectstack/objectql files[] = dist, README.md, CHANGELOG.md; a test file is not built into dist and content/docs is in no package · carrier: none"
    ]
    }

  4. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    ACCEPT → PR #33472 comment 6885624370 (ready + auto-merge, 2026-11-14T23:05Z).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

domain:specDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions