Skip to content

Retire "Console" as the name of the end-user surface; keep a name only for the admin surface (Setup) #79

Closed

Description

@os-zhuang

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/records describes 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:

  1. End-user context (use/**, most of build/**) — 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.
  2. Admin context (configure/**, parts of operate/**) — becomes Setup where it names the admin surface.
  3. Not the product noun at all — /_console paths, CLI output samples, packages/console, Console UI in 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 _console exactly 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 for Console hits 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:579 prints ➜ 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

  1. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Triage: promoted to pm:queue. The decision is already made and recorded in the body (maintainer, 2026-08-18: docs + UI copy only, /_console URL 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#78 is 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/ in Surface) 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:devx seat (objectos execution folds into devx; no repo:objectos seat by the 2026-08-18 Option B ruling).


    Generated by Claude Code

  2. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor

    Measured before dispatch — and the card's framing has a gap

    Counted on 6fca5d1, English pages only:

    160 occurrences of Console across 45 of 79 pages. Nine are inside code fences. The rest is prose needing a per-occurrence call.

    Section Occurrences Pages
    build/ 57 15
    configure/ 25 8
    resources/ 23 4
    root pages (index, why, quickstart, architecture, extend-existing-systems) 24 5
    reference/ 15 5
    use/ 6 5
    operate/ 5 3
    deploy/ 0 0

    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 in use/. It does not. use/ holds 6 occurrences; build/ holds 57, nine times as many, and the card says nothing about what a build/ 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 — as Part 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.mdx


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 18, 2026
  4. self-assigned this
    on Aug 18, 2026
  5. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor

    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

  6. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor

    ACCEPT — #100. 47 files, Console 160 → 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:

    git fetch origin claude/issue-79-... && git fetch origin main
    # ...then compared FETCH_HEAD against origin/main
    

    The second fetch clobbers FETCH_HEAD. I compared main against main and 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:

    main PR
    Console, English pages 160 16
    _console, English pages 17 15
    _console, excluding glossary.mdx 13 13
    ### Console glossary entries 2 0 (one ### Setup)

    My two instructions contradicted each other

    I required the _console count to come out identical and required #89's duplicate /_console/ in the Surface entry 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 UI as 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:

    | Admin UI | Console (basic) | Setup + Account |
    

    That Console is 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 Rule proves the second was never a C-word; and the URL question was settled from objectstack source (CONSOLE_PATH = '/_console', one conditional Console: 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 Surface rather 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 /_console ruling.

    Open question 2 — Studio: not mine, escalated

    Studio is a third live surface name with its own studio.access capability, named on four pages and in an os studio CLI 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-decision and 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:38 still 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

    Item Reading
    CI build and Ownership & freshness both green on adbcafc
    Not split Correct — configure/** alone would have left Setup there and Console in six other sections
    In-fence occurrences 9, byte-identical
    Anchors 6 headings renamed; repo-wide grep for every old slug returns nothing
    Rendered Read from next start on the production build, not next dev — avoiding the next-env.d.ts trap #87 hit
    docs/TRANSLATION.md Console dropped from the never-translate glossary, Setup kept

    Landing

    Direct merge, same recorded deviation: build required, ci.yml still without merge_group: (#76), #77 open and stalled with its base far behind main.


    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

pm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions