Area / route
A batch of confirmed low-severity automations-editor / automations-exec / websites defects, each independently fixable. Grouped as polish; itemized below.
Sites
- [86] schedule cron-expression Zod validation messages are hardcoded English, not i18n keys
- Evidence: schedule-create-dialog.tsx:111 (.min(1, 'Cron expression is required')) and :119 ('Must be a valid 5-field cron expression'); confirmed no validation i18n key under automations.triggers.schedules.form in messages/en.json
- [89] SecretRevealDialog copy-button aria-label is hardcoded English (
Copy ${label}) instead of an i18n key
- Evidence: secret-reveal-dialog.tsx:89 (aria-label={
Copy ${secret.label}}); common.actions.copy exists in messages/en.json but is not used here
- [90] create-automation duplicate check is slug-based, so distinct names that slugify identically show a misleading "name already exists"
- Evidence: automation-create-dialog.tsx:51-65 (nameToSlug), :106-119 (slug-keyed isNew save), :150-152 (DUPLICATE_NAME → validation.duplicateName message)
- [95] Top-workflows table styles every row as clickable but null-slug rows are dead; null-slug fallback key uses Math.random() (remounts each render)
- Evidence: app/features/automations/metrics/top-workflows-table.tsx:49-59 (handleRowClick
if (!slug) return) + 149-151 (getRowId Math.random() fallback); app/components/ui/data-table/data-table.tsx:944 (cursor-pointer applied whenever onRowClick set)
- [96] Executions Duration column shows raw milliseconds ("120,000 ms") instead of a humanized duration, inconsistent with the metrics tables
- Evidence: app/features/automations/executions/executions-table.tsx:208-220 (calculateDuration -> formatDuration(duration, locale)); lib/utils/format/number.ts formatDuration returns
${formatNumber(ms, locale)} ms; app/features/automations/metrics/format-duration.ts:1-12 (formatDurationSeconds humanizes)
- [97] Automations metrics donut center total excludes pending runs, disagreeing with the "Total runs" KPI
- Evidence: app/features/automations/metrics/status-breakdown.tsx:28 (total = completed + failed + running) + 62-66 (centerValue=total); convex/workflows/executions/get_org_workflow_metrics.ts:143 (total++ for every in-window row) vs 175-198 (switch only increments completed/failed/running)
- [77] Website scanInterval not validated against the allowed enum on REST create/update (and agent write tool) — invalid value is stored, rendered raw, and silently crawled at the 6h default
- Evidence: rest_api.ts:56-58 (presence-only check); convex/websites/create_website.ts:14 + validators.ts:24 (scanInterval: v.string()); internal_actions.ts:16-35 (scanIntervalToSeconds default 21600); use-websites-table-config.tsx:119-135 (renders intervalLabels[val] || val).
Notes
Per item: [86] add automations.triggers.schedules.form.validation.cron* keys (all locales) and resolve in the schema useMemo; [89] add a copyField key with a {label} placeholder (don't drop the field name); [90] reword automations.validation.duplicateName to describe the slug/identifier collision; [95] mark only non-null-slug rows clickable and replace the Math.random() key fallback with a deterministic value; [96] humanize the executions Duration via formatDurationSeconds at the call site; [97] add a Pending segment (or derive the donut center from summary.total); [77] define a single scanInterval union validator + a matching z.enum for the agent write tool. [77] is the only bug; the rest are improvements.
Filed by an automated manual-review pass (live browser QA + a 25-agent code-grounded audit, each finding adversarially verified). Deduped against open issues (incl. #1972–#1999, settings/forms epic #1941–#1966, audit cluster #1842–#1846) and recently-closed issues.
Area / route
A batch of confirmed low-severity automations-editor / automations-exec / websites defects, each independently fixable. Grouped as polish; itemized below.
Sites
Copy ${label}) instead of an i18n keyCopy ${secret.label}}); common.actions.copy exists in messages/en.json but is not used hereif (!slug) return) + 149-151 (getRowId Math.random() fallback); app/components/ui/data-table/data-table.tsx:944 (cursor-pointer applied whenever onRowClick set)${formatNumber(ms, locale)} ms; app/features/automations/metrics/format-duration.ts:1-12 (formatDurationSeconds humanizes)Notes
Per item: [86] add
automations.triggers.schedules.form.validation.cron*keys (all locales) and resolve in the schema useMemo; [89] add acopyFieldkey with a {label} placeholder (don't drop the field name); [90] rewordautomations.validation.duplicateNameto describe the slug/identifier collision; [95] mark only non-null-slug rows clickable and replace the Math.random() key fallback with a deterministic value; [96] humanize the executions Duration via formatDurationSeconds at the call site; [97] add a Pending segment (or derive the donut center from summary.total); [77] define a single scanInterval union validator + a matching z.enum for the agent write tool. [77] is the only bug; the rest are improvements.Filed by an automated manual-review pass (live browser QA + a 25-agent code-grounded audit, each finding adversarially verified). Deduped against open issues (incl. #1972–#1999, settings/forms epic #1941–#1966, audit cluster #1842–#1846) and recently-closed issues.