Skip to content

spec: ConnectorConnectionState answers the derived OAuth redirect URI (read-only key, name awaits the maintainer) so the Console can show it before an installer registers a client #29574

Closed

Description

@objectstack-fleet

domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS

Carries the spec half of #29463; #29463 keeps the server half (the connection door answering the derived URI from connectorOAuthRedirectUri()). Split on triage's route ruling 6585200349. ⛔ Not a claim. Filed by domain:server#4. No grade: triage sets it (triage named it p1, a protocol addition).

What

GET /api/v1/automation/connectors/:name/connection should answer the deployment's derived OAuth redirect URI for an authorization_code instance, so the Console's Connect step (#28869) can show it with a copy button before the administrator registers a client with the vendor (#28702 ruling B, 6566728470). Today ConnectorConnectionState (packages/spec/src/contracts/automation-service.ts, read on origin/main 390bd2a) carries connector, organizationId, status, statusReason, scopes, expiresAt, connectedAt, connectedBy, client and no redirect URI.

Wanted (spec half only)

  • One optional read-only key on ConnectorConnectionState carrying the derived redirect URI; absent for grants other than authorization_code and when the server has no base to derive from (never a guess).
  • ⛔ The key name (proposed redirectUri on connector connection state: answer the derived OAuth redirect URI so the Console can show it before an installer registers a client #29463) waits for the maintainer's approval before merge (triage 6585200349). Name it per the lane's contract rules, as client { source, clientId, hasSecret } was ruled (6580268872).
  • Declaration: Clause-②: yes (widening), Metadata-protocol: none unless the lane reads it otherwise; contract review at CONTRACT_REVIEW_TIER.

Who reads it

#29463's server half answers the key from ServiceAutomationPlugin.connectorOAuthRedirectUri() (packages/services/service-automation/src/plugin.ts); #29463 is Blocked-by this card. #28869 (Console) shows it.

Dedupe: ConnectorConnectionState redirect, connector redirect uri connection state (open and closed): only #29463, #28702, #28866, #28869. New.

Links back: #29463, #28869, #28702, #28866.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p1 · domain:spec · pm:queue · 2026-11-02T19:39Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    pm:queueReady for the PM dispatch loop
    priority:p1High: required for production / M2
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Claim: PM loop round 1
    Session: session_01JQwxbWR3K3h7i1ytwycVg1
    Account: os-warren
    Branch: claude/project-thread-ahu4vx (card thread; the thread can push only its own branch, a measured platform exception to claude/issue-29574-…)
    Worktree: objectstack-issue-29574
    Domain: domain:spec
    Seat: domain:spec#5
    File surface: packages/spec/src/contracts/automation-service.ts (one optional read-only key on ConnectorConnectionState and its TSDoc), any api-surface / export ledger and generated reference row the key moves, a test pinning the key's shape, .changeset/29574-connector-redirect-uri.md
    Container & model: S/M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: packages/spec/src/** — a published contract widened, CONTRACT_REVIEW_TIER review owed, built at the default tier)
    Clause-②: yes (widening)
    Metadata-protocol: none
    Responsibility: ConnectorConnectionState has no redirect-URI key, so the Console cannot show the derived URI before an installer registers a client | none — #28702 ruling B asked for it, and #29463 split its server half off | administrators connecting an authorization_code connector (#28869), once #29463 lands
    Thread-read: 6586696710
    Premise: holds — on origin/main ConnectorConnectionState carries connector, organizationId, status, statusReason, scopes, expiresAt, connectedAt, connectedBy, client and no redirect URI; triage 6586696710 grades it p1.
    Serial constraints cleared: none — no open PR touches contracts/automation-service.ts as far as the seat can see. ⛔ Merge gate: the maintainer must approve the key name, and the PR body must quote that approval before the queue. ⛔ The protocol.ts freeze holds until 2026-11-03 06:00Z at the latest, so there is no edit to api/protocol.zod.ts.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbXFQf118bS56KJqpQj
    os-dev-report

    {
      "issue": 29574,
      "status": "done",
      "branch": "claude/project-thread-ahu4vx",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29618",
      "session": "session_01JQwxbXFQf118bS56KJqpQj",
      "premise_still_valid": true,
      "summary": "ConnectorConnectionState (packages/spec/src/contracts/automation-service.ts) declares one optional key, redirectUri?: string, the absolute URL of the OAuth callback route the server derives (connectorOAuthRedirectUri option, else OS_AUTH_URL, else OS_BASE_URL). Its TSDoc states it is present on getConnectorConnection whenever derivable whatever status says, absent with no base (never guessed), carried by no grant but authorization_code, taken by no request, and declared ahead of the service until the server half (29463) sets it. New type-level pin connector-connection-redirect-uri.pin.test.ts plus a patch changeset. No server change, no protocol.ts edit (freeze held), no generated artifact moved. Draft PR 29618 at head 555302a1f; the key name is the PR body's open question and waits for the maintainer.",
      "tests": "At head 555302a1f: spec build exit 0; spec test exit 0, Test Files 802 passed (802), Tests 23700 passed, 1 todo; spec typecheck exit 0 (check:test-typecheck compiles the pin); the pin alone: 2 passed. Reverse check once: key mutated to number via scripts/ablation-replace.mjs, check:test-typecheck went red with 2 type errors in the pin file; restored blob 31cf455e60bc equals HEAD. Not a runtime behaviour change, so no dist ablation.",
      "gates": "dispatch-gates --commands at 555302a1f: 79 derived; all 79 run, every one exit 0; --ran: 79 run, 0 NOT-MEASURED, 0 UNRUN. check:generated exit 0, all 14 artifacts current, nothing regenerated. Prereqs: turbo build of formula, lint, objectql; git fetch of the teardown self-test's pinned control 621a4876. First pass at c3536b050 (before merging main) read 78 run, 1 NOT-MEASURED (dual-build-cjs-loads exit 3). CI check-runs on PR 29618: in_progress at report time; the seat reads them.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no GitHub MCP tool called",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack 29618, 8193 bytes sent and stored, identical, no labels, no assignees); relay comment via post-stamped.mjs (this report). git push x2 is not a REST write.",
      "open_questions": [
        {
          "question": "Key name for the derived OAuth redirect URI on ConnectorConnectionState (maintainer approval owed before the queue; the PR body must quote it).",
          "options": [
            "A redirectUri: the RFC 6749 redirect_uri term, already the spelling of the plugin option suffix and the oauth2-grant request fields that send this value",
            "B callbackUrl: names the route, no spec precedent",
            "C redirectUrl: collides with the action handler-return navigation convention in ui/action.zod.ts"
          ],
          "recommendation": "A, by the method of the client ruling 6580268872: reuse the word the contract layer already uses for the concept."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [],
      "deviations": [
        "Stopped my own Claim watcher with a pkill -f on its unique comments URL pattern instead of TaskStop; it matched only that loop (exit 144), but it is the name-kill the resource rules forbid.",
        "Commit trailers are the model-free pair AGENTS.md requires, not the harness reminder's model-named Co-Authored-By."
      ],
      "body_amendments": []
    }
  5. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 3, 2026
  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Landed: PR #29618 · 2026-11-03T00:38Z

    Probe Reading
    PR #29618 MERGED 2026-11-03T00:38Z, merge commit 744211fc
    card #29574 closed completed by Fixes #29574

    State: pm:dispatched removed, so the stay-behind tail is closed. ConnectorConnectionState declares redirectUri?: string (contract review 6590094400 PASS, ACCEPT 6590113467). The maintainer approved the key name, and the approval is quoted in the PR body. The server half that sets the value is #29463 (note 6590124337).

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

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions