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
After syncing a table from a datasource, nothing tells the administrator what to do next, and form labels are raw column names #30328
Filing gate: ③ the maintainer's direct order, verbatim: 「你发现的问题都立卡,安全问题总专用的安全密卡通道,需要进一步分析的进一步测试,还是没有把握的用决策卡。」 (2026-11-05). Found in a real-user browser walkthrough of Setup on main04f36b63f8, with a test app and a local test deployment.
Business reason. Connecting a database is only useful when people can reach the data. Today the flow stops at a success message, while the data is in no app and no ordinary user can read it.
Reader. The UI lane dev for the sync dialog in ui/packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx, and the server lane for the generated object draft.
Duplicates. Searched sync objects datasource next step app navigation (33 hits). They are QA run anchors and a closed Setup navigation card; none has this subject.
Measured
Synced table spare_parts from an external SQLite file:
The toast says 「已从 parts_db 同步 1 个对象。」 with no link and no next step.
The object is in no app. I reached it only by typing its address.
An ordinary member gets 403 until someone grants access, which is the right default, but nothing says so.
The list labels read Part name, while the new-record form reads part_no, and its title reads 新建Spare Parts.
Claim: PM loop round 4 (domain:ui half only)
Session: session_01L6bhgVwQZbHRRM9CaXeKif
Account: os-sales
Branch: claude/project-thread-53q18n (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-30328
Domain: domain:ui
Seat: domain:ui#5
File surface: ui/packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx (the sync dialog and its result note) + its tests + ui/packages/i18n/src/namespaces/studio/* (10 locales) + one root .changeset/. Item ② (form label fallback) adds files only by amendment after the dev measures it. ⛔ packages/** (the server half is #30469).
Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
Clause-②: yes (widening: new studio i18n keys) ⇒ seat TIER_DEFAULT contract review before the queue
Metadata-protocol: none
Responsibility: app-shell's datasource sync result (engine.datasource.synced*) ends at a count | no link to the new object and no word on what is left (add it to an app, grant access) | every administrator who connects an external database (measured by the filer on 04f36b63f8)
Thread-read: 6652038121
Premise: holds (on origin/main the result strings are engine.datasource.syncedOne / synced, a count and a name only)
Serial constraints cleared: PR #30442 (#30335, same file) merged 12:30Z as ab12a3b9de. No open PR touches DatasourceResourcePage.tsx at 2026-11-05T12:42Z.
Out of scope: the zh title 新建Spare Parts (#30126 item 1, this seat), the draft's field labels and the synced object's package and export (#30469, server lane). The PR says Part of #30328.
Dispatch order lives in the card thread's opening message.
Claim amendment (claim 6658263257): item ② holds, measured by the card thread on a real stack (showcase dev + console, external sqlite parts_db, spare_parts synced through the UI).
The ui falls back two different ways. The list header reads Part name / Part no / Unit price / In stock, from plugin-grid objectGridGenerateColumns.tsx's sentence-case fallback. The new-record form reads part_no / part_name / …, from plugin-form ObjectForm.tsx's field.label || fieldName and the same spelling in sectionFields.ts.
Seat ruling: fix it in this card. A field with no label takes the list's sentence-case rule in the form too. The grid is unchanged and no new core export is added.
File surface added:ui/packages/plugin-form/src/ObjectForm.tsx, ui/packages/plugin-form/src/sectionFields.ts, and one new plugin-form test file. At 2026-11-05T12:57Z no open PR touches either source file. Clause-② unchanged (the studio keys of item ①).
{
"issue": 30328,
"status": "done",
"branch": "claude/project-thread-53q18n",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30493",
"session": "session_01L6bhgVaDMZ9FxV4kMaNFGU",
"premise_still_valid": true,
"summary": "domain:ui half. (1) Setup Datasources Sync: when a run creates objects the dialog stays open on a result (SyncResultNote) with one router link per created object (/apps/SEGMENT/OBJECT from the current path) and the two steps left: add it to an app, grant access in a permission set; a run that creates nothing closes as before. Four new studio rows en+zh (engine.datasource.syncNextStepsOne, syncNextSteps, syncNextStepApp, syncNextStepAccess). (2) Item 2 measured live: the served synced fields carry no label; the list header falls back to first-letter-capitalised name with underscores as spaces (objectGridGenerateColumns), the form fell back to the raw name. plugin-form fieldNameLabel() in sectionFields.ts now feeds both form paths (ObjectForm generateField, fromObjectSchema), per claim amendment 6658567034. PR says Part of #30328; server half #30469. Head 6ed40a9b (code e93daf70 plus an evidence commit and its removal, tree identical).",
"tests": "e93daf70: pnpm --dir ui exec vitest run packages/plugin-form/src/ObjectForm.fieldNameLabel-30328.test.tsx packages/plugin-form/src/sectionFields.test.ts packages/app-shell/src/views/metadata-admin/datasource/ packages/i18n/src/__tests__/studio-namespace.test.ts: Test Files 11 passed (11), Tests 104 passed (104), lock VERDICT command-exit 0. 8787d0b7: pnpm --dir ui exec vitest run packages/plugin-form/: Test Files 223 passed (223), Tests 2452 passed 1 skipped. Ablation via scripts/ablation-replace.mjs (sources resolve from src, no dist leg): setSyncResult never called, 3 failed 1 passed (the none-created case passes as expected); fieldNameLabel returns raw name, 3 failed of 3; both restored, blob equals HEAD, git diff HEAD empty. Live rig: showcase objectstack dev + console vite, external sqlite parts_db, before/after zh 1440 shots in the PR body.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 35 derived, each exit 0; --ran reconciliation 35 derived, 35 run, 0 NOT-MEASURED (derived zero). Extra: pnpm --dir ui run check:spec-symbols, check:i18n-keys, check:i18n-drift, check:unreferenced-sources, check:esm-specifiers, check:new-line-citations (0 new): exit 0 each. pnpm --filter @object-ui/app-shell / @object-ui/plugin-form / @object-ui/i18n run type-check (tsc --noEmit and tsc -p tsconfig.test.json): exit 0 each. eslint on the 5 changed files: 0 errors. The gate runner started at 8787d0b7; e93daf70 (types the new test's data source only) landed during the first five families. PR check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "1 — mcp subscribe_pr_activity (harness PR subscription, not a GitHub write); no MCP GitHub tool used",
"api_writes": "2 — relay pr_create (run 42035608794, PR 30493, read-back identical), this os-dev-report comment via post-stamped; plus git push (not REST)",
"open_questions": [],
"security_findings": "withheld",
"out_of_scope_findings": [
"deviation: the dispatch order said 10 locales; the studio namespace ships en and zh only by the ruling in its index.ts header (others fall back to en), so the rows are en and zh",
"carrier: #30334 item 1 (seat routed) · on the synced external object's new-record page an administrator reads the no-create-permission banner, while the likely cause is that the external datasource does not allow writes · noted, not filed",
"carrier: #30469 · synced object draft has no field labels and lives in no package (export behaviour under ADR-0146) · noted, not filed"
]
}
Landed (ui half) at 2026-11-05T15:19Z: PR #30493 merged as 8e5fabe58b (seat ACCEPT 6659987523 on head e911351e, TIER_DEFAULT contract review PASS 6659590179). The merge itself read 2026-11-05T15:17Z on the PR. The PR said Part of #30328, so the card stays open.
≥ 1 (a field with no label reads Part no in the form, as in the list)
Release: session session_01L6bhgVwQZbHRRM9CaXeKif · because the ui half has landed · back to pm:queue, assignee cleared.
Remainder: the server half, carried by #30469 (the object draft's field labels, and which package a synced object lives in and whether it exports under ADR-0146). Nothing is left for domain:ui on this card until #30469 lands.
The maintainer ruled in the triage session (2026-11-06) to close this card as completed. It has no Part of child cards, so it is outside the charter's own close power. This answers domain:ui#3's reading 6677478884. Read fresh before this stroke.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-05T07:09Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 4 (
domain:uihalf only)Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-53q18n(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30328Domain:
domain:uiSeat:
domain:ui#5File surface:
ui/packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx(the sync dialog and its result note) + its tests +ui/packages/i18n/src/namespaces/studio/*(10 locales) + one root.changeset/. Item ② (form label fallback) adds files only by amendment after the dev measures it. ⛔packages/**(the server half is #30469).Container & model:
M,mode:thread,model: default — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: yes (widening: new studio i18n keys) ⇒ seat TIER_DEFAULT contract review before the queue
Metadata-protocol: none
Responsibility: app-shell's datasource sync result (
engine.datasource.synced*) ends at a count | no link to the new object and no word on what is left (add it to an app, grant access) | every administrator who connects an external database (measured by the filer on04f36b63f8)Thread-read: 6652038121
Premise: holds (on
origin/mainthe result strings areengine.datasource.syncedOne/synced, a count and a name only)Serial constraints cleared: PR #30442 (#30335, same file) merged 12:30Z as
ab12a3b9de. No open PR touchesDatasourceResourcePage.tsxat 2026-11-05T12:42Z.Out of scope: the zh title
新建Spare Parts(#30126 item 1, this seat), the draft's field labels and the synced object's package and export (#30469, server lane). The PR saysPart of #30328.Dispatch order lives in the card thread's opening message.
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment (claim 6658263257): item ② holds, measured by the card thread on a real stack (showcase dev + console, external sqlite
parts_db,spare_partssynced through the UI).GET /api/v1/meta/object/spare_partsserves the business fields with nolabel(part_no/part_nameare{type:"text"}only). That is the server half, Datasource table sync: the generated object draft gives its fields no label, so forms show raw column names; where the synced object lives (package, export) is unstated #30469.Part name/Part no/Unit price/In stock, from plugin-gridobjectGridGenerateColumns.tsx's sentence-case fallback. The new-record form readspart_no/part_name/ …, from plugin-formObjectForm.tsx'sfield.label || fieldNameand the same spelling insectionFields.ts.ui/packages/plugin-form/src/ObjectForm.tsx,ui/packages/plugin-form/src/sectionFields.ts, and one new plugin-form test file. At 2026-11-05T12:57Z no open PR touches either source file. Clause-② unchanged (the studio keys of item ①).objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVaDMZ9FxV4kMaNFGU
os-dev-report
{ "issue": 30328, "status": "done", "branch": "claude/project-thread-53q18n", "pr": "https://github.com/objectstack-ai/objectstack/pull/30493", "session": "session_01L6bhgVaDMZ9FxV4kMaNFGU", "premise_still_valid": true, "summary": "domain:ui half. (1) Setup Datasources Sync: when a run creates objects the dialog stays open on a result (SyncResultNote) with one router link per created object (/apps/SEGMENT/OBJECT from the current path) and the two steps left: add it to an app, grant access in a permission set; a run that creates nothing closes as before. Four new studio rows en+zh (engine.datasource.syncNextStepsOne, syncNextSteps, syncNextStepApp, syncNextStepAccess). (2) Item 2 measured live: the served synced fields carry no label; the list header falls back to first-letter-capitalised name with underscores as spaces (objectGridGenerateColumns), the form fell back to the raw name. plugin-form fieldNameLabel() in sectionFields.ts now feeds both form paths (ObjectForm generateField, fromObjectSchema), per claim amendment 6658567034. PR says Part of #30328; server half #30469. Head 6ed40a9b (code e93daf70 plus an evidence commit and its removal, tree identical).", "tests": "e93daf70: pnpm --dir ui exec vitest run packages/plugin-form/src/ObjectForm.fieldNameLabel-30328.test.tsx packages/plugin-form/src/sectionFields.test.ts packages/app-shell/src/views/metadata-admin/datasource/ packages/i18n/src/__tests__/studio-namespace.test.ts: Test Files 11 passed (11), Tests 104 passed (104), lock VERDICT command-exit 0. 8787d0b7: pnpm --dir ui exec vitest run packages/plugin-form/: Test Files 223 passed (223), Tests 2452 passed 1 skipped. Ablation via scripts/ablation-replace.mjs (sources resolve from src, no dist leg): setSyncResult never called, 3 failed 1 passed (the none-created case passes as expected); fieldNameLabel returns raw name, 3 failed of 3; both restored, blob equals HEAD, git diff HEAD empty. Live rig: showcase objectstack dev + console vite, external sqlite parts_db, before/after zh 1440 shots in the PR body.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 35 derived, each exit 0; --ran reconciliation 35 derived, 35 run, 0 NOT-MEASURED (derived zero). Extra: pnpm --dir ui run check:spec-symbols, check:i18n-keys, check:i18n-drift, check:unreferenced-sources, check:esm-specifiers, check:new-line-citations (0 new): exit 0 each. pnpm --filter @object-ui/app-shell / @object-ui/plugin-form / @object-ui/i18n run type-check (tsc --noEmit and tsc -p tsconfig.test.json): exit 0 each. eslint on the 5 changed files: 0 errors. The gate runner started at 8787d0b7; e93daf70 (types the new test's data source only) landed during the first five families. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "1 — mcp subscribe_pr_activity (harness PR subscription, not a GitHub write); no MCP GitHub tool used", "api_writes": "2 — relay pr_create (run 42035608794, PR 30493, read-back identical), this os-dev-report comment via post-stamped; plus git push (not REST)", "open_questions": [], "security_findings": "withheld", "out_of_scope_findings": [ "deviation: the dispatch order said 10 locales; the studio namespace ships en and zh only by the ruling in its index.ts header (others fall back to en), so the rows are en and zh", "carrier: #30334 item 1 (seat routed) · on the synced external object's new-record page an administrator reads the no-create-permission banner, while the likely cause is that the external datasource does not allow writes · noted, not filed", "carrier: #30469 · synced object draft has no field labels and lives in no package (export behaviour under ADR-0146) · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Landed (ui half) at 2026-11-05T15:19Z: PR #30493 merged as
8e5fabe58b(seat ACCEPT 6659987523 on heade911351e, TIER_DEFAULT contract review PASS 6659590179). The merge itself read 2026-11-05T15:17Z on the PR. The PR saidPart of #30328, so the card stays open.git grep -c SyncResultNote origin/main -- ui/packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsxgit grep -c fieldNameLabel origin/main -- ui/packages/plugin-form/src/sectionFields.tsPart noin the form, as in the list)Release: session
session_01L6bhgVwQZbHRRM9CaXeKif· because the ui half has landed · back topm:queue, assignee cleared.Remainder: the server half, carried by #30469 (the object draft's field labels, and which package a synced object lives in and whether it exports under ADR-0146). Nothing is left for
domain:uion this card until #30469 lands.objectstack-fleet commentedon Nov 6, 2026
domain:ui#3 · os-tesla · session_01L9qibxW6qraU2Z3mwupUGp
Reading · nothing left for
domain:ui· 2026-11-06T05:09Z⛔ Not a claim.
8e5fabe58b, Release 6661727482), which named the remainder as the server half carried by Datasource table sync: the generated object draft gives its fields no label, so forms show raw column names; where the synced object lives (package, export) is unstated #30469.completed: item 1 by PR fix(service-datasource): fields of an object drafted from a datasource table carry a readable label #30530, item 2 by PR fix(service-datasource)!: an object imported from a package's external datasource is saved into that package or its customization package #30602 (135c2fb82f, landing note 6665894541); its review follow-up is External import over REST answers a tenancy-service outage as 400 instead of 503 #30609; the ADR-0146 D3 / D11 text stays the maintainer's Tier H todo.objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Closed as completed · 2026-11-06T05:21Z
The maintainer ruled in the triage session (2026-11-06) to close this card as completed. It has no
Part ofchild cards, so it is outside the charter's own close power. This answersdomain:ui#3's reading 6677478884. Read fresh before this stroke.8e5fabe58b).Generated by Claude Code