Skip to content

Connector credentials: prove the install-local round trip on a live stack, and pin the Setup Integrations order #28260

Closed

Description

@objectstack-fleet

domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

Filing gate: ② should-fixes S1 and S2 from the contract review PASS record 6532419644 on PR #28200 (#27238). The seat files them under os-dev rule 3.
Business reason: the Connector Credentials page and the install-time credential step exist so an administrator can make an installed app's connectors work without server env vars or a restart (ruling A on #27230). jsdom pins the screens, but nothing yet shows the real round trip, where a missing ref is filled and the connector becomes ready without a restart. And nothing stops a later contributor from silently re-ordering the Integrations group.
Reader who acts: domain:ui (QA probe on a dev stack, plus one test file).
Duplicate search: open issues with "connector credentials live round trip" / "Integrations group order pin" found none. New.

S1: live round trip (QA probe)

On a dev stack with no connector env vars:

  1. Install HotCRM through the Console marketplace (install-local).
  2. The install result's credential step lists the Slack ref as missing. Skip it, and see that the result links to Setup → Integrations → Connector Credentials.
  3. On that page, fill the ref. The connector reports ready without a restart, and the page never shows the value.

Record what you ran and what you saw on this card. A failure is a defect against #27238's code, filed with evidence.

S2: order pin

Setup → Integrations orders by contribution priority: Webhooks / Datasources at 100, Connect an Agent at 110, Connector Credentials at 120 (packages/services/service-automation/src/connector-credentials-ui.ts), Cloud Connection at 200. Add one merged-order pin, in packages/cli/test beside connect-agent-both-halves-wire.pin.test.ts or in check-app-nav-i18n, so that a later contributor can't reorder the group silently.

