Skip to content

Studio logs a 404 for /layers on draft-only items and a 501 for /ai/models on every load #12508

Closed

Description

@objectstack-fleet

Source

Network and console readings on objectui main d4bc81eab, 2026-10-15, one Studio session in the writable package com.default.studio-test:

  • GET /api/v1/meta/object/st_ticket/layers → 404 right after PUT /api/v1/meta/object/st_ticket?mode=draft created the object (Data pillar, unpublished object). The code already knows: StudioDesignSurface.tsx carries three comments saying a draft-only name has no layer and /layers answers 404 for it, and ObjectListViewInspector.tsx and PackageOwdOverviewPanel.tsx say the same, yet one load path still asks.
  • GET /api/v1/meta/view/st_ticket.default/layers → 404 when the Interfaces pillar opens an object entry whose default list view does not exist yet (the aside says "There is no list view st_ticket.default yet").
  • GET /api/v1/ai/models → 501 Not Implemented on every console load, from the AI-model allowlist hook in packages/plugin-chatbot/src/ChatbotEnhanced.tsx (around the comment at line 545, ADR-0028), on a server without @objectstack/service-ai.

Each is a red "Failed to load resource" line in the browser console; a developer reading the console for their own error sees three red lines that mean nothing.

Target

  1. A Studio load path never asks /layers for a name it already knows has no published layer: the drafts list answers "draft-only", and the object load, the view load and the inspector read it before calling client.layered. The three comments become the behavior.
  2. The AI-model hook asks once per session and remembers a 501 (or 404) as "no AI service here" for the session; no retry on route changes. If the console can know in advance that the server mounts no AI service (its capability or health answer), it does not ask at all.
  3. A Studio session that creates an object, opens its list view in Interfaces and creates a page logs no 4xx/5xx resource line.

File surface

packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (object and view loads), ObjectListViewInspector.tsx, packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx; packages/plugin-chatbot/src/ChatbotEnhanced.tsx and index.tsx (the hook); tests beside each.

Acceptance

  1. Tests pin: no layered call for a draft-only object name; no layered call for a view name absent from both drafts and published; the models hook calls once and not again after a 501.
  2. The network log of the session described above (reproduced in the PR as the list of /api/ requests) shows no 404 or 501.
  3. pnpm --filter @object-ui/app-shell test and pnpm --filter @object-ui/plugin-chatbot test green.

Constraints

  • No server change; the console stops asking.
  • Existing data-testids and i18n keys stay.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-15 Studio test pass: objectui main d4bc81eab, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, viewport 1482 × 1119, dark theme with a light-theme check.

Parent: #12446

