Skip to content

feat(workflows): add explainable cron schedule widget with Simple/Advanced builder#209

Open
tstapler wants to merge 2 commits into
mainfrom
cron-schedule-widget
Open

feat(workflows): add explainable cron schedule widget with Simple/Advanced builder#209
tstapler wants to merge 2 commits into
mainfrom
cron-schedule-widget

Conversation

@tstapler

Copy link
Copy Markdown
Owner

Summary

Backlog item: "Cron expression widget needs better explanation" — the Workflow form's cron field was a bare text <input> with no explanation, no non-expert entry mode, and no client-side validation, forcing users to know cron syntax and round-trip to the backend to find out if their expression was even valid.

What Changed

  • New web-app/src/lib/cron/explainCron.ts: pure functions validateCron, explainCron, buildCronFromSimple, parseCronToSimple. Validation grammar is pinned to the exact backend parser config (server/workflows/scheduler.go: cron.Minute|Hour|Dom|Month|Dow, no Descriptor bit) — @daily/@every macros are rejected client-side too, matching real (not assumed) backend behavior confirmed by reading the robfig/cron/v3 source.
  • New CronScheduleInput component: live human-readable explanation (aria-live="polite", correct OR semantics when both day-of-month and day-of-week are restricted), a Simple builder (daily/weekly/weekdays/monthly + time) for non-cron-literate users, and an Advanced raw-text mode for power users (unchanged behavior).
  • Advanced→Simple mode switch checks representability first and shows a fallback notice instead of silently mangling an expression the builder can't model (steps/ranges/lists/month restrictions). Simple→Advanced always preserves the exact last builder-computed string.
  • Static "runs in the server's local timezone" label (honest — the client can't know the server's actual zone).
  • WorkflowForm.tsx now blocks submission client-side when the cron field is enabled but invalid.
  • Registry entry added: docs/registry/features/frontend/workflow-cron-schedule-input.json.
  • New Playwright e2e spec: tests/e2e/workflow-cron-schedule.spec.ts (raw-cron power-user flow, invalid-cron submit blocking, Simple-mode build flow, and an Axe Core WCAG AA check).

Explicitly out of scope: plain-English-to-cron NL parsing (tracked separately per the backlog item).

Test plan

  • cd web-app && npx jest --no-coverage --testPathPatterns="explainCron|CronScheduleInput" — 31/31 passed
  • npx tsc --noEmit -p web-app — no errors
  • cd web-app && pnpm run lint — zero warnings/errors on any touched file (one pre-existing, unrelated Error: elsewhere in the repo)
  • make web-build && go build -o stapler-squad ., ran against a real isolated instance: cd tests/e2e && npx playwright test workflow-cron-schedule.spec.ts — 4/4 passed on chromium, 3/3 on chromium-dom
  • Full web-app jest suite: 3459/3466 passed (7 pre-existing unrelated failures in SessionDetail.embedded.test.tsx / BacklogEmptyState.test.tsx)
  • make registry-aggregate — new feature entry present in docs/registry/frontend-features.json

🤖 Generated with Claude Code

https://claude.ai/code/session_01YH4Wu7Ue5LAuPMJBcefvhC

…anced builder

Replaces the bare cron text input in the Workflow form with CronScheduleInput:
a live human-readable explanation (correct OR semantics for day-of-month/
day-of-week), a Simple builder for daily/weekly/weekdays/monthly schedules,
inline client-side validation pinned to the backend's exact 5-field
robfig/cron/v3 grammar, and a server-local timezone label. Advanced mode keeps
the raw-cron power-user workflow unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YH4Wu7Ue5LAuPMJBcefvhC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 117 feature files to /tmp/tmp.o5PToBsdET/backend
Wrote 15 feature files to /tmp/tmp.o5PToBsdET/backend
Wrote 45 feature files to /tmp/tmp.o5PToBsdET/backend
Wrote 7 feature files to /tmp/tmp.o5PToBsdET/backend
Wrote 11 feature files to /tmp/tmp.o5PToBsdET/backend

=== Backend Registry Diff ===
Committed: 179  Generated: 179  Divergence: 0.0%
⚠️  111 feature(s) missing // +api: marker (markerFound: false)

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 18/179 features have testIds (10.1%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

@github-actions

Copy link
Copy Markdown
Contributor

UX Analysis

Check Status Details
❌ Axe Core (WCAG 2.1 AA) failure Critical/serious violations block merge
⚠️ Lighthouse Performance Score: unknown Warning if < 70 (non-blocking)
🤖 Claude UX Analysis Advisory See docs/qa/ for findings

Axe Core excludes terminal rendering areas (intentional design).
Lighthouse runs in desktop preset for this developer tool.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Go Benchmarks (Tier 1)

benchmarks/go/tier1-baseline.txt:98: missing iteration count
benchmarks/go/tier1-baseline.txt:197: missing iteration count
tier1-bench.txt:98: missing iteration count
tier1-bench.txt:198: missing iteration count
goos: linux
goarch: amd64
pkg: github.com/tstapler/stapler-squad/session
cpu: AMD EPYC 7763 64-Core Processor                
                                            │ tier1-bench.txt │
                                            │     sec/op      │
CircularBufferWrite_4KB-4                         80.36n ± 0%
CircularBufferWrite_4KB_Allocs-4                  80.99n ± 0%
CircularBufferGetRecent_4KB-4                     511.7n ± 2%
CircularBufferGetAll-4                            3.856µ ± 1%
GetTimeSinceLastMeaningfulOutput_HotPath-4        65.80n ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4       32.76n ± 0%
geomean                                           173.9n

                                            │ tier1-bench.txt │
                                            │      B/op       │
CircularBufferWrite_4KB-4                        0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                 0.000 ± 0%
CircularBufferGetRecent_4KB-4                  4.000Ki ± 0%
CircularBufferGetAll-4                         40.00Ki ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4       0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4      0.000 ± 0%
geomean                                                     ¹
¹ summaries must be >0 to compute geomean

                                            │ tier1-bench.txt │
                                            │    allocs/op    │
CircularBufferWrite_4KB-4                        0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                 0.000 ± 0%
CircularBufferGetRecent_4KB-4                    1.000 ± 0%
CircularBufferGetAll-4                           1.000 ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4       0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4      0.000 ± 0%
geomean                                                     ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │       B/s       │
CircularBufferWrite_4KB-4          47.47Gi ± 0%
CircularBufferGetRecent_4KB-4      7.455Gi ± 2%
geomean                            18.81Gi

cpu: AMD EPYC 9V74 80-Core Processor                
                                            │ benchmarks/go/tier1-baseline.txt │
                                            │              sec/op              │
CircularBufferWrite_4KB-4                                          80.55n ± 1%
CircularBufferWrite_4KB_Allocs-4                                   81.14n ± 2%
CircularBufferGetRecent_4KB-4                                      573.1n ± 3%
CircularBufferGetAll-4                                             4.417µ ± 8%
GetTimeSinceLastMeaningfulOutput_HotPath-4                         70.15n ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        34.54n ± 0%
geomean                                                            185.0n

                                            │ benchmarks/go/tier1-baseline.txt │
                                            │               B/op               │
CircularBufferWrite_4KB-4                                         0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                                  0.000 ± 0%
CircularBufferGetRecent_4KB-4                                   4.000Ki ± 0%
CircularBufferGetAll-4                                          40.00Ki ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%
geomean                                                                      ¹
¹ summaries must be >0 to compute geomean

                                            │ benchmarks/go/tier1-baseline.txt │
                                            │            allocs/op             │
CircularBufferWrite_4KB-4                                         0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                                  0.000 ± 0%
CircularBufferGetRecent_4KB-4                                     1.000 ± 0%
CircularBufferGetAll-4                                            1.000 ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%
geomean                                                                      ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/s                │
CircularBufferWrite_4KB-4                           47.35Gi ± 1%
CircularBufferGetRecent_4KB-4                       6.657Gi ± 3%
geomean                                             17.75Gi

pkg: github.com/tstapler/stapler-squad/session/detection/ratelimit
cpu: AMD EPYC 7763 64-Core Processor                
                              │ tier1-bench.txt │
                              │     sec/op      │
StripANSI_PlainText-4               6.875n ± 1%
StripANSI_WithEscapes-4             745.0n ± 0%
ProcessOutput_InactiveState-4       6.268n ± 0%
geomean                             31.78n

                              │ tier1-bench.txt │
                              │      B/op       │
StripANSI_PlainText-4              0.000 ± 0%
StripANSI_WithEscapes-4            136.0 ± 0%
ProcessOutput_InactiveState-4      0.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │    allocs/op    │
StripANSI_PlainText-4              0.000 ± 0%
StripANSI_WithEscapes-4            5.000 ± 0%
ProcessOutput_InactiveState-4      0.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
StripANSI_PlainText-4                                7.048n ± 3%
StripANSI_WithEscapes-4                              653.0n ± 0%
ProcessOutput_InactiveState-4                        6.630n ± 1%
geomean                                              31.25n

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/op               │
StripANSI_PlainText-4                               0.000 ± 0%
StripANSI_WithEscapes-4                             136.0 ± 0%
ProcessOutput_InactiveState-4                       0.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │            allocs/op             │
StripANSI_PlainText-4                               0.000 ± 0%
StripANSI_WithEscapes-4                             5.000 ± 0%
ProcessOutput_InactiveState-4                       0.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/queue
cpu: AMD EPYC 7763 64-Core Processor                
                              │ tier1-bench.txt │
                              │     sec/op      │
ReviewQueue_ConcurrentReads-4      88.27n ± 11%
ReviewQueue_Add-4                  500.8n ±  1%
geomean                            210.2n

                              │ tier1-bench.txt │
                              │      B/op       │
ReviewQueue_ConcurrentReads-4      0.000 ± 0%
ReviewQueue_Add-4                  640.0 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │    allocs/op    │
ReviewQueue_ConcurrentReads-4      0.000 ± 0%
ReviewQueue_Add-4                  4.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
ReviewQueue_ConcurrentReads-4                        79.58n ± 4%
ReviewQueue_Add-4                                    499.4n ± 1%
geomean                                              199.3n

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/op               │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%
ReviewQueue_Add-4                                   640.0 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │            allocs/op             │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%
ReviewQueue_Add-4                                   4.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/scrollback
cpu: AMD EPYC 7763 64-Core Processor                
                                      │ tier1-bench.txt │
                                      │     sec/op      │
CircularBuffer_ConcurrentReadWrite-4        3.984µ ± 1%
CircularBuffer_BurstAppend-4                102.1µ ± 1%
CircularBuffer_GetLastN_LargeBuffer-4       20.15µ ± 2%
CircularBuffer_GetRange_Sequential-4        11.16µ ± 1%
CircularBufferAppend-4                      97.64n ± 0%
CircularBufferGetLastN-4                    2.277µ ± 1%
CircularBufferConcurrentAppend-4            127.0n ± 1%
geomean                                     3.072µ

                                      │ tier1-bench.txt │
                                      │      B/op       │
CircularBuffer_ConcurrentReadWrite-4       6.062Ki ± 0%
CircularBuffer_BurstAppend-4               62.50Ki ± 0%
CircularBuffer_GetLastN_LargeBuffer-4      56.00Ki ± 0%
CircularBuffer_GetRange_Sequential-4       28.00Ki ± 0%
CircularBufferAppend-4                       24.00 ± 0%
CircularBufferGetLastN-4                   6.000Ki ± 0%
CircularBufferConcurrentAppend-4             32.00 ± 0%
geomean                                    3.077Ki

                                      │ tier1-bench.txt │
                                      │    allocs/op    │
CircularBuffer_ConcurrentReadWrite-4         2.000 ± 0%
CircularBuffer_BurstAppend-4                1.000k ± 0%
CircularBuffer_GetLastN_LargeBuffer-4        1.000 ± 0%
CircularBuffer_GetRange_Sequential-4         1.000 ± 0%
CircularBufferAppend-4                       1.000 ± 0%
CircularBufferGetLastN-4                     1.000 ± 0%
CircularBufferConcurrentAppend-4             1.000 ± 0%
geomean                                      2.962

                             │ tier1-bench.txt │
                             │       B/s       │
CircularBuffer_BurstAppend-4      598.0Mi ± 2%

cpu: AMD EPYC 9V74 80-Core Processor                
                                      │ benchmarks/go/tier1-baseline.txt │
                                      │              sec/op              │
CircularBuffer_ConcurrentReadWrite-4                         3.474µ ± 4%
CircularBuffer_BurstAppend-4                                 107.1µ ± 1%
CircularBuffer_GetLastN_LargeBuffer-4                        20.29µ ± 2%
CircularBuffer_GetRange_Sequential-4                         10.56µ ± 1%
CircularBufferAppend-4                                       103.5n ± 0%
CircularBufferGetLastN-4                                     2.334µ ± 2%
CircularBufferConcurrentAppend-4                             137.8n ± 0%
geomean                                                      3.084µ

                                      │ benchmarks/go/tier1-baseline.txt │
                                      │               B/op               │
CircularBuffer_ConcurrentReadWrite-4                        6.062Ki ± 0%
CircularBuffer_BurstAppend-4                                62.50Ki ± 0%
CircularBuffer_GetLastN_LargeBuffer-4                       56.00Ki ± 0%
CircularBuffer_GetRange_Sequential-4                        28.00Ki ± 0%
CircularBufferAppend-4                                        24.00 ± 0%
CircularBufferGetLastN-4                                    6.000Ki ± 0%
CircularBufferConcurrentAppend-4                              32.00 ± 0%
geomean                                                     3.077Ki

                                      │ benchmarks/go/tier1-baseline.txt │
                                      │            allocs/op             │
CircularBuffer_ConcurrentReadWrite-4                          2.000 ± 0%
CircularBuffer_BurstAppend-4                                 1.000k ± 0%
CircularBuffer_GetLastN_LargeBuffer-4                         1.000 ± 0%
CircularBuffer_GetRange_Sequential-4                          1.000 ± 0%
CircularBufferAppend-4                                        1.000 ± 0%
CircularBufferGetLastN-4                                      1.000 ± 0%
CircularBufferConcurrentAppend-4                              1.000 ± 0%
geomean                                                       2.962

                             │ benchmarks/go/tier1-baseline.txt │
                             │               B/s                │
CircularBuffer_BurstAppend-4                       569.8Mi ± 3%

pkg: github.com/tstapler/stapler-squad/session/tmux
cpu: AMD EPYC 7763 64-Core Processor                
                             │ tier1-bench.txt │
                             │     sec/op      │
StripANSICodes_PlainText-4         6.863n ± 1%
StripANSICodes_WithEscapes-4       692.1n ± 0%
IsBanner_PlainText-4               478.2n ± 0%
geomean                            131.5n

                             │ tier1-bench.txt │
                             │      B/op       │
StripANSICodes_PlainText-4        0.000 ± 0%
StripANSICodes_WithEscapes-4      56.00 ± 0%
IsBanner_PlainText-4              0.000 ± 0%
geomean                                      ¹
¹ summaries must be >0 to compute geomean

                             │ tier1-bench.txt │
                             │    allocs/op    │
StripANSICodes_PlainText-4        0.000 ± 0%
StripANSICodes_WithEscapes-4      4.000 ± 0%
IsBanner_PlainText-4              0.000 ± 0%
geomean                                      ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                             │ benchmarks/go/tier1-baseline.txt │
                             │              sec/op              │
StripANSICodes_PlainText-4                          7.054n ± 5%
StripANSICodes_WithEscapes-4                        619.1n ± 2%
IsBanner_PlainText-4                                463.9n ± 1%
geomean                                             126.5n

                             │ benchmarks/go/tier1-baseline.txt │
                             │               B/op               │
StripANSICodes_PlainText-4                         0.000 ± 0%
StripANSICodes_WithEscapes-4                       56.00 ± 0%
IsBanner_PlainText-4                               0.000 ± 0%
geomean                                                       ¹
¹ summaries must be >0 to compute geomean

                             │ benchmarks/go/tier1-baseline.txt │
                             │            allocs/op             │
StripANSICodes_PlainText-4                         0.000 ± 0%
StripANSICodes_WithEscapes-4                       4.000 ± 0%
IsBanner_PlainText-4                               0.000 ± 0%
geomean                                                       ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/tokens
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ tier1-bench.txt │
                                   │     sec/op      │
TokenParser_ProcessUserEntry-4           5.267m ± 2%
DetectCommandsInText/NoSlash-4           7.500n ± 0%
DetectCommandsInText/WithCommand-4       1.655µ ± 1%
geomean                                  4.028µ

                                   │ tier1-bench.txt │
                                   │      B/op       │
TokenParser_ProcessUserEntry-4        11.02Mi ± 0%
DetectCommandsInText/NoSlash-4          0.000 ± 0%
DetectCommandsInText/WithCommand-4      433.0 ± 0%
geomean                                            ¹
¹ summaries must be >0 to compute geomean

                                   │ tier1-bench.txt │
                                   │    allocs/op    │
TokenParser_ProcessUserEntry-4          34.00 ± 0%
DetectCommandsInText/NoSlash-4          0.000 ± 0%
DetectCommandsInText/WithCommand-4      6.000 ± 0%
geomean                                            ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmarks/go/tier1-baseline.txt │
                                   │              sec/op              │
TokenParser_ProcessUserEntry-4                            5.445m ± 1%
DetectCommandsInText/NoSlash-4                            6.349n ± 1%
DetectCommandsInText/WithCommand-4                        1.493µ ± 1%
geomean                                                   3.723µ

                                   │ benchmarks/go/tier1-baseline.txt │
                                   │               B/op               │
TokenParser_ProcessUserEntry-4                         11.02Mi ± 0%
DetectCommandsInText/NoSlash-4                           0.000 ± 0%
DetectCommandsInText/WithCommand-4                       433.0 ± 0%
geomean                                                             ¹
¹ summaries must be >0 to compute geomean

                                   │ benchmarks/go/tier1-baseline.txt │
                                   │            allocs/op             │
TokenParser_ProcessUserEntry-4                           34.00 ± 0%
DetectCommandsInText/NoSlash-4                           0.000 ± 0%
DetectCommandsInText/WithCommand-4                       6.000 ± 0%
geomean                                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/unfinished
cpu: AMD EPYC 7763 64-Core Processor                
                               │ tier1-bench.txt │
                               │     sec/op      │
DiffShortstat/GitVCSReader-4         3.174m ± 1%
DiffShortstat/GoGitVCSReader-4       76.92n ± 0%
DiffShortstatCached-4                75.69n ± 1%
geomean                              2.644µ

                               │ tier1-bench.txt │
                               │      B/op       │
DiffShortstat/GitVCSReader-4      56.57Ki ± 0%
DiffShortstat/GoGitVCSReader-4      0.000 ± 0%
DiffShortstatCached-4               0.000 ± 0%
geomean                                        ¹
¹ summaries must be >0 to compute geomean

                               │ tier1-bench.txt │
                               │    allocs/op    │
DiffShortstat/GitVCSReader-4        360.0 ± 0%
DiffShortstat/GoGitVCSReader-4      0.000 ± 0%
DiffShortstatCached-4               0.000 ± 0%
geomean                                        ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                               │ benchmarks/go/tier1-baseline.txt │
                               │              sec/op              │
DiffShortstat/GitVCSReader-4                          3.369m ± 1%
DiffShortstat/GoGitVCSReader-4                        80.82n ± 0%
DiffShortstatCached-4                                 80.56n ± 0%
geomean                                               2.799µ

                               │ benchmarks/go/tier1-baseline.txt │
                               │               B/op               │
DiffShortstat/GitVCSReader-4                       62.58Ki ± 0%
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%
DiffShortstatCached-4                                0.000 ± 0%
geomean                                                         ¹
¹ summaries must be >0 to compute geomean

                               │ benchmarks/go/tier1-baseline.txt │
                               │            allocs/op             │
DiffShortstat/GitVCSReader-4                         360.0 ± 0%
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%
DiffShortstatCached-4                                0.000 ± 0%
geomean                                                         ¹
¹ summaries must be >0 to compute geomean

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

🎬 E2E Feature Demos

2 shard(s) recorded feature flows for this PR.

recordings shard 1
recordings shard 2

Demo preview opens directly in browser (single-file HTML). Raw WebM recordings in ZIP. Expires after 30 days.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 7ms (▼ faster -5.1%; baseline: 8ms)
list-sessions-total-mean: 12ms (▼ faster -2.7%; baseline: 12ms)

@github-actions

Copy link
Copy Markdown
Contributor

📊 Feature E2E Coverage

Feature E2E coverage: 6/179 tested (3%)

Run make e2e-report locally to view the full Allure report.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 16 KB/s ▼ -5.2% (baseline: 16 KB/s)
terminal-throughput-p50: 16 KB/s ▼ -5.5% (baseline: 17 KB/s)

…from code review

- validateCron/explainCron now accept `?` as a synonym for `*` (verified against
  the vendored robfig/cron/v3 source: getRange treats it unconditionally as a
  wildcard, not gated behind Quartz/Descriptor options) instead of incorrectly
  rejecting valid backend syntax.
- Range validation now rejects start > end (e.g. "17-9"), matching the backend
  parser's actual rejection of reversed ranges.
- Fixed a duplicated-word bug ("every every 15") in step-only explanations.
- Fixed an accessibility regression where CronScheduleInput's `id` prop was only
  applied to the Advanced-mode input, leaving the Cron Expression label
  unassociated with any control while in Simple mode (the default for new
  workflows) — the widget now exposes an accessible group name via
  aria-labelledby in both modes.
- Added a golden fixture test pinning the hand-written grammar against
  documented real robfig/cron/v3 behavior, a WorkflowForm submit-blocking unit
  test, and an Advanced->Simple success-path test — closing gaps a 4-agent code
  review found before merge.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YH4Wu7Ue5LAuPMJBcefvhC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 117 feature files to /tmp/tmp.BC9Uvu2isf/backend
Wrote 15 feature files to /tmp/tmp.BC9Uvu2isf/backend
Wrote 45 feature files to /tmp/tmp.BC9Uvu2isf/backend
Wrote 7 feature files to /tmp/tmp.BC9Uvu2isf/backend
Wrote 11 feature files to /tmp/tmp.BC9Uvu2isf/backend

=== Backend Registry Diff ===
Committed: 179  Generated: 179  Divergence: 0.0%
⚠️  111 feature(s) missing // +api: marker (markerFound: false)

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 18/179 features have testIds (10.1%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

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.

1 participant