Skip to content

Settings pages: no duplicated action labels, warnings out of the subtitle, Cloud Connection says its sentence once #12610

Closed

Description

@objectstack-fleet

Source

Walked on objectui main 8415d9f11, the settings hub pages:

  • Mail Delivery: the "Delivery" section ends with "Send test email" as a row label and "Send test email" as the button beside it; AI & Embedder repeats "Test connection / Test connection", "Reset to environment defaults / Reset to environment defaults", "Test embedder / Test embedder"; Knowledge and File Storage repeat "Test connection".
  • File Storage's page subtitle is "Backend used for attachments, exports, and user uploads. ⚠ Switching adapter does not migrate existing files — files uploaded under the previous adapter become unreachable through the new one."; Knowledge's subtitle carries "⚠ Switching adapter does NOT migrate existing indices."; AI & Embedder's "Log full prompts" help text carries "⚠ May leak PII".
  • Cloud Connection (page/cloud_connection_settings): the page description and the card body are the same sentence ("Connect this runtime to an ObjectStack control plane to browse your organization's private packages and install them here.").
  • Installed Apps carries a "Note: The kernel API is additive only — uninstall removes the on-disk manifest …" paragraph under the empty state.

Target

  1. An action row has one label: the button carries it; the row's left side holds the one-line help ("Sends a message to the from address") or nothing.
  2. Warnings leave subtitles and help text: a callout (amber, 13 px, icon) under the section they concern, rendered once.
  3. Cloud Connection's card body says what the state is and what the button does; the page description stays the one sentence.
  4. Installed Apps' kernel note becomes a tooltip on the Uninstall action, where it applies.

File surface

The settings hub pages under system/settings/* in packages/app-shell/src/console/, packages/app-shell/src/views/setup/ pages for Cloud Connection and Installed Apps, packages/i18n/src/locales/*.ts, tests beside.

Acceptance

  1. Tests: no settings page renders the same string as both a row label and a button label; each ⚠ sentence renders inside a callout element.
  2. Screenshots of Mail, AI & Embedder, File Storage and Cloud Connection at 1280 px.
  3. pnpm --filter @object-ui/app-shell test, pnpm check:i18n green.

Constraints

  • Settings keys, values and save behaviour do not change.

Evidence

No screenshot; the measurements above and the page URLs are the evidence.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 second review pass: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the Studio pillars and all 43 Setup pages walked in the maintainer's browser pane at 1024 × 768 (en) with a 1280 × 900 re-check (zh). The maintainer asked for every finding to be filed, verbatim: 「全部立卡」.

Activity

  1. added
    enhancementNew feature or request
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    pm:retriage — half of this card's strings are produced in objectstack · domain:ui seat 3 · session_01Vk15bz8xHtKGUfXfCm16h4 · 2026-10-16T07:29Z

    Read in this act: this card's body (no comments), and git grep of the card's quoted strings on objectui origin/main 0a41305 and objectstack origin/main 43567a8fc. Control: each string was found in at least one of the two trees.

    Where each item's text is produced:

    item quoted text produced in
    1 (one label per action row) "Send test email", "Test embedder", "Test connection" objectstack packages/services/service-settings/src/manifests/*.manifest.ts declares them, e.g. { type: 'action_button', id: 'test', label: 'Send test email', … } in mail.manifest.ts. Drawing the label twice is objectui's settings renderer. objectui, generic.
    2 (warnings out of subtitles) "Switching adapter does not migrate existing files…", "…does NOT migrate existing indices.", "May leak PII" objectstack service-settings storage.manifest.ts, knowledge.manifest.ts, ai.manifest.ts and src/translations/en.ts: the ⚠ sentences sit inside the manifests' description strings. objectstack, the producer. Splitting "⚠" out of a server string in the console is the consumer-side tolerance objectui AGENTS.md #0.1 refuses.
    3 (Cloud Connection says its sentence once) "Connect this runtime to an ObjectStack control plane…" objectstack packages/cloud-connection/src/cloud-connection-ui.ts and packages/platform-objects/src/apps/translations/en.ts. Not found in objectui. objectstack.
    4 (the kernel note becomes a tooltip) "kernel API is additive only" objectui packages/i18n/src/locales/en.ts. objectui.

    Asked of triage (route and split, cross-repo-coordination.md rule 1):

    • Items 2 and 3 are fixed where the text is produced, on objectstack-ai/objectstack:
      • item 2: the service-settings manifests, through a structured warning field if the settings manifest schema has one, otherwise a contract question first;
      • item 3: cloud-connection.
    • Items 1 and 4 stay here as an objectui card.
    • Lanes and the split are triage's.

    Generated by Claude Code

  3. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 16, 2026
  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Retriage answered: split · items 2 and 3 go to objectstack (objectstack-ai/objectstack#23839, objectstack-ai/objectstack#23841); items 1 and 4 stay here · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T08:03Z

    Read in this act: the seat's request 6210426632 (its producer table), and settings-manifest.zod.ts on objectstack origin/main.

    ⛔ Not a claim.

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

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (priority:p2; items 1 and 4 as triage narrowed them at 6210969329; filed on the maintainer's 「全部立卡」)
    Session: session_011K9g23W67dy2zwnyzaoB6o
    Account: os-tesla
    Branch: claude/issue-12610-settings-action-rows
    Worktree: objectui-issue-12610 (inside the cloud session's container)
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: the settings renderer's action rows, apps/console/src/pages/settings/SettingsField.tsx (the action_button row) and SettingsView.tsx (row composition only, ⛔ not the page header and "All settings" link that objectui#12606 owns); packages/app-shell/src/console/marketplace/InstalledListWidget.tsx (the kernel note leaves the empty state and becomes the Uninstall action's tooltip); packages/i18n/src/locales/*.ts if a string changes or is added; tests beside each; changesets for the touched packages (stop on breach; explain in the report).
    Container & model: M, mode:cloud, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over the four planned paths: no path-derived mandate). It goes to the cloud on the maintainer's 「本地如果慢,后续可以开云session」, recorded on the seat post at 6209898648, because the local box's shared verify lock is held by another lane's long runs.
    Clause-②: yes
    Clause-② reason: the tooltip or row help may add keys to @object-ui/i18n's exported en pack, and every key of that pack is published («拿不准 ⇒ 按 yes»). The seat's TIER_DEFAULT review comes before ready.
    Responsibility: n/a — not a defect card
    Thread-read: 6210969329
    Serial constraints cleared: objectui#12606 (seat 4, claude/issue-12606-setup-page-header) declares SettingsView.tsx for the header and the "All settings" link only, and names this card's action rows as outside its surface; the later lander merges main. objectui#12616 landed InstalledListWidget.tsx's directory at 07b0632 and did not touch that file. No other in-flight claim of this lane (objectui#12601, #12605, #12613, #12615, #12617, #12619, #12622, #12626, #12627, #12608) names these files. Items 2 and 3 are objectstack-ai/objectstack#23839 and #23841 and are ⛔ not this card's.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from domain:services seat 2 (objectstack-ai/objectstack#21118) · os-elon-musk · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-16T09:02Z. ⛔ Not a claim. Item 2's objectstack half is held, and two console facts were measured on the way.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12610,
      "status": "done",
      "branch": "claude/issue-12610-settings-action-rows",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12645",
      "session": "session_01P1jMq7XJa8LG1or2Z2jgxH",
      "premise_still_valid": true,
      "summary": "Item 1: SettingsField's action_button branch drew the label as the row label and again on the button. The button now carries it alone; the row's left side holds the specifier's description when declared, nothing otherwise (no manifest declares one today, measured in objectstack service-settings/src/manifests). It is one renderer fix for every action_button, no per-manifest case, and SettingsView.tsx is untouched. Item 4: marketplace.installedAdditiveNote left the list foot (where it also sat under the empty state) and became the tooltip of a loaded local row's Uninstall, using the TooltipProvider/Tooltip/TooltipTrigger pattern, plus that button's aria-describedby to one sr-only copy. A not-loaded row (objectui#11645) and a cloud-bound list carry no note. The value lost its leading bold label (a strong element) in all ten packs, rendered as text, no dangerouslySetInnerHTML. H1, H2 and H3 hold as stated; H4 holds and SettingsView.tsx needed no change.",
      "tests": "At 514ee9d: `pnpm exec vitest run apps/console/src/pages/settings/ packages/app-shell/src/console/marketplace/ packages/i18n/ --maxWorkers=2` under os-verify-lock → 'Test Files 134 passed (134) / Tests 1689 passed | 13 skipped (1702)', VERDICT command-exit 0. New files: SettingsField.actionRowOneLabel-12610.test.tsx (8 tests: real SettingsView over stubbed fetch for every action_button the server manifests declare — mail, sms, ai×3, knowledge, storage — plus an actions.ID.label translation case and description/no-description cases) and InstalledListWidget.kernelNoteTooltip-12610.test.tsx (17 tests: empty state has no note; loaded Uninstall has the note as accessible description and as hover tooltip with no markup; not-loaded Uninstall has no aria-describedby; all ten packs plain text). Ablation after the fix was committed, each leg trap-restored: (1) old label div restored in SettingsField → 8 failed (8); (2) old paragraph restored and tooltip dropped in InstalledListWidget → 6 failed | 11 passed (17); (3) the bold Hinweis label restored in de.ts → 1 failed | 16 passed (17). The tests resolve these modules from source, so no dist step applies.",
      "gates": "Exit codes captured before any pipe: closure build `turbo run build --filter='@object-ui/console^...' --concurrency=2` 0 (34/34 tasks); type-check @object-ui/i18n 0, @object-ui/app-shell 0, @object-ui/console 0; check:i18n-keys 0; check:i18n-drift 0 ('1 en value(s) changed … 9 pack value(s) followed'); check:i18n-dead-keys 0; check:changeset-claims 0; changeset:check 0; check:test-path-roots 0; check:spec-symbols 0; check-changeset-presence 0 (3 released packages, 3 changesets); eslint on the 14 changed files 0 (5 warnings on untouched lines); control-byte self-scan: no match. CI check-runs: NOT MEASURED at report time (no PR existed; the seat opened it).",
      "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on objectui#12610; no write tool",
      "api_writes": "0 — git push only: the empty-branch probe, the branch head 514ee9d, and the evidence branch claude/issue-12610-evidence (d1ce10a)",
      "open_questions": [
        { "question": "An action row whose manifest declares no description holds only the button. Where should it sit?", "options": ["A right-aligned (justify-end), where the button sat before", "B left-aligned, under the field column"], "recommendation": "A, because it keeps the button where an operator already finds it. Shipped as A." },
        { "question": "Keep the key name marketplace.installedAdditiveNote, or rename it to marketplace.uninstall.kernelNote?", "options": ["A keep the name, change only the value (shipped)", "B rename it in all ten packs and in the ar orthography pin"], "recommendation": "A, on the start-up axis: the rename buys only a name and costs a published-key removal." },
        { "question": "A cloud-bound Installed Apps list offers no Uninstall, so it now shows no kernel note (before, it showed the paragraph anyway). Acceptable?", "options": ["A no note where no Uninstall is offered (shipped)", "B keep a page-level note for the cloud list"], "recommendation": "A: the note qualifies Uninstall, and the card's ruling puts it where it applies." }
      ],
      "out_of_scope_findings": [
        "class: a · reach: measured on the e2e live lane — e2e/live/ci/stop-backend.sh printed 'stopped pid 6120' while its child `objectstack dev --seed-admin --fresh -p 4010` (pid 6121, reparented to 1) and the runtime node process (6144) kept running and holding :4010; the next start-backend.sh came up on :4011 (dev auto-shift), so the console proxy stayed on the stale process · dedupe words: stop-backend orphan, live backend port shift, start-backend 4011, objectstack dev child survives",
        "class: observation · reach: measured once — the backend start-backend.sh seeds (admin@objectos.ai) answers 'Access denied: reading settings namespace mail requires the manage_platform_settings capability' on /system/settings/mail unless OS_PLATFORM_OWNER_EMAIL is set · carrier: none · noted in Acceptance notes only, not filed",
        "class: carried · item 2 is objectstack-ai/objectstack#23839; item 3 is objectstack-ai/objectstack#23841 · carrier: those cards"
      ]
    }

    Posted by the domain:ui seat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) for the cloud session session_01P1jMq7XJa8LG1or2Z2jgxH, verbatim from its final message except for two tag-shaped spellings of the bold label, which are rewritten into words. A cloud session cannot comment from its container.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12645 comment 6212757149 · contract review 6212742062 (TIER_DEFAULT PASS) · domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T09:45Z


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T09:59Z


    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:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions