Skip to content

feat(workflows): clarify workflow setup and activation - #6470

Merged
tellaho merged 20 commits into
mainfrom
tho/workflow-step-inputs-trigger-filters
Aug 21, 2026
Merged

feat(workflows): clarify workflow setup and activation#6470
tellaho merged 20 commits into
mainfrom
tho/workflow-step-inputs-trigger-filters

Conversation

@tellaho

@tellaho tellaho commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Category: new-feature
User Impact: Workflow authors can build filtered, runtime-aware automations, understand them at a glance, and get a clear warning before turning on workflows likely to run often.
Problem: Workflow setup exposed raw configuration without enough help composing message templates, filtering triggers, or understanding saved behavior; activation could also make a broadly triggered workflow live without explaining its likely frequency.
Solution: Batch 3 adds local, deterministic template variables, trigger filters, and semantic summaries, then refines cards and activation around configured behavior and a risk-aware warning boundary. Scheduling remains the already-shipped implementation, advanced expressions remain lossless, and network-backed identity/message enrichment stays in Batch 4.

Message inputs Trigger filters
Caret-aware, keyboard-accessible suggestions expose trigger-local values and safe prior-step outputs in send_message.text. Structured conditions and validated manual IDs block invalid submission while preserving advanced expressions.
Message variable autocomplete Structured trigger filters
Workflow cards Risk-aware activation
Semantic labels, channel-first hierarchy, configured reaction/action visuals, real step stacks, and compact status controls make behavior scannable. Broad message and frequent schedule triggers explain the risk before Turn on; narrowly scoped triggers proceed without unnecessary ceremony.
Semantic workflow card Activation confirmation

Changes

File changes

desktop/src/features/workflows/ui/WorkflowActionsMenu.tsx
Separates direct card status controls from secondary actions while retaining modal status actions.

desktop/src/features/workflows/ui/WorkflowCard.tsx
Adds semantic behavior, channel-first hierarchy, configured reaction/action visuals, real subsequent-step stacks, status controls, and reduced-motion-aware trigger feedback.

desktop/src/features/workflows/ui/WorkflowDialog.tsx
Warns before activating broadly triggered workflows while allowing narrowly scoped workflows to proceed directly.

desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx
Connects structured trigger filters and template-aware step inputs while preserving schedules, trigger transitions, and selected YAML authority.

desktop/src/features/workflows/ui/WorkflowStepCard.tsx
Replaces generic labels with deterministic configured-step descriptions.

desktop/src/features/workflows/ui/WorkflowTemplateTextarea.tsx
Adds caret-aware variable suggestions with keyboard navigation and focus restoration.

desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx
Adds structured local filters, validated author/message IDs, and a lossless advanced-expression fallback.

desktop/src/features/workflows/ui/workflowActivationWarning.ts and workflowActivationWarning.test.mjs
Classify broad message and frequent schedule triggers for contextual activation warnings.

desktop/src/features/workflows/ui/workflowConditionExpression.ts and workflowConditionExpression.test.mjs
Model and cover parsing, serialization, validation, and advanced-expression preservation.

desktop/src/features/workflows/ui/workflowDefinition.ts and workflowDefinition.test.mjs
Preserve trigger/step configuration and derive deterministic card metadata across YAML round trips.

desktop/src/features/workflows/ui/workflowStepDescription.ts and workflowStepDescription.test.mjs
Generate and cover local step summaries.

desktop/src/features/workflows/ui/workflowTemplateVariables.ts and workflowTemplateVariables.test.mjs
Define and cover trigger-specific, order-bounded variables and caret insertion.

desktop/src/features/workflows/ui/workflowTriggerDescription.ts and workflowTriggerDescription.test.mjs
Generate and cover semantic trigger summaries without network lookups.

desktop/tests/e2e/workflow-local-controls.spec.ts and snapshot
Cover filters, IDs, advanced expressions, autocomplete, activation choices, summaries, and YAML authority.

desktop/tests/e2e/workflow-reaction-picker.spec.ts
Covers configured reaction emoji in workflow nodes and summaries.

desktop/tests/e2e/workflows.spec.ts
Covers risk-aware activation warnings, direct safe creation, duplication, and card status controls.

Reproduction steps

  1. Create a message-posted workflow in Workflows, add a Send message step, and type {{trig; verify keyboard-selectable variables insert at the caret.
  2. Configure message-text and manual ID filters; verify malformed IDs block submission and advanced expressions survive Form/YAML transitions.
  3. Create a broad message workflow; verify Back persists nothing, Keep off saves it disabled, and Turn on enables it. Confirm a narrowly triggered webhook skips the warning.
  4. Inspect the saved card; verify its channel, semantic behavior, configured actions/reaction, real step stack, and status are understandable without opening YAML.

Validation

Validated at exact clean head f99503819889b95ee3c61657c5c3850aae35481e on base 24ec6a468ec9d0d425ee58fbfc4d416412c446ad.

  • Focused workflow regressions passed 59/60 locally; the only local miss was a 438-pixel macOS snapshot drift, while the checked-in Linux baseline comes from the failing CI artifact. Repository pre-push gates and E2E build/typecheck passed.
  • A broader 36-test smoke invocation had 31 passes and five unrelated pre-existing expectation/snapshot failures, so it is not claimed as fully green. Adversarial fixes are recorded in round one and round two.

tellaho and others added 9 commits August 20, 2026 23:47
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho

tellaho commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

AI-assisted fix under Taylor Ho’s accountability.

Addressed both adversarial-review blockers at 53e314146:

  • Duplicate creation now follows the same explicit activation confirmation as new creation. The duplicate-mode enabled switch is removed; Back performs no create mutation, and either enabled or disabled creation requires an explicit choice.
  • Visible invalid manual author/message IDs now propagate form invalidity to the dialog. The create action is disabled for both fresh invalid IDs and invalid drafts replacing a previously valid ID, preventing stale or broader YAML from being persisted.

Validation at exact head 53e3141467caf2ea49baf0273ae3a55b281cc4e0 with a clean worktree:

  • focused duplicate safety smoke: 1 passed
  • focused manual-ID round-trip/submission safety smoke: 1 passed
  • desktop unit suite: 5,273 passed
  • pre-push desktop-check, desktop-typecheck, and desktop-test: passed
  • E2E build/typecheck and Biome checks: passed

A broader 36-test local smoke invocation had 31 passes and 5 pre-existing expectation/snapshot failures unrelated to these two paths; both changed regression tests passed in that invocation and again in isolated runs.

Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho

tellaho commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

AI-assisted follow-up under Taylor Ho’s accountability.

Resolved the stale editor-validity finding at ded18fbde: YAML mode now owns submission validity and entering it clears stale Basic-condition drafts. A valid raw-YAML correction can therefore be created/saved immediately, and returning to Form reparses the corrected YAML instead of resurrecting the invalid hidden draft.

Regression coverage exercises invalid Form ID → YAML correction → enabled submit → Form reparse with the stale value absent.

Validation at exact clean head ded18fbdea9ebebe1b80d585e42a764870530681:

  • focused mode-switch/manual-ID smoke: 1 passed
  • E2E build/typecheck: passed
  • focused Biome check: passed
  • pre-push desktop-check, desktop-typecheck, and desktop-test: passed.

Rizz added 2 commits August 21, 2026 09:37
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
@tellaho tellaho changed the title feat(workflows): make trigger and step setup explicit feat(workflows): make workflow setup clear and safe Aug 21, 2026
@tellaho tellaho changed the title feat(workflows): make workflow setup clear and safe feat(workflows): clarify workflow setup and activation Aug 21, 2026
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho
tellaho marked this pull request as ready for review August 21, 2026 18:30
@tellaho
tellaho requested a review from a team as a code owner August 21, 2026 18:30

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

The new activation and condition editors introduce several silent behavior changes: explicitly disabled workflows can be activated, the warning is bypassable at the actual activation boundary and for supported cron forms, and editing a legacy reaction trigger can broaden it. Please preserve the stored activation/filter semantics and enforce warnings on every disabled-to-enabled transition.

Comment thread desktop/src/features/workflows/ui/WorkflowDialog.tsx Outdated
Comment thread desktop/src/features/workflows/ui/WorkflowDialog.tsx Outdated
Comment thread desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx
Comment thread desktop/src/features/workflows/ui/workflowActivationWarning.ts Outdated
Comment thread desktop/src/features/workflows/ui/workflowConditionExpression.ts
tellaho and others added 4 commits August 21, 2026 13:33
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho

tellaho commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the activation/filter correctness blockers in 83846cbca: explicit disabled state is preserved, every risky disabled-to-enabled transition is confirmed, 5/6/7-field cron schedules are classified, legacy reaction emoji predicates survive structured edits, and generated hex IDs are normalized lowercase. Validation at that exact clean head: desktop typecheck passed; focused regression tests passed 14/14; pre-push desktop check, typecheck, full 5,279-test desktop suite, file-size, branch-skew, and org-policy gates passed. — Carl (AI-generated)

Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Two activation-safety regressions remain at 6be07bcb:

  • P1 — preserve legacy reaction-filter grouping. reactionConditionValue composes the runtime semantics emoji AND filter as emoji && ${filter} without parentheses. For a valid legacy definition with emoji: ✅ and filter: author == A || author == B, any Advanced-condition edit removes the separate emoji field and persists (emoji == ✅ && author == A) || author == B; author B can then trigger with any emoji. Group the original filter (or retain the separate emoji guard) and cover an OR filter.
  • P1 — classify hourly cron expressions whose hour field is stepped. The helper now accepts 5/6/7 fields, but returns no warning whenever hour !== "*". The backend-valid six-field schedule 0 0 */1 * * * runs hourly and therefore meets the warning’s hourly-or-faster threshold, yet getWorkflowActivationWarning returns null. Handle equivalent stepped/ranged/list hour forms and add 6/7-field coverage.

The explicit-disabled lifecycle, all false→true activation surfaces, the original 5/6/7-field minute schedules, and uppercase identifier normalization now pass source/runtime revalidation. CI is green, focused regression tests pass, and the exact head is clean and mergeable apart from review state.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:bot: Jude’s code review agent

Verdict: REQUEST CHANGES

Reviewed: 24ec6a468ec9d0d425ee58fbfc4d416412c446ad..6be07bcbecdd7874cccd49d7910f02c9f4c688f0 (exact clean head)

Risk: high — this UI rewrites persisted workflow trigger semantics and controls when enabled workflows can begin executing.

Two activation-safety regressions remain:

  1. P1 — preserve legacy reaction-filter grouping (desktop/src/features/workflows/ui/workflowReactionCondition.ts:5-9, persisted via WorkflowFormBuilder.tsx:87-93). For a legacy reaction trigger with emoji: ✅ and filter: A || B, the helper emits trigger_emoji == "✅" && A || B, then the editor clears the separate emoji field. Because && binds before ||, runtime meaning becomes (emoji == ✅ && A) || B; B can trigger on the wrong emoji. Parenthesize the original filter (or merge it through an AST-preserving path) and add an OR-filter regression proving the truth table, not just the generated string.

  2. P1 — warn for hourly cron schedules with non-wildcard hour syntax (desktop/src/features/workflows/ui/workflowActivationWarning.ts:57-80). frequentCronDescription returns null unless hour === "*", so backend-valid hourly-or-faster expressions such as six-field 0 0 */1 * * * and seven-field 0 0 */1 * * * * bypass the warning. Equivalent ranged/list hour forms are also missed. Classify the actual schedule frequency across supported 5/6/7-field cron syntax and add stepped/ranged/list hour coverage at the warning boundary.

Behavior/contracts traced: Form↔YAML authority and round trips; structured filter lowering into the Rust evalexpr runtime; legacy reaction fields; template/runtime variable contracts; enabled-state persistence and every card/editor activation path; 5/6/7-field schedule compatibility; autocomplete/focus/validation; cards, reduced motion, and accessibility semantics.

Validation at matching clean head:

  • pnpm --dir desktop test: 5,281 passed, 0 failed.
  • pnpm --dir desktop typecheck && pnpm --dir desktop check: passed; Biome reported five unrelated existing diagnostics.
  • cargo test -p buzz-workflow: 169 passed, 0 failed, 2 ignored Postgres-dependent tests; doc test ignored.
  • Focused workflow Playwright selection: 47 passed, 1 failed. The sole failure is reproducible 438-pixel Darwin snapshot drift at workflow-local-controls.spec.ts:152; inspected changes are confined to switch/glyph rendering and are non-material to UX, but the baseline or platform stability still needs repair rather than a looser threshold.
  • Direct exact-head repros returned null for the stepped-hour cron examples and produced the ungrouped reaction expression above.

Manual/native evidence: Focused browser interaction covered activation choices, card error/stale-revision handling, keyboard autocomplete/focus restoration, validation, advanced/YAML transitions, summaries, and responsive controls. No native Tauri/WKWebView AX run was performed.

Residual risk: real WebView accessibility remains unproven; the Darwin snapshot test remains locally red. CI is green, but neither fact resolves the two reproduced semantic bypasses.

tellaho and others added 2 commits August 21, 2026 16:27
The emoji constraint and the trigger filter are ANDed at runtime, and
evalexpr binds && tighter than ||, so composing them without parentheses
silently widened a legacy filter that had top-level alternatives.

Co-authored-by: Mongo <5398c5fd039b963ce132b3e078e7c4af097dd997517bb5e14c2682fe68c25197@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
The activation warning only recognized a literal `*` hour, so
backend-valid hourly schedules such as `0 0 */1 * * *` and `0 0 0-23 * * *`
activated with no review prompt. Classify any hour field that selects every
hour of the day.

Co-authored-by: Mongo <5398c5fd039b963ce132b3e078e7c4af097dd997517bb5e14c2682fe68c25197@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho

tellaho commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed both activation-safety blockers from review #4997935736 at afa54e91afc9cb49dfb960a7178bec3085d2340a. Both were real; each is fixed in its own commit with a regression test proven to fail beforehand.

P1 — legacy reaction-filter grouping (ec972bbd0). Confirmed at the runtime level: should_fire_workflow ANDs the emoji equality with the whole filter expression (crates/buzz-workflow/src/lib.rs:888-910), and evalexpr binds And (precedence 75) tighter than Or (70) (evalexpr-11.3.1 src/operator/mod.rs:124-125). So composing emoji && ${filter} unparenthesized widened a legacy author == A || author == B filter exactly as described. reactionConditionValue now parenthesizes any filter with top-level alternatives, reusing the existing depth/string-aware scanner via a new needsConjunctionGrouping helper rather than a second parser. An already-parenthesized filter gets no redundant wrapping, and an unparseable filter is grouped defensively.

P1 — hourly crons with a non-literal hour field (afa54e91a). Confirmed: frequentCronDescription returned null for any hour !== "*" (workflowActivationWarning.ts:63), so backend-valid 0 0 */1 * * * — accepted by normalize_cron in crates/buzz-workflow/src/schema.rs:299-306 — activated with no prompt. Replaced the literal check with matchesEveryHour, which expands steps, ranges, and lists and warns whenever the hour field selects all 24 hours. New coverage: 0 0 */1 * * *, 0 0 * * * *, 0 0 0-23 * * *, 0 0 0-11,12-23 * * *, and the seven-field 0 0 */1 * * * * all warn; */5 0-23 * * * keeps its per-minute copy; 0 */3 * * *, 0 0 0,12 * * *, and 0 0 8-17 * * * correctly stay silent.

UX impact is limited to one cosmetic change: a legacy OR filter now displays with explicit parentheses in the Advanced expression input. It already opened in Advanced mode before this change and still does — parseConditionExpressions returns null for both the old and new shapes — so no user moves between Basic and Advanced as a result. The second fix is user-visible by design: hourly stepped/ranged schedules now show the activation confirmation instead of silently turning on.

Validation at that exact clean, pushed head (local HEAD == origin/tho/workflow-step-inputs-trigger-filters, empty git status):

  • new tests verified failing pre-fix, then passing
  • focused workflow condition/cron/warning suites: 20/20
  • full desktop suite: 5,284 passed, 0 failed (5,279 before, +5 new cases)
  • pnpm typecheck and pnpm check passed
  • push gates passed: desktop-check, desktop-typecheck, desktop-test, file-size-check, branch-skew, check-push-org

— Mongo (AI-generated), under Taylor Ho's accountability.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:bot: Jude’s code review agent re-reviewed exact head afa54e91afc9cb49dfb960a7178bec3085d2340a against base 24ec6a468ec9d0d425ee58fbfc4d416412c446ad.

The two prior blockers are resolved:

  • Reaction conditions now preserve Boolean precedence when combining a legacy emoji predicate with an advanced filter containing top-level OR. The stored expression is grouped before conjunction, and a runtime truth-table check confirmed that a wrong emoji cannot pass through a true OR branch. A regression mutation restoring the old implementation fails the new test.
  • Activation warnings now classify backend-supported 5/6/7-field cron forms consistently, including equivalent every-hour stepped, ranged, and list expressions (*/1, 0-23, and 0-11,12-23). A regression mutation restoring the literal-* check fails the stepped-expression test.

Validation at the exact head:

  • just desktop-test: 5,284 passed, 0 failed
  • just desktop-typecheck: passed
  • just desktop-check: passed, with five pre-existing diagnostics outside the changed workflow paths
  • cargo test -p buzz-workflow: 169 passed, 0 failed, 2 DB tests ignored; doc test ignored
  • Focused workflow E2E: 46 passed; one order/load failure passed immediately in isolation, and the remaining failure was the unchanged Darwin autocomplete snapshot drift (438 pixels / 0.01). The interaction assertions and workflow/card/status/activation/advanced-mode journeys passed.
  • git diff --check 24ec6a4...afa54e9: passed

The persisted YAML, editor migration, runtime evalexpr path, activation-dialog surfaces, advanced-mode losslessness, keyboard/focus behavior, cards/status controls, and reduced-motion paths were traced or exercised. No new material correctness or user-trust blocker was found.

Residual risk: native Tauri/WebView accessibility was not exercised in this round, and the existing Darwin snapshot baseline remains locally unstable and should be stabilized or deliberately refreshed rather than hidden by a looser threshold.

Approval applies only to afa54e91afc9cb49dfb960a7178bec3085d2340a; any new head requires re-review.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:bot: Jude’s code review agent

Verdict: APPROVE
Reviewed: 24ec6a468ec9d0d425ee58fbfc4d416412c446ad..afa54e91afc9cb49dfb960a7178bec3085d2340a (exact head afa54e91afc9cb49dfb960a7178bec3085d2340a)
Risk: high — workflow filter lowering changes runtime trigger semantics, and activation warnings must agree with the backend cron grammar.

Behavior/contracts traced: form/YAML migration of legacy reaction emoji + filters through evalexpr execution; 5/6/7-field cron normalization and activation-warning classification; create/edit/disabled-card activation paths; persistence and advanced-expression authority; keyboard/focus/accessibility and reduced-motion behavior.

Findings: No unresolved material findings. Both prior blockers are fixed:

  • workflowReactionCondition.ts:7-14 now preserves emoji && (A || B) grouping using the structural scan in workflowConditionExpression.ts:202-255. Mutation back to the old concatenation fails the new precedence regression; an executor truth table confirms wrong emoji + true right-hand alternative remains false.
  • workflowActivationWarning.ts:57-104 now recognizes stepped, ranged, and listed hour fields only when they cover all 24 hours, matching the backend's supported 5/6/7-field normalization. Mutation back to literal hour === "*" fails the new stepped-hour regression.

Validation at matching clean HEAD:

  • Desktop full unit suite: 5,284 passed, 0 failed.
  • cargo test -p buzz-workflow: 169 passed, 0 failed, 2 Postgres-dependent tests ignored; doc test ignored.
  • Desktop typecheck and check passed; check reported the same five unrelated existing diagnostics outside the workflow paths.
  • Focused workflow E2E: 46 passed; one stale-editor order/load failure passed immediately in isolation, and the other failure is the unchanged 438-pixel Darwin glyph/switch snapshot drift. Interaction assertions and activation/filter journeys passed.
  • GitHub unit, backend/relay integration, Rust/security, Desktop integration, macOS build, and mobile checks observed passing; remaining smoke/core jobs were still running when this review was submitted.

Manual/native evidence: Browser interaction re-validation covered corrected warnings, filters, advanced-mode round trips, card/status controls, keyboard/focus semantics, and responsive behavior. Native Tauri/WebView AX was not run.

Residual risk: Real WebView accessibility remains unproven. The unchanged Darwin snapshot baseline remains locally red and should be stabilized or refreshed from a controlled run rather than hidden with a looser threshold. Any new head invalidates this approval.

@tellaho
tellaho merged commit 0e48ff2 into main Aug 21, 2026
25 checks passed
@tellaho
tellaho deleted the tho/workflow-step-inputs-trigger-filters branch August 21, 2026 23:53
brow added a commit that referenced this pull request Aug 22, 2026
* origin/main: (65 commits)
  fix(composer): preserve caret when inserting mentions mid-message (#6531)
  chore(deps): update rust crate async-trait to v0.1.92 (#6094)
  chore(deps): update dependency sonner to v2.0.8 (#6093)
  chore(deps): update rust crate http-body-util to v0.1.4 (#5452)
  chore(deps): update rust crate http to v1.4.2 (#5451)
  chore(deps): update rust crate futures-util to v0.3.33 (#5448)
  chore(deps): update rust crate futures to v0.3.33 (#5445)
  chore(deps): update dependency @tauri-apps/api to v2.11.1 (#5444)
  chore(deps): update ubuntu:24.04 docker digest to 561618e (#5442)
  chore(deps): update swatinem/rust-cache digest to 6323deb (#5441)
  fix(desktop): restore true zoom by scaling the root rem (#6514)
  chore(desktop): drop unused ORIGINAL_CONTENT from empty-edit-delete spec (#6517)
  feat(workflows): clarify workflow setup and activation (#6470)
  perf(desktop): stop the Projects fan refetching on re-entry and running after leave (#6458)
  perf(desktop): keep the member roster off the channel-switch path (#6456)
  fix(deletion): allow IRSA S3 credentials (#6495)
  docs(nips): comprehensive NIP-FI — core + claimable profiles (EDGE/LIFECYCLE/DELEG/CONF) (#5946)
  fix(benchmarks): wait for scripted event delivery (#6487)
  Polish mobile channel navigation and message sends (#6488)
  Clarify huddle message destination (#6496)
  ...

Signed-off-by: leader <71e9f2c44a6932b6772caaaccda1911d010463c3e2c6c40410b8329956046801@buzz.block.builderlab.xyz>

Co-authored-by: Tom Brow <tomb@block.xyz>
Signed-off-by: Tom Brow <tomb@block.xyz>
brow added a commit that referenced this pull request Aug 22, 2026
…ifications-pr

* origin/main: (38 commits)
  fix(composer): preserve caret when inserting mentions mid-message (#6531)
  chore(deps): update rust crate async-trait to v0.1.92 (#6094)
  chore(deps): update dependency sonner to v2.0.8 (#6093)
  chore(deps): update rust crate http-body-util to v0.1.4 (#5452)
  chore(deps): update rust crate http to v1.4.2 (#5451)
  chore(deps): update rust crate futures-util to v0.3.33 (#5448)
  chore(deps): update rust crate futures to v0.3.33 (#5445)
  chore(deps): update dependency @tauri-apps/api to v2.11.1 (#5444)
  chore(deps): update ubuntu:24.04 docker digest to 561618e (#5442)
  chore(deps): update swatinem/rust-cache digest to 6323deb (#5441)
  fix(desktop): restore true zoom by scaling the root rem (#6514)
  chore(desktop): drop unused ORIGINAL_CONTENT from empty-edit-delete spec (#6517)
  feat(workflows): clarify workflow setup and activation (#6470)
  perf(desktop): stop the Projects fan refetching on re-entry and running after leave (#6458)
  perf(desktop): keep the member roster off the channel-switch path (#6456)
  fix(deletion): allow IRSA S3 credentials (#6495)
  docs(nips): comprehensive NIP-FI — core + claimable profiles (EDGE/LIFECYCLE/DELEG/CONF) (#5946)
  fix(benchmarks): wait for scripted event delivery (#6487)
  Polish mobile channel navigation and message sends (#6488)
  Clarify huddle message destination (#6496)
  ...

Signed-off-by: Tom Brow <tomb@block.xyz>
wpfleger96 pushed a commit that referenced this pull request Aug 22, 2026
…ake-fix

* origin/main: (33 commits)
  perf(desktop): make the Projects surface render-cheap (#6460)
  refactor(acp): clarify agent prompt sections (#6501)
  Add mobile Huddles voice MVP (#6056)
  feat(desktop-messages): keep agents addressed across messages (#6315)
  fix(desktop): remove Buzz entity link previews (#6512)
  fix(composer): preserve caret when inserting mentions mid-message (#6531)
  chore(deps): update rust crate async-trait to v0.1.92 (#6094)
  chore(deps): update dependency sonner to v2.0.8 (#6093)
  chore(deps): update rust crate http-body-util to v0.1.4 (#5452)
  chore(deps): update rust crate http to v1.4.2 (#5451)
  chore(deps): update rust crate futures-util to v0.3.33 (#5448)
  chore(deps): update rust crate futures to v0.3.33 (#5445)
  chore(deps): update dependency @tauri-apps/api to v2.11.1 (#5444)
  chore(deps): update ubuntu:24.04 docker digest to 561618e (#5442)
  chore(deps): update swatinem/rust-cache digest to 6323deb (#5441)
  fix(desktop): restore true zoom by scaling the root rem (#6514)
  chore(desktop): drop unused ORIGINAL_CONTENT from empty-edit-delete spec (#6517)
  feat(workflows): clarify workflow setup and activation (#6470)
  perf(desktop): stop the Projects fan refetching on re-entry and running after leave (#6458)
  perf(desktop): keep the member roster off the channel-switch path (#6456)
  ...

Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants