Repository navigation
Description
Blocked-by: #78
The decision
Maintainer decision, 2026-08-18. Scope, in their words: 「对于 console 我只要改 文档和 UI 文案」 — docs and UI copy only, the /_console URL is not touched. Naming, chosen from four options: 主界面不命名 + 管理面叫 Setup.
Concretely:
- The end-user surface gets no name. A reader opens ObjectOS, or your app — not "the Console".
use/recordsdescribes opening a record in ObjectOS, not in the Console. - The admin surface keeps a name:
Setup. That word already appears on 18 English pages, so this is mostly a matter of using it consistently rather than introducing it.
Why, so the next person does not undo it
"Console" is an operator's word — server console, admin console — and it currently covers the entire runtime UI: end users working records, views, forms and approvals; admins configuring permissions and data sources; the AI Builder; the marketplace; the Account UI. One word addressing both a business user and an administrator makes the product sound like a control panel bolted onto something else.
Large products tend not to name their main surface at all — you open Notion, not "the Notion console". The split this repository's own information architecture already makes — use/ for end users, configure/ for admins — is the split the vocabulary should make too.
Scope in this repository
English sources under content/docs/. Every occurrence needs a judgement, not a search-and-replace, because the same word is doing three different jobs:
- End-user context (
use/**, most ofbuild/**) — drop the noun. "In the Console, open the record" → "Open the record". Watch for sentences that become ungrammatical or lose their subject when the noun is removed. - Admin context (
configure/**, parts ofoperate/**) — becomesSetupwhere it names the admin surface. - Not the product noun at all —
/_consolepaths, CLI output samples,packages/console,Console UIin an architecture diagram describing the served bundle. ⛔ These stay. The URL is explicitly out of scope, so any code block, curl example or path reference keeps_consoleexactly as it is.
Category 3 is the trap: a global replace will corrupt URLs and code samples that must not change, and those are the occurrences a reader copies and runs.
docs/TRANSLATION.md also lists Console in the never-translate glossary. Update the glossary in the same PR — for the surviving Setup, and drop the retired term rather than leaving a rule for a word that no longer appears.
Not in this repository — do not attempt from this card
The UI copy half lives elsewhere and is not dispatchable from here:
objectui— a case-sensitive grep forConsolehits 179 files, but that count mixes the product noun with component names, type names and identifiers. Someone has to separate user-visible copy from code identifiers before that work can be sized; the number above is not a work estimate.objectstack—packages/cli/src/utils/format.ts:579prints➜ Console:on startup, which is the first place a new user meets the word.
Both need their own cards in their own repositories, routed by triage. Filing them is not this card's job and dispatching into those lanes is not this seat's to do.
Ordering
Serial with #78, not parallel. #78 (the 17.0 alignment) touches quickstart, faq, build/data/index, reference/field-types, configure/permissions/** and more; "Console" appears across essentially the whole corpus, so the two file surfaces overlap almost completely. Correctness first: a reader currently following quickstart.mdx on Node 20 fails, which outranks a naming improvement. The rename is also easier to apply to a corrected corpus than the reverse.
Activity
os-support-ai commentedon Aug 18, 2026
Triage: promoted to
pm:queue. The decision is already made and recorded in the body (maintainer, 2026-08-18: docs + UI copy only,/_consoleURL untouched; end-user surface unnamed, admin surface =Setup), so this is an execution card, not an inbox card.The body's
Blocked-by: objectstack-ai/objectos#78is discharged: #78 closed 2026-08-18 12:36Z via merged PR #82 (the 17.0 alignment). The serial-ordering reason (near-total file overlap with the corrected corpus) is now satisfied in the right order — the rename applies on top of the corrected pages.Bundle note: #89 (glossary double-
Console+ duplicate/_console/inSurface) rides with this card — same claimant, same PR or back-to-back, per #89's own analysis that a mechanical rename would produce "Setup … Distinct from Setup" and miss the URL defect. The authoritative URL for each surface must come from the runtime's routing, not from either glossary sentence.Also per the card's own scope: the objectui / objectstack UI-copy halves are separate cards in their own repos — filing them goes through triage when this card's docs half lands and the vocabulary is proven out.
Execution lane:
domain:devxseat (objectos execution folds into devx; norepo:objectosseat by the 2026-08-18 Option B ruling).Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
Measured before dispatch — and the card's framing has a gap
Counted on
6fca5d1, English pages only:160 occurrences of
Consoleacross 45 of 79 pages. Nine are inside code fences. The rest is prose needing a per-occurrence call.build/configure/resources/index,why,quickstart,architecture,extend-existing-systems)reference/use/operate/deploy/The gap
I wrote this card around two contexts — end-user (drop the noun) and admin (becomes
Setup) — with the implicit assumption that the bulk sat inuse/. It does not.use/holds 6 occurrences;build/holds 57, nine times as many, and the card says nothing about what abuild/context becomes.The maintainer's decision does extend there coherently — if the main surface has no name, then a builder creating an object is doing it "in ObjectOS", the same as an end user opening a record. But
build/also carries occurrences that are architectural statements about the UI layer rather than instructions to a person: "Console views", "the Console's generic action runtime", "install apps via the Console marketplace". Those are closer to category 3 (not the product noun as a place the reader goes) than to either rewrite.So the three categories stand, but the weight is in the hardest place, and whoever executes this should expect
build/to be most of the work and most of the judgement.⛔ If an occurrence fits none of the three categories, stop and report rather than inventing a fourth. A rename that grows a category mid-sweep produces exactly the inconsistency this card exists to remove.
Sizing
This is larger than #78 (19 files) by a factor of two-plus in pages touched. If it exceeds one reviewable PR, land the coherent half —
configure/**→Setup, which is the least ambiguous slice — asPart of #79, file the remainder, and say so. ⛔ Do not land a partial rename that leaves two spellings of the same surface in the corpus at once; split along a boundary a reader would not notice, not through the middle of one.Prerequisites, both in
resources/glossary.mdxConsoletwice, and each entry says it is "Distinct from Console" #89 — theConsoleentry is defined twice, each saying it is "Distinct from Console", both giving the same/_console/URL. A mechanical rename produces "Setup … Distinct from Setup". This card owns fixing that; glossary.mdx definesConsoletwice, and each entry says it is "Distinct from Console" #89 is its record.actions.mdxbuilt-inshareaction namesroleas a recipient kind — same retired vocabulary as #80 #91 — records thatrecord-access.mdx:15names three of five recipient kinds while line 66 of the same page names all five. Unrelated to the rename, but it is in a file this sweep may touch; leave it alone and letactions.mdxbuilt-inshareaction namesroleas a recipient kind — same retired vocabulary as #80 #91 carry it.Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
os-dev-report
{ "issue": 79, "status": "done", "branch": "claude/issue-79-retire-console-name", "pr": "https://github.com/objectstack-ai/objectos/pull/100", "premise_still_valid": true, "summary": "Retired 'Console' as the name of the end-user surface across 47 English pages and ratified 'Setup' for administration, one occurrence at a time. The line I drew: is the word naming a PLACE THE READER GOES, or a THING THE PRODUCT SHIPS? A place (end-user or builder) loses the noun and the sentence is rewritten to keep its subject; a place (administration) becomes Setup, which the corpus already spelled on 18 pages as 'Setup -> Configuration -> ...', gated on setup.access, at /apps/setup; a thing the product ships (a URL, the ConsoleUI plugin id, a CLI banner line, an architecture-diagram box, a component named in the licence text) is unchanged. Nothing inside a code fence changed - all nine in-fence occurrences are byte-identical, and every /_console string in the corpus is untouched. Not split: configure/** alone would have left Setup there and Console in build/, use/, reference/, operate/, resources/ and the root pages, i.e. two spellings of one surface, which the card forbids. #89 resolved in the same PR (see open_questions for what the two entries were distinguishing and where the URL answer came from). docs/TRANSLATION.md drops Console from the never-translate glossary and keeps Setup.", "tests": "All on adbcafc (final commit; nothing landed after). (1) pnpm turbo run type-check --force -> '@objectos/docs:type-check: cache bypass, force executing 5f6f0dc855a640b1' ... 'Tasks: 1 successful, 1 total'. (2) pnpm turbo run build --force -> 'cache bypass, force executing 002d42ca7ee9a0e6' ... 'Tasks: 1 successful, 1 total', 79 English pages + 256 translations prerendered. Both under flock /tmp/os-heavy-verify.lock, NODE_OPTIONS=--max-old-space-size=4096; lock uncontended. (3) All three translation checks run: check-translation-ownership.mjs --actor os-zhuang -> exit 0, '0 translation artifact(s) and 48 other file(s)'; check-translations.mjs -> exit 0, 'translations gate passed' (FRESHNESS GATE PASSES - stale is reported, not blocking, per AGENTS.md; 46/33/32/33/33/33 stale per locale); check-translation-output.mjs --self-test -> exit 0, '20 case(s) ... every rule demonstrated able to fail'; check-translation-output.mjs --files -> exit 0, '116 pre-existing finding(s) reported', none in a file this PR touches (I changed zero locale files). (4) Rendered HTML read, not just the diff: booted `next start` on 127.0.0.1:3010 off the production build (NOT `next dev` - so apps/docs/next-env.d.ts is untouched, git status confirms), fetched 8 pages 200 OK, stripped tags and scanned rendered TEXT. use/index, use/notifications, configure/index, configure/permissions/permission-sets, build/interface/actions, resources/glossary => ZERO Console/console in rendered text. build/marketplace => 2, both the ASCII diagram inside the fence. quickstart => 7, all inside the two banner fences plus the plugin list. Rendered TOCs confirmed: 'The home page', 'The Setup app', 'From the UI', and one 'Setup' glossary entry in alphabetical position. Server torn down by PID (28238 + 3 children), port 3010 confirmed closed, no processes left in the worktree, worktree removed without --force. (5) CATEGORY-3 COUNT - reported honestly because it does NOT come out identical, and the reason matters: _console in English pages 17 -> 15; _console in English pages OUTSIDE resources/glossary.mdx 13 -> 13 (unchanged); _console across all .mdx including locales 113 -> 111; Console in English pages 160 -> 16; in-fence Console 9 -> 9 byte-identical. Every /_console STRING is untouched - `git diff -U0 | grep '_console'` shows only surrounding prose changing on those lines. The entire 2-occurrence delta is inside resources/glossary.mdx and is exactly what #89 asked for: the deleted duplicate entry took its /_console/ with it, and de-duplicating the Surface entry removed the repeated one. The dispatch's two instructions (resolve #89's duplicate /_console/ in Surface; keep the _console count identical) cannot both hold - I kept the one that names a defect and reported the other rather than leaving the defect in place. (6) Anchors: 6 headings renamed (use/index 'The Console home'->'The home page', configure/index 'The Setup console'->'The Setup app', operate/observability 'Console diagnostics'->'Setup diagnostics', build/interface/actions '### Console'->'### From the UI', build/packages '### From Console'->'### From the UI', reference/cli 'os studio - Console with dev server'->'... dev server with the UI enabled', plus the two glossary '### Console' headings). Repo-wide grep for every old slug and for 'glossary#' returns nothing - no internal link points at a renamed anchor. (7) Control-byte scan of every touched file: clean.", "open_questions": [ { "question": "#89 asked what the two `Console` glossary entries were actually distinguishing, and said a guess would be a report. I could tell, and I want the reading on record because I acted on it. The two entry BODIES survived intact - only the headings and one URL were damaged - and they distinguish PLATFORM ADMINISTRATION (users, roles, permission sets, audit log, sessions, API keys, system settings) from WORKING IN THE APPS (browse, create, edit records, configure views, install apps from the marketplace). Two independent confirmations: the second entry sits in the alphabetical slot AFTER `Sharing Rule` and before `Surface`, so it was never a C-word; and the same collapsed-pair damage repeats in quickstart.mdx, which prints two identical `Console:` banner lines and lists `Console UI` twice among 23 plugins. On the URL, the triage required an authoritative source rather than either glossary sentence, and there is one: objectstack@origin/main defines CONSOLE_PATH = '/_console' in packages/cli/src/utils/console.ts:43 and defaults uiBasePath to '/_console' in packages/spec/src/system/auth-config.zod.ts:302, and printServerReady prints exactly ONE conditional `Console:` line. So the duplicated URL was not a wrong URL - there is ONE UI at /_console/, and what was wrong was presenting two AREAS of it as two separately-named surfaces. The glossary now says Setup lives at /apps/setup inside the UI served at /_console/, which is what configure/index.mdx:19 and configure/users.mdx:9 already said.", "options": [ "A - accept the reading as landed: one `Setup` entry, no entry for the end-user surface, `Surface` keeps three distinct entry points and loses the numeral 'four'", "B - the two entries were distinguishing something else and the fix needs revisiting" ], "recommendation": "A. On `Surface` specifically I removed the numeral rather than asserting 'three': three is what this corpus can support, four is a claim nothing in the corpus or in objectstack's routing supports, and inventing a fourth URL is out of scope under the /_console ruling. If a fourth entry point exists (MCP at /api/v1/mcp is the candidate the CLI banner hints at), restoring the count is a one-line follow-up on top of an honest sentence rather than a correction of a wrong one." }, { "question": "The naming decision defines two outcomes (unnamed / Setup) but the corpus carries a live THIRD surface name: `Studio`, gated on its own `studio.access` capability, named in configure/index.mdx:13 ('Permissions are designed in Studio, assigned in Setup'), managing-access.mdx:124, build/interface/apps.mdx:98, TRANSLATION.md's never-translate glossary, and an `os studio` CLI command. Four `Console` occurrences pointed at metadata-AUTHORING destinations that today's corpus places in Studio, not Setup - 'Console -> Objects -> New Object', 'Console -> Packages -> New Package', 'Console -> Agents -> New Agent', and the explain-engine panel that configure/index.mdx:14 explicitly places in Studio. Neither sanctioned outcome fits, and inventing a third would be the ⛔ 'grow a category mid-sweep' failure.", "options": [ "A - Studio survives as a named surface: those four occurrences should name Studio, and Studio needs a glossary entry next to the new Setup one", "B - Studio is itself a leftover and needs the same treatment Console just got", "C - leave the four with the noun dropped, as landed" ], "recommendation": "C for this PR (what I did - dropped the noun, so nothing asserts a surface I cannot verify), then A or B as a follow-up. Filed as #102 so the decision is made once rather than rediscovered by the next person who greps for surface names and finds Setup, Studio, and no rule relating them. Real business need: a reader told to click 'Objects -> New Object' with no destination has to guess which app hosts it. Long-term soundness: the rename was worth doing because one word served two audiences; if Studio and Setup are two names for two audiences that is the same split done right, and it belongs in the glossary rather than in one page's callout. AI-authorability: `setup.access` and `studio.access` are both real declared capabilities, so declared-and-enforced already holds in the runtime - the docs are the half that is out of step, and a glossary that names both surfaces is what stops the next agent inventing a third." } ], "out_of_scope_findings": [ "filed as #101: four code-fence lines still say Console but are authored prose, not product output - two ASCII diagram lines in build/marketplace.mdx, one in reference/field-types.mdx, one bash comment in reference/cli.mdx. Left byte-identical under the ⛔, but the ⛔'s stated rationale (terminal output a reader compares) does not reach them. reference/cli.mdx is where it shows: the fenced comment still reads '# API only (no Console/Account)' while the flag table three screens down now reads 'Disable the UI and Account portals'.", "filed as #102: `Studio` is a third live surface name the naming decision does not cover (detail in open_questions above).", "NOT filed, already covered by #94: quickstart.mdx's os start banner prints two identical `Console:` lines, an `Account:` line the real CLI never emits, and lists `Console UI` twice among the plugins. #94 measured this against CLI 17.0.0 and explicitly notes #79 does not fix it. I confirmed the mechanism independently from objectstack@origin/main: printServerReady emits API + one conditional Console + one conditional MCP, no Account line. NOTE FOR #94's EXECUTOR: this PR changed the two DESCRIPTIONS in quickstart's 'What's running' table (rows now read 'The generated UI - and the app marketplace' and '**Setup** - users, roles, audit log, settings'); the duplicated URL #94 records is untouched and its item 3 still stands.", "NOT filed, reported here only: the card's own measurement missed 20 lowercase `console` occurrences because it grepped case-sensitively - 'the console home', 'wherever you are in the console', 'the whole console follows immediately', 'Tour the console as an everyday user'. Thirteen are in use/, the section measured at 6, so use/ actually held 19 occurrences and not 6. Leaving them would have left two spellings of one surface live, so 15 were retired with the rest; the 5 that stay are category 3 (/console/f/... form URLs in build/interface/forms.mdx, and OS_OBS_EXPORTER=console in two pages). No issue filed because this PR closes it." ] }Generated by Claude Code
Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
ACCEPT — #100. 47 files,
Console160 → 16 across the English corpus.First: my verification of this card was wrong, and I nearly shipped it as a confirmation
I set the acceptance bar myself — "
grep -c '_console'must return the same count before and after; report both numbers" — then measured it wrong:The second fetch clobbers
FETCH_HEAD. I comparedmainagainstmainand got a perfect 17 → 17, 13 → 13. It looked like confirmation and was an artifact of my own command.I caught it only because the numbers disagreed with the dev's report. Had they happened to match my broken measurement, I would have posted a wrong verification as a confirmation. Redone against a proper ref, everything the report claims is exact:
Console, English pages_console, English pages_console, excludingglossary.mdx### Consoleglossary entries### Setup)My two instructions contradicted each other
I required the
_consolecount to come out identical and required #89's duplicate/_console/in theSurfaceentry to be resolved. Those cannot both hold — resolving the duplicate necessarily removes an occurrence.The dev kept the one that names a defect, reported the other with the delta traced to its source, and showed the count unchanged (13 → 13) everywhere except the file the fix was in. That is the correct resolution of a contradictory dispatch, and the contradiction was mine.
And my measurement missed a third of the corpus
I grepped case-sensitively.
use/measured at 6; it held 6 uppercase plus lowercase occurrences — "the console home", "wherever you are in the console", "Tour the console as an everyday user". Left alone, those would have kept a second spelling of the retired surface live, which is exactly what this card exists to prevent. 15 were retired with the rest; the 5 that stay are category 3 (/console/f/...form URLs,OS_OBS_EXPORTER=console).Four of my measurements have been wrong today. The pattern is consistent enough to name: I keep measuring with a narrower instrument than the defect, then reporting the result as settled. The dispatch clause telling devs to verify rather than inherit is the only reason none of them landed.
The line the dev drew, and the 16 survivors
The stated rule — is the word naming a place the reader goes, or a thing the product ships? — is a better formulation than my three categories, because it decides
build/(my card's gap) without needing a fourth bucket.I checked all 16 survivors individually. Every one is a thing the product ships: CLI banner lines inside fences,
Console UIas a plugin/component name, ASCII diagram boxes, licence text naming shipped components.The one worth calling out is
why.mdx:79, in the Supabase comparison table:That
Consoleis Supabase's, and only the ObjectOS column was updated. A sweep working from a word list rather than from meaning would have renamed a competitor's product surface. That row is the best single piece of evidence the rule was applied by reading rather than by matching.Open question 1 — #89: A, accept as landed
Well-evidenced and I am not second-guessing it. The two entries distinguished platform administration from working in the apps; the alphabetical slot after
Sharing Ruleproves the second was never a C-word; and the URL question was settled fromobjectstacksource (CONSOLE_PATH = '/_console', one conditionalConsole:banner line) rather than from either glossary sentence. The duplicated URL was not a wrong URL — there is one UI, and the defect was presenting two areas of it as two separately-named surfaces.Dropping the numeral from
Surfacerather than asserting "three" is right: three is what the corpus supports, four was a claim nothing supports, and inventing a fourth URL would have breached the/_consoleruling.Open question 2 — Studio: not mine, escalated
Studiois a third live surface name with its ownstudio.accesscapability, named on four pages and in anos studioCLI command, and the naming decision covers only two outcomes. Four occurrences pointed at metadata-authoring destinations the corpus places in Studio.Taking option C — drop the noun, assert nothing — was right: it is the only choice that invents no surface. This is product vocabulary and the maintainer's call, exactly as the Console decision was. #102 is labelled
needs-user-decisionand goes to them rather than being adjudicated here.#101 — my prohibition was over-broad, fairly
I ruled that nothing inside a code fence changes, on the rationale that fences hold terminal output a reader compares against their own. That rationale does not reach an ASCII diagram or a bash comment. The sharp instance:
reference/cli.mdx:38still reads# API only (no Console/Account)while the flag table three screens below now says "Disable the UI and Account portals" — fence and prose now disagree.The dev obeyed the ⛔ literally and filed the gap rather than deciding it was not meant. Third time today a dispatch of mine was followed to the letter while its premise was flagged, and it is the behaviour that keeps a wrong ruling from becoming a wrong page.
Other checks
buildandOwnership & freshnessboth green onadbcafcconfigure/**alone would have leftSetupthere andConsolein six other sectionsnext starton the production build, notnext dev— avoiding thenext-env.d.tstrap #87 hitdocs/TRANSLATION.mdConsoledropped from the never-translate glossary,SetupkeptLanding
Direct merge, same recorded deviation:
buildrequired,ci.ymlstill withoutmerge_group:(#76), #77 open and stalled with its base far behindmain.Generated by Claude Code
docs: rewrite the four authored-prose lines that still said "Console"
docs: rewrite the four authored-prose lines that still said "Console" (…