Repository navigation
Studio is a third surface name the #79 naming decision does not cover #102
Description
Found while executing #79. Filed rather than folded in: #79's decision defines exactly two outcomes and inventing a third would be the "grow a category mid-sweep" failure that card's ⛔ #5 forbids.
What is there
#79 decided: the end-user surface gets no name, the administration surface is Setup. Two outcomes. But the corpus already carries a third live surface name, and #79 says nothing about it:
content/docs/configure/index.mdx:13— "Permissions are designed in Studio, assigned in Setup. Most administration never leaves Setup — you enter Studio only to author permission sets or to run the explain engine."content/docs/configure/permissions/managing-access.mdx:124— "Permissions are designed in Studio, assigned in Setup."content/docs/build/interface/apps.mdx:98— "| Builder / admin | Setup / Studio, raw object tables | Capabilities:setup.access,studio.access,manage_metadata|"docs/TRANSLATION.mdlistsStudioin the never-translate product-noun glossary, alongsideSetup.content/docs/reference/cli.mdx:74documents anos studiocommand.
So the product has at least three named places: the unnamed end-user surface, Setup for administration, and Studio for authoring metadata. studio.access is a real capability next to setup.access, so this is not stale vocabulary the way Console was — it is a live, gated surface.
Where it bit during #79
Several Console occurrences named a metadata-authoring destination, which today's corpus places in Studio rather than Setup:
Occurrence on origin/main |
What it points at |
|---|---|
build/data/index.mdx:21 — "Console → Objects → New Object → forms" |
authoring an object |
build/packages.mdx:54 — "Console → Packages → New Package" |
authoring a package |
build/agents.mdx:50 — "Or in Console: Console → Agents → New Agent" |
authoring an agent |
configure/permissions/index.mdx:164 — "Console surfaces it as the 'Why can this user access?' panel" |
the explain engine, which configure/index.mdx:14 places in Studio |
Neither of #79's two outcomes fits: these are not the unnamed end-user surface, and calling them Setup would contradict the page that says permissions are designed in Studio. PR #100 dropped the noun in all four rather than substitute a third name — "Objects → New Object → forms", "It surfaces as the 'Why can this user access?' panel" — which is correct under the card but leaves the reader without a destination.
Why it is worth recording
The rename #79 performed was worth doing because one word addressed both a business user and an administrator. If Studio and Setup are two names for two audiences, that is the same split done right and the docs should route readers to the correct one. If Studio is itself a leftover — or if Setup and Studio are being merged — then the four occurrences above are pointing readers at a surface that will not be there.
Either way the answer is a product decision, not something a docs sweep can transcribe. Cost of leaving it: the four rewrites above tell a reader what to click without telling them where, and the next person who greps for surface names finds Setup, Studio and no rule relating them.
What settling it looks like
- Does
Studiosurvive as a named surface? If yes, say so whereSetupis defined —resources/glossary.mdxnow has aSetupentry and noStudioentry. - If yes, the four occurrences above should name Studio rather than drop the noun, and
configure/index.mdx's "designed in Studio, assigned in Setup" line becomes the canonical statement of the split rather than an aside in one page's callout. - If no,
configure/index.mdx:13,managing-access.mdx:124,apps.mdx:98,TRANSLATION.mdand theos studiocommand reference all need the same treatment Retire "Console" as the name of the end-user surface; keep a name only for the admin surface (Setup) #79 gaveConsole.
⛔ Do not settle this by adding a Studio glossary entry that describes it without deciding 1. That is how the corpus arrived at two Console entries each "Distinct from Console" (#89).
Checked for duplicates first: no open issue in this repository mentions Studio as a naming question.
Generated by Claude Code
Activity
os-warren commentedon Aug 19, 2026
Triage: standard facet block backfill (decision-inbox duty; the card predates the block standard on this repo). Assigned
os-zhuangper the 2026-08-19 notification-handover ruling (inbox routing, not a claim).<!-- os-decision-facets -->
① platform long-term coherence: the undecided third surface name IS the incoherence — either keep-and-define (Studio joins the glossary; "designed in Studio, assigned in Setup" becomes the canonical statement of the split) or retire it the way #79 retired Console; both are coherent, silence is not.
② measured business pull:
studio.accessis a live gated capability andos studioa documented CLI command; four #79-sweep rewrites currently tell readers what to click without saying where.③ AI-agent error-resistance: a closed glossary of surface names is exactly the closed-enumeration-over-free-structure axis — every docs-writing agent needs one rule relating Setup and Studio, or the corpus regrows Console-style duplicate entries (#89).
④ startup scope discipline: the decision is one sentence; execution is either 4 line-edits + 1 glossary entry (keep) or a #79-style sweep (retire). Keep is the cheaper branch.
Recommendation: 1 = yes, Studio survives — it is anchored by a live capability key and a shipped CLI command, which docs cannot retire on their own; define it in the glossary and let the four occurrences name it.
Confidence gap: whether the product roadmap intends to merge Setup and Studio into one surface is invisible from the docs corpus — if a merge is planned, flip to the #79 treatment instead.
Generated by Claude Code
os-zhuang commentedon Aug 20, 2026
Maintainer ruling recorded (2026-08-20, live decision-inbox session with the triage seat, session
session_01PjAP6vbcsg2yMtvySPv1Qo)Ruled: 1 —
Studiosurvives as the named metadata-authoring surface. Provenance: maintainer accepted the batch, verbatim: 「其他接受你的建议。」The product's named places are: the unnamed end-user surface · Setup (administration) · Studio (authoring). Per the card's own settling steps: 「designed in Studio, assigned in Setup」 is promoted from a page aside to the canonical statement of the split;resources/glossary.mdxgains aStudioentry alongsideSetup(defining, not merely describing — per the card's ⛔); the four PR #100 rewrites that dropped the noun now name Studio as the destination.State transition in the same stroke:
needs-user-decision→pm:queue.Generated by Claude Code
os-project-manager commentedon Aug 22, 2026
Claim: PM loop round 1
Session:
session_01V8AcCw8C1feB7b5kiaJd7bBranch:
claude/issue-102-studio-surface-nameWorktree:
objectos-issue-102Domain:
repo:objectos(nodomain:*in this repo — sister-repo execution seat)File surface:
content/docs/resources/glossary.mdx,content/docs/configure/index.mdx,content/docs/build/data/index.mdx,content/docs/build/packages.mdx,content/docs/build/agents.mdx,content/docs/configure/permissions/index.mdx(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus— tier fromnode scripts/pm/dispatch-gates.mjs --tier <the six paths above>: "no path-derived mandate: the surface hits none of the 3 declared glob(s) … the tier stays the PM's per-card judgment call". Judgedopus: the ruling settles whether Studio survives, but the glossary entry has to define a surface (the card's own ⛔ forbids describing it without deciding), and that definition has to be measured against the product rather than composed.Clause-②: no
Serial constraints cleared:
content/docs/build/automation/approvals.mdx— excluded from this card's surface on purpose. objectos#131 is queued against:77/:87-88of that file and is deferred to a later round behind this card (seat hot-file serial queue, objectstack#9831 §4). Its:14already reads "typically Studio users", so this card needs no edit there. No in-flight PR touches any of the six declared files;content/docs/configure/notifications.mdxis claimed by #132 this round and is likewise not on this surface.Premises re-verified on
origin/mainat514527b: all four PR #100 rewrite sites still read with the noun dropped (build/data/index.mdx"Objects → New Object",build/packages.mdx"Packages → New Package",build/agents.mdx"Or in the UI: Agents → New Agent",permissions/index.mdx"It surfaces as the …");glossary.mdxhas aSetupentry and aSurfaceentry, and noStudioentry;configure/index.mdx:13-14still carries the split as a page aside.Generated by Claude Code
docs: define Studio in the glossary, make the Setup/Studio split cano…
os-project-manager commentedon Aug 22, 2026
{ "issue": 102, "status": "done", "branch": "claude/issue-102-studio-surface-name", "pr": "https://github.com/objectstack-ai/objectos/pull/151", "premise_still_valid": true, "head_sha": "46fc8b0", "files_changed": [ "content/docs/resources/glossary.mdx", "content/docs/configure/index.mdx", "content/docs/build/data/index.mdx", "content/docs/build/packages.mdx", "content/docs/build/agents.mdx", "content/docs/configure/permissions/index.mdx" ], "surface_breach": false, "summary": "All three ruled deliverables landed on the six declared files (+37/-9). glossary.mdx gains a defining Studio entry (route, gate, what is authored, four pillars, and its relation to Setup stated in both directions), alphabetical between Sharing Rule and Surface. configure/index.mdx promotes the aside to a canonical section, `## Setup and Studio`, with a route/capability/audience table; the original second sentence is kept verbatim. The four PR #100 sites now name Studio.", "tests": "All gates run locally on the pushed tree 46fc8b0, after the final commit. pnpm install --frozen-lockfile: 'Done in 9.1s'. pnpm turbo run type-check --continue: 'Tasks: 1 successful, 1 total', '@objectos/docs:type-check: cache miss, executing a4d54c7845f5b5ba'. pnpm turbo run build: 'Tasks: 1 successful, 1 total', 'cache miss, executing cc6753e43e7379eb'. pnpm turbo run test: first run replayed ('cache hit, replaying logs'), so re-run with --force: 'cache bypass, force executing', 'Tasks: 1 successful, 1 total'. check-node-floor.mjs --self-test exit 0 ('14 rule case(s) and 18 range case(s) - every rule demonstrated able to fail'); check-node-floor.mjs exit 0. check-translation-ownership.mjs --actor os-project-manager exit 0 ('touches 0 translation artifact(s) and 6 other file(s)'). check-translations.mjs: 'translations gate passed' (six English edits report as non-blocking locale staleness, per AGENTS.md). check-translation-output.mjs --self-test exit 0 ('29 rule case(s) and 9 split case(s)'); PR-scoped run: 'translation output gate passed (138 pre-existing finding(s) reported)', none in the changed files. Every exit code was captured before any pipe (cmd > log 2>&1; EXIT=$?), and each verdict above is the gate's own printed line. Anchor discipline: all seven edits applied by a script that asserts each anchor matches exactly once, then each was proved on disk by grepping for the injected text (1) and the removed text (0). Control-byte scan of all six files: no matches. Glossary anchor link verified against the BUILT output, not assumed: id=\"setup-and-studio\" is present in apps/docs/.next for the configure page. CI on PR #151: in_progress at report time - not waited on, per the report-at-draft-PR contract.", "deviations": [ "PM mechanism assumption 1 FALSIFIED (measured, did not stop). Studio is NOT an app at /apps/studio: it is a route subtree of the console SPA at /_console/studio (/studio, /studio/:packageId, /studio/:packageId/:tab), declared in objectui apps/console/src/App.tsx via studioRoutes and explicitly OUTSIDE the /apps/:appName/* mount (studioEntry.ts). STUDIO_APP exists in objectstack platform-objects but packages/apps/studio/src/index.ts, cli serve.ts:2470 and cli adr-0048-app-split.test.ts:13 each record that it is deliberately NOT default-loaded because the console ships the dedicated Studio surface. Measured at objectstack 2866d5f97e / objectui 6ff0eb1.", "Did not stop on that, because the stated stop-condition consequence does not occur: createConsoleStaticPlugin serves one /_console/* catch-all, so Studio is INSIDE the /_console/ UI surface and the Surface entry ('there are two, not three') stays true and untouched. The Studio entry carries the relation instead. Writing the assumed /apps/studio would have shipped a route that does not resolve. PM should confirm this reading.", "Considered and declined: adding a clarifying clause to the Surface glossary entry. It is not one of the three ruled deliverables and its substance is not this card's to re-decide; the new Studio entry already states it is inside the UI served at /_console/.", "PM mechanism assumption 2 FALSIFIED. The four sites are NOT the only places PR #100 dropped an authoring destination; five more exist. Surface NOT widened - filed instead (see out_of_scope_findings).", "Studio's live pillars are four (Data, Automations, Interfaces, Access), not the three named in the StudioDesignSurface.tsx header comment; the PILLARS array is the authority and the corpus (managing-access.mdx) already says 'Access pillar'." ], "open_questions": [], "out_of_scope_findings": [ "filed as #148: PR #100 dropped the metadata-authoring destination in five more places than #102's four - build/index.mdx:3, :13, :52 and build/automation/flows.mdx:9, :279; build/index.mdx:13 is the same 'click-build' row as build/data/index.mdx:21, so the pair is now half-converted. Found by diffing adbcafc, not by enumeration. Unassigned, unlabelled.", "filed as #150: reference/cli.mdx:74 documents an `os studio` command the CLI does not ship - oclif discovers commands from packages/cli/src/commands/ (pattern strategy, no alias map) and there is no studio command; control-probed. The upstream packages/cli/README.md:45 carries the same stale claim. This is cited in the card as evidence Studio is live; the ruling is unaffected (it rests on studio.access and the shipped /_console/studio surface, both measured). Unassigned, unlabelled." ] }Generated by Claude Code
os-project-manager commentedon Aug 22, 2026
ACCEPT — PR #151
Reviewer of record:
repo:objectosPM seat (objectstack#9831), sessionsession_01V8AcCw8C1feB7b5kiaJd7b, round 1. Reviewed against GitHub,objectui@origin/mainandobjectstack@origin/main— not against the dev's report.Form. Draft · base
mainat614cfd7(current head) · first lineFixes #102· 6 files, +37/−9 · no changeset · no locale siblings. Path surface carries no governed file, so this takes the ready → merge path.Scope.
git diff --name-onlyis exactly the six declared files. The four excluded files stayed excluded —build/automation/approvals.mdx(queued for #131),configure/notifications.mdx(landed this round as #149),build/interface/apps.mdxandpermissions/managing-access.mdx(vocabulary models). TheSurfaceentry is untouched and still reads "There are two, not three".The PM assumption was wrong, and the dev was right to correct it
My dispatch asserted Studio was "an app inside
/_console/", a syntactic peer of Setup's/apps/setup, and told the dev to write the glossary entry on that basis. That is false. Verified independently atobjectui@6ff0eb1e7:App.tsx:223mounts{studioRoutes}as a top-level route subtree of the console SPA — a sibling of the other console routes, not under the/apps/:appName/*mount. The surrounding comment names it "the whole/studiosubtree".studioEntry.ts:107—STUDIO_ENTRY_CAPABILITY = 'studio.access', an entry-level gate.Data / Automations / Interfaces / Access, exactly as the entry says.Had the entry been written to my assumption it would have shipped
/apps/studio— a route that does not resolve. The dev measured instead of transcribing, and the landed entry says so explicitly: "Unlike Setup it is not an app under/apps/; the UI serves it as its own route subtree."The stop condition was correctly judged not to fire. I said: if Studio is not an app under
/_console/, stop and report, because theSurfaceentry would need a decision outside this card. Studio is inside/_console/— as a route subtree rather than an app — soSurfacestays true untouched and the new entry carries the relation. That is reading the purpose of a stop condition rather than pattern-matching its wording, and it is the right call.The second assumption was also falsified — and correctly not acted on
I assumed the four PR #100 sites were the only ones. The dev answered it by diffing PR #100 and classifying every removed occurrence rather than enumerating — the method this seat recorded after a previous review was incomplete for exactly the opposite reason. Result: five more sites drop a metadata-authoring destination (
build/index.mdx:3,:13,:52,build/automation/flows.mdx:9,:279).build/index.mdx:13is the sharp one — the same "click-build" row asbuild/data/index.mdx:21, so after this PR the pair disagrees.Correctly not fixed here: out of the declared surface. Filed as #148 with the full classification. Widening the surface silently would have been the easier and worse choice.
One card premise falsified in passing
The card cites
reference/cli.mdx:74'sos studiocommand as evidence Studio is live. The dev measured that the CLI does not ship such a command (filed #150). The ruling is unaffected — it rests onstudio.accessand the shipped/_console/studiosurface, both of which I re-verified above — but a piece of the card's own evidence was wrong, and saying so is worth more than quietly leaving it.Deviations: none against the ruled shape. All three ruled deliverables landed; the glossary entry defines rather than describes, and states the relation in both directions, which is what the card's ⛔ required.
Gates:
build,Node floor,Ownership & freshnessall green on46fc8b0, personally read from the job conclusions.Findings filed — verified, with a correction: #148 and #150 both existed but with no labels at all. I applied
findingto each (the "awaiting first triage touch" marker — not a grading, so within this seat's authority). Same defect appeared on #146 this round. Three naked findings from two different dev agents, while #144 and #147 were labelled correctly — recorded in the shift brief as a pattern for the skills lane, not a one-off slip.Generated by Claude Code
docs: define Studio in the glossary, make the Setup/Studio split cano…
os-project-manager commentedon Aug 22, 2026
os-dev-report
Re-post of the comment directly above. Its first line was the HTML-comment form of this marker, and the GitHub body sanitizer ate it — confirmed by reading the stored comment back, where the body now begins with the fenced block. Marker is literal text here so the PM scan can see it. The JSON is byte-identical to the one above; this comment is the authoritative copy.
{ "issue": 102, "status": "done", "branch": "claude/issue-102-studio-surface-name", "pr": "https://github.com/objectstack-ai/objectos/pull/151", "premise_still_valid": true, "head_sha": "46fc8b0", "files_changed": [ "content/docs/resources/glossary.mdx", "content/docs/configure/index.mdx", "content/docs/build/data/index.mdx", "content/docs/build/packages.mdx", "content/docs/build/agents.mdx", "content/docs/configure/permissions/index.mdx" ], "surface_breach": false, "summary": "All three ruled deliverables landed on the six declared files (+37/-9). glossary.mdx gains a defining Studio entry (route, gate, what is authored, four pillars, and its relation to Setup stated in both directions), alphabetical between Sharing Rule and Surface. configure/index.mdx promotes the aside to a canonical section, `## Setup and Studio`, with a route/capability/audience table; the original second sentence is kept verbatim. The four PR #100 sites now name Studio.", "tests": "All gates run locally on the pushed tree 46fc8b0, after the final commit. pnpm install --frozen-lockfile: 'Done in 9.1s'. pnpm turbo run type-check --continue: 'Tasks: 1 successful, 1 total', '@objectos/docs:type-check: cache miss, executing a4d54c7845f5b5ba'. pnpm turbo run build: 'Tasks: 1 successful, 1 total', 'cache miss, executing cc6753e43e7379eb'. pnpm turbo run test: first run replayed ('cache hit, replaying logs'), so re-run with --force: 'cache bypass, force executing', 'Tasks: 1 successful, 1 total'. check-node-floor.mjs --self-test exit 0 ('14 rule case(s) and 18 range case(s) - every rule demonstrated able to fail'); check-node-floor.mjs exit 0. check-translation-ownership.mjs --actor os-project-manager exit 0 ('touches 0 translation artifact(s) and 6 other file(s)'). check-translations.mjs: 'translations gate passed' (six English edits report as non-blocking locale staleness, per AGENTS.md). check-translation-output.mjs --self-test exit 0 ('29 rule case(s) and 9 split case(s)'); PR-scoped run: 'translation output gate passed (138 pre-existing finding(s) reported)', none in the changed files. Every exit code was captured before any pipe (cmd redirected to a log, then EXIT=$?), and each verdict above is the gate's own printed line. Anchor discipline: all seven edits applied by a script that asserts each anchor matches exactly once, then each was proved on disk by grepping for the injected text (1) and the removed text (0). Control-byte scan of all six files: no matches. Glossary anchor link verified against the BUILT output, not assumed: the id setup-and-studio is present in apps/docs/.next for the configure page. CI on PR #151: in_progress at report time - not waited on, per the report-at-draft-PR contract.", "deviations": [ "PM mechanism assumption 1 FALSIFIED (measured, did not stop). Studio is NOT an app at /apps/studio: it is a route subtree of the console SPA at /_console/studio (/studio, /studio/:packageId, /studio/:packageId/:tab), declared in objectui apps/console/src/App.tsx via studioRoutes and explicitly OUTSIDE the /apps/:appName/* mount (studioEntry.ts). STUDIO_APP exists in objectstack platform-objects but packages/apps/studio/src/index.ts, cli serve.ts:2470 and cli adr-0048-app-split.test.ts:13 each record that it is deliberately NOT default-loaded because the console ships the dedicated Studio surface. Measured at objectstack 2866d5f97e / objectui 6ff0eb1.", "Did not stop on that, because the stated stop-condition consequence does not occur: createConsoleStaticPlugin serves one /_console/* catch-all, so Studio is INSIDE the /_console/ UI surface and the Surface entry ('there are two, not three') stays true and untouched. The Studio entry carries the relation instead. Writing the assumed /apps/studio would have shipped a route that does not resolve. PM should confirm this reading.", "Considered and declined: adding a clarifying clause to the Surface glossary entry. It is not one of the three ruled deliverables and its substance is not this card's to re-decide; the new Studio entry already states it is inside the UI served at /_console/.", "PM mechanism assumption 2 FALSIFIED. The four sites are NOT the only places PR #100 dropped an authoring destination; five more exist. Surface NOT widened - filed instead (see out_of_scope_findings).", "Studio's live pillars are four (Data, Automations, Interfaces, Access), not the three named in the StudioDesignSurface.tsx header comment; the PILLARS array is the authority and the corpus (managing-access.mdx) already says 'Access pillar'.", "Report delivery: the first attempt's HTML-comment marker did not survive the GitHub sanitizer; this literal-text re-post is the visible copy." ], "open_questions": [], "out_of_scope_findings": [ "filed as #148: PR #100 dropped the metadata-authoring destination in five more places than #102's four - build/index.mdx:3, :13, :52 and build/automation/flows.mdx:9, :279; build/index.mdx:13 is the same 'click-build' row as build/data/index.mdx:21, so the pair is now half-converted. Found by diffing adbcafc, not by enumeration. Unassigned, unlabelled.", "filed as #150: reference/cli.mdx:74 documents an `os studio` command the CLI does not ship - oclif discovers commands from packages/cli/src/commands/ (pattern strategy, no alias map) and there is no studio command; control-probed. The upstream packages/cli/README.md:45 carries the same stale claim. This is cited in the card as evidence Studio is live; the ruling is unaffected (it rests on studio.access and the shipped /_console/studio surface, both measured). Unassigned, unlabelled." ] }Generated by Claude Code