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
First-run flow: small frictions a new deployment's first people meet #30125
From a real-user walkthrough of the development flow, filed on the maintainer's word: 「第二组第三组也同意」 (2026-11-04). Measured on main987ff33b88 unless a line says otherwise. Test project scaffolded with create-objectstack@18.3.0.
Items
#
What a person meets
Where measured
Suggestion
1
Nothing asks the company name. Every invitee reads 「王总 邀请你加入 Default Organization」
main
Ask at first sign-in, or let the first admin rename it from the home page
2
Joining by invitation takes three screens: register, then 「接受邀请」, then 「邀请已接受 … 继续」
Published 18.3.0
Registering from an invitation link accepts it; end on the app
3
The time zone dialog opened right after an unrelated action, on top of the toast saying what to do next (the invitation link). The toast expired behind it
Published 18.3.0 production mode. Not reproduced under os dev on main
Ask at a calm moment, or do not cover a toast
4
After a sign-out, the next person lands on the previous person's page. A new member first sees 「你没有访问此应用的权限」 for the Setup page the admin had open
main: /login?redirect=%2Fapps%2Fcom.objectstack.setup%2F…. #29174 removed filter, search and sort from this redirect and kept the path
An explicit sign-out goes to home
5
The scaffold's sample note object stays in the project and is listed by list_objects over MCP. A developer building a repair app may never notice it
main: templates/blank/src/objects/note.object.ts
Say in the generated docs that it is a sample to delete, or have os g object offer to remove it
Left out on purpose
Prefilling the email on the invitation form: packages/plugins/plugin-auth/src/invitation-preview.ts:34-38 records a ruling that refused the unmasked variant, so the seat does not suggest it.
Read fresh. Four small first-run frictions: company name, the three-screen invitation path, a time-zone dialog that covers the next-step toast, and the post-sign-out redirect to the last person's page. Mostly Console, so domain:ui. The invitation half is plugin-auth's, which the PR names. p3.
Claim: PM loop round 3
Session: session_01L6bhgVwQZbHRRM9CaXeKif
Account: os-sales
Branch: claude/project-thread-guv7bd (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-30125
Domain: domain:ui
Seat: domain:ui#5
File surface: items 3 and 4 only — ui/apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx + workspaceTimezonePromptLogic.ts (item 3), ui/apps/console/src/components/ProtectedRoute.tsx and ui/packages/auth/src/AuthProvider.tsx sign-out (item 4), their tests, one root .changeset/. ⛔ packages/**, ⛔ ui/apps/console/src/pages/auth/** (held by #30157, PR #30243), ⛔ AppHeader.tsx (PR #30443).
Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6636150216
Premise: holds for item 4 on origin/main; item 3 was seen only on published 18.3.0 production mode — the dev measures a production build of main first and reports premise_still_valid: false for item 3 if it does not reproduce.
Serial constraints cleared: #30157 (PR #30243) holds the auth pages, out of this surface; PR #30443 (this seat) edits AppHeader.tsx, fenced out. Items 1, 2 and 5 are out of this claim (server and product call / held by #30157 and plugin-auth / devx template) and stay on the card.
Scope: Part of #30125. Clause-② no; it becomes yes (widening) only if a new i18n key lands, and the seat then owes a TIER_DEFAULT review. Dispatch order lives in the card thread's opening message.
PR #30556 merged 2026-11-05T16:30Z as 27b0bc7989 (seat ACCEPT 6662698500 on head 3fc04671, TIER_DEFAULT review in it). The PR said Part of #30125, so the card stays open.
:176 in the console page and :59 in app-shell's (both register pages join the invitation the link names)
card state
open (Part of)
Release: session session_01L6bhgVfPeFZkN1FP93imKU · because item 2 has landed · back to pm:queue, assignee cleared.
Remainder: item 5 only (the scaffold's sample note object, templates/blank, devx). Item 4 landed with PR #30490; items 1 and 3 close against #30206 (release 6660788692). Signing in to an EXISTING account from an invitation link still takes the accept page: item 2 names registration only, recorded in PR #30556's Acceptance notes, not a row of this card.
Claim: PM loop round 1
Session: session_016WV4cymvo9YoyLwKCXXBNw
Account: os-elon-musk
Branch: claude/project-thread-qjnxn4 (the card thread's platform-assigned branch; a measured platform exception to claude/issue-<n>-<slug>) · card thread session session_016WV4cz8vMayjbrsVxur2KN
Worktree: objectstack-issue-30125
Domain: domain:devx
Seat: domain:devx#1
File surface: item 5 only (the remainder named by release 6663500314 and triage 6664861246): packages/create-objectstack/src/templates/blank/README.md and, if the template ships a sample header comment, packages/create-objectstack/src/templates/blank/src/objects/note.object.ts (a comment only), their template tests, and one root .changeset/ file (create-objectstack: patch). Route: the card's first suggestion (say in the generated project that note is a sample to delete). ⛔ No os g object change, no removal of the sample object.
Container & model: S, mode:thread, model: default tier (no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6664861246
Premise: holds — packages/create-objectstack/src/templates/blank/src/objects/note.object.ts is on origin/mainb3d2f4bd; whether the README already says it is a sample is for the dev to measure first.
Serial constraints cleared: no open PR touches packages/create-objectstack/src/templates/blank/**; items 1–4 are landed or moved to #30206 (domain:ui), which does not touch the template.
{
"issue": 30125,
"status": "done",
"branch": "claude/project-thread-qjnxn4",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30671",
"session": "session_016WV4cz8vMayjbrsVxur2KN",
"premise_still_valid": true,
"summary": "Item 5. Measured on origin/main f4d568ba: neither templates/blank/README.md nor src/objects/note.object.ts said note is a sample (the object's description only called it the starter object). The generated README gains a section, The sample note object, saying it ships in every build, is served over REST and is listed to MCP clients until removed, with three steps to delete or replace it (file + export line in src/objects/index.ts; point note.test.ts at your own object; pnpm validate + pnpm test); the Layout bullet links to it. note.object.ts opens with a header comment saying the same. No os g object change, sample kept. Items 1-4 landed or moved to #30206, so the PR says Fixes #30125.",
"tests": "pnpm --filter create-objectstack exec vitest run --maxWorkers=2 under the verify lock on 7eea2807: Test Files 24 passed (24), Tests 369 passed (369), VERDICT command-exit 0 (covers starter-comments-self-contained, blank-template-console-disclosure, blank-readme-validate-disclosure). No ablation: documentation and a comment only, no tested behaviour changed.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack derived 52 families on 7eea2807, identical list on merge head 22f58ae4. 48 :: exit 0; 4 :: exit 3 PREREQUISITE NOT MET (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content: they read built dist trees; no package source in the diff, declared to CI). --ran: 52 accounted, 48 run, 4 NOT-MEASURED (derived). check:commit-card-trailers --range origin/main..HEAD exit 0. PR check-runs: in_progress at report time.",
"line_budget": "3 files, +34 / -1 (README +16/-1, note.object.ts +10, changeset +8)",
"files_changed": [
".changeset/30125-blank-sample-note.md",
"packages/create-objectstack/src/templates/blank/README.md",
"packages/create-objectstack/src/templates/blank/src/objects/note.object.ts"
],
"deviations": [
"Harness-assigned branch claude/project-thread-qjnxn4, not claude/issue-30125-*.",
"Changeset and PR body carry the claim's Clause-② no / Metadata-protocol none lines.",
"Merged origin/main b77c160a before opening (head 22f58ae4); derived gate list unchanged, gates not re-run on the merge head."
],
"dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
"mcp_calls": "2 reads: issue_read x2 (get, get_comments on 30125). 0 writes.",
"api_writes": "2: fleet-write relay pr_create (run 42116817936, PR 30671, 6181 bytes read back identical) and this os-dev-report via post-stamped. Plus git push (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
Landed (item 5) · PR #30671 merged as a98e5cd1c6 · 2026-11-05T22:59Z. The card closed through Fixes: items 2 and 4 landed earlier (PRs #30556, #30490), and items 1 and 3 are carried by #30206. This stroke removes pm:dispatched.
Activity
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-04T16:33Z⛔ Not a claim.
domain:ui. The invitation half isplugin-auth's, which the PR names. p3.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 3
Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-guv7bd(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30125Domain:
domain:uiSeat:
domain:ui#5File surface: items 3 and 4 only —
ui/apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx+workspaceTimezonePromptLogic.ts(item 3),ui/apps/console/src/components/ProtectedRoute.tsxandui/packages/auth/src/AuthProvider.tsxsign-out (item 4), their tests, one root.changeset/. ⛔packages/**, ⛔ui/apps/console/src/pages/auth/**(held by #30157, PR #30243), ⛔AppHeader.tsx(PR #30443).Container & model:
M,mode:thread,model: default — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6636150216
Premise: holds for item 4 on
origin/main; item 3 was seen only on published 18.3.0 production mode — the dev measures a production build of main first and reportspremise_still_valid: falsefor item 3 if it does not reproduce.Serial constraints cleared: #30157 (PR #30243) holds the auth pages, out of this surface; PR #30443 (this seat) edits
AppHeader.tsx, fenced out. Items 1, 2 and 5 are out of this claim (server and product call / held by #30157 and plugin-auth / devx template) and stay on the card.Scope:
Part of #30125. Clause-②no; it becomesyes (widening)only if a new i18n key lands, and the seat then owes a TIER_DEFAULT review. Dispatch order lives in the card thread's opening message.fix(auth): the outside-provider default answers sessionEndedBySignOut…
chore: evidence screenshots for the #30125 PR body (removed in the ne…
chore: drop the #30125 evidence screenshots (kept at the previous com…
refactor(auth): lower sessionEndedBySignOut during render, not in an …
chore: after screenshots at the final #30125 fix (removed in the next…
chore: drop the #30125 after screenshots (kept at the previous commit)
15 remaining items
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
Landing record (item 2) · 2026-11-05T16:36Z
PR #30556 merged 2026-11-05T16:30Z as
27b0bc7989(seat ACCEPT 6662698500 on head3fc04671, TIER_DEFAULT review in it). The PR saidPart of #30125, so the card stays open.git grep -n useInvitationSignUpJoin origin/main -- ui/apps/console/src/pages/auth/RegisterPage.tsx ui/packages/app-shell/src/console/auth/RegisterPage.tsx:176in the console page and:59in app-shell's (both register pages join the invitation the link names)Release: session
session_01L6bhgVfPeFZkN1FP93imKU· because item 2 has landed · back topm:queue, assignee cleared.Remainder: item 5 only (the scaffold's sample
noteobject,templates/blank, devx). Item 4 landed with PR #30490; items 1 and 3 close against #30206 (release 6660788692). Signing in to an EXISTING account from an invitation link still takes the accept page: item 2 names registration only, recorded in PR #30556's Acceptance notes, not a row of this card.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: retriage answered ·
domain:ui→domain:devx· 2026-11-05T17:36Z⛔ Not a claim.
domain:ui#1's ask. Item 2 landed in PR feat(console): registering from an invitation link joins its organization and enters the app in one step #30556 and item 4 in PR fix(console): after a sign-out, the next person to sign in lands on their own home, not the previous person's page #30490, and items 1 and 3 close against First-run setup checklist for administrators, replacing the currency and time zone dialog #30206. The remainder, item 5, is thetemplates/blankscaffold's samplenoteobject, outsideui/**. p3 kept.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw
Claim: PM loop round 1
Session:
session_016WV4cymvo9YoyLwKCXXBNwAccount:
os-elon-muskBranch:
claude/project-thread-qjnxn4(the card thread's platform-assigned branch; a measured platform exception toclaude/issue-<n>-<slug>) · card thread sessionsession_016WV4cz8vMayjbrsVxur2KNWorktree:
objectstack-issue-30125Domain:
domain:devxSeat:
domain:devx#1File surface: item 5 only (the remainder named by release 6663500314 and triage 6664861246):
packages/create-objectstack/src/templates/blank/README.mdand, if the template ships a sample header comment,packages/create-objectstack/src/templates/blank/src/objects/note.object.ts(a comment only), their template tests, and one root.changeset/file (create-objectstack: patch). Route: the card's first suggestion (say in the generated project thatnoteis a sample to delete). ⛔ Noos g objectchange, no removal of the sample object.Container & model:
S,mode:thread,model: default tier(no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6664861246
Premise: holds —
packages/create-objectstack/src/templates/blank/src/objects/note.object.tsis onorigin/mainb3d2f4bd; whether the README already says it is a sample is for the dev to measure first.Serial constraints cleared: no open PR touches
packages/create-objectstack/src/templates/blank/**; items 1–4 are landed or moved to #30206 (domain:ui), which does not touch the template.objectstack-fleet commentedon Nov 5, 2026
domain:devx#1 · os-elon-musk · session_016WV4cz8vMayjbrsVxur2KN
os-dev-report
{ "issue": 30125, "status": "done", "branch": "claude/project-thread-qjnxn4", "pr": "https://github.com/objectstack-ai/objectstack/pull/30671", "session": "session_016WV4cz8vMayjbrsVxur2KN", "premise_still_valid": true, "summary": "Item 5. Measured on origin/main f4d568ba: neither templates/blank/README.md nor src/objects/note.object.ts said note is a sample (the object's description only called it the starter object). The generated README gains a section, The sample note object, saying it ships in every build, is served over REST and is listed to MCP clients until removed, with three steps to delete or replace it (file + export line in src/objects/index.ts; point note.test.ts at your own object; pnpm validate + pnpm test); the Layout bullet links to it. note.object.ts opens with a header comment saying the same. No os g object change, sample kept. Items 1-4 landed or moved to #30206, so the PR says Fixes #30125.", "tests": "pnpm --filter create-objectstack exec vitest run --maxWorkers=2 under the verify lock on 7eea2807: Test Files 24 passed (24), Tests 369 passed (369), VERDICT command-exit 0 (covers starter-comments-self-contained, blank-template-console-disclosure, blank-readme-validate-disclosure). No ablation: documentation and a comment only, no tested behaviour changed.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack derived 52 families on 7eea2807, identical list on merge head 22f58ae4. 48 :: exit 0; 4 :: exit 3 PREREQUISITE NOT MET (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content: they read built dist trees; no package source in the diff, declared to CI). --ran: 52 accounted, 48 run, 4 NOT-MEASURED (derived). check:commit-card-trailers --range origin/main..HEAD exit 0. PR check-runs: in_progress at report time.", "line_budget": "3 files, +34 / -1 (README +16/-1, note.object.ts +10, changeset +8)", "files_changed": [ ".changeset/30125-blank-sample-note.md", "packages/create-objectstack/src/templates/blank/README.md", "packages/create-objectstack/src/templates/blank/src/objects/note.object.ts" ], "deviations": [ "Harness-assigned branch claude/project-thread-qjnxn4, not claude/issue-30125-*.", "Changeset and PR body carry the claim's Clause-② no / Metadata-protocol none lines.", "Merged origin/main b77c160a before opening (head 22f58ae4); derived gate list unchanged, gates not re-run on the merge head." ], "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm", "mcp_calls": "2 reads: issue_read x2 (get, get_comments on 30125). 0 writes.", "api_writes": "2: fleet-write relay pr_create (run 42116817936, PR 30671, 6181 bytes read back identical) and this os-dev-report via post-stamped. Plus git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 5, 2026
domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw
Landed (item 5) · PR #30671 merged as
a98e5cd1c6· 2026-11-05T22:59Z. The card closed throughFixes: items 2 and 4 landed earlier (PRs #30556, #30490), and items 1 and 3 are carried by #30206. This stroke removespm:dispatched.