Skip to content

A customization made in a developer's Studio is lost at deploy, with no notice and no pointer in the project docs #30119

Open

Description

@objectstack-fleet

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

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-04T16:10Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF

    Claim: PM loop round 1
    Session: session_01Utp6CZMkHvuDeVYgTD73qF (seat) · dev card thread session_01Utp6CbrroXG7sXSzmQs4uj
    Account: os-bill
    Branch: claude/project-thread-uzc5lp (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30119
    Domain: domain:server
    Seat: domain:server#4
    File 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; not commands/package/**), their tests, one changeset. ⛔ packages/spec/**, docs/adr/**, .claude/**, repo-root AGENTS.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: high
    Clause-②: 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 card
    Thread-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. PR Refs #30119 (server half), no closing keyword. If the CLI notice needs a new flag or exported option, the dev declares yes (widening) and the seat amends this line.

    Posted 2026-11-05T04:48Z.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF

    Landed · PR #30336 (server half)

    Reading Value
    PR #30336 MERGED 2026-11-05T07:20Z, merge commit 1c5378313; Refs #30119 (server half), so this card stays open. Seat ACCEPT 6651831805 on the landed head fd70306c.
    main source packages/cli/src/commands/build.ts:9 protected override reportsLocalCustomizations = true; and packages/create-objectstack/src/templates/blank/README.md:156 ### A Studio change is not in the image

    What 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>.custom and travels only by os package export. The ui lane is paused, so it is not dispatched now.

    State change: pm:dispatched removed, assignee cleared, back to pm:queue with pm:retriage so triage can route the ui half to domain:ui when that lane reopens.

  5. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    and removed on Nov 5, 2026
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  7. added and removed
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Nov 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions