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
An app cannot give each audience its own landing page #28022
Filing gate: ③ triage-directed. The order on #27386 said: take what is ui-only, card the rest. The card thread measured each row on origin/main (report 6518223407, out_of_scope_findings). Rows 2 and 4 are taken in PR #28017.
Reach: any app shared by more than one audience. In HotCRM, moving Sales above Service moves service staff's landing to Leads (#27386 row 5).
Reader who acts: domain:spec first (the app or manifest key), then domain:ui (the console landing redirect).
Duplicate search: search_issues "app landing page per audience persona visible predicate navigationContributions position" → #23610 (closed, PageTypeSchema wording), not this.
Observed
An app's landing is its first shown navigation entry. homePageId is retired, and manifest navigationContributions only append.
Wanted
Spec: either a new app key (for example a landing list with visible predicates, first match wins), or contributions that declare a position. Landing: packages/specui/app.zod.ts, or the kernel manifest.zod.tsnavigationContributions.
Ruling: batch 2026-10-31 item 3 · letter A · maintainer 「同意」 2026-10-31T15:12Z
The maintainer answered the consolidated decision list of 2026-10-31 (items 1–9, every item as recommended) with 「同意」 at 2026-10-31T15:10Z, in the project's decisions thread. Item 3 is this card.
A (ruled): the app gains a landing list key; each entry carries a visible predicate, and the first entry whose predicate holds is the landing.
B (not taken): reuse navigationContributions with a declared position, no new key.
Work for A: one new spec key on ui/app.zod.ts with the usual spec-to-ui ripple (liveness row, lint of the predicate, docs), then the console landing redirect reads it. Order: spec first (this card, seat 2), then a domain:ui card for the redirect.
Claim: PM loop round 5
Session: session_01L9qibx5r5nhDMwpRs4SL6D
Account: os-tesla
Branch: claude/project-thread-9ddkwd (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-28022
Domain: domain:spec
Seat: domain:spec#2
File surface: packages/spec/src/ui/app.zod.ts + tests, packages/spec/liveness/* app row, the lint expression check for the new slot, docs pages listing app keys, the tables the gates force, a @objectstack/spec changeset. ⛔ no ui/**, no docs/adr/**, no governed path (stop on breach; explain in the report)
Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high; landing: seat after the lane contract review (not governed unless an ADR amendment is forced; then Tier H, stop and report)
Clause-②: yes (widening: one optional app key, a landing list with visible predicates)
Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: 6545223246
Premise: holds (re-read at origin/main5da3a8ce; the gap named on the card is still there)
Serial constraints cleared: none (no open PR touches ui/app.zod.ts app keys at claim time)
Ruling-ref: maintainer 「同意」 (2026-10-31T15:10Z), ruling 6545223246, letter A; dispatch authority = the maintainer's 「p3 也可以开发」 (2026-10-30T12:41Z) and 「每个座位并发可以5」 (2026-10-30T15:04Z); order: /mnt/project-files/spec-seat-2/r2026-10-30/dispatch-28022.md
Dispatched 2026-10-31T15:19Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
File surface: + one test-only line in ui/packages/types/src/__tests__/spec-object-refinements-7715.test.ts: the "SpecAppFields → AppComponentSchema" row gains notAttachable: ['appLandingItemsResolve'], owed to the follow-up domain:ui landing card. Forced by the census gate (Test UI, a required context): the new AppSchema object-level refusal of a dangling landing[].item is not attached to objectui's AppComponentSchema in this PR. ⛔ Still no ui/** source edit; attaching the refinement rides the ui card.
{
"issue": 28022,
"status": "pr_open",
"branch": "claude/project-thread-9ddkwd",
"pr": 28449,
"head": "1308512cc0d6e8f9d4f4358f541f94ac028b0f74",
"session": "session_01L9qibwXXtueDQZXqxv2FsL",
"premise_still_valid": true,
"summary": "Spec half of ruling A: AppSchema.landing [{ item, visible }], first match wins, no match opens the first navigation item by order. checkAppLandingItems (superRefine, exported) refuses at parse an item naming no entry of navigation or areas[].navigation, an item naming a group/separator/action, and a visible reading data. Lint judges each landing predicate at os validate/os build. Liveness row planned + authorWarn; docs section; changeset spec+lint minor.",
"tests": "spec app-landing.test.ts 14 new; lint validate-expressions landing case + read-surface rows; ablations: superRefine mount removed -> 5 failed, lint check removed -> 2 failed",
"gates": "dispatch-gates --ran: 108 derived, 108 run, 0 NOT-MEASURED (5 lines rerun after fetching the teardown pinned sha and a full dts build). After merging main: generated ui artifacts regenerated, check:generated + targeted spec/lint/metadata-protocol/ui census/dogfood tests exit 0 at 1308512c.",
"dogfood_battery": "n/a",
"mcp_calls": {
"writes": 0,
"reads": [
"issue_read get",
"issue_read get_comments"
]
},
"api_writes": [
"fleet-write pr_create #28449 (run 41221928886)"
],
"open_questions": [],
"follow_up_owed": "domain:ui landing card: console landing redirect, liveness landing -> live, attach checkAppLandingItems to objectui AppComponentSchema and drop the notAttachable line in ui/packages/types/src/__tests__/spec-object-refinements-7715.test.ts, re-classify dogfood row cel-app-landing. PR body line awaits the seat's card number.",
"out_of_scope_findings": [
"validateStackExpressions does not list app in its runtimeTypes, so a landing predicate's CEL syntax is judged only at os validate/os build, not at the app save door (parse refusals do run there).",
"No root verdict on the landing predicate: reading record.x passes lint; the console card decides the evaluation scope."
]
}
Activity
objectstack-fleet commentedon Oct 31, 2026
domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D
Ruling: batch 2026-10-31 item 3 · letter A · maintainer 「同意」 2026-10-31T15:12Z
The maintainer answered the consolidated decision list of 2026-10-31 (items 1–9, every item as recommended) with 「同意」 at 2026-10-31T15:10Z, in the project's decisions thread. Item 3 is this card.
visiblepredicate, and the first entry whose predicate holds is the landing.navigationContributionswith a declared position, no new key.Work for A: one new spec key on
ui/app.zod.tswith the usual spec-to-ui ripple (liveness row, lint of the predicate, docs), then the console landing redirect reads it. Order: spec first (this card, seat 2), then adomain:uicard for the redirect.objectstack-fleet commentedon Oct 31, 2026
domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D
Claim: PM loop round 5
Session:
session_01L9qibx5r5nhDMwpRs4SL6DAccount:
os-teslaBranch:
claude/project-thread-9ddkwd(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28022Domain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/ui/app.zod.ts+ tests,packages/spec/liveness/*app row, the lint expression check for the new slot, docs pages listing app keys, the tables the gates force, a@objectstack/specchangeset. ⛔ noui/**, nodocs/adr/**, no governed path (stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT,effort: high; landing: seat after the lane contract review (not governed unless an ADR amendment is forced; then Tier H, stop and report)Clause-②: yes (widening: one optional app key, a landing list with
visiblepredicates)Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: 6545223246
Premise: holds (re-read at
origin/main5da3a8ce; the gap named on the card is still there)Serial constraints cleared: none (no open PR touches
ui/app.zod.tsapp keys at claim time)Ruling-ref: maintainer 「同意」 (2026-10-31T15:10Z), ruling 6545223246, letter A; dispatch authority = the maintainer's 「p3 也可以开发」 (2026-10-30T12:41Z) and 「每个座位并发可以5」 (2026-10-30T15:04Z); order: /mnt/project-files/spec-seat-2/r2026-10-30/dispatch-28022.md
Dispatched 2026-10-31T15:19Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
objectstack-fleet commentedon Oct 31, 2026
domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D
Amends claim 6545300407 · 2026-10-31T15:38Z
File surface: + one test-only line in
ui/packages/types/src/__tests__/spec-object-refinements-7715.test.ts: the "SpecAppFields → AppComponentSchema" row gainsnotAttachable: ['appLandingItemsResolve'], owed to the follow-updomain:uilanding card. Forced by the census gate (Test UI, a required context): the newAppSchemaobject-level refusal of a danglinglanding[].itemis not attached to objectui'sAppComponentSchemain this PR. ⛔ Still noui/**source edit; attaching the refinement rides the ui card.objectstack-fleet commentedon Oct 31, 2026
domain:spec#2 · os-tesla · session_01L9qibwXXtueDQZXqxv2FsL
os-dev-report
{ "issue": 28022, "status": "pr_open", "branch": "claude/project-thread-9ddkwd", "pr": 28449, "head": "1308512cc0d6e8f9d4f4358f541f94ac028b0f74", "session": "session_01L9qibwXXtueDQZXqxv2FsL", "premise_still_valid": true, "summary": "Spec half of ruling A: AppSchema.landing [{ item, visible }], first match wins, no match opens the first navigation item by order. checkAppLandingItems (superRefine, exported) refuses at parse an item naming no entry of navigation or areas[].navigation, an item naming a group/separator/action, and a visible reading data. Lint judges each landing predicate at os validate/os build. Liveness row planned + authorWarn; docs section; changeset spec+lint minor.", "tests": "spec app-landing.test.ts 14 new; lint validate-expressions landing case + read-surface rows; ablations: superRefine mount removed -> 5 failed, lint check removed -> 2 failed", "gates": "dispatch-gates --ran: 108 derived, 108 run, 0 NOT-MEASURED (5 lines rerun after fetching the teardown pinned sha and a full dts build). After merging main: generated ui artifacts regenerated, check:generated + targeted spec/lint/metadata-protocol/ui census/dogfood tests exit 0 at 1308512c.", "dogfood_battery": "n/a", "mcp_calls": { "writes": 0, "reads": [ "issue_read get", "issue_read get_comments" ] }, "api_writes": [ "fleet-write pr_create #28449 (run 41221928886)" ], "open_questions": [], "follow_up_owed": "domain:ui landing card: console landing redirect, liveness landing -> live, attach checkAppLandingItems to objectui AppComponentSchema and drop the notAttachable line in ui/packages/types/src/__tests__/spec-object-refinements-7715.test.ts, re-classify dogfood row cel-app-landing. PR body line awaits the seat's card number.", "out_of_scope_findings": [ "validateStackExpressions does not list app in its runtimeTypes, so a landing predicate's CEL syntax is judged only at os validate/os build, not at the app save door (parse refusals do run there).", "No root verdict on the landing predicate: reading record.x passes lint; the console card decides the evaluation scope." ] }