feat: name new threads from linked tickets - #8344
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
There was a problem hiding this comment.
Effect service conventions review: one finding on the new TicketProviderRegistry wiring in apps/server/src/server.ts. The service module itself (tag with inline interface, exported make, layer, dependencies acquired via yield* VcsProcess.VcsProcess / yield* HttpClient.HttpClient, Schema.TaggedErrorClass failure with structured attributes and preserved cause) matches the conventions, and the Layer.succeed uses in tests/harnesses are legitimate test seams.
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
Reviewed the changed web settings UI (TicketProviderSettings.tsx, ProjectSettingsPanel.tsx, IntegrationsSettings.tsx, settingsSearch.ts) against the shared settings primitives and environment-scoping rules. Two consistency findings, both in the new/changed lines; everything else (Button/Select/Switch/Dialog/Field usage, SettingResetButton, search catalog entries, and the project-scoped useEnvironmentSettings(selectedCheckout.environmentId) reads) follows the existing contracts.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One new consistency issue in the ticket provider settings: the new SettingsSection id collides with the settings-search anchor id rendered inside TicketProviderSettings, so #ticket-providers matches two elements on /settings/integrations.
The two findings reported on the previous revision (hand-rolled instance rows in TicketProviderSettings.tsx, and the checkout-derived inherited label on the group-wide ticket title row in ProjectSettingsPanel.tsx) are unchanged and still apply.
Posted via Macroscope — UI Consistency
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR introduces a broad ticket-provider integration across orchestration, persistence, RPC authorization, secret storage, and web/mobile settings, with new external CLI and HTTP behavior on the first-turn path. Its size, user-facing capability, concurrency semantics, and sensitive credential handling require human review. You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
One finding on the new ticket-title project row: its inherited-default label can misstate the environment default for multi-checkout groups. Everything else in the changed web files (shared SettingsRow/Select/Switch/Button composition, anchor ids, select widths, environment-scoped probe routing) lines up with the existing settings system.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
Two error-modeling findings in the new TicketProviderRegistry service. Import/module-namespace and dependency-acquisition conventions look correct (make yields VcsProcess/HttpClient from the environment, layer is canonical, Foo["Service"] is used at call sites, and the earlier aliased layer import in server.ts is now a namespace import).
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
Reviewed the changed web settings UI (TicketProviderSettings.tsx, ProjectSettingsPanel.tsx, IntegrationsSettings.tsx, settingsSearch.ts). The earlier findings (hand-rolled instance rows, duplicated ticket-providers anchor id, misleading multi-checkout inherited label) are resolved — instance rows now use SettingsRow, the anchor id lives only on the section, and the project row passes inheritedLabel: "Default (per checkout)".
Two remaining items, both in TicketProviderSettings.tsx: the dialog's Switch has no accessible name, and a failed connection test renders in the same muted tone as a successful one.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding in the ticket title settings: the invalid-template message renders in the same muted status treatment as the success preview. Everything else in the new panel matches the shared settings primitives (SettingsRow, SettingsSection, Select, Input, Switch, Button variants) and the project/environment scoping reads from explicit environment ids.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding in the web settings scope: the ticket title template row rejects invalid input without any invalid affordance. Everything previously flagged (dialog switch name, probe status tone, duplicate ticket-providers id, hand-rolled instance rows, group-wide inherited label) now follows the shared settings contracts.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding on the new TicketProviderRegistry probe path; the earlier notes on TicketProviderResolveError.message, the unused invalid-response reason, and the aliased layer import in server.ts are all addressed.
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
UI consistency review of the changed web settings surfaces. One finding: the new Ticket providers section duplicates its heading text and diverges from the shared list-section pattern. The rest of the changed web code (ticket title policy row, instance rows, project checkout binding rows) follows the shared SettingsRow/Select/Switch/Button contracts and scopes its environment reads explicitly.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
Reviewed the changed web UI (TicketProviderSettings.tsx, ProjectSettingsPanel.tsx, IntegrationsSettings.tsx, settingsSearch.ts) against the shared settings primitives. Two consistency findings, both in the new TicketProviderSettings.tsx. The earlier duplicate ticket-providers anchor/heading, the destructive probe/template statuses, the inherited-policy label, and the SettingsRow migration for account rows all look resolved.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a92d5fe. Configure here.
There was a problem hiding this comment.
One finding: the new ticket-account rows use a bare border-t, which in Tailwind v4 resolves to currentColor rather than the semantic border token, so each row gets a full-contrast foreground hairline instead of the muted divider used everywhere else in the settings tree.
Posted via Macroscope — UI Consistency

What Changed
New threads can adopt the title and identifier of a ticket linked in their first user message. Resolution runs asynchronously after the existing provisional title, and compare-and-set metadata updates ensure that a manual rename always wins.
The server supports GitHub Issues, GitLab Issues, Azure DevOps work items, Bitbucket Cloud issues, Jira Cloud/Data Center, and ClickUp tasks. It prefers local CLIs where available, supports explicit per-project account bindings, stores sensitive credentials outside settings.json, and falls back silently on ambiguous links or lookup failures.
Web/desktop and mobile settings expose the global policy, project overrides, account configuration, custom templates, and connection tests. User and internal documentation are included.
Why
Ticket-driven threads are difficult to scan when the generated title paraphrases the prompt instead of preserving the ticket identifier and canonical title. Resolving metadata at the server boundary keeps local CLI authentication and credentials with the environment while providing consistent behavior to every client.
Proposal and design discussion: #8334
This is intentionally submitted despite being an XXL external feature PR so maintainers can evaluate the complete behavior. I am happy to split it along the boundaries proposed in the discussion.
UI Changes
Before: no ticket-title policy, ticket account management, project binding, or connection-test controls.
After: these controls are available under Settings → Integrations → Ticket providers and in project settings on web/desktop, with a dedicated Ticket providers route on mobile. The full flow was manually verified against the fork from a remote Mac. Automated screenshot capture was unavailable in the collaborative preview, so this PR does not claim the screenshot checklist item.
Validation
Checklist
Generated with GPT-5.6-sol through the T3 Code Codex harness.
Note
Medium Risk
Touches orchestration title races, secret persistence for external integrations, and new operate-scoped RPC probes; behavior is heavily tested but the surface area is large.
Overview
Adds ticket-driven thread naming: on a thread’s first turn, the server can look up a single supported ticket link in the user message and asynchronously replace the generated title using environment/project ticket title policy and provider account bindings, with optimistic concurrency (
expectedTitle/titleRevision) so manual renames win over late lookups.Introduces
TicketProviderRegistry(resolve + probe), wires it intoProviderCommandReactorand server startup, and authorizesserverProbeTicketProvider. Server settings now persist ticket-provider secrets outsidesettings.json, support revision-guarded instance updates, and roll back secret writes on failure. Projections gainticketTitlePolicy,ticketProviderBindings, and threadtitleRevision(migrations 44–45).Mobile gets a Ticket Providers settings route and a large configuration screen (policies, accounts, add/probe/default/disable, per-project overrides) aligned with existing web/desktop controls; main settings adds navigation rows and sheet targets.
Reviewed by Cursor Bugbot for commit 1ea3f7a. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Name new threads from linked tickets via provider registry and title policy
TicketProviderRegistryservice that resolves ticket metadata from URLs using VCS process and HTTP clients, with structured errors for no-instance, ambiguous-instance, unsupported-driver, etc.ProviderCommandReactormay asynchronously replace the generated thread title with a ticket-derived title, gated by optimistic concurrency (expectedTitle,expectedTitleRevision) to avoid clobbering manual renames.ticketTitlePolicy,ticketProviderInstances(with secrets kept outsidesettings.json), and aticketProviderInstancesRevisionfor compare-and-set updates;applyServerSettingsPatchincrements the revision on whole-map replacement.ticket_title_policy_jsonandticket_provider_bindings_jsontoprojection_projects, andtitle_revisiontoprojection_threads; projector and snapshot query layers read/write these fields.TicketProviderSettings,ProjectSettingsPanel) and mobile (SettingsTicketProvidersRouteScreen) UI lets users configure ticket title policy and per-provider account bindings; aserver.probeTicketProviderRPC checks instance availability.thread.meta.updatenow omits thetitlefield whenexpectedTitlemismatches the current title orexpectedTitleRevisionis stale;titleRegenerationis cleared only when a new non-equal title is provided and a regeneration is in progress. Projects and threads in the read model now include the new ticket fields, which may require out-of-tree consumers to update their schemas.Macroscope summarized 1ea3f7a.