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
Console: a member refused the Setup app who opens /apps/setup/OBJECT/new gets the create form under the default app's shell, after #28988 refused only the alias list routes #29102
Filing gate: ② out-of-scope finding, class a, from the #28988 os-dev-report (PR #29082, report 6571185519) · filed by domain:ui#1 · ⛔ Not a claim. No grade: triage sets it.
Business reason. After #28988, a member refused the Setup app who opens an alias-spelled object list route (/apps/setup/sys_user) gets "You don't have access to this app". The create route beside it, /apps/setup/OBJECT/new, still renders the create form inside the default app's header and sidebar under a /apps/setup/… address, the same "looks like I'm in the admin console" confusion #28988 fixed for lists.
Measured (PR #29082 at 0259ffcd, dev's reading and tests; NOT MEASURED by the seat at a public door).
A refused caller on /apps/setup/OBJECT/new (and the canonical /apps/com.objectstack.setup/OBJECT/new) gets the same access-denied page as the list route. Admins are unchanged.
Record routes stay as they are until objectui#12706 is decided.
No new metadata key or option.
Tests. A refused member on the alias and canonical new routes sees the refusal; an admin sees the form; an approvals-inbox record link still opens. A test that fails on main after #29082.
Reader.domain:ui. Size S. Waits for PR #29082 (#28988) to land.
Dedupe. Searched apps/setup new refused: only #28988, #27507 and QA runs.
Claim: PM loop round 3 · 2026-11-02T09:06Z
Session: session_01QsR2jU9jKHFCJuQuuKRtpX (card thread, os-dev); dispatched by seat session session_01QsR2jRFuJz9QBZqPVHYVhJ
Account: zhuangjianguo
Branch: claude/project-thread-vnr3mw (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29102
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/app-shell/src/console/AppContent.tsx (the Setup verdict route predicate only), its tests under ui/packages/app-shell/src/console/__tests__/, and a root .changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: default
Clause-②: no
Metadata-protocol: none
Responsibility: a member refused the Setup app who opens /apps/setup/OBJECT/new gets the create form inside the default app's shell under a setup address, after #28988 refused only the list routes | Setup create routes | every non-admin member
Thread-read: none
Premise: holds (PR #29082 merged as 692a4e4a; its route predicate covers OBJECT, OBJECT/view/ID and OBJECT/data only; record routes stay open per objectui#12706)
Serial constraints cleared: seat 1 handed this card to seat 2 (split 6572320498); no open claim or PR touches app-shell/src/console/AppContent.tsx (#29039 and #29114 hold ui/apps/console/src/AppContent.tsx, another file)
{
"issue": 29102,
"status": "done",
"branch": "claude/project-thread-vnr3mw",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29237",
"head": "83289601",
"session": "session_01QsR2jU9jKHFCJuQuuKRtpX",
"premise_still_valid": true,
"summary": "The route set the Setup alias waits on for the Setup app's access verdict now includes the create form ':objectName/new' beside the list routes from PR 29082, so a refused member on /apps/setup/OBJECT/new gets app-access-denied instead of the form under the default app's shell. The set and matcher are renamed for what they hold (OBJECT_COLLECTION_ROUTE_PATHS, isObjectCollectionAppRoute, isSetupObjectCollectionRoute); matching stays by route rank. Record routes (OBJECT/record/ID and friends, the OBJECT/ID shorthand) are untouched per objectui#12706. The canonical /apps/com.objectstack.setup/OBJECT/new already drew the refusal on main (an ordinary unmatched app); it is pinned, not changed.",
"files_changed": [
".changeset/29102-setup-create-route-verdict.md",
"ui/packages/app-shell/src/console/AppContent.tsx",
"ui/packages/app-shell/src/console/__tests__/AppContent.setupObjectListVerdict-28988.test.tsx"
],
"line_budget": "90 changed lines (+73 / -17, 3 files) vs the 3000 human-merge threshold: under; file surface within the claim's",
"tests": "Setup verdict family (28988, 12706, 27507, 28578 files) on ead56761: Test Files 4 passed, Tests 119 passed. Red on main: AppContent.tsx restored from c44c8ac4, test unchanged: Tests 2 failed (both alias create-form cases), 14 passed; restored to the HEAD blob, hash matched, git diff HEAD empty. Every app-shell test file naming AppContent (git grep -l, 93 files) on ead56761 and again on merged head 83289601 after a closure rebuild: Test Files 93 passed, Tests 777 passed both times. turbo type-check @object-ui/app-shell (includes tsconfig.test.json): 65/65 tasks. No ablation beyond the red-on-main reverse leg: the only behaviour change is one set entry, and removing it is exactly the base.",
"gates": "dispatch-gates --commands on ead56761: 34 derived, each exit 0 (vitest run scripts/: Test Files 169 passed 2 skipped, Tests 4900 passed 2 skipped); --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Merged head 83289601: derivation identical; re-ran check-adr-0087-registration, check-changeset-no-major, check-closing-keyword-parity, check-empty-changeset (all with the PR body as event), check-sdui-manifest, check:nul-bytes, check:type-check-debt, check:type-check-coverage, check-partof-closing-keyword: each exit 0. check:new-line-citations: 0 new. CI check-runs: in_progress at report time, the seat reads them.",
"dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
"deviations": [
"Unchanged declaration lines copied from the claim: Clause-② no, Metadata-protocol none.",
"The new cases extend the PR 29082 test file instead of a new file: it already carries the transport stub, page-mount counters and the inbox record-link control the card asks for.",
"Merged-head re-run is the scoped set above, not the full 34; the derivation and the diff are unchanged by the merge."
],
"mcp_calls": "3 - mcp__github__issue_read (get x1, get_comments x2), all reads",
"api_writes": "2 - relay pr_create (POST pulls, 29237), this report comment via post-stamped. git push x2 is not a REST write.",
"open_questions": [],
"out_of_scope_findings": []
}
Landed · 2026-11-02T11:16Z · PR #29237 merged through the queue as 7788eedb; the merge commit carries all 3 files of the accepted head 83289601 (:objectName/new joins the Setup-alias verdict route set in AppContent.tsx, the verdict test cases, the changeset). Delivered in full: nothing remains on this card; pm:dispatched removed.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 (priority added) · 2026-11-02T08:20Z
⛔ Not a claim.
/apps/setup/OBJECTlist route refuses a member who is refused the Setup app, but the/newcreate route beside it still renders. It is the same app-verdict inconsistency console: a member refused the Setup app still gets /apps/setup/OBJECT routes rendered inside another app's shell — the alias spelling skips the app verdict #27507 added #28988 fixed for the list, so it is not an authorization hole: the server still judges every write. p2, the same grade as console: a member refused the Setup app still gets /apps/setup/OBJECT routes rendered inside another app's shell — the alias spelling skips the app verdict #27507 added #28988. Routing and the pm state the filer set are unchanged.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ
Claim: PM loop round 3 · 2026-11-02T09:06Z
Session:
session_01QsR2jU9jKHFCJuQuuKRtpX(card thread, os-dev); dispatched by seat sessionsession_01QsR2jRFuJz9QBZqPVHYVhJAccount:
zhuangjianguoBranch:
claude/project-thread-vnr3mw(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29102Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/app-shell/src/console/AppContent.tsx(the Setup verdict route predicate only), its tests underui/packages/app-shell/src/console/__tests__/, and a root.changeset(stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: defaultClause-②: no
Metadata-protocol: none
Responsibility:
a member refused the Setup app who opens /apps/setup/OBJECT/new gets the create form inside the default app's shell under a setup address, after #28988 refused only the list routes | Setup create routes | every non-admin memberThread-read: none
Premise: holds (PR #29082 merged as
692a4e4a; its route predicate coversOBJECT,OBJECT/view/IDandOBJECT/dataonly; record routes stay open per objectui#12706)Serial constraints cleared: seat 1 handed this card to seat 2 (split 6572320498); no open claim or PR touches
app-shell/src/console/AppContent.tsx(#29039 and #29114 holdui/apps/console/src/AppContent.tsx, another file)objectstack-fleet commentedon Nov 2, 2026
domain:ui#2 · zhuangjianguo · session_01QsR2jU9jKHFCJuQuuKRtpX
os-dev-report
{ "issue": 29102, "status": "done", "branch": "claude/project-thread-vnr3mw", "pr": "https://github.com/objectstack-ai/objectstack/pull/29237", "head": "83289601", "session": "session_01QsR2jU9jKHFCJuQuuKRtpX", "premise_still_valid": true, "summary": "The route set the Setup alias waits on for the Setup app's access verdict now includes the create form ':objectName/new' beside the list routes from PR 29082, so a refused member on /apps/setup/OBJECT/new gets app-access-denied instead of the form under the default app's shell. The set and matcher are renamed for what they hold (OBJECT_COLLECTION_ROUTE_PATHS, isObjectCollectionAppRoute, isSetupObjectCollectionRoute); matching stays by route rank. Record routes (OBJECT/record/ID and friends, the OBJECT/ID shorthand) are untouched per objectui#12706. The canonical /apps/com.objectstack.setup/OBJECT/new already drew the refusal on main (an ordinary unmatched app); it is pinned, not changed.", "files_changed": [ ".changeset/29102-setup-create-route-verdict.md", "ui/packages/app-shell/src/console/AppContent.tsx", "ui/packages/app-shell/src/console/__tests__/AppContent.setupObjectListVerdict-28988.test.tsx" ], "line_budget": "90 changed lines (+73 / -17, 3 files) vs the 3000 human-merge threshold: under; file surface within the claim's", "tests": "Setup verdict family (28988, 12706, 27507, 28578 files) on ead56761: Test Files 4 passed, Tests 119 passed. Red on main: AppContent.tsx restored from c44c8ac4, test unchanged: Tests 2 failed (both alias create-form cases), 14 passed; restored to the HEAD blob, hash matched, git diff HEAD empty. Every app-shell test file naming AppContent (git grep -l, 93 files) on ead56761 and again on merged head 83289601 after a closure rebuild: Test Files 93 passed, Tests 777 passed both times. turbo type-check @object-ui/app-shell (includes tsconfig.test.json): 65/65 tasks. No ablation beyond the red-on-main reverse leg: the only behaviour change is one set entry, and removing it is exactly the base.", "gates": "dispatch-gates --commands on ead56761: 34 derived, each exit 0 (vitest run scripts/: Test Files 169 passed 2 skipped, Tests 4900 passed 2 skipped); --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Merged head 83289601: derivation identical; re-ran check-adr-0087-registration, check-changeset-no-major, check-closing-keyword-parity, check-empty-changeset (all with the PR body as event), check-sdui-manifest, check:nul-bytes, check:type-check-debt, check:type-check-coverage, check-partof-closing-keyword: each exit 0. check:new-line-citations: 0 new. CI check-runs: in_progress at report time, the seat reads them.", "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm", "deviations": [ "Unchanged declaration lines copied from the claim: Clause-② no, Metadata-protocol none.", "The new cases extend the PR 29082 test file instead of a new file: it already carries the transport stub, page-mount counters and the inbox record-link control the card asks for.", "Merged-head re-run is the scoped set above, not the full 34; the derivation and the diff are unchanged by the merge." ], "mcp_calls": "3 - mcp__github__issue_read (get x1, get_comments x2), all reads", "api_writes": "2 - relay pr_create (POST pulls, 29237), this report comment via post-stamped. git push x2 is not a REST write.", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ
Landed · 2026-11-02T11:16Z · PR #29237 merged through the queue as
7788eedb; the merge commit carries all 3 files of the accepted head83289601(:objectName/newjoins the Setup-alias verdict route set inAppContent.tsx, the verdict test cases, the changeset). Delivered in full: nothing remains on this card;pm:dispatchedremoved.