Install for my organization / Connect Slack on the Connections table ended on a screen titled "Connect Slack" with an empty body and only a Return button. SlackProcesses.connectAction declared a frontend step with a view field (authorizeUrl) but no component, and a frontend step shows only the components it declares.
After Slack, the callback redirected to /preferences?section=slack, which the host UI does not serve (its Preferences page is /app/preferences).
In an environment without the public URL or the Slack app secrets, connecting failed with IllegalArgumentException (Slack public URL is required) or Slack secret unavailable.
What changed
The Connect and Install processes end on an HTML component: one sentence about what happens, a Continue to Slack link to the consent page (same tab) and the link's lifetime, read from the new SlackOAuthState.LIFETIME_SECONDS (600 seconds, "10 minutes"). The address is in the link target only. authorizeUrl stays a process value for API clients.
The callback returns to /app/preferences?section=slack&result=connected or &error=<code> (SlackOAuthRouteProvider.returnUrl).
SlackConnect.startUrl refuses an environment that is not set up before issuing any state, with a QUserFacingException: "Slack is not set up in this environment", which of the public URL and the Slack app secrets is missing, and the names of the missing environment variables. Never a value.
The Preferences action is unchanged: it answers with the authorize address as the whole message, because core has no redirect field on UserPreferenceActionResult (checked through QQQ 4.1.0-RC.31). The matching qqq-frontend-next change opens a message that is only an https: address instead of showing it in a toast.
Tests
SlackConnectScreenTest (new, 7 tests): the screens declare a component; the HTML links to the authorize address and states the lifetime, with no address in visible text; a real RunProcessAction run stops on the screen with its HTML; the preference action answers with the address alone; the return URL; the three refusal sentences, through startUrl, the preference action and the process step, with a canary proving no value leaks. SlackOAuthRouteTest now asserts the /app/preferences location and fails on the old code.
## What was wrong (staging, qbit-slack 0.1.0-RC.6)
1. **Install for my organization** / **Connect Slack** on the Connections table ended on a screen titled "Connect Slack" with an empty body and only a Return button. `SlackProcesses.connectAction` declared a frontend step with a view field (`authorizeUrl`) but no component, and a frontend step shows only the components it declares.
2. After Slack, the callback redirected to `/preferences?section=slack`, which the host UI does not serve (its Preferences page is `/app/preferences`).
3. In an environment without the public URL or the Slack app secrets, connecting failed with `IllegalArgumentException (Slack public URL is required)` or `Slack secret unavailable`.
## What changed
- The Connect and Install processes end on an `HTML` component: one sentence about what happens, a **Continue to Slack** link to the consent page (same tab) and the link's lifetime, read from the new `SlackOAuthState.LIFETIME_SECONDS` (600 seconds, "10 minutes"). The address is in the link target only. `authorizeUrl` stays a process value for API clients.
- The callback returns to `/app/preferences?section=slack&result=connected` or `&error=<code>` (`SlackOAuthRouteProvider.returnUrl`).
- `SlackConnect.startUrl` refuses an environment that is not set up before issuing any state, with a `QUserFacingException`: "Slack is not set up in this environment", which of the public URL and the Slack app secrets is missing, and the names of the missing environment variables. Never a value.
- The Preferences action is unchanged: it answers with the authorize address as the whole message, because core has no redirect field on `UserPreferenceActionResult` (checked through QQQ 4.1.0-RC.31). The matching qqq-frontend-next change opens a message that is only an `https:` address instead of showing it in a toast.
## Tests
`SlackConnectScreenTest` (new, 7 tests): the screens declare a component; the HTML links to the authorize address and states the lifetime, with no address in visible text; a real `RunProcessAction` run stops on the screen with its HTML; the preference action answers with the address alone; the return URL; the three refusal sentences, through `startUrl`, the preference action and the process step, with a canary proving no value leaks. `SlackOAuthRouteTest` now asserts the `/app/preferences` location and fails on the old code.
`./mvnw -B verify`: 185 tests, 0 Checkstyle violations, guardrails and JaCoCo gate pass.
Not verified in a browser: no environment sign-in was available. Issue 36 (Uninstall/Disconnect across environments) is not touched.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Install for my organization and Connect Slack on the Connections table
ended on an empty screen with only a Return button. The screen declared
a view field (authorizeUrl) but no component, and a frontend step shows
only the components it declares. The screen is now an HTML component:
one sentence about what happens, a Continue to Slack link to the consent
page (same tab, so Slack can return the browser) and the lifetime of the
link, read from SlackOAuthState.LIFETIME_SECONDS (10 minutes).
After Slack, the callback redirected to /preferences?section=slack,
which the host UI does not serve. It returns to
/app/preferences?section=slack with &result=connected or &error=<code>.
Connecting in an environment without the public URL or the Slack app
secrets failed with "IllegalArgumentException (Slack public URL is
required)" or "Slack secret unavailable". It is refused before any state
is issued with a user-facing message that says Slack is not set up in
this environment, which of the two is missing, and the names of the
missing environment variables, never a value.
The Preferences action still answers with the authorize address as the
whole message: core has no redirect field on an action result.
qqq-frontend-next opens a message that is only an https address.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What was wrong (staging, qbit-slack 0.1.0-RC.6)
SlackProcesses.connectActiondeclared a frontend step with a view field (authorizeUrl) but no component, and a frontend step shows only the components it declares./preferences?section=slack, which the host UI does not serve (its Preferences page is/app/preferences).IllegalArgumentException (Slack public URL is required)orSlack secret unavailable.What changed
HTMLcomponent: one sentence about what happens, a Continue to Slack link to the consent page (same tab) and the link's lifetime, read from the newSlackOAuthState.LIFETIME_SECONDS(600 seconds, "10 minutes"). The address is in the link target only.authorizeUrlstays a process value for API clients./app/preferences?section=slack&result=connectedor&error=<code>(SlackOAuthRouteProvider.returnUrl).SlackConnect.startUrlrefuses an environment that is not set up before issuing any state, with aQUserFacingException: "Slack is not set up in this environment", which of the public URL and the Slack app secrets is missing, and the names of the missing environment variables. Never a value.UserPreferenceActionResult(checked through QQQ 4.1.0-RC.31). The matching qqq-frontend-next change opens a message that is only anhttps:address instead of showing it in a toast.Tests
SlackConnectScreenTest(new, 7 tests): the screens declare a component; the HTML links to the authorize address and states the lifetime, with no address in visible text; a realRunProcessActionrun stops on the screen with its HTML; the preference action answers with the address alone; the return URL; the three refusal sentences, throughstartUrl, the preference action and the process step, with a canary proving no value leaks.SlackOAuthRouteTestnow asserts the/app/preferenceslocation and fails on the old code../mvnw -B verify: 185 tests, 0 Checkstyle violations, guardrails and JaCoCo gate pass.Not verified in a browser: no environment sign-in was available. Issue 36 (Uninstall/Disconnect across environments) is not touched.
🤖 Generated with Claude Code