Repository navigation
Conversation
The wizard's ready step shows the AI workflow suggestions from the workflows homepage behind workflows-data-suggestions. They start loading when the person reaches the wait for DNS phase and load once. The welcome email template stays as the fallback. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The domain wizard now loads suggestions before its last step is on screen, so a finished load no longer counts as a view. The component that renders the cards reports the shown event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🤖 CI report✅ Comment density — 3% of added code lines are comments (12 of 456)This section warns when comments are more than 3% of the code lines a PR adds, and alerts above 6%. Before agent-assisted PRs, the typical share was about 2%. Only full-line comments count. Docstrings, generated files, snapshots, migrations, and workflow files are left out. Comments that restate the code, record how the change came about, or narrate the next line add noise for the next reader. Keep the comments that explain a reason the code cannot show, and remove the rest. See Files with the most added comment lines:
This check does not block merging. It updates on every push and clears when the share drops. |
…gestions Once the AI suggestions load on the wizard's last step, they replace the welcome email template. A blank workflow card, the one from the new workflow chooser, stays on the step in every mode for people who want neither. The chooser and the wizard now share that card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A page translation extension replaces text nodes, so the lead swaps its paragraph rather than its text when the suggestions load. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The suggestions take up to a minute to write, so the domain wizard now starts them as soon as the sender exists rather than at the wait for DNS step. They still load once, and only with workflows-data-suggestions on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FirstWorkflowChoices holds the suggestions, the welcome template and the blank workflow card, so a second step of the domain wizard can render the same block. The last step's lead no longer depends on the mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The heading broke the domain mid-word and switched to monospace partway through. The domain now sits in the heading's type as one inline box, so the line wraps before it. A story renders the step with a longer domain. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
break-words keeps a long label at its full minimum width, so a domain wider than the card overflowed it. wrap-anywhere lets that box shrink, and a domain that fits on a line still wraps whole. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r the organization The ready step said "Your first sender" and "Send your first email" even when the project already sends from another verified domain. It now says first only when no other email sender is verified. The wizard named a new sender after the label before the domain's suffix, so mail.acme.co.uk became "Co". It now uses the organization name, unless it is a placeholder such as "Jane's Organization". Otherwise it takes the brand label and skips a country-code second level such as co.uk or com.au. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… header can't carry it The email service puts the sender name into the From header as is, without MIME encoding or escaping. An organization name with non-ASCII characters or quotes would break that header, so the wizard falls back to the domain's brand label for such names. A person can still type any name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
workflows-data-suggestions. They take up to a minute to write, so loading them on the last step would leave the person waiting again.hello@mail.hedgebox.example.comthat is "Example", and formail.acme.co.ukit would be "Co".Stacked on #341, the wizard stack tip. Sibling of #520, not under it.
Impact
Pays into Grow Workflows through the activation rate (measured here). Expected move: small, up. The wizard's share shows as
workflows data suggestion builtwith surfaceemail_domain_wizard.Warning
🟡 Merge risk: medium · two-way door (merge-risk rubric)
workflows-data-suggestionson, including people who leave at the settings step. The project cache, the generation lock, the failure cache and the AI throttles bound the spend.workflows data suggestions shownwhen the cards render, not when the result arrives. This also changes the event for the homepage empty state and the onboarding wizard.create-workflow-blankdata-attr stay the same.workflows-email-domain-wizard, the suggestions behindworkflows-data-suggestions, the backend endpoint is unchanged, and a revert restores the old behavior.Changes
workflows-data-suggestionsis on. It reusesWorkflowDataSuggestionsandworkflowDataSuggestionsLogic, with a new surfaceemail_domain_wizard.createEmptyWorkflowaction. It opens a new workflow with no template.ai_not_approvedorunavailableanswer, or the flag off, shows the template and the blank card.emailDomainLogicmounts the suggestions logic as soon as the sender exists, so the run has the settings and DNS steps to finish. It keeps the logic until the wizard closes.FirstWorkflowChoices. It holds the welcome template, the blank workflow card and the suggestions, and switches between the modes itself. A second step of the wizard can render it as-is, inside the same bound wizard logics.mail.acme.co.ukandacme.com.augive "Acme". The frontend has no public-suffix helper, and none was added."<>\also falls back to the domain label. The email service puts the name into the From header without encoding, so such a name could break sends.FirstSenderCardis nowSenderCard.WorkflowTemplateBlankCardis the chooser's blank card in its own file.CreateWelcomeWorkflowActionis the welcome button in its own file, byte-identical to the same file on #520. The fake email domain backend serves the suggestions endpoints. AReadyWithSuggestionsstory renders the loaded state, and aReadyLongDomainstory renders the heading with a longer domain.mail.acme.comupdates.hedgebox-mail.commail.acme.comAll data in the renders is invented. No horizontal overflow at either width. The loading render comes from a scratch story that is not committed.
Earlier lead, on b17d3cd: the lead changed with the mode
Earlier layout, on 447d6ad: suggestions under the welcome template
How did you test this code?
Test seams:
emailDomainLogic, the preload.emailDomainLogic.test.tsdrives the fake backend from the settings phase through the wait for DNS phase toready, flag on and off. It catches a preload that starts later than the settings step, a second load, and a load with the flag off. The domain step test catches a load before a domain exists. It failed on the settings step before this change.EmailDomainScene.test.tsxgoes from checking DNS to the ready step. The cards show, the welcome template is gone, the generate call ran once, and the shown event fires only on the ready step. "Blank workflow" opens the new workflow page without a template. It failed before the change.EmailDomainScene.test.tsx: the manual-path test now asserts "Your first sender" and "Send your first email from mail.acme.com". A new case seeds a second verified sender on another domain and asserts "Your sender", "Send email from mail.acme.com" and no "first" anywhere on the page. It failed before the change.emailDomainWizardLogic. One parameterized case per input inemailDomainWizardLogic.test.ts: the organization name, a trimmed one, a blank one, the signup placeholder onshop.acme.co.uk, "Default" onacme.com.au, a non-ASCII name and a quoted name. Each asserts thenamein the create request the fake backend receives. Four rows failed before the change, the last two before the review fix.generatinganswer. Each asserts that the template stays primary and opens its template, and that the blank card shows.Live run on
64451f01bdf(evidence kept in the fleet proof store):workflow_data_suggestionsview, through the Django test client, with the exact calls the wizard makes. The LLM and the event classifier are stubbed, Celery is eager. The backend is unchanged since that run.ai_not_approved. No event classifier:unavailable.generating, thenreadywith cards, while the sender is still unverified, as on the settings step. The ready step's reads hit the cache, so the LLM ran once.email_sender_readyflips to true. "Create workflow" on the preloaded card builds a draft whose email step sends from the new sender, with no missing inputs.mail.acme.comandupdates.hedgebox-mail.com. A 63-character label at 520px stays inside the card, measured in the live Storybook page (the span ended at 859px against a 504px card withbreak-words, and at 471px withwrap-anywhere).Checks: the
Channels/EmailDomainJest suites pass on907d522a6de(92 tests), and thesetupGuideandWorkflows/templatessuites passed on64451f01bdf. The frontend typecheck reports nine errors, all outside this diff:AgentPromptButton.tsxand seven files underproducts/conversations/frontend/components/QuillSidePanel/.Not checked:
workflows-data-suggestionson, the org's AI data processing approved, the Jev event classifier configured, and LLM gateway keys. Without them the step shows the template and the blank card.907d522a6de. The owed live-run proof is reused from64451f01bdf. A later redeploy of the preview box re-runs it.The heading fix has no Jest test, because jsdom does no layout. The
ReadyLongDomainstory's visual review baseline guards it.Test rationale: The logic seam guards when the preload starts and that it runs once, which no existing test covers. The scene seam guards what the person sees in each mode, the blank fallback and the shown event, which only a render shows. The existing
workflowDataSuggestionsLogictests still cover polling and building.Release status
The wizard sits behind
workflows-email-domain-wizard, the suggestions behindworkflows-data-suggestions. Two changes reach other surfaces: the shown event timing (behindworkflows-data-suggestionstoo) and the shared blank card in the new workflow chooser, which behaves as before.Docs update
None.
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Agent: Claude Code in T3 Code, Claude Opus 5.5 (high). Design pass, reviews and final read by GPT-6.1 Sol (high).
impact,tdd,writing-tests,writing-kea-logics,using-kea-disposables,writing-ui-components,writing-user-facing-copy,pr-description,writing-pr-descriptions,merge-risk, the QA swarm design pass.447d6adfea6: the preload counted a shown event during DNS checks (major), and no test covered a pending last step (minor).447d6adfea6found nothing.6e364f74830found one minor item, fixed inb17d3cd5d17: the lead swapped its bare text nodes when suggestions loaded, which a page translation extension can leave stale (frontend/src/AGENTS.mdRule 7). Each lead is now its own keyed paragraph.b17d3cd5d17found nothing.a955d415985andbcee93148d3.bcee93148d3found nothing and graded the risk medium, for the earlier generation. The proof store's two-round budget was lifted with Michael's request for another round. No fixes followed, so no final read ran.dfb66cc960c. The final read on it found one medium item: a domain longer than the card overflowed withbreak-words. Fixed in64451f01bdfwithwrap-anywhere. The final read on64451f01bdffound nothing.fleet proof gatepasses on HEAD.6d970b17340. The design pass on it found nothing.6d970b17340found two items. Fixed: a non-ASCII or quoted organization name would reach the From header unencoded (major), fixed in907d522a6de. Rejected:shop.net.dereads as a country-code suffix (minor). It needs a domain whose own label isnetorcounder a country code, the label there is a generic word either way, and the name stays editable. The round-4 reservation used the task brief's request for one more round. The final read on907d522a6defound nothing.fleet proof gatepasses on HEAD.ReadyWithSuggestionsandReadyLongDomainstories add visual review baselines that need approval. TheReadystory changes, because it gains the blank workflow card.Decisions
FirstWorkflowChoices, rendered on the last step here and on the wait for DNS step by a follow-up on #520co,com,org,net,ac,gov,edu) under a two-letter top level. Alternative: a public-suffix dependency, ruled outworkflows-data-suggestionsflag, the homepage's gate. The backend adds the AI data processing check and answersai_not_approvedInvolvement: no grilling rounds, no prototypes. Reviews: two design passes, four review rounds and four final reads (GPT-6.1 Sol). Proof captured: live run and renders.
🤖 Generated with Claude Code