waitsec 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/waitsec/references/anti-overengineering.md +27 -15
- package/skills/waitsec/references/ask-first.md +25 -13
- package/skills/waitsec/references/debug-first.md +25 -13
- package/skills/waitsec/references/small-diff.md +25 -13
- package/skills/waitsec/references/verify-first.md +25 -13
- package/skills/waitsec-code/SKILL.md +87 -12
- package/skills/waitsec-pagemaker/SKILL.md +420 -8
- package/skills/waitsec-pagemaker/references/about-me.md +39 -0
- package/skills/waitsec-pagemaker/references/article-single.md +64 -0
- package/skills/waitsec-pagemaker/references/blog-index.md +46 -0
- package/skills/waitsec-pagemaker/references/contact-page.md +41 -2
- package/skills/waitsec-pagemaker/references/landing-page.md +68 -0
- package/skills/waitsec-quality/SKILL.md +95 -16
- package/skills/waitsec-ui/SKILL.md +74 -17
|
@@ -112,6 +112,50 @@ Every article preview card must contain:
|
|
|
112
112
|
|
|
113
113
|
---
|
|
114
114
|
|
|
115
|
+
## SEO, GEO & Structured Data (Blog Index)
|
|
116
|
+
|
|
117
|
+
- Title: blog name plus its topic focus, about 50 to 60 characters.
|
|
118
|
+
- Meta description: what the blog covers and who it helps, about 140 to 160 characters.
|
|
119
|
+
- One `<h1>` for the index title, and `<h2>` for each article title.
|
|
120
|
+
- Server-render article titles, excerpts, and dates so crawlers read them without JavaScript.
|
|
121
|
+
- Link each card with the article title as anchor text, not "read more".
|
|
122
|
+
- Point a canonical tag at the canonical page of the listing, and keep paginated pages self-canonical.
|
|
123
|
+
- Keep the publish date and reading time visible, because freshness matters to both search and answer engines.
|
|
124
|
+
|
|
125
|
+
### JSON-LD for a Blog Index
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<script type="application/ld+json">
|
|
129
|
+
{
|
|
130
|
+
"@context": "https://schema.org",
|
|
131
|
+
"@type": "CollectionPage",
|
|
132
|
+
"name": "Engineering Journal",
|
|
133
|
+
"url": "https://example.com/blog",
|
|
134
|
+
"description": "Articles about software architecture, security, and frontend engineering.",
|
|
135
|
+
"isPartOf": { "@type": "WebSite", "url": "https://example.com" },
|
|
136
|
+
"mainEntity": {
|
|
137
|
+
"@type": "ItemList",
|
|
138
|
+
"itemListElement": [
|
|
139
|
+
{
|
|
140
|
+
"@type": "ListItem",
|
|
141
|
+
"position": 1,
|
|
142
|
+
"url": "https://example.com/blog/scaling-sqlite"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"@type": "ListItem",
|
|
146
|
+
"position": 2,
|
|
147
|
+
"url": "https://example.com/blog/reading-stack-traces"
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
</script>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Use `Blog` instead of `CollectionPage` when the listing is a true blog. Include one `ListItem` per visible article, in the same order shown on the page.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
115
159
|
## Pre-Flight Checklist for Blog Index Pages
|
|
116
160
|
|
|
117
161
|
- [ ] Do article cards stack into a clean single column on mobile without horizontal scrolling?
|
|
@@ -119,3 +163,5 @@ Every article preview card must contain:
|
|
|
119
163
|
- [ ] Are article excerpts clamped to 2 or 3 lines so cards maintain a predictable height?
|
|
120
164
|
- [ ] Can visitors comfortably reach the footer without being trapped by automatic infinite scroll?
|
|
121
165
|
- [ ] Are publication dates and reading estimates clearly legible with strong contrast?
|
|
166
|
+
- [ ] Does the page expose a valid CollectionPage or Blog ItemList schema?
|
|
167
|
+
- [ ] Do article cards use the article title as anchor text instead of "read more"?
|
|
@@ -84,9 +84,9 @@ Never demand phone numbers, fax numbers, company size, or physical mailing addre
|
|
|
84
84
|
* **Why It Fails:** Software must always confirm state changes. Silent forms destroy confidence and generate duplicate tickets.
|
|
85
85
|
* **Clean Fix:** Disable the submit button immediately on click, show a loading state, and render an unmistakable success card:
|
|
86
86
|
```html
|
|
87
|
-
<!-- Button Loading State -->
|
|
87
|
+
<!-- Button Loading State: the spinner icon comes from the icon library, never inline SVG -->
|
|
88
88
|
<button disabled class="w-full py-3 bg-neutral-700 text-white font-medium rounded-lg cursor-not-allowed flex items-center justify-center gap-2">
|
|
89
|
-
<
|
|
89
|
+
<i data-lucide="loader-2" class="w-4 h-4 animate-spin"></i>
|
|
90
90
|
<span>Sending...</span>
|
|
91
91
|
</button>
|
|
92
92
|
|
|
@@ -113,6 +113,43 @@ Never demand phone numbers, fax numbers, company size, or physical mailing addre
|
|
|
113
113
|
|
|
114
114
|
---
|
|
115
115
|
|
|
116
|
+
## SEO, GEO & Structured Data (Contact Page)
|
|
117
|
+
|
|
118
|
+
- Title: "Contact" plus the brand name, about 50 to 60 characters.
|
|
119
|
+
- Meta description: how to reach the team and the expected response time, about 140 to 160 characters.
|
|
120
|
+
- One `<h1>` such as "Get in touch".
|
|
121
|
+
- Print the email and address as visible text, not only inside the form, so they can be extracted.
|
|
122
|
+
- Server-render the contact details, the email link, and the response-time note.
|
|
123
|
+
- Keep the page focused on contact, and avoid unrelated marketing sections.
|
|
124
|
+
|
|
125
|
+
### JSON-LD for a Contact Page
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<script type="application/ld+json">
|
|
129
|
+
{
|
|
130
|
+
"@context": "https://schema.org",
|
|
131
|
+
"@type": "ContactPage",
|
|
132
|
+
"name": "Contact Us",
|
|
133
|
+
"url": "https://example.com/contact",
|
|
134
|
+
"mainEntity": {
|
|
135
|
+
"@type": "Organization",
|
|
136
|
+
"name": "Example Inc",
|
|
137
|
+
"url": "https://example.com",
|
|
138
|
+
"contactPoint": {
|
|
139
|
+
"@type": "ContactPoint",
|
|
140
|
+
"contactType": "customer support",
|
|
141
|
+
"email": "hello@example.com",
|
|
142
|
+
"availableLanguage": ["English", "Indonesian"]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
</script>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Add the organization `logo` and a `PostalAddress` when a physical address is shown. Only include channels that are actually displayed on the page.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
116
153
|
## Pre-Flight Checklist for Contact Pages
|
|
117
154
|
|
|
118
155
|
- [ ] Is the form limited to 3 or 4 essential fields (Name, Email, Message)?
|
|
@@ -121,3 +158,5 @@ Never demand phone numbers, fax numbers, company size, or physical mailing addre
|
|
|
121
158
|
- [ ] Does the page display an unmistakable success banner after submission?
|
|
122
159
|
- [ ] Is there a direct, visible email address (`mailto:`) provided as an alternative contact method?
|
|
123
160
|
- [ ] Does the form have enough bottom padding to clear mobile virtual keyboards?
|
|
161
|
+
- [ ] Is there a valid ContactPage with Organization and ContactPoint schema?
|
|
162
|
+
- [ ] Are the email and address visible as text, not only inside the form?
|
|
@@ -143,6 +143,72 @@ Use this guide when creating a marketing page, product launch screen, or SaaS ho
|
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
146
|
+
## SEO, GEO & Structured Data (Landing Page)
|
|
147
|
+
|
|
148
|
+
State what the product is and who it is for within the first two sentences of the hero. Answer engines quote those lines, so make them complete and direct.
|
|
149
|
+
|
|
150
|
+
- Title: product name plus one clear benefit, about 50 to 60 characters.
|
|
151
|
+
- Meta description: what the product does and who it is for, about 140 to 160 characters.
|
|
152
|
+
- One `<h1>` that carries the core value proposition in plain words.
|
|
153
|
+
- Server-render the hero headline, subheadline, and primary CTA.
|
|
154
|
+
- Add an FAQ block with question-shaped `<h3>` headings. Start each answer with a direct one-sentence response.
|
|
155
|
+
- Keep the Open Graph image at 1200x630 and use an absolute URL.
|
|
156
|
+
|
|
157
|
+
### JSON-LD for a Landing Page
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<script type="application/ld+json">
|
|
161
|
+
{
|
|
162
|
+
"@context": "https://schema.org",
|
|
163
|
+
"@graph": [
|
|
164
|
+
{
|
|
165
|
+
"@type": "Organization",
|
|
166
|
+
"@id": "https://example.com/#organization",
|
|
167
|
+
"name": "Example Inc",
|
|
168
|
+
"url": "https://example.com",
|
|
169
|
+
"logo": "https://example.com/images/logo.png"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"@type": "WebSite",
|
|
173
|
+
"@id": "https://example.com/#website",
|
|
174
|
+
"url": "https://example.com",
|
|
175
|
+
"name": "Example",
|
|
176
|
+
"publisher": { "@id": "https://example.com/#organization" }
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"@type": "SoftwareApplication",
|
|
180
|
+
"name": "Example App",
|
|
181
|
+
"applicationCategory": "BusinessApplication",
|
|
182
|
+
"operatingSystem": "Web",
|
|
183
|
+
"url": "https://example.com",
|
|
184
|
+
"offers": {
|
|
185
|
+
"@type": "Offer",
|
|
186
|
+
"price": "0",
|
|
187
|
+
"priceCurrency": "USD"
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"@type": "FAQPage",
|
|
192
|
+
"mainEntity": [
|
|
193
|
+
{
|
|
194
|
+
"@type": "Question",
|
|
195
|
+
"name": "Is there a free plan?",
|
|
196
|
+
"acceptedAnswer": {
|
|
197
|
+
"@type": "Answer",
|
|
198
|
+
"text": "Yes. The free plan covers one project with no time limit."
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
</script>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Include the `FAQPage` block only when the FAQ is actually visible on the page. Use `Product` instead of `SoftwareApplication` for a physical or ecommerce product.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
146
212
|
## Pre-Flight Checklist for Landing Pages
|
|
147
213
|
|
|
148
214
|
- [ ] Does the hero section have exactly 1 high-contrast primary CTA button?
|
|
@@ -150,3 +216,5 @@ Use this guide when creating a marketing page, product launch screen, or SaaS ho
|
|
|
150
216
|
- [ ] Are feature cards structured with varied visual weight (bento style) rather than copy-paste clones?
|
|
151
217
|
- [ ] Is there zero horizontal page wobble when testing at 320px width?
|
|
152
218
|
- [ ] Are all headlines scaled down comfortably on mobile to avoid breaking words into multiple lines?
|
|
219
|
+
- [ ] Is there one H1, a unique title, a meta description, and an absolute Open Graph image?
|
|
220
|
+
- [ ] Is the JSON-LD valid, type-appropriate, and free of validator errors?
|
|
@@ -21,22 +21,101 @@ Activate this skill whenever:
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
##
|
|
25
|
-
|
|
26
|
-
### 1.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
## Part 1: Security & Access Boundaries
|
|
25
|
+
|
|
26
|
+
### 1. Trusting Client-Supplied IDs (IDOR)
|
|
27
|
+
|
|
28
|
+
* **The Bad Habit:** Fetching a record straight from a request ID, like `Order::find($id)`, without checking who owns it.
|
|
29
|
+
* **The Problem:** Any logged-in user can change the ID in the URL and read or edit someone else's record.
|
|
30
|
+
* **Why It Fails:** This is a direct data breach. One guessed number exposes private orders, messages, or invoices.
|
|
31
|
+
* **Clean Fix:** Scope every read, update, and delete to the authenticated user or tenant:
|
|
32
|
+
```php
|
|
33
|
+
// Bad
|
|
34
|
+
$order = Order::find($id);
|
|
35
|
+
|
|
36
|
+
// Good
|
|
37
|
+
$order = auth()->user()->orders()->findOrFail($id);
|
|
38
|
+
```
|
|
39
|
+
* **The Waitsec Way:** Never trust an ID that came from the client. Verify ownership on every data access.
|
|
40
|
+
|
|
41
|
+
### 2. Leaking Sensitive Data in Responses
|
|
42
|
+
|
|
43
|
+
* **The Bad Habit:** Returning the whole model, including password hashes, internal flags, or stack traces.
|
|
44
|
+
* **The Problem:** The API response exposes fields the user should never see.
|
|
45
|
+
* **Why It Fails:** Leaked hashes and internal details hand attackers the first step of a break-in.
|
|
46
|
+
* **Clean Fix:** Return explicit, whitelisted fields only. Use serialization filters or resource classes.
|
|
47
|
+
* **The Waitsec Way:** Send the minimum the client needs. Everything else stays server-side.
|
|
48
|
+
|
|
49
|
+
### 3. Mass Assignment
|
|
50
|
+
|
|
51
|
+
* **The Bad Habit:** Passing the whole request payload into `create()` or `update()`.
|
|
52
|
+
* **The Problem:** A crafted request can set fields the form never exposed, such as `isAdmin` or `price`.
|
|
53
|
+
* **Why It Fails:** Attackers change roles and prices with a single extra parameter, and the database accepts it.
|
|
54
|
+
* **Clean Fix:** Whitelist fillable attributes and pass only validated data:
|
|
55
|
+
```php
|
|
56
|
+
// Forbidden
|
|
57
|
+
User::create($request->all());
|
|
58
|
+
|
|
59
|
+
// Required
|
|
60
|
+
User::create($request->validated());
|
|
61
|
+
```
|
|
62
|
+
* **The Waitsec Way:** Accept only the fields you meant to accept. Never forward raw input to the database.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Part 2: Testing Discipline
|
|
67
|
+
|
|
68
|
+
### 4. Trivial Assertions
|
|
69
|
+
|
|
70
|
+
* **The Bad Habit:** Writing tests that assert `true`, assert the response is not null, or call an endpoint without checking the result.
|
|
71
|
+
* **The Problem:** The suite is green while the feature is broken.
|
|
72
|
+
* **Why It Fails:** A passing test that proves nothing gives false confidence. Bugs reach production behind a fake safety net.
|
|
73
|
+
* **Clean Fix:** Assert a concrete outcome: the row was created, the balance changed, the status code is 403, or the field equals the expected value.
|
|
74
|
+
* **The Waitsec Way:** A test must prove a behavior. If it cannot fail, it is not a test.
|
|
75
|
+
|
|
76
|
+
### 5. Mocking the System Under Test
|
|
77
|
+
|
|
78
|
+
* **The Bad Habit:** Mocking the very class or query the test is supposed to verify.
|
|
79
|
+
* **The Problem:** The test only confirms that the mock returned what the mock was told to return.
|
|
80
|
+
* **Why It Fails:** Real bugs live in the code that got mocked away. The suite passes and the feature still fails.
|
|
81
|
+
* **Clean Fix:** Test real business logic and database behavior where feasible. Mock only true external boundaries.
|
|
82
|
+
* **The Waitsec Way:** Test the real thing. Put mocks at the edges, never over the subject.
|
|
83
|
+
|
|
84
|
+
### 6. Fixing Without a Reproduction Test
|
|
85
|
+
|
|
86
|
+
* **The Bad Habit:** Fixing a reported bug immediately and moving on, with no test that captures the failure.
|
|
87
|
+
* **The Problem:** Nothing stops the same bug from returning in the next refactor.
|
|
88
|
+
* **Why It Fails:** Without a failing reproduction first, you cannot even prove the fix addresses the reported case.
|
|
89
|
+
* **Clean Fix:** Write a failing test that reproduces the bug, then fix until it passes, then keep the test.
|
|
90
|
+
* **The Waitsec Way:** A bug fix ships with proof. The reproduction test is that proof.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Part 3: Data & Migration Integrity
|
|
95
|
+
|
|
96
|
+
### 7. One-Way Migrations
|
|
97
|
+
|
|
98
|
+
* **The Bad Habit:** Writing an `up()` migration with no working `down()` rollback.
|
|
99
|
+
* **The Problem:** A bad deploy cannot be reversed cleanly.
|
|
100
|
+
* **Why It Fails:** When the migration corrupts or blocks data, the team is stuck with a manual, risky recovery under pressure.
|
|
101
|
+
* **Clean Fix:** Every migration gets a tested rollback that restores the previous schema state.
|
|
102
|
+
* **The Waitsec Way:** A migration is a two-way door. If you cannot safely go back, you cannot safely go forward.
|
|
103
|
+
|
|
104
|
+
### 8. Destructive Schema Shortcuts
|
|
105
|
+
|
|
106
|
+
* **The Bad Habit:** Dropping a column or table in one migration to "clean up".
|
|
107
|
+
* **The Problem:** Live data disappears the moment the migration runs, with no recovery path.
|
|
108
|
+
* **Why It Fails:** Production data loss is permanent and often unrecoverable. One migration erases history.
|
|
109
|
+
* **Clean Fix:** Deprecate in steps: stop writing, keep reading, back up, wait, then drop in a later release.
|
|
110
|
+
* **The Waitsec Way:** Remove data only when you are certain nothing needs it. Prefer deprecation over destruction.
|
|
111
|
+
|
|
112
|
+
### 9. Application-Only Constraints
|
|
113
|
+
|
|
114
|
+
* **The Bad Habit:** Enforcing uniqueness or relationships only in application code.
|
|
115
|
+
* **The Problem:** Race conditions and direct database writes slip past the checks.
|
|
116
|
+
* **Why It Fails:** Duplicate or orphaned rows appear even though the app "always checks". Data integrity decays over time.
|
|
117
|
+
* **Clean Fix:** Enforce foreign keys, unique indexes, and not-null rules at the database engine level.
|
|
118
|
+
* **The Waitsec Way:** The database is the last line of defense. Let it enforce the invariants.
|
|
40
119
|
|
|
41
120
|
---
|
|
42
121
|
|
|
@@ -20,23 +20,80 @@ Activate this skill whenever:
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
##
|
|
24
|
-
|
|
25
|
-
### 1.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
23
|
+
## Part 1: Visual Restraint
|
|
24
|
+
|
|
25
|
+
### 1. Generic AI Aesthetics
|
|
26
|
+
|
|
27
|
+
* **The Bad Habit:** Reaching for purple-to-indigo gradients, layered drop shadows, and slow hover animations on every surface.
|
|
28
|
+
* **The Problem:** The interface looks like every other generated template, and depth cues appear on elements that have no reason to float or move.
|
|
29
|
+
* **Why It Fails:** Users recognize the generic look instantly and trust the product less. Decorative motion also distracts from the actual task.
|
|
30
|
+
* **Clean Fix:** Use solid neutral surfaces and pick one deliberate accent color for the primary action. Add shadow or motion only when it signals real elevation or state.
|
|
31
|
+
* **The Waitsec Way:** Restraint reads as confidence. If an effect does not help the user, remove it.
|
|
32
|
+
|
|
33
|
+
### 2. Decoration That Does Not Earn Its Place
|
|
34
|
+
|
|
35
|
+
* **The Bad Habit:** Adding borders, shadows, glows, and background patterns to fill empty space.
|
|
36
|
+
* **The Problem:** The page is visually busy and the important element no longer stands out.
|
|
37
|
+
* **Why It Fails:** When everything is decorated, nothing has hierarchy. Users do not know where to look first.
|
|
38
|
+
* **Clean Fix:** Remove an effect and check whether usability drops. If it does not, leave it removed.
|
|
39
|
+
* **The Waitsec Way:** Every visual choice must carry meaning. Decoration is not a substitute for hierarchy.
|
|
40
|
+
|
|
41
|
+
### 3. Arbitrary Values Instead of Design Tokens
|
|
42
|
+
|
|
43
|
+
* **The Bad Habit:** Typing random hex colors, odd spacing numbers, and one-off font sizes into components.
|
|
44
|
+
* **The Problem:** The same "gray" appears in five slightly different shades, and spacing drifts from screen to screen.
|
|
45
|
+
* **Why It Fails:** The interface feels inconsistent, and future changes require hunting every stray value.
|
|
46
|
+
* **Clean Fix:** Use the existing design tokens, spacing scale, and theme colors. Add a token only when the system genuinely lacks one.
|
|
47
|
+
* **The Waitsec Way:** Follow the system in place. Consistency comes from reuse, not from fresh choices.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Part 2: Responsive Discipline
|
|
52
|
+
|
|
53
|
+
### 4. Fixed Widths and Horizontal Overflow
|
|
54
|
+
|
|
55
|
+
* **The Bad Habit:** Setting fixed pixel widths on main containers, tables, or code blocks.
|
|
56
|
+
* **The Problem:** On a narrow phone the page wobbles sideways and content disappears past the edge of the screen.
|
|
57
|
+
* **Why It Fails:** Horizontal scrolling on a vertical page breaks reading and navigation. Users lose their place and leave.
|
|
58
|
+
* **Clean Fix:** Use fluid widths with a max width (`w-full max-w-5xl mx-auto px-4`) and wrap tables or code blocks in `overflow-x-auto`.
|
|
59
|
+
* **The Waitsec Way:** The layout must fit the screen it is on. Zero horizontal page scrolling on mobile.
|
|
60
|
+
|
|
61
|
+
### 5. Desktop Assumed as the Default
|
|
62
|
+
|
|
63
|
+
* **The Bad Habit:** Building the wide desktop layout first and patching mobile with a media query at the very end.
|
|
64
|
+
* **The Problem:** The mobile view inherits desktop rules and glitches: oversized type, cramped cards, and broken spacing.
|
|
65
|
+
* **Why It Fails:** A last-minute patch fixes only the bug you happened to notice. Real visitors hit all the rest.
|
|
66
|
+
* **Clean Fix:** Start with the mobile layout, then add widths and columns as the screen grows.
|
|
67
|
+
* **The Waitsec Way:** Mobile is the base, not an afterthought. Design from the small screen up.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Part 3: Anti-Slop UI Copy (Implementation Silence)
|
|
72
|
+
|
|
73
|
+
### 6. Implementation Leaks in Copy
|
|
74
|
+
|
|
75
|
+
* **The Bad Habit:** Writing user-facing text about the code, such as "Data loaded via asynchronous API" or "Infinite scroll, 40 items per request".
|
|
76
|
+
* **The Problem:** The interface explains its own technical internals to the user.
|
|
77
|
+
* **Why It Fails:** Users want to finish a task, not read architecture notes. The text adds noise and reveals nothing useful.
|
|
78
|
+
* **Clean Fix:** Delete implementation talk. Keep only what helps the user understand the data or complete an action.
|
|
79
|
+
* **The Waitsec Way:** The UI serves the user, not the developer. Hide the mechanism, show the meaning.
|
|
80
|
+
* *Deep Dive & Triage:* Read [`skills/waitsec/references/write-info-analyzer.md`](../waitsec/references/write-info-analyzer.md).
|
|
81
|
+
|
|
82
|
+
### 7. Redundant Instructional Copy
|
|
83
|
+
|
|
84
|
+
* **The Bad Habit:** Adding "Click here to submit" under a clear "Submit" button.
|
|
85
|
+
* **The Problem:** The screen repeats what the control already says.
|
|
86
|
+
* **Why It Fails:** Extra text slows scanning without adding information. It makes a clean interface feel cluttered and unsure.
|
|
87
|
+
* **Clean Fix:** Let the label and visual design carry the instruction. Delete the helper sentence.
|
|
88
|
+
* **The Waitsec Way:** If the interface is already clear, stay quiet. Clear does not mean more text.
|
|
89
|
+
|
|
90
|
+
### 8. Labels That Do Not Help a Decision
|
|
91
|
+
|
|
92
|
+
* **The Bad Habit:** Labeling every icon, card, and number with explanatory text "so the screen does not look empty".
|
|
93
|
+
* **The Problem:** The page fills with words that do not help the user choose or act.
|
|
94
|
+
* **Why It Fails:** Visual noise makes the real information harder to find, and users skim past everything.
|
|
95
|
+
* **Clean Fix:** Keep text only when it changes a decision or explains the data. Remove labels that merely restate what is already visible.
|
|
96
|
+
* **The Waitsec Way:** Show information that helps. Delete decoration made of words.
|
|
40
97
|
|
|
41
98
|
---
|
|
42
99
|
|