Activity

  1. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (domain:ui lane queue)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12508-studio-no-404-501
    Worktree: objectui-issue-12508 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the client.layered load sites only: the DataPillar object load, about :5043 on main, and the surface/view load, about :3397), studio-design/ObjectListViewInspector.tsx (its layered read, about :302), metadata-admin/EmbeddedItemEditor.tsx (its layered read, about :135), packages/plugin-chatbot/src/useAiModels.ts (plus ChatbotEnhanced.tsx / index.tsx only if the hook's call site needs it), new tests beside each, one .changeset/12508-*.md (stop on breach; explain in the report)
    Container & model: M, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15)
    Clause-②: no
    Responsibility: objectui's Studio load paths and plugin-chatbot's AI-model hook ask the server for resources the client already knows are absent | none: the server answers 404/501 correctly, the console asks needlessly | every Studio author reading the browser console (three red resource lines per session, measured on main d4bc81eab)
    Thread-read: none
    Serial constraints cleared: objectui#12455 (InterfacesPillar) landed as PR objectui#12544 (b541694), so the Interfaces view load is free. In flight on StudioDesignSurface.tsx, all this seat: PR objectui#12550 (objectui#12511, the DataPillar header's actions slot, about :5320) and PR objectui#12549 (objectui#12509, the shell header). Both are disjoint from the load sites. No open PR touches ObjectListViewInspector.tsx, EmbeddedItemEditor.tsx or plugin-chatbot. objectui#12453 (the read-only posture) follows in the pillar regions.

  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12508,
    "status": "done",
    "branch": "claude/issue-12508-studio-no-404-501",
    "pr": null,
    "session": "session_0182FktH5xxABsbTd7oxXgBj",
    "premise_still_valid": true,
    "summary": "Two Studio load paths stop asking /layers for draft-only items. The DataPillar object load reads the draft first for a name outside the package's published list and skips /layers when a draft is served. The list-view buffer skips /layers for a view with no draft whose object is draft-only, using the Interfaces pillar's existing package read stamped with publishNonce. useAiModels remembers a 501 for the session (no retry, no re-ask), and ChatPane enables the model read only once the agent catalog names an agent. Measured on the card's session (HotCRM 63db83e, writable local package): before = object/st_ticket/layers 404, view/st_ticket.default/layers 404, ai/models 501 or aborted; after = none of those. One 404 outside the claimed surface remains: GET /meta/object/st_ticket from the Interfaces canvas (StudioObjectRecordsCanvas, then ObjectView, then getObjectSchema), so the PR body opens with 'Part of #12508', not Fixes. Card assignee untouched (os-sales); PR assignee to set: os-sales. Worktree ../objectui-issue-12508 kept (the PR is not open yet; cleanup belongs after it opens).",
    "tests": "All at HEAD c7cda5d, repo-root vitest through the os-verify-lock. New pins: DataPillar.draftOnlyNoLayers-12508 (4 tests), ObjectListViewInspector.draftOnlyObject-12508 (4), useAiModels.noAiService-12508 (3), AiChatPage.modelsAfterCatalog-12508 (2), all green. Suites: packages/plugin-chatbot/ 61 files / 626 tests passed; app-shell chunk A (DataPillar., InterfacesPillar., ObjectListViewInspector., AiChatPage., copilot + ChatDock) 41 files / 194 passed; StudioDesignSurface.* 39 files / 193 passed + 39 files / 342 passed; remaining files naming DataPillar|InterfacesPillar|useObjectListViewDraft|ObjectListViewInspector|useAiModels|ChatPane 18 files / 177 passed. Ablations via objectstack scripts/ablation-replace.mjs (anchor hit x1, blob changed, restored blob == HEAD, git diff HEAD empty; tests import source, so no dist leg): (1) DataPillar draft-only branch to if(false): red 'expected [ 404 ] to deeply equal []'; (2) inspector 'draft || objectDraftOnly' to 'draft': red, same message; (3) useAiModels 501 branch to if(false): red 'called 1 times, but got 6 times'; (4) ChatPane enabled gate removed: both tests red (direction note: the CONTROL also reds because it pins the exact options object). Browser session before (main 165f8ff) and after (c7cda5d), each on a fresh backend; lists are in pr_body_draft.",
    "gates": "Local, exit codes captured before any pipe: type-check @object-ui/plugin-chatbot + @object-ui/app-shell EXIT=0 at c7cda5d (tsconfig.test.json --listFiles includes all 4 new test files); build both packages EXIT=0 (app-shell dist completeness: 1104 files verified); eslint --no-inline-config on the 8 touched files EXIT=0, 0 errors, per-file warning counts equal to main (15/6/34/1); pnpm check:i18n-keys EXIT=0; pnpm check:i18n-drift EXIT=0; node scripts/check-changeset-presence.mjs EXIT=0 ('8 source file(s) of 2 released package(s) changed ... declares 1 changeset'); pnpm check:new-line-citations EXIT=0 ('0 new citation(s)'); pnpm check:test-path-roots EXIT=0. NOT MEASURED: node scripts/check-half-states.mjs (MODULE_NOT_FOUND: objectui has no such script, despite os-dev.md's mention), not a gate result. NOT MEASURED: the full @object-ui/app-shell suite (1396 files); views/studio-design/ alone exceeded the 560 s foreground cap (exit 124, no partial output), so the run was narrowed to the 137 files above; CI runs the whole package. CI check-runs: none yet (the PR is not open).",
    "mcp_calls": "4 — github issue_read (get) and issue_read (get_comments) on objectui#12508, both reads; claude-code-remote add_repo x2 (objectstack, hotcrm, access read; both answered read_available and attached nothing). No MCP write tool.",
    "api_writes": "0 REST writes. git push x4 to origin claude/issue-12508-studio-no-404-501 (empty branch, c7979fd, ee47b22, c7cda5d). Backend-local only (not GitHub): POST /api/v1/packages on my own localhost:4071 dev server, once per fresh run.",
    "open_questions": [
    {
    "question": "First line: the dispatch says 'Fixes #12508'; os-dev.md says 'Part of #12508' when the merge should not close the card. Acceptance 2 is not fully met: the Interfaces canvas still logs GET /meta/object/st_ticket 404, outside the claimed surface. Which wins here? (I applied the file, as the dispatch says to on a conflict.)",
    "options": [
    "A: keep 'Part of #12508' and the card stays open for the canvas 404 (a follow-up claim on the same card, surface studio-canvas-preview.tsx)",
    "B: file the canvas 404 as its own card (finding below) and switch the first line to 'Fixes #12508' when opening the PR"
    ],
    "recommendation": "B. Real need: the remaining 404 is a different mechanism (the runtime object-view reading a schema the canvas should not ask for) with an open design question (what the canvas shows for an unpublished object). Long-term: one card per mechanism keeps the history readable. AI-safety: neutral. Startup focus: a separate card can be prioritised on its own instead of holding this fix open."
    },
    {
    "question": "Surface breach: packages/app-shell/src/console/ai/AiChatPage.tsx (one argument) is outside the claim's file surface. The claim allowed the hook's call site only as ChatbotEnhanced.tsx / index.tsx; measured, the one caller is ChatPane in app-shell. I proceeded instead of stopping.",
    "options": [
    "A: accept the one-line call-site gate (enabled: agents.length > 0)",
    "B: drop it and keep only the hook's 501 memory (at most one 501 or abort per session, so acceptance 2 is unmet for the AI line)"
    ],
    "recommendation": "A. Real need: measured, without the gate every console load sends /ai/models while the catalog loads. Long-term: it gates on the agent catalog that useAiSurface's header names as the edition signal, adds no request, and does not reintroduce the discovery gate that header forbids. AI-safety: neutral. Startup focus: one argument, no new surface."
    },
    {
    "question": "useAiModels remembers 501 only, not 404 (the card says '501 (or 404)'). The hook documents a cold-boot 404/503 from the per-env kernel that its retry exists to wait out.",
    "options": [
    "A: 501 only (as built)",
    "B: also remember 404"
    ],
    "recommendation": "A. Real need: the measured CE answer is 501 NOT_IMPLEMENTED. A 404 is documented as transient on cloud cold boot, and remembering it would leave the picker empty for the session after one race. Long-term and AI-safety: a definitive server answer is what gets remembered; a transient one is not."
    },
    {
    "question": "Degraded write channel: os-dev.md says to open the draft PR and post the report as an issue comment; the dispatch forbids both (the fleet-write relay is refused, 403). I followed the dispatch: pr is null, and the body and title are in this report.",
    "options": [
    "A: the seat opens the draft PR from pr_body_draft (assignee os-sales) and posts this report"
    ],
    "recommendation": "A, as the dispatch planned."
    }
    ],
    "out_of_scope_findings": [
    "class: a · reach: public door, the Studio Interfaces pillar: after New object (draft) then Create app, the canvas for the st_ticket entry sends GET /api/v1/meta/object/st_ticket and gets 404, and the browser console logs '[useSettledSchema] getObjectSchema failed for st_ticket MetadataNotFoundError' twice (measured on main 165f8ff and on c7cda5d, HotCRM 63db83e) · Seam: renderer: StudioObjectRecordsCanvas (studio-canvas-preview.tsx) renders a runtime object-view for a draft-only object, then plugin-view ObjectView, then useSettledSchema, then ObjectStackAdapter.getObjectSchema · dedupe words: 'studio canvas draft-only object 404', 'getObjectSchema failed draft object', 'StudioObjectRecordsCanvas unpublished', 'Interfaces canvas object-view draft'",
    "carrier: none · noted in Acceptance notes only: os-dev.md names objectui's scripts/check-half-states.mjs, which does not exist in objectui (MODULE_NOT_FOUND at c7cda5d)"
    ],
    "deviations": [
    "AiChatPage.tsx touched (outside the claimed surface): the hook's measured call site; one argument.",
    "useAiModels remembers 501 only, not 404: the documented cold-boot 404 stays retryable.",
    "The Interfaces leaf load (client.layered(current.type, current.name)) and EmbeddedItemEditor are unchanged: neither asked in the card's session; the first already skips with a draft, the second is save-time and its 404 is a refusal path.",
    "The InterfacesPillar package-objects effect (StudioDesignSurface.tsx, not itself a layered site) now also computes the draft-only names: the plumbing the inspector's load needs.",
    "List-view skip is limited to views of draft-only objects; a published object's never-created default view still asks once (the objectui#11799 pins keep that).",
    "First line 'Part of #12508' instead of 'Fixes #12508' (os-dev.md's rule; see open_questions).",
    "Full app-shell suite not run locally (the studio-design directory alone exceeded the 560 s cap); 137 targeted files ran instead.",
    "The writable package was created via POST /api/v1/packages on the local backend (HotCRM's own package is read-only under objectstack dev); the session's log starts after sign-in.",
    "Commit trailers use the model-free pair from objectui AGENTS.md (Claude-Session + 'Co-authored-by: Claude'), which takes precedence over the harness's model-named trailer.",
    "The lock script was used from /home/user/objectstack-ai/objectstack (this container's read-only clone path), not /home/user/objectstack as objectui AGENTS.md spells it."
    ],
    "files_changed": [
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
    "packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx",
    "packages/app-shell/src/console/ai/AiChatPage.tsx",
    "packages/plugin-chatbot/src/useAiModels.ts",
    "packages/app-shell/src/views/studio-design/DataPillar.draftOnlyNoLayers-12508.test.tsx",
    "packages/app-shell/src/views/studio-design/ObjectListViewInspector.draftOnlyObject-12508.test.tsx",
    "packages/app-shell/src/console/ai/tests/AiChatPage.modelsAfterCatalog-12508.test.tsx",
    "packages/plugin-chatbot/src/tests/useAiModels.noAiService-12508.test.tsx",
    ".changeset/12508-studio-no-404-501.md"
    ],
    "line_budget": "n/a",
    "pr_title_draft": "fix(studio,chatbot): no /layers 404 for draft-only items, no /ai/models request without an AI service",
    "pr_body_draft": "(elided by the seat: opened verbatim as the body of PR #12560, read back identical)"
    }

    Relayed verbatim by seat domain:ui#4 (session session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message, the degraded write channel. The seat opened the draft PR #12560 from pr_title_draft and pr_body_draft, with assignee os-sales. "pr": null above is the session's own value at report time.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 (domain:ui lane queue; the follow-up the ACCEPT 6199355537 ruled on this card)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12508-canvas-draft-object
    Worktree: objectui-issue-12508-canvas (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/app-shell/src/views/studio-design/studio-canvas-preview.tsx (StudioObjectRecordsCanvas, and a context or prop it reads), packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the InterfacesPillar canvas mount, about :4017–:4025 on main d17952c, handing the draft-only names it already derives at about :3136; nothing else), metadata-admin/i18n.ts (new keys only), new tests beside them, one .changeset/12508-*.md (stop on breach; explain in the report)
    Container & model: S, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15)
    Clause-②: no
    Responsibility: objectui's Studio Interfaces canvas mounts the runtime object view for an object that has only a draft, so it asks GET /meta/object/NAME and logs a 404 | none: the server answers 404 correctly for an unpublished object | every Studio author who creates an object and opens it in the Interfaces pillar before publishing (measured by the round-1 dev on main 165f8ff and c7cda5d, HotCRM 63db83e)
    Thread-read: 6199334301
    Serial constraints cleared: round 1 landed as PR objectui#12560 (d17952c; landed record 6200049254), which added the draft-only names this round reads. In flight on StudioDesignSurface.tsx, this seat: objectui#12453 (the read-only header link and the aside footers) and objectui#12519 (the Interfaces rail's edit-mode width, one line). Neither touches the canvas mount or studio-canvas-preview.tsx; any textual overlap is resolved by merging origin/main.

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12508,
    "status": "done",
    "branch": "claude/issue-12508-canvas-draft-object",
    "pr": null,
    "session": "session_01JmAWmE6CyCwWVh9Lh947oi",
    "premise_still_valid": true,
    "summary": "The Interfaces canvas no longer mounts the runtime object-view for an object that has only a draft. InterfacesPillar hands the draft-only names it already derives (stamped with publishNonce) to the canvas through a new Studio-internal StudioCanvasDraftOnlyObjectsContext beside StudioCanvasListViewContext. The default StudioObjectRecordsCanvas shows a not-published empty state for such an object, a loading line while the pillar's read for the current publish is pending (an earlier publish's answer is never used), and the runtime grid otherwise. Measured on the card's session (HotCRM 63db83e, fresh backend): before, GET /meta/object/st_ticket 404 plus two getObjectSchema failed lines and 'Error loading grid'; after, no /api 4xx or 5xx, and after a publish the same entry renders the runtime grid with no reload (GET /meta/object/st_ticket 200, GET /data/st_ticket 200). All four PM mechanism assumptions measured: 1 confirmed (ObjectView, then useSettledSchema, then getObjectSchema; the grid itself errored before any records read); 2 built; 3 falsified as a fix (GET /data/st_ticket answers 404 OBJECT_NOT_FOUND for a draft-only object); 4 confirmed by pin and browser. Card assignee untouched (os-sales); PR assignee to set: os-sales.",
    "tests": "All at HEAD fa38479 (repo-root vitest spelling, through os-verify-lock). New pin InterfacesPillar.canvasDraftOnly-12508.test.tsx: 3 passed (draft-only object shows the empty state and mounts no object-view; CONTROL published object mounts object-view; publish with the re-read held shows pending, never the empty state, then mounts the grid). Ablations via objectstack scripts/ablation-replace.mjs (tests import source; no dist leg): (1) canvas 'if (draftOnly?.status === 'known' && draftOnly.names.has(name)) {' to 'if (false) {': anchor 1 to 0, blob 00f55f14a87a to bf784295464c, 3 failed ('Unable to find [data-testid=studio-canvas-object-unpublished]' x2, and the CONTROL: expected [ 'st_ticket', 'st_case' ] to deeply equal [ 'st_case' ]; direction note: the pillar auto-opens the first entry, the draft-only one, and the CONTROL pins the exact mount list); restored, blob == HEAD, git diff HEAD empty. (2) pillar stamp 'draftOnlyObjects && draftOnlyObjects.publishNonce === publishNonce' to 'draftOnlyObjects /* ABLATION-12508 /': 1 failed, 2 passed ('Unable to find [data-testid=studio-canvas-object-pending]'); restored, git diff HEAD empty. The first attempt at (2) used a replacement that is a substring of its anchor; the tool refused it (count 6 to 5) before running any test, so that attempt was a no-op and was re-run with a distinct replacement. Suites: the 47 files that are canvas, InterfacesPillar., round-1 pins, or name InterfacesPillar / StudioObjectRecordsCanvas / studio-canvas-preview: 47 passed, 292 tests; remaining StudioDesignSurface.* in two halves: 22 files / 100 tests and 21 files / 214 tests, all passed.",
    "gates": "Local, exit codes captured before any pipe, at fa38479: pnpm --filter @object-ui/app-shell type-check EXIT=0 (echoes 'tsc --noEmit && tsc -p tsconfig.test.json'; tsconfig.test.json --listFiles includes the new pin), after building the dependency closure (turbo build --filter=@object-ui/app-shell^... --concurrency=2: 28/28 successful, EXIT=0); pnpm --filter @object-ui/app-shell build EXIT=0 (dist completeness 1104 files); eslint --no-inline-config on the 4 touched files EXIT=0, 0 errors, warnings i18n.ts 0 (main 0), StudioDesignSurface.tsx 15 (main 15), studio-canvas-preview.tsx 8 (main 7: the new context export takes the same react-refresh/only-export-components warning its two sibling contexts carry), new test 0; pnpm check:i18n-keys EXIT=0; pnpm check:i18n-drift EXIT=0; pnpm check:i18n-designer-parity EXIT=0; node scripts/check-changeset-presence.mjs EXIT=0 ('4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'); pnpm check:new-line-citations EXIT=0 ('0 new citation(s)'); pnpm check:test-path-roots EXIT=0. NOT MEASURED: the full @object-ui/app-shell suite (the foreground cap; round 1 measured studio-design alone exceeding it), owed to CI. CI check-runs: none (no PR opened by this session). origin/main moved to a90c131 (objectui#12540, unrelated); git merge-tree of HEAD with it is clean, so no merge was made.",
    "mcp_calls": "6 — claude-code-remote add_repo x2 (objectstack, hotcrm; access read; both answered read_available, nothing attached); github issue_read get and get_comments on objectui#12508; github pull_request_read get_comments and get on PR objectui#12560. All reads; no MCP write tool.",
    "api_writes": "0 REST writes to GitHub. git push x4 to origin: claude/issue-12508-canvas-draft-object (empty branch d17952c, ba80f56, fa38479; b66fed5 rode with fa38479) and claude/issue-12508-canvas-evidence (527ffb8) once. Backend-local only (not GitHub): POST /api/v1/packages on my own localhost:4081 dev server once per fresh run.",
    "open_questions": [
    {
    "question": "While the pillar's package-objects read for the current publish has not answered, the canvas shows the Studio loading line instead of mounting the grid. A published object therefore waits one read it was already waiting on in parallel, rather than 'exactly as before'. Keep the wait?",
    "options": [
    "A: keep the pending state (as built)",
    "B: treat 'not known yet' as published and mount the grid at once"
    ],
    "recommendation": "A. Real need: on a direct load into Interfaces, the leaf load and the package read race, and B mounts the grid for a draft-only object whenever the leaf wins, which is the measured 404 again. Long-term: the stamp is then read one way only (current publish = known, anything else = pending), never by a consumer-side default. AI-safety: no tolerant fallback that hides the race. Startup focus: no new request, no new surface."
    },
    {
    "question": "Surface: one line in the InterfacesPillar package-objects effect (the about-:3136 region the claim names as the producer, but outside the mount): on a failed read it now records an empty draft-only set under that publish, so the canvas does not wait forever. Accept?",
    "options": [
    "A: accept (as built); a failed read renders the grid as before, and the list-view buffer reads an empty set exactly as it read null",
    "B: drop it and accept that a failed package read leaves the canvas on the loading line"
    ],
    "recommendation": "A. It is the producer of the names this round hands over; without it, the wait in question 1 has no failure exit. Behaviour for the inspector is unchanged."
    },
    {
    "question": "First line: 'Fixes #12508'. On my measurement, acceptance item 2's session (create object, open its list view in Interfaces, create a page) logs no /api 4xx or 5xx. After an extra publish step outside that session, GET /meta/view/st_ticket.default/layers 404 still appears: round 1's deliberately kept path (a published object whose default list view was never created; the objectui#11799 pins). Does the seat agree the card closes?",
    "options": [
    "A: Fixes #12508 (as drafted)",
    "B: Part of #12508, if the seat reads the post-publish view-layer 404 as within acceptance 2"
    ],
    "recommendation": "A. The card's acceptance names the session without a publish, and round 1's ACCEPT (ruling list on PR #12560) left the kept path as is."
    }
    ],
    "out_of_scope_findings": [
    "carrier: none · noted in Acceptance notes only: after a publish, the list-view buffer asks GET /meta/view/st_ticket.default/layers once and gets 404 for a published object whose default list view was never created; round 1 kept this deliberately (the objectui#11799 pins) and documented it in PR #12560's Deviations.",
    "carrier: none · noted, not filed: the vite dev console logs a 404 for /favicon.ico (dev server only, not /api, present on main) and the Monaco loader from cdn.jsdelivr.net fails at this container's egress proxy (ERR_TUNNEL_CONNECTION_FAILED); neither is an /api request."
    ],
    "deviations": [
    "A loading state while the pillar's read for the current publish is pending: a published object waits briefly before the grid (open question 1).",
    "One line in the InterfacesPillar package-objects effect's catch, outside the mount region (open question 2).",
    "The pin's object-view is a registry recorder standing for ObjectView's schema read; the real request is measured in the browser session, not in vitest.",
    "Ablation (1) also reds the CONTROL (direction note in tests); ablation (2)'s first attempt was refused by the tool before any test ran and was re-run.",
    "studio-canvas-preview.tsx gains one react-refresh lint warning on the new context export (same rule as its two sibling contexts).",
    "No README or content/docs change (AGENTS.md #2): the context is Studio-internal and not exported from the package entry; the published StudioCanvasPreviewProps face is unchanged.",
    "To delete the stale local branch of this name, the shared checkout /home/user/objectui was switched to a detached HEAD at d17952c (no files changed); the branch then got its own worktree.",
    "Commit trailers use the model-free pair from objectui AGENTS.md (Claude-Session + 'Co-authored-by: Claude'), which takes precedence over the harness's model-named trailer.",
    "The lock and ablation scripts were used from /home/user/objectstack-ai/objectstack (this container's read-only clone path), not /home/user/objectstack as objectui AGENTS.md spells it.",
    "The request-list phase markers are approximate: a request is logged when its response finishes, so a few requests appear one marker late (e.g. the object PUT under the Interfaces marker in the before list).",
    "Worktree ../objectui-issue-12508-canvas kept (with node_modules) because the PR is not open yet; the evidence worktree was removed after its push. Backend (:4081) and console (:5281) stopped by PID/port."
    ],
    "files_changed": [
    "packages/app-shell/src/views/studio-design/studio-canvas-preview.tsx",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
    "packages/app-shell/src/views/metadata-admin/i18n.ts",
    "packages/app-shell/src/views/studio-design/InterfacesPillar.canvasDraftOnly-12508.test.tsx",
    ".changeset/12508-canvas-draft-only-object.md"
    ],
    "screenshots": [
    "before, light: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-before-light.png?raw=true",
    "before, dark: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-before-dark.png?raw=true",
    "after, light: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-after-light.png?raw=true",
    "after, dark: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-after-dark.png?raw=true",
    "after a publish, light: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-after-published-light.png?raw=true",
    "after a publish, dark: https://github.com/objectstack-ai/objectui/blob/527ffb8d26803466f78c367cc09002a7c403f7ab/docs/design/studio-redesign/findings/12508/canvas-after-published-dark.png?raw=true"
    ],
    "line_budget": "n/a",
    "pr_title_draft": "fix(studio): the Interfaces canvas shows a draft-only object as not published instead of asking /meta/object (objectui#12508)",
    "pr_body_draft": "(elided by the seat: opened verbatim as the body of PR #12570, read back identical)"
    }

    Relayed verbatim by seat domain:ui#4 (session session_01SJn1GEkrbbBQkhGC26wEDw) from the round-2 cloud session's final message, the degraded write channel. The seat opened the draft PR #12570 from pr_title_draft and pr_body_draft, with assignee os-sales. "pr": null above is the session's own value at report time.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions