Skip to content

console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238

Closed

Description

@objectstack-fleet

Filing gate ③ (maintainer ruling). Ruled on #27230, letter A, comment 6468327468, 2026-10-28; the maintainer's words in the session thread, verbatim: 「同意」. This is the Console half; the server half (object, resolver chain, REST surface, install-local answer) is #27237 (the sibling card filed in the same batch).

Filed by session_01J8VVAjRKqdoEYQ4hXxtBuf. ⛔ Not a claim. Lane suggestion: domain:ui (ui/packages/app-shell, the Setup Integrations group and the marketplace install dialog). Triage sets labels and priority. Blocked-by: #27237 (the server card's REST surface).

Business reason. The customer's administrator who installs an app holds the vendor key and has no server access on a hosted environment. Today there is no place in the Console to supply the credential a connector declares, so the app's integration stays dark. This card is that place: one page listing every declared credential with its status, and a prompt at install time.

Who acts. The domain:ui seat, against the sibling's routes. Readers: administrators; the docs page for Setup.

Dedupe: as #27230 (two searches, 2026-10-28, nothing open).

Governing text

Protocol statement. Metadata-protocol: none. Skills-docs: follow-up owed — an administrator page under content/docs (Setup → Integrations → Connector credentials: what the list shows, env-sourced rows, rejected status, skipping at install).

Premises (each with a re-check)

  1. Setup's Integrations group exists and takes plugin-contributed entries. Re-check: git grep -n "group_integrations\|Integrations" origin/main -- packages/platform-objects/src/apps/setup-nav.contributions.ts.
  2. The marketplace install dialog is MarketplacePackagePage's install dialog (ui/packages/app-shell/src/console/marketplace/). Re-check: git grep -n "install" origin/main -- ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx.
  3. The sibling's routes exist on the runtime the Console talks to (blocked until then).

Work

  1. Connector credentials page under Setup → Integrations, contributed by the automation service's UI bundle: one row per declared ref — ref, connector, package, status (set / missing / rejected with the upstream message / env read-only), last changed by/at; a masked input to set or replace (empty = unchanged), a clear action with confirm. Never displays a value.
  2. Install dialog: after the package's manifest is resolved and before install, a "Credentials" step listing the refs the package declares that are missing, each with a masked input and a "skip for now" affordance; skipped refs are shown on the result screen with a link to the page.
  3. Honesty states: when the runtime has no credential routes (older runtime, or walled posture refusing), the page renders the configuration conclusion, not an error.
  4. Docs: the administrator page named in Skills-docs:.

Acceptance

  • Install HotCRM on a fresh environment through the Console with no env vars: the dialog shows the Slack ref as missing; fill it; the connector is ready on the next reconcile without restart; the page shows set, by whom, when.
  • Skip at install; the page shows missing; set it later; same result.
  • A wrong key: page shows rejected with the upstream message; correcting it clears the state.
  • With the ref in env: the row reads env, input disabled.
  • No value ever rendered, in the DOM or in network responses.

Out of scope

Related

#27230 (ruling) · #27237 · #26702 · #27223 · ADR-0007.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: domain:ui, p2, area:automation · pm:blocked on #27237 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-28T13:14Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Part of #27293 (E2 credential hand-off) · 2026-10-28T15:01Z

    Epic link on the maintainer's ruling 「是否建议立专题卡统一处理。」→「同意」 (2026-10-28, session_01J8VVAjRKqdoEYQ4hXxtBuf). Role in the chain: the Console half — credentials page and install dialog step; Blocked-by #27237 stands. Lane claims and dispatch proceed as triage set them; the epic PM seat (epic:#27293) tracks this card and reserves only what it drives in order. ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

    Reserved for the epic subtree · 2026-10-28T15:12Z — pm:epic added; pm:blocked on #27237 unchanged.

    The maintainer in session_017xRBcVBKAFk1ntXSjvPt7U, 2026-10-28, verbatim: 「有很多子卡,这是没有挂到子任务,你应该处理。」 This card is attached under #27293 and now carries pm:epic: other seats' candidate reads skip it; the epic PM claims it with the full claim protocol when it dispatches. ⛔ Not a claim, ⛔ not a dispatch.

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Cloud ask (objectstack-ai/cloud#3352) (2026-10-28T15:41Z)

    On a hosted environment, the Console installs a package through /cloud-connection/install. That call reaches the cloud control plane's POST /cloud/environments/:id/install-package, not install-local (MarketplacePage.tsx:462-474, MarketplacePackagePage.tsx:94-105). So a prompt fed by install-local's answer (#27237 item 5) never appears on hosted environments, and the triage note "no cloud change required" does not hold for them.

    Ask: could the install dialog's credential step read the environment's credential-refs route (the #27237 contract) after any install completes, whether hosted or local, instead of reading it off the install answer? Then both paths get the prompt with no cloud change. If that does not fit this card, please say so here, and cloud#3352 will make the control plane's install answer carry the refs in #27237's shape.

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 能用的表单 | none | P②

    Triage: unblocked · p2 · domain:ui · pm:queue · 2026-10-30T12:28Z

    ⛔ Not a claim.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 2 · 2026-10-30T14:55Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibvG8uA9GWnnZkscgFF, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-5nh6oc (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27238
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/app-shell/src/** (a new Setup → Integrations page and the marketplace install dialog step), i18n keys in the ten packs, the automation service's UI bundle declaration in packages/services/service-automation (contribution only; cross-lane, the dev checks open claims and PRs there first), packages/cli/scripts/check-app-nav-i18n.mjs if the bundle census needs a row, a content/docs administrator page, tests, root changeset (stop on breach; explain in the report)
    Container & model: L, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: xhigh
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6522868103
    Premise: holds (the server half #27237 is closed; credential object, resolver and door present on origin/main 10fc9bf1; the pm:epic reservation was released by triage 6522868103)
    Serial constraints cleared: no live claim or open PR touches the marketplace install dialog or a Setup Integrations page; domain:ui#2 is going off duty (6524625478) and was told of this split on #25995

    Clause-② is the seat's expectation; the dev measures it on the built entry (a new public export or route is yes (widening: …)) and the seat amends the claim if it moves. Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-27238.md under FRAME.md (delivered in the card thread's opening message).

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibvG8uA9GWnnZkscgFF

    os-dev-report

    {
      "issue": 27238,
      "status": "done",
      "branch": "claude/project-thread-5nh6oc",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28200",
      "head": "e7b058e504a7dabc7b4b5f62afabc1c2053ac938",
      "session": "session_01L9qibvG8uA9GWnnZkscgFF (card thread; seat session_01L9qibzC6RxMfB59EsgAoNN)",
      "premise_still_valid": true,
      "summary": "Setup -> Integrations -> Connector Credentials page (list with status/connectors/last change, masked set/replace input that starts empty and sends nothing when empty, Clear behind a confirm, env rows read-only, 403/404/501/503 drawn as configuration notices) plus a credential step in the install result after any install landing in this runtime (install-local with hotLoaded, org install, cloud install once served), filtered by connectors[].packageId, with Skip for now and a link to the page. The nav entry is CONNECTOR_CREDENTIALS_UI_BUNDLE in @objectstack/service-automation, registered through the manifest service at kernel:ready (cloud ADR-0009 shape); app-shell registers component automation:connector-credentials.",
      "tests": "44 new ui tests in 5 files (connectorCredentials 18, page 13, nav contribution 3, install step 7, marketplace install-local integration 3) and 5 new service-automation tests (bundle parses under ManifestSchema; LiteKernel boot registers it once at kernel:ready; inert boot and no-manifest boot register none), all passing. Regression: setup + marketplace 50 files / 487 tests and packages/i18n pass at the head.",
      "gates": "dispatch-gates --commands: 97 derived, all exit 0 (check:skill-examples and check:dual-build-cjs-loads first exited 3 on missing dists, then 0 after a full workspace build). --ran reconciliation at e7b058e5: 97 run, 0 NOT-MEASURED, 0 UNRUN. Outside the derivation, all exit 0: typecheck of service-automation (+ check:test-typecheck), platform-objects and cli; type-check of @object-ui/i18n and @object-ui/app-shell; check:app-nav-i18n (13 contributors); ui check-eager-closure-budget (2006.9 / 2431.6 KB gz); ui check-i18n-call-site-keys and check-i18n-en-drift; ui check:new-line-citations (0 new); eslint on changed sources. CI check-runs on PR 28200: started at report time.",
      "line_budget": "+2481 / -4, 35 files, under the 3000 human-merge threshold",
      "files_changed": [
        ".changeset/27238-connector-credentials-page.md",
        "content/docs/automation/connectors.mdx",
        "packages/cli/scripts/check-app-nav-i18n.mjs",
        "packages/platform-objects/src/apps/translations/{en,es-ES,ja-JP,zh-CN}.ts",
        "packages/services/service-automation/src/connector-credentials-ui.ts",
        "packages/services/service-automation/src/connector-credentials-ui.test.ts",
        "packages/services/service-automation/src/index.ts",
        "packages/services/service-automation/src/plugin.ts",
        "ui/packages/app-shell/src/console/marketplace/ConnectorCredentialsStep.tsx",
        "ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx",
        "ui/packages/app-shell/src/console/marketplace/MarketplacePage.tsx",
        "ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts",
        "ui/packages/app-shell/src/console/marketplace/__tests__/ConnectorCredentialsStep-27238.test.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePackagePage.credentialStep-27238.test.tsx",
        "ui/packages/app-shell/src/services/builtinComponents.tsx",
        "ui/packages/app-shell/src/views/setup/ConnectorCredentialsPage.tsx",
        "ui/packages/app-shell/src/views/setup/ConnectorCredentialsPage.test.tsx",
        "ui/packages/app-shell/src/views/setup/ConnectorCredentialsPage.navContribution.test.tsx",
        "ui/packages/app-shell/src/views/setup/CredentialValueForm.tsx",
        "ui/packages/app-shell/src/views/setup/connectorCredentials.ts",
        "ui/packages/app-shell/src/views/setup/connectorCredentials.test.ts",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "ui/packages/i18n/src/locales/index.ts"
      ],
      "deviations": [
        "Clause-② measured yes (widening): three new exports on the published @objectstack/service-automation entry and a new Setup nav entry; the claim said no.",
        "The credential prompt is AFTER the install (in the install result), not before: the door answers 404 for a reference no installed package declares, so a value typed before the install could not be stored.",
        "Cloud ask 6473504855 adopted: the step reads the same GET credential-refs route the page uses, filtered by package, after install-local and after a cloud install once served in this runtime; no cloud change.",
        "Skills-docs: updated here as a Console paragraph pair in the existing content/docs/automation/connectors.mdx 'Setting a credential' section, not a new page (a new page would duplicate that section).",
        "ui/packages/i18n/src/locales/index.ts: builtInLocales gets an explicit type (each property typeof its pack) because the 43 new keys pushed the inferred type past tsc's serialization limit (TS7056 on the @object-ui/i18n build). Type unchanged.",
        "Dogfood roster platform-app-object-entry-views.test.ts not changed: it judges object entries only, and this entry is a component."
      ],
      "live_stack_only": "Not run: the entry in a real Setup sidebar for an admin vs a member; a real install-local flipping a degraded connector to ready through the step; the walled posture sentence on a group deployment.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — issue_read get x1, issue_read get_comments x2, list_pull_requests x1, pull_request_read get x1 (mergeable_state blocked: draft, checks pending; not dirty or behind); no write tool",
      "api_writes": "2 — pr_create via fleet-write relay (run 41090883303, read-back identical, 11280 bytes); this comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  8. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-30T16:36Z · amends claim 6525790151 at the card thread's request (os-dev-report 6527973633). Append-only.

    Clause-②: yes (widening: @objectstack/service-automation exports CONNECTOR_CREDENTIALS_UI_BUNDLE, CONNECTOR_CREDENTIALS_COMPONENT_REF and CONNECTOR_CREDENTIALS_NAV_CAPABILITY, and registers a new Setup navigation entry nav_connector_credentials resolving component ref automation:connector-credentials; no existing key, route or shape changes)

    The claim's Clause-②: no was the seat's expectation. The dev's measurement on PR #28200 replaces it. The widening puts a contract face on the PR, so the contract review goes to the contract-review lane (Fable tier) before the seat lands it. The file surface is unchanged: the server-side edits stay limited to the bundle declaration, its registration at kernel:ready and the three re-exports.

  9. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-30T20:50Z · PR #28200 (seat ACCEPT pinned to 295ae9d8, contract-review PASS 6532419644).

    reading value
    PR merged 2026-10-30T20:49:36Z as 0c8c27eb through the merge queue. It waited on main-red #28219 and a main merge before the lane's PASS
    origin/main content ui/packages/app-shell/src/views/setup/ConnectorCredentialsPage.tsx, ui/packages/app-shell/src/console/marketplace/ConnectorCredentialsStep.tsx and packages/services/service-automation/src/connector-credentials-ui.ts present

    State: the card closes as completed by Fixes #27238, and pm:dispatched comes off in the same stroke as this note. Nothing remains on this card. The contract review's S1 (live install round trip) and S2 (Integrations order pin) are #28260.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions