Skip to content

feat(workflows): show first-run draft and sending banners - #335

Closed
Silthus wants to merge 1 commit into
feat/workflows-first-run-test-send-taskfrom
feat/workflows-first-run-banners
Closed

Silthus wants to merge 1 commit into
feat/workflows-first-run-test-send-taskfrom
feat/workflows-first-run-banners

Conversation

@Silthus

@Silthus Silthus commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Problem

Feature flags. workflows-first-run gates the first-run experience. Shared template/schema fixes remain unconditional; sandbox and reach integrations are separate follow-ups.

First-run drafts and sending workflows need guidance that reflects their current state.

Depends on #112299. GitHub shows the cumulative diff against master. Incremental range: 0760a420c27f..e4c0685e1290.

Warning

Merge risk: medium. The default-off first-run flag and stored workflow id limit banners to the first-run workflow.

Fork handoff for source #112076. Modernized head e4c0685e1290a6c393ccc1b317176b43e6873c9a. This draft prepares review and recreation in the upstream repository.

Changes

Kind Files Lines
Production 4 +307 −0
Tests 1 +141 −0
Total 5 +448 −0
  • Draft and sending banners follow the first-run workflow state and remember dismissals.

Historical screenshot from the original head. It does not verify the modernized head.

|

|

How did you test this code?

Final freshness proof: the nine core layers descend from b75567aca6cce9f0499e882463fc7e71d65a064c. The template API suite passed 31 cases; frontend first-run, sender, welcome, setup-task and test-send suites passed 110 cases across 16 suites. Full frontend TypeScript and all nine strict increment gates passed with no new Semgrep findings. API types were regenerated from the current backend source in the owning layers; the final full OpenAPI run produced zero drift. The default-off workflows-first-run gate remains, and sandbox/reach follow-ups are excluded. Historical screenshots and reviews retain their recorded scope. Fresh upstream CI, a new browser render and a fresh Claude review remain unchecked.

The independent cumulative frontend run passed 106 tests across 15 existing suites. Backend metadata/API suites passed 31 tests. OpenAPI regeneration completed successfully. Final frontend typecheck and strict cumulative preflight passed with zero failures. Storybook has not produced a usable rendered screenshot on the new head. Historical images and proof remain preserved below.

Test rationale: Existing banner logic tests cover draft and sending states, remembered dismissals, and flag-off behavior.

Historical proof on c90a96e, before modernization on 2026-10-07

Test seams: a kea logic test, firstRunWorkflowBannerLogic.test.ts, mounts the real workflowLogic with the hog flow API mocked at the HTTP layer. Stories in FirstRunWorkflowBanner.stories.tsx cover both states at full width and at 520px.

Test rationale: no existing test covers this banner. The logic test catches:

  • the wrong banner for a status, or a banner on any workflow other than the first-run one, or with the flag off;
  • the banner not flipping after the header's enable save (driven through saveWorkflowPartial, as the header does);
  • the Enable highlight missing on a draft, or firing on a sending workflow;
  • a dismissal that comes back after enabling, or is not persisted across a remount;
  • "View metrics" not routing to the Metrics tab.

Evidence:

Red: the new test on a stub logic that never shows a banner
✕ shows the draft banner on the first-run draft and highlights Enable
✕ turns into the sending banner once the header enables the workflow
✕ does not highlight Enable on a sending workflow
✓ shows nothing on another workflow
✓ shows nothing on the first-run workflow with the flag off
✓ keeps a dismissed banner dismissed when the workflow opens again
✕ shows the sending banner after the draft banner was dismissed
✕ opens the Metrics tab from the sending banner
Tests: 5 failed, 3 passed, 8 total

The dismissal test passed on the stub because it did not yet assert the draft banner first. It now does, and removing persist from the dismissal reducer makes it fail.

  • Green: all 7 tests pass, and the first-run suites plus workflowSceneLogic.test.ts pass (7 suites, 44 tests).
  • Review fix: the rewritten dismissal test failed on the earlier per-state dismissal, then passed after the fix.
  • Gate on the final tree: typescript:check clean, oxlint --quiet and oxfmt --check clean on the touched files, pre-push ci:preflight --strict clean.
  • Browser: Storybook rendered headless. Clicking Enable inside the story does not flip the banner, because Storybook has no email function template and the editor blocks the enable. The logic test covers the flip instead.
  • Not checked: the running app against a real backend.

Historical references: link 1, link 2, link 3, link 4, link 5, link 6, link 7, link 8, link 9.

Release status

Fork handoff only. This task does not activate rollout flags. Upstream CI and the unavailable Opus review remain handoff gaps.

  • This change is behind a feature flag and is not available to users

The first-run journey uses the existing default-off workflows-first-run flag. Core uses verified own-domain senders and the baseline single-step test-send endpoint. Core has no sandbox, testing-v2 or email-reach dependency. No flag rollout is part of this modernization.

Docs update

None. The first run is behind a flag and has no docs yet.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Claude Opus 5.5 (claude-opus-5-5); Codex, GPT-6.1 Sol for the 2026-10-07 modernization.

Skills: modernize-pr, pr, writing-pr-descriptions, writing-voice, unslop, merge-risk, running-ci-preflight, and tdd for behavior adaptations.

This freshness replay preserves each published snapshot increment on pinned upstream b75567aca6cce9f0499e882463fc7e71d65a064c. Historical reviews remain scoped to their original heads. The parent-coordinated Claude Opus 5.5 review attempt hit an API rate limit; the modernization review remains incomplete. No real SES delivery, DNS changes or flag rollout occurred.

Final freshness replay: T3 Code, Codex, GPT-6.1 Sol (gpt-6.1-sol). Skills: pr, writing-pr-descriptions, writing-voice, unslop, stacking-prs, running-ci-preflight. Fork drafts remain unready; no preview label or rollout flag was activated.

@Silthus Silthus self-assigned this Oct 7, 2026
@Silthus
Silthus added this pull request to stack #340 October 7, 2026 10:38
@Silthus Silthus added the feature-flagged PR or stack includes flagged behavior; individual increments may be unconditional label Oct 7, 2026
@Silthus
Silthus force-pushed the feat/workflows-first-run-banners branch from 6710258 to 14e6faf Compare October 7, 2026 11:59
@Silthus
Silthus force-pushed the feat/workflows-first-run-banners branch from 14e6faf to e4c0685 Compare October 7, 2026 12:08
@Silthus Silthus changed the title feat(workflows): show draft and sending banners on the first-run workflow feat(workflows): show first-run draft and sending banners Oct 7, 2026
@Silthus Silthus closed this Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature-flagged PR or stack includes flagged behavior; individual increments may be unconditional

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant