Description
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
From a real-user walkthrough of the development flow, filed on the maintainer's word: 「第一组:会卡住人或误导人,立卡」 (2026-11-04). Measured on main 987ff33b88 unless a line says otherwise. Test project scaffolded with create-objectstack@18.3.0.
Governing text: ADR-0146 D2: customizations live in <base>.custom and are "exported… committed, reviewed and deployed". This card is about telling the developer that. #30106 tracks the install half, which is broken today.
What a customer sees
A developer runs os dev, tunes a view in Studio, is happy with it, then deploys with os build and the generated Dockerfile. The change is not in production, and nothing warned them.
Measured
A view override saved and published into com.example.asset-repair.custom on os dev is served by that instance.
| Where | Contains the change? |
|---|---|
src/ |
No |
dist/objectstack.json after os build |
No |
os package export output |
Yes |
packages/create-objectstack/src/templates/AGENTS.md and templates/blank/README.md do not contain the word Studio. A search of the Studio views for an environment-scope notice or package export found neither. The Studio screens were not walked for a notice in this run.
Expected
- Studio says plainly, where a customization is saved, that it lives in this environment's database and how it moves.
- The generated README and AGENTS.md name
os package export, and when an agent should edit code rather than Studio.
The seat does not propose writing Studio changes back into src/.
Activity
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:server·pm:queue· 2026-11-04T16:10Z⛔ Not a claim.
os dev) does not travel withos build/ theDockerfile, and nothing says so. Tell the developer: CLI output and the scaffold'sAGENTS.md. p2..customexport installed on another environment reports success and the override is not applied #30106 (p1), which fixes the install half this notice points to.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Claim: PM loop round 1
Session:
session_01Utp6CZMkHvuDeVYgTD73qF(seat) · dev card threadsession_01Utp6CbrroXG7sXSzmQs4ujAccount:
os-billBranch:
claude/project-thread-uzc5lp(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30119Domain:
domain:serverSeat:
domain:server#4File surface:
packages/create-objectstack/src/templates/AGENTS.md,packages/create-objectstack/src/templates/blank/README.md, and one CLI notice at the point where a developer loses the change (packages/cli/src/commands/**, the dev measures where; notcommands/package/**), their tests, one changeset. ⛔packages/spec/**,docs/adr/**,.claude/**, repo-rootAGENTS.md,ui/**(the Studio notice is the ui residue, recorded at landing),skills/**(stop on breach; explain in the report)Container & model:
S–M,mode:thread,model: default judgment tier (opus) — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: yes (widening) — the exported CompileCommand gains a protected reportsLocalCustomizations flag (default false), overridden by os build; nothing removed or narrowed (amended at review; precedent #30015)
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: 6635627917
Premise: holds
Serial constraints cleared: #30106 merged (PR #30207); PR #30258 (#30123, the last change to the template's
AGENTS.md) merged 2026-11-05T04:45Z; seat 3 confirmed #30215 / #30217 do not touch these files.Dispatch order:
/mnt/project-files/server-seat4/dispatch-30119.md(project shared folder). Ruling section: the card's origin 「第一组:会卡住人或误导人,立卡」 (maintainer, 2026-11-04) and triage audit 6635627917. PRRefs #30119 (server half), no closing keyword. If the CLI notice needs a new flag or exported option, the dev declaresyes (widening)and the seat amends this line.Posted 2026-11-05T04:48Z.
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
os-dev-report
{ "issue": 30119, "status": "done", "branch": "claude/project-thread-uzc5lp", "pr": "https://github.com/objectstack-ai/objectstack/pull/30336", "session": "session_01Utp6CbrroXG7sXSzmQs4uj", "premise_still_valid": true, "summary": "Server half only. os build (not os compile, which os dev runs on every boot and rebuild) now ends its text face with one notice when the SQLite database os dev opens for the project holds sys_metadata rows of a BASE.custom package: the count per pair, the database file, and the remedy (make the change in src/, or os package export while os dev runs). The read is local and read-only (resolveProjectDatabaseUrl over the process env layered on the project's development .env files, better-sqlite3 readonly, one aggregate SELECT); a non-SQLite database is not probed; an unreadable file prints 'Could not check'; --json unchanged; no server door. The scaffold AGENTS.md and blank README now say a Studio change lives in the environment's database as an item of PACKAGE_ID.custom, never in src/, that build and the Dockerfile leave it behind, that app changes go in src/, and how a customization moves (os login, os package export, os package install --runtime, numbered order). The Studio notice is the ui residue, untouched.", "tests": "head 0baf7e9a4 (after one merge of origin/main, full workspace rebuild, spec check:generated exit 0). cli: typecheck 0; vitest --project unit 385/385 files, 5435/5435 tests; integration file local-customizations.sqlite.test.ts 5/5 (rest of cli integration tier declared to CI). create-objectstack: typecheck 0; test 24/24 files, 369/369. Real measurement on examples/app-todo with os dev: ensure-customization + PUT view override into com.example.todo.custom served; row in sys_metadata (package_id com.example.todo.custom, state active); src/ 0 hits, os build artifact 0, os package export 1. os build on this branch printed the notice with os dev running (WAL) and after it stopped; os dev's boot compile printed nothing new. No ablation: the pins assert the reading and the build/compile switch directly; the first unit run reddened validate-build-gate-parity on the unclassified calls, fixed by a NOT_A_GATE row.", "gates": "dispatch-gates --commands on 0baf7e9a4: 62 families, 62 run, all exit 0 (exit captured per line before any pipe; on the pre-merge head 3 exited 3 for missing build output / shallow clone, re-run after the full build and git fetch of the pinned fixture commit); --ran: 62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. CI check-runs: in_progress at report time. Logs: /mnt/project-files/server-seat4/30119/.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub call (reads via gh api)", "api_writes": "2 — relay pr_create (fw-20261105T062259Z-7f1ae3 -> #30336, read-back identical, no assignees, no labels); this os-dev-report comment via post-stamped. Plus git pushes (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: seat (ui lane, paused) · ui residue: the card's first Expected bullet, Studio saying where a customization is saved (this environment's database, BASE.custom) and how it moves (os package export) · noted in Acceptance notes, not filed", "carrier: none · a dev database that is not local SQLite (Postgres etc.) gets the docs but no build notice, by the dispatch's no-network-round-trip rule · noted in Acceptance notes" ], "deviations": [ "packages/cli/test/validate-build-gate-parity.test.ts edited (one NOT_A_GATE row for the two new compile.ts calls); outside the Claim's named files but inside its 'their tests' surface and not on the forbidden list.", "The session-context assign/review step and the PR subscription were skipped, as the dispatch order and os-dev.md require.", "The first WIP commit carried a Refs line; the pre-push hook refused it and it was amended before any push." ], "files_changed": [ ".changeset/30119-studio-customization-build-notice.md", "packages/cli/src/commands/build.ts", "packages/cli/src/commands/compile.ts", "packages/cli/src/utils/local-customizations.ts", "packages/cli/src/utils/local-customizations.test.ts", "packages/cli/src/utils/local-customizations.sqlite.test.ts", "packages/cli/test/validate-build-gate-parity.test.ts", "packages/create-objectstack/src/studio-customization-disclosure.test.ts", "packages/create-objectstack/src/templates/AGENTS.md", "packages/create-objectstack/src/templates/blank/README.md" ], "line_budget": "S–M: +549 / -0 across 10 files (two new test files carry most of it)" }Report taken 2026-11-05T06:24Z.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Landed · PR #30336 (server half)
1c5378313;Refs #30119 (server half), so this card stays open. Seat ACCEPT 6651831805 on the landed headfd70306c.mainsourcepackages/cli/src/commands/build.ts:9protected override reportsLocalCustomizations = true;andpackages/create-objectstack/src/templates/blank/README.md:156### A Studio change is not in the imageWhat is left on this card is the ui half: the Studio notice "where a customization is saved", at the moment a person saves one, saying it lives in this environment's database as an item of
<base>.customand travels only byos package export. The ui lane is paused, so it is not dispatched now.State change:
pm:dispatchedremoved, assignee cleared, back topm:queuewithpm:retriageso triage can route the ui half todomain:uiwhen that lane reopens.objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: retriage · server half landed ·
domain:server→domain:ui·pm:queue· 2026-11-05T07:59Z⛔ Not a claim.
os buildreports local customizations, and the scaffold README says it). What is left is thedomain:uihalf: a Studio notice, at save time, that a customization lives in this environment as an item of<base>.customand travels only byos package export.domain:uiseats Add metamodel interfaces for ObjectQL/ObjectUI contract #1, ✨ Set up Copilot instructions #2, Implement ObjectStack protocol specification with Zod schemas and TypeScript interfaces #3, Add Changesets and GitHub Actions automation #4 and [WIP] Fix error in step four of the action run #5 are on duty, so the card routes there now. p2 kept.pm:retriagewas removed.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
Claim: PM loop round 4 · 2026-11-05T10:20Z
Session:
session_01Utp6Cay8ZjjPDJ1vkTcVDd(card thread, os-dev); dispatched by seat sessionsession_01Utp6CbPN5UYMnBaNJPJWfGAccount:
os-billBranch:
claude/project-thread-pc7bmk(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-30119Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/views/studio-design/**as measured (the customize/publish door and its tests),ui/packages/i18n/src/locales/**(every pack), one root.changeset/file; ⛔StudioDesignSurface.tsx(PR #30381) andObjectListViewInspector.tsx(PR #30315),packages/**(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (opus) — dispatch-gates --tier at 0e4dfbe2: no path-derived mandate,effort: highClause-②: yes (widening) —
@object-ui/i18nkeys expectedMetadata-protocol: none
Responsibility: a developer customizes in Studio and deploys with
os build; the change stays behind and Studio never said so | ADR-0146 D2 says customizations live in<base>.customand travel by export; the server half (PR #30336) tells the CLI user, Studio does not | every developer who customizes in a dev environmentThread-read: 6652867871
Premise: holds (server half PR #30336 landed; the ui half is the Studio notice named in triage 6652867871)
Serial constraints cleared: PR #30381 (
domain:ui#2) holdsStudioDesignSurface.tsx, PR #30315 holdsObjectListViewInspector.tsx; the dev keeps off both and reports if the honest place is there.objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
os-dev-report
{ "issue": 30119, "status": "done", "branch": "claude/project-thread-pc7bmk", "pr": "https://github.com/objectstack-ai/objectstack/pull/30435", "session": "session_01Utp6Cay8ZjjPDJ1vkTcVDd", "premise_still_valid": true, "summary": "Ui half. Studio's pending-changes sheet (DraftChangesPanel), reviewing a read-only base's pair, now adds one line under 'Saved to BASE's customizations': the changes are kept in this environment's database as items of the pair the host reviews (its packageId, the ensure door's answer or the served listed pair, never a computed .custom spelling), not in the project's source, and reach another environment only through os package export (PACKAGE_EXPORT_COMMAND, interpolated so no pack translates it). New key preview.changes.customizationEnvironment in all ten packs. Not switched by environment: discovery serves environment (measured 'development' under objectstack dev), but the sentence holds on every deployment. The item header's note line (StudioDesignSurface.tsx, held by PR #30381) is left for a follow-up.", "tests": "head 8fc8d012 (after one merge of origin/main). vitest from ui/ under the lock: DraftChangesPanel.test.tsx + StudioDesignSurface.customizePublish-28562.test.tsx + packages/i18n/ = Test Files 97 passed (97), Tests 1479 passed | 13 skipped, VERDICT command-exit 0. turbo type-check app-shell + i18n: 69/69 tasks, VERDICT command-exit 0. Ablation: render condition mutated to false via ablation-replace (anchor 1 -> 0, blob f764b8da -> 2fd64bc2): exactly the 2 new render tests fail, 26 pass; restored blob f764b8da = HEAD. Live walk on examples/app-showcase (objectstack dev --fresh + console Vite, zh-CN and en): ensure-customization 201 com.example.showcase.custom, view draft saved into the pair, sheet before (sources at d3f23d20) shows no line, after shows it naming com.example.showcase.custom and os package export; shots in project files ui-seat3/30119/.", "gates": "dispatch-gates --commands on 8fc8d012: 35 families, all exit 0 (exit captured per line before any pipe; check:type-check-debt under the lock; check-sdui-manifest among them); --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. ui check:new-line-citations: 0 new. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "2 — issue_read get + get_comments on #30119 (reads only; no write tool)", "api_writes": "2 — relay pr_create (fw-20261105T111727Z-b17be9 -> #30435, read-back identical, no assignees, no labels); this os-dev-report comment via post-stamped. Plus git pushes (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: seat (filed at ACCEPT, after PR #30381) · the Studio item header's note line 'Saved to BASE's customizations' (four call sites in StudioDesignSurface.tsx) does not yet carry the environment line; it receives only the base's label, so naming the pair needs that file · noted in Acceptance notes" ], "deviations": [ "File surface widened by the seat (thread, 10:22Z): ui/packages/app-shell/src/preview/DraftChangesPanel.tsx, preview/savedToCustomization.tsx and preview/__tests__/DraftChangesPanel.test.tsx, outside the Claim's studio-design/**; no studio-design/** file changed.", "The first gate loop ran on the pre-merge head and was stopped when PR #30361 landed; every gate was re-run on the merged head 8fc8d012.", "The first WIP commit carried a model name in the co-author trailer; the pre-push hook refused it and it was amended before any push.", "The session-context assign/review step and the PR subscription were skipped, as the dispatch order and os-dev.md require." ], "files_changed": [ ".changeset/30119-studio-customization-environment-line.md", "ui/packages/app-shell/src/preview/DraftChangesPanel.tsx", "ui/packages/app-shell/src/preview/savedToCustomization.tsx", "ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.test.tsx", "ui/packages/i18n/src/locales/ar.ts", "ui/packages/i18n/src/locales/de.ts", "ui/packages/i18n/src/locales/en.ts", "ui/packages/i18n/src/locales/es.ts", "ui/packages/i18n/src/locales/fr.ts", "ui/packages/i18n/src/locales/ja.ts", "ui/packages/i18n/src/locales/ko.ts", "ui/packages/i18n/src/locales/pt.ts", "ui/packages/i18n/src/locales/ru.ts", "ui/packages/i18n/src/locales/zh.ts" ], "line_budget": "M: +94 / -2 across 14 files" }Report taken 2026-11-05T11:18Z.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
Landed · PR #30435 · 2026-11-05T11:54Z
b6caa1415;Fixes #30119, card closed by the merge. Seat ACCEPT 6656984514 on the landed head8fc8d012..custompair the server answered, not in the project's source, and reach another environment only throughos package export(ten packs, command untranslated). Shown on every environment. The CLI/scaffold half landed in PR #30336.StudioDesignSurface.tsx, held by PR #30381) → #30436.State change:
pm:dispatchedremoved, assignee cleared.