Serial: after PR #28200 lands.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:ui · area:automation · 2026-10-30T20:56Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 6 · 2026-10-31T04:31Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qiby1xTh1tChY988SHhX, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-6qrx89 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28260
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: one new test file in packages/cli/test/** (the Setup Integrations merged-order pin) and the S1 live-probe record on this card; no product source (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
    Metadata-protocol: none
    Responsibility: the live Connector Credentials round trip is recorded on a dev stack, and the Setup Integrations order is pinned (S1 + S2 of review 6532419644 on #28200)
    Thread-read: 6533291401
    Premise: holds (PR #28200 merged 0c8c27eb; no merged-order pin exists beside connect-agent-both-halves-wire.pin.test.ts)
    Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. Other ui seats have not claimed this card.

    Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28260.md under FRAME.md.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qiby1xTh1tChY988SHhX

    S1 record: the connector credential round trip on a live stack — GREEN, on a probe package

    Taken 2026-10-31T05:29Z on objectstack-ai/objectstack at 98931dde (base b3394651, which contains #28200's 0c8c27eb), after a full workspace build and packages/console/build-dist.sh. Draft PR for S2: #28336.

    Two departures from the card's steps, and why

    1. HotCRM declares no connector, so it has no Slack reference to list. git grep -il credentialRef origin/main in objectstack-ai/hotcrm at a598256 (unshallowed) returns nothing, and HotCRM's own content/docs/guides/integrations.mdx says "src/ carries no connector metadata of any kind"; Slack appears there only as a roadmap row. The "HotCRM Slack connector" in [Decision] Where a customer administrator supplies a declarative connector credential: a platform credentials page over an encrypted object, an app-shipped settings manifest, env-only as today, or the OAuth connection record #27230's analysis does not exist on main. So installing HotCRM would show an empty credential step, which proves nothing about the round trip. The probe used a package of its own, com.example.slackprobe ("Slack Probe"), declaring exactly one connector:
      { name: slack_probe_api, type: api, provider: rest, providerConfig: { baseUrl: (the dev stack itself) }, auth: { type: bearer, credentialRef: SLACK_BOT_TOKEN } }
    2. The marketplace catalog was a local stand-in. This container's proxy refuses cloud.objectos.ai and marketplace.objectos.ai (CONNECT tunnel failed, response 403). The dev stack therefore read its catalog through the supported OS_MARKETPLACE_PUBLIC_BASE_URL, pointed at a ~40-line local server that serves the snapshot shape (packages.json, packages/slack_probe.json, packages/slack_probe/versions/latest/manifest.json). Everything from the Console package page onward is the real stack: MarketplaceProxyPlugin, MarketplaceInstallLocalPlugin, the credential door, the automation service and the Console.

    Stack

    • OS_MARKETPLACE_PUBLIC_BASE_URL=http://127.0.0.1:38518 pnpm dev -- --fresh -p 38517 (showcase). No connector env var: SLACK_BOT_TOKEN unset (checked by presence, not by value). OS_CLOUD_URL unset.
    • GET /api/v1/runtime/config → features: { installLocal: true, marketplace: true }.
    • Driven in headless Chromium (Playwright) as admin@objectos.ai. Server pid 15400, started 05:02:11Z.

    Step 1 · Install through the Console marketplace

    /_console/system/marketplace/slack_probe → Install.

    POST /api/v1/marketplace/install-local {"packageId":"slack_probe"} → 200:

    {"manifestId":"com.example.slackprobe","version":"0.1.0","versionId":"v1","hotLoaded":true,
     "credentialRefs":[{"ref":"SLACK_BOT_TOKEN","connectors":["slack_probe_api"],"status":"missing","source":null}],
     "credentialNote":"Connector credential 'SLACK_BOT_TOKEN' needs an administrator — not set, refused by the upstream, or unreadable now (each entry's `status` says which). The connector instances naming them are installed degraded and materialize once each is set: PUT /api/v1/automation/connectors/credential-refs/:ref, or a server environment variable of the same name.", "...": "…"}

    Server log at install: WARN [Automation] connector instance 'slack_probe_api' (provider 'rest') is degraded: credential 'SLACK_BOT_TOKEN' is not set. …

    Step 2 · The credential step lists the ref as missing — ✅

    On screen, under "Installed v0.1.0 to this runtime.": a Credentials panel, "The connectors of this app need these credentials. Enter each one now, or skip it and set it later.", one row SLACK_BOT_TOKEN slack_probe_api with an empty masked input, a disabled Save and Skip for now.

    GET /api/v1/automation/connectors/credential-refs → 200: SLACK_BOT_TOKEN status: missing, writable: true, declared: true, connector slack_probe_api (packageId: com.example.slackprobe) state: degraded.

    Step 3 · Skip → the result links to Setup → Integrations → Connector Credentials — ✅

    After Skip for now: "Skipped for now · SLACK_BOT_TOKEN · The connectors that use them stay disconnected until each one is set." and the link Set them in Connector credentials → /_console/apps/com.objectstack.setup/component/automation/connector-credentials. Following it opened the page.

    The Setup sidebar's Integrations group read, top to bottom: Webhooks, HTTP Deliveries, Datasources, Connect an Agent, Connector Credentials, Cloud Connection (the order #28336 pins).

    Step 4 · Fill the ref → ready without a restart, value never shown — ✅

    Page before: SLACK_BOT_TOKEN · slack_probe_api · com.example.slackprobe · Missing, input type=password, empty.

    Typed a probe token and pressed Save. PUT /api/v1/automation/connectors/credential-refs/SLACK_BOT_TOKEN request {"value":"REDACTED"} → 200:

    {"ref":"SLACK_BOT_TOKEN","status":"set","source":"object","writable":true,"declared":true,
     "connectors":[{"name":"slack_probe_api","packageId":"com.example.slackprobe","state":"ready"}],
     "updatedAt":"2026-10-31T05:04:41.429Z","updatedBy":"aPIvyNcbsR4QACN8KHZlCylmhRIImV7v"}

    On screen: "Saved SLACK_BOT_TOKEN. The connectors that use it reconnect with it now.", status Set, "Last changed 10/31/2026, 5:04:41 AM by aPIvyNcbsR4QACN8KHZlCylmhRIImV7v", the input empty again with the placeholder "Enter a new value to replace it", plus Clear.

    • GET /api/v1/automation/connectors → slack_probe_api origin: declarative, state: ready, actions ["request"].
    • No restart: server pid 15400, started 05:02:11Z, before and after the save.
    • Value never shown: the token string was searched for in every response body the browser received (0 hits), the page's text, every input's value and the full HTML after save (absent), the HTML after a reload (absent), both GET routes above (absent) and the server log (0 lines).

    Verdict

    Every check the card names holds: the ref is listed missing by the install's credential step, Skip links to Setup → Integrations → Connector Credentials, filling it there makes the connector ready without a restart, and the value is never echoed. No defect against #27238 to file. Open for the seat: whether HotCRM's missing Slack connector (a premise of #27230, not of #27238's code) needs a card of its own.

    Observation, not filed: "Last changed … by" shows the raw user id rather than a display name.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qiby1xTh1tChY988SHhX

    os-dev-report

    {
      "issue": 28260,
      "status": "done",
      "branch": "claude/project-thread-6qrx89",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28336",
      "session": "session_01L9qiby1xTh1tChY988SHhX (card thread; seat session_01L9qibzC6RxMfB59EsgAoNN)",
      "premise_still_valid": true,
      "summary": "S2: one new test, packages/cli/test/setup-integrations-order.pin.test.ts, folds the real Setup shell and the five group_integrations contributors (plugin-webhooks and service-datasource booted through init on a manifest-only context, the mcp / service-automation / cloud-connection bundles read directly) through SchemaRegistry and pins the merged order tier by tier, with the priorities read from the contributions (no priority literal in the test). S1: the live round trip is GREEN and recorded on the card (comment 6539579665): install-local listed SLACK_BOT_TOKEN missing, Skip linked to Setup → Integrations → Connector Credentials, filling it there made the connector ready with the same server pid, and the value appeared nowhere. Two departures, both named in the record and the PR: HotCRM declares no connector on main, so the probe used its own package com.example.slackprobe with one rest connector naming SLACK_BOT_TOKEN; and cloud/marketplace hosts are refused by this container's proxy, so the catalog was a local snapshot server behind OS_MARKETPLACE_PUBLIC_BASE_URL.",
      "tests": "at 98931dde: pnpm --filter @objectstack/cli exec vitest run --project unit test/setup-integrations-order.pin.test.ts test/connect-agent-both-halves-wire.pin.test.ts test/vitest-tiers-partition.test.ts → 3 files / 25 tests passed. cli unit tier (--project unit --maxWorkers=2) → 358 files / 5136 tests passed, lock VERDICT command-exit 0; integration tier declared to CI (no integration-tier file or spawn entry touched). pnpm --filter @objectstack/cli typecheck (tsc + check:test-typecheck) → exit 0. Ablation, one-time: ablation-replace swapped connector-credentials-ui.ts 120→110 and connect-ui.ts 110→120 (on-disk counts automation 110=1 120=0, mcp 110=0 120=1), both packages rebuilt (exit 0), ablation-dist-preflight saw 'priority: 110' in service-automation dist and 'priority: 120' in mcp dist (both markers absent from the pristine dist beforehand), pin RED: expected Set{ 'nav_connector_credentials' } to deeply equal Set{ 'nav_connect_agent' }. Restore: blob == HEAD and git diff HEAD empty for both files, rebuilt, --absent preflight clean with the tree clean, pin green (1 passed).",
      "gates": "local: dispatch-gates --commands derived 48 families against the diff; all 48 run with </dev/null, exit codes on disk (28260-gates-ran-98931dde.list in the seat's out folder); check-plugin-teardown-shape --self-test first exit 3 (fixture sha absent from the shallow clone), after git fetch origin 621a487607881c66b2899b7e3477115229a156b4 --depth=1 exit 0. dispatch-gates --ran: '48 derived famil(ies) accounted for — 48 run, 0 NOT-MEASURED'. node scripts/check-sdui-manifest.mjs exit 0. CI check-runs on #28336: in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "+181 / -0, 1 file (packages/cli/test/setup-integrations-order.pin.test.ts); under the 3000-line threshold",
      "files_changed": ["packages/cli/test/setup-integrations-order.pin.test.ts"],
      "deviations": [
        "S1 package: a probe package (com.example.slackprobe, connector slack_probe_api, credentialRef SLACK_BOT_TOKEN) instead of HotCRM, because HotCRM main (a598256) declares no connector and so has no Slack ref",
        "S1 catalog: a local snapshot server behind OS_MARKETPLACE_PUBLIC_BASE_URL, because cloud.objectos.ai and marketplace.objectos.ai are refused by this container's proxy (CONNECT 403)",
        "PR body carries Fixes #28260 on the strength of S1 recorded green with the two departures above; switch it to Refs if the seat does not accept the probe package",
        "skip-changeset rides the pr_create: the only file is under packages/cli/test, and @objectstack/cli ships files [dist, README.md, CHANGELOG.md]"
      ],
      "mcp_calls": "5 — reads only: issue_read get #28260, issue_read get_comments #28260 (x2), issue_read get #27230, pull_request_read get #28336; 0 writes",
      "api_writes": "3 via the fleet-write relay — pr_create (#28336, labels skip-changeset), POST /repos/objectstack-ai/objectstack/issues/28260/comments (S1 record 6539579665), POST /repos/objectstack-ai/objectstack/issues/28260/comments (this report); plus 1 git push",
      "open_questions": [
        {
          "question": "HotCRM has no Slack (or any) connector on main, though #27230's analysis cites one as a measured pull. File a card?",
          "options": ["A: note only — #27230 is ruled and its mechanism is proven live; HotCRM's integrations page already marks Slack as roadmap", "B: file a hotcrm card for a real Slack connector declaring a credentialRef"],
          "recommendation": "A, because the gap is a roadmap item HotCRM already documents, and the platform half is now proven without it"
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: the Connector Credentials page's Last changed column shows the raw user id (… by aPIvyNcbsR4QACN8KHZlCylmhRIImV7v) rather than a display name"
      ]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T06:48Z · PR #28336 (seat ACCEPT 6539743113, pinned to 98931dde; test-only, so no contract review is owed).

    reading value
    PR merged 2026-10-31T06:10:08Z as 92120357 through the merge queue, on the first pass
    origin/main content packages/cli/test/setup-integrations-order.pin.test.ts is present. It pins the Setup → Integrations merged order from each contribution's own priority.

    State: Fixes #28260 closes the card as completed. S1 is recorded GREEN in 6539579665, on a one-connector probe package, because HotCRM main declares no connector. That departure was accepted by the seat. No defect against #27238 was found. pm:dispatched comes off in the same stroke as this note. Nothing remains on this card.

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