A <button disabled>Coming Soon</button> announces unfinished work on every page view. Prospects see the placeholder before they see the working feature set, pricing tables look padded with vaporware, and competitors screenshot the dead CTA for comparison pages. The pattern also breaks keyboard and screen-reader flows because the button focuses but does nothing, which maps to WCAG 2.2 SC 2.4.3 (Focus Order) and SC 3.2.2 (On Input) complaints.
Info because the defect is cosmetic and accessibility-adjacent rather than data- or security-impacting.
Either hide the feature behind a flag until implementation lands, or wire the CTA to a real waitlist action that captures email and sets expectations. Never ship a disabled button with placeholder text. Fix at src/components/Pricing.tsx:
{FEATURE_ENABLED ? (
<button onClick={handleClick}>Sign up</button>
) : (
<button onClick={() => addToWaitlist(email)}>Join waitlist</button>
)}
ID: ai-slop-half-finished.dev-artifacts.disabled-feature-placeholders
Severity: info
What to look for: Walk all .tsx/.jsx/.html/.vue/.svelte component files. Count all buttons, links, or interactive elements containing these exact visible text patterns (case-insensitive): coming soon, not yet available, temporarily disabled, under construction, we're working on it, feature in progress. Also count buttons with disabled attribute AND no onClick/onSubmit/href handler.
Pass criteria: 0 "coming soon" placeholders in interactive UI elements. Report: "Scanned X component files, 0 placeholder CTAs."
Fail criteria: At least 1 component has a button/link with "coming soon" text OR a disabled button with no handler.
Skip (N/A) when: Project has 0 component files.
Detail on fail: "2 'coming soon' CTAs: <button disabled>Coming Soon</button> in src/components/Pricing.tsx, <Link href='#'>Not yet available</Link> in src/app/page.tsx"
Remediation: "Coming soon" buttons signal unfinished work to every visitor. Either hide the feature entirely until it's ready OR implement a real waitlist CTA:
// Bad: dead button
<button disabled>Coming Soon</button>
// Better: hide entirely until ready
{FEATURE_ENABLED && <button onClick={handleClick}>Sign up</button>}
// Best: real waitlist with real action
<button onClick={() => addToWaitlist(email)}>Join waitlist</button>