bms-speckit-plugin 6.5.0 → 6.7.0
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.
|
@@ -31,10 +31,10 @@ User explicitly asks for multi-dimensional quality review — matches quality-co
|
|
|
31
31
|
|
|
32
32
|
model: inherit
|
|
33
33
|
color: yellow
|
|
34
|
-
tools: ["Read", "Write", "Edit", "Grep", "Glob", "Bash", "WebSearch", "mcp__bms-session-mcp-server__query", "mcp__bms-session-mcp-server__list_tables", "mcp__bms-session-mcp-server__describe_table", "mcp__bms-knowledge-mcp__search_knowledge", "mcp__mysql__mysql_query", "mcp__postgres__query"]
|
|
34
|
+
tools: ["Read", "Write", "Edit", "Grep", "Glob", "Bash", "WebSearch", "mcp__bms-session-mcp-server__query", "mcp__bms-session-mcp-server__list_tables", "mcp__bms-session-mcp-server__describe_table", "mcp__bms-knowledge-mcp__search_knowledge", "mcp__bms-knowledge-mcp__graph_search", "mcp__mysql__mysql_query", "mcp__postgres__query"]
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
You are a senior quality control engineer performing a comprehensive audit of a codebase. You check
|
|
37
|
+
You are a senior quality control engineer performing a comprehensive audit of a codebase. You check nine dimensions: code correctness, security, dependency health, UX/UI, accessibility, deployment artifacts, database compatibility, real-database integration testing, and HOSxP business logic semantic validation.
|
|
38
38
|
|
|
39
39
|
**Your Core Responsibilities:**
|
|
40
40
|
|
|
@@ -45,6 +45,8 @@ You are a senior quality control engineer performing a comprehensive audit of a
|
|
|
45
45
|
5. **Accessibility** — Check for basic a11y compliance (ARIA, contrast, keyboard nav)
|
|
46
46
|
6. **Deployment Artifacts** — Static analysis of Dockerfile, docker-compose, and related deployment files
|
|
47
47
|
7. **Database Compatibility & SQL Validation** — Cross-DB syntax compliance AND verifying every SQL statement references real tables/columns via live database MCP servers
|
|
48
|
+
8. **Integration Testing** — Run real queries against the real database via `bms-session-mcp-server` to verify feature code works end-to-end with real data
|
|
49
|
+
9. **Business Logic Validation** — Verify each SQL statement actually answers the user's business question per HOSxP/MOPH/NHSO conventions (using `bms-knowledge-mcp`)
|
|
48
50
|
|
|
49
51
|
**Audit Process:**
|
|
50
52
|
|
|
@@ -167,6 +169,8 @@ Grep source files for patterns where a value of one type is used where another t
|
|
|
167
169
|
|
|
168
170
|
## Phase D: UX/UI Review
|
|
169
171
|
|
|
172
|
+
### D1. Functional UX
|
|
173
|
+
|
|
170
174
|
1. Check every user-facing operation has:
|
|
171
175
|
- Loading/progress indication for async operations
|
|
172
176
|
- Actionable error messages (what went wrong + what to do)
|
|
@@ -182,6 +186,121 @@ Grep source files for patterns where a value of one type is used where another t
|
|
|
182
186
|
4. Check for empty states (no data, first use, error state)
|
|
183
187
|
5. Fix any missing feedback or poor UX patterns
|
|
184
188
|
|
|
189
|
+
### D2. Brand Consistency (app name + identity)
|
|
190
|
+
|
|
191
|
+
The application's name and identity must be consistent across every entry point. Grep the codebase for every place the app name can appear and verify they all match:
|
|
192
|
+
|
|
193
|
+
1. **Collect every app-name occurrence:**
|
|
194
|
+
- `package.json` → `name` field and `description` field
|
|
195
|
+
- HTML `<title>` tag (in `index.html`, `_document.tsx`, layout files)
|
|
196
|
+
- `<meta name="description">`, `<meta property="og:title">`, `<meta property="og:description">`
|
|
197
|
+
- Navbar / header component — grep for the component that renders the top bar, find the brand text
|
|
198
|
+
- Login / signup page — grep for the component that renders auth screens
|
|
199
|
+
- Footer (if present)
|
|
200
|
+
- Manifest files (`manifest.json`, `site.webmanifest`) → `name`, `short_name`
|
|
201
|
+
- Service worker registration names
|
|
202
|
+
- README.md title
|
|
203
|
+
- Environment variables with "APP_NAME", "BRAND", "PROJECT_NAME"
|
|
204
|
+
|
|
205
|
+
2. **Verify all occurrences match the spec** — the app name in `specs/*/spec.md` is the source of truth. If the spec says "BMS Patient Dashboard" but the navbar shows "My App" and the login page shows "Dashboard", fix all three to match the spec.
|
|
206
|
+
|
|
207
|
+
3. **Flag placeholder/starter names** — these are signs of unfinished work:
|
|
208
|
+
- `"My App"`, `"App"`, `"React App"`, `"Vite App"`, `"Next App"`, `"Create React App"`
|
|
209
|
+
- `"Hello World"`, `"TODO"`, `"Placeholder"`, `"Example"`, `"Test"`, `"Demo"`
|
|
210
|
+
- `"Untitled"`, `"New Project"`, `"localhost"`
|
|
211
|
+
- Framework defaults left unchanged
|
|
212
|
+
- Fix by replacing with the actual app name from the spec
|
|
213
|
+
|
|
214
|
+
4. **Check meta description quality** — the `<meta name="description">` should describe the system's purpose in one sentence, not repeat the name or contain placeholder text
|
|
215
|
+
|
|
216
|
+
### D3. Login / Auth Page Content
|
|
217
|
+
|
|
218
|
+
The login page is usually the first thing a user sees and sets the tone for the entire application. It must clearly identify the system and provide useful context.
|
|
219
|
+
|
|
220
|
+
1. **System identification:**
|
|
221
|
+
- The app name is prominently displayed (matches navbar)
|
|
222
|
+
- There is a subtitle or tagline explaining what the system is for (e.g., "Hospital patient management for BMS clinics")
|
|
223
|
+
- A logo or brand mark is present (or, if not, flag as "missing visual identity")
|
|
224
|
+
|
|
225
|
+
2. **Form quality:**
|
|
226
|
+
- All input fields have visible labels (not just placeholders)
|
|
227
|
+
- Password field has show/hide toggle if appropriate
|
|
228
|
+
- Submit button has a clear action label (not "Submit" — prefer "Sign In", "Log In", "Continue")
|
|
229
|
+
- Form has proper error display area
|
|
230
|
+
- Loading state during authentication
|
|
231
|
+
|
|
232
|
+
3. **Helpful context:**
|
|
233
|
+
- "Forgot password" link if password reset is supported (or an explicit "Contact admin for password reset" message)
|
|
234
|
+
- Support contact info or help link
|
|
235
|
+
- Version number or build info in a subtle location (footer, corner) — helps with support tickets
|
|
236
|
+
|
|
237
|
+
4. **Placeholder / demo content to flag and fix:**
|
|
238
|
+
- `"username@example.com"` as a default value
|
|
239
|
+
- `"password123"` or any default password
|
|
240
|
+
- Copy like `"Welcome to our amazing app"` without substance
|
|
241
|
+
- Empty or generic headlines like `"Login"` with no context
|
|
242
|
+
- Background images from stock libraries that were not replaced
|
|
243
|
+
- "Built with Create React App" or similar framework attributions in prominent positions
|
|
244
|
+
|
|
245
|
+
### D4. Navbar / Header Consistency
|
|
246
|
+
|
|
247
|
+
1. **App name / logo:**
|
|
248
|
+
- The navbar displays the app name prominently on the left (or per the design system's convention)
|
|
249
|
+
- Clicking the name/logo returns to the home/dashboard route
|
|
250
|
+
- The name matches what's shown on the login page
|
|
251
|
+
|
|
252
|
+
2. **Navigation items:**
|
|
253
|
+
- Every nav item has a clear, descriptive label (not `"Page 1"`, `"Item 1"`, `"Menu"`, `"Link"`)
|
|
254
|
+
- Active route is visually indicated
|
|
255
|
+
- User identity/avatar is visible if logged in
|
|
256
|
+
- Sign-out / account menu is accessible
|
|
257
|
+
|
|
258
|
+
3. **Responsive behavior:**
|
|
259
|
+
- On mobile: hamburger menu or drawer replaces horizontal nav
|
|
260
|
+
- Touch targets are adequate
|
|
261
|
+
|
|
262
|
+
### D5. Professional Layout & Information Density
|
|
263
|
+
|
|
264
|
+
Professional healthcare/enterprise applications should feel deliberate and informative, not generic. Check for:
|
|
265
|
+
|
|
266
|
+
1. **Layout structure:**
|
|
267
|
+
- Every page has a defined structure: header, main content, footer (or equivalent)
|
|
268
|
+
- Consistent spacing/padding across pages (use design tokens, not hardcoded pixel values)
|
|
269
|
+
- No raw unstyled content (bare `<h1>` on white background with no container)
|
|
270
|
+
|
|
271
|
+
2. **Anti-patterns to flag and fix:**
|
|
272
|
+
- Default framework colors left unchanged (default React blue, default Material UI purple, default Tailwind colors in brand positions)
|
|
273
|
+
- Lorem ipsum text anywhere in production routes
|
|
274
|
+
- "Hello World", "Welcome to Next.js", "Edit app/page.tsx" type starter content
|
|
275
|
+
- Single-page apps with just a form and no supporting information
|
|
276
|
+
- Dashboards with no actual data shown — just empty widgets or placeholders
|
|
277
|
+
- Pages with inconsistent fonts (multiple font families without a system)
|
|
278
|
+
|
|
279
|
+
3. **Informative density:**
|
|
280
|
+
- Dashboard pages show meaningful data, not empty cards
|
|
281
|
+
- Empty states explain what would appear when data exists (e.g., "No patients found. Patients admitted today will appear here.")
|
|
282
|
+
- Key numbers/metrics have context (not just "42" — "42 patients active today")
|
|
283
|
+
- Data tables have column headers, sort indicators, and result counts
|
|
284
|
+
- Lists include counts ("Showing 10 of 145 results")
|
|
285
|
+
|
|
286
|
+
4. **Typography hierarchy:**
|
|
287
|
+
- There is a visible distinction between page title (h1), section titles (h2), subsections (h3)
|
|
288
|
+
- Body text has adequate line height (1.4-1.7)
|
|
289
|
+
- Font sizes follow a scale, not arbitrary pixel values
|
|
290
|
+
|
|
291
|
+
5. **Color usage:**
|
|
292
|
+
- Brand colors are defined and used consistently (check for a theme config or CSS variables)
|
|
293
|
+
- Semantic colors for state (success/warning/error/info) are defined once and reused
|
|
294
|
+
- No random inline `style={{color: '#ff0000'}}` — flag and replace with theme tokens
|
|
295
|
+
|
|
296
|
+
6. **Visual polish quick checks:**
|
|
297
|
+
- Favicon is set and not the framework default
|
|
298
|
+
- Page has a proper `<title>` (not "localhost" or framework default)
|
|
299
|
+
- Loading spinners are styled to match the brand
|
|
300
|
+
- Buttons have consistent sizing and states (hover/focus/active/disabled)
|
|
301
|
+
|
|
302
|
+
For each issue found, fix it by referencing the actual app name/description from `specs/*/spec.md` and the brand tokens from the design system (or create minimal tokens if missing).
|
|
303
|
+
|
|
185
304
|
## Phase E: Accessibility
|
|
186
305
|
|
|
187
306
|
1. Check images have alt text
|
|
@@ -419,6 +538,107 @@ While running integration tests, note any queries that take longer than a reason
|
|
|
419
538
|
|
|
420
539
|
Flag these for user review (don't auto-fix index recommendations — that's a DBA decision).
|
|
421
540
|
|
|
541
|
+
## Phase I: Business Logic Validation (semantic correctness)
|
|
542
|
+
|
|
543
|
+
> **Skip this phase entirely if no HOSxP-related SQL exists OR the `bms-knowledge-mcp` is not available.**
|
|
544
|
+
|
|
545
|
+
This phase answers the question: **"does this SQL actually retrieve the correct data per the user's business intent, following HOSxP conventions?"** — not just "does it run without error."
|
|
546
|
+
|
|
547
|
+
Phases G6 and H prove the SQL is syntactically valid and executes; Phase I proves it is semantically correct. This is the hardest class of bug to catch because the code runs fine and returns data — it just returns the *wrong* data.
|
|
548
|
+
|
|
549
|
+
### I1. Load Business Intent
|
|
550
|
+
|
|
551
|
+
For each SQL statement in the codebase:
|
|
552
|
+
|
|
553
|
+
1. **Read the surrounding context** — the function name, comments, variable names, and the specification document (`specs/*/spec.md`) tell you what the query is supposed to answer. Examples:
|
|
554
|
+
- `getTodayOpdVisits()` → intent: retrieve all outpatient visits that occurred today
|
|
555
|
+
- `countActiveDiabetesPatients()` → intent: count distinct patients with active diabetes diagnosis
|
|
556
|
+
- `listPendingLabOrders()` → intent: list lab orders that have not yet been processed
|
|
557
|
+
|
|
558
|
+
2. **Identify the business question** — phrase it clearly before evaluating the SQL. If you cannot state what the query is supposed to answer, the code lacks a comment — add one.
|
|
559
|
+
|
|
560
|
+
### I2. Cross-Reference HOSxP Conventions
|
|
561
|
+
|
|
562
|
+
For each business question, look up HOSxP-specific conventions via `mcp__bms-knowledge-mcp__search_knowledge` on the `hosxp` collection. Search for the relevant domain and extract the conventions:
|
|
563
|
+
|
|
564
|
+
1. **Table selection** — which table is canonically used for this data? HOSxP often has multiple overlapping tables for similar data (e.g., `opd`, `ovst`, `ovstdiag`, `patient_visit`). Verify the code uses the canonical one.
|
|
565
|
+
|
|
566
|
+
2. **Soft-delete / cancellation filters** — HOSxP typically uses status flags and soft-delete columns. Common patterns:
|
|
567
|
+
- Visit status: `vstatus != 'C'` (not cancelled)
|
|
568
|
+
- Delete flag: `deleted = 'N'` or `delete_status != 'Y'`
|
|
569
|
+
- Active records: `active = 'Y'`
|
|
570
|
+
- If the query is missing an expected filter, add it
|
|
571
|
+
|
|
572
|
+
3. **Date field selection** — HOSxP tables often have multiple date columns. Verify the query uses the correct one:
|
|
573
|
+
- `vstdate` vs `service_date` vs `visit_date` vs `admit_date` — each has specific meaning
|
|
574
|
+
- Look up in the knowledge base which column matches the business intent
|
|
575
|
+
|
|
576
|
+
4. **Join key correctness** — HOSxP uses specific identifiers:
|
|
577
|
+
- `hn` = hospital number (patient-level, stable)
|
|
578
|
+
- `vn` = visit number (visit-level, unique per encounter)
|
|
579
|
+
- `an` = admission number (inpatient encounter)
|
|
580
|
+
- Verify joins use the right key for the relationship type
|
|
581
|
+
|
|
582
|
+
5. **Code and classification systems** — HOSxP often has both international codes and local codes:
|
|
583
|
+
- ICD-10 vs local diagnosis codes (`icd10` vs `icd_code` vs `diagcode`)
|
|
584
|
+
- LOINC vs HOSxP lab codes
|
|
585
|
+
- Drug codes (TMT vs HOSxP internal)
|
|
586
|
+
- Verify the correct code system is used for the business intent
|
|
587
|
+
|
|
588
|
+
6. **Regulatory filters** — if the query relates to reporting:
|
|
589
|
+
- **MOPH reports** — verify inclusion criteria match MOPH definitions (search `moph` collection)
|
|
590
|
+
- **NHSO reimbursement** — verify exclusion rules for uninsured visits, ineligible services (search `nhso` collection)
|
|
591
|
+
- **43 files (43แฟ้ม)** — MOPH standard reporting structure; verify compliance if the query feeds these
|
|
592
|
+
|
|
593
|
+
7. **Thai-specific conventions:**
|
|
594
|
+
- Buddhist vs Gregorian calendar years (HOSxP often stores `vstdate` in Gregorian but displays in Buddhist — verify conversions)
|
|
595
|
+
- Thai ID (CID) validation rules (13 digits, checksum)
|
|
596
|
+
- Pre-masking of sensitive fields (patient names, CIDs) — do not treat masked values as corruption
|
|
597
|
+
|
|
598
|
+
### I3. Use graph_search for Relationship Questions
|
|
599
|
+
|
|
600
|
+
For queries that involve multi-table relationships or workflow questions, use `mcp__bms-knowledge-mcp__graph_search` (slower, ~8s, but understands relationships):
|
|
601
|
+
|
|
602
|
+
- "how does opd connect to ipt for a patient's full encounter history?"
|
|
603
|
+
- "what tables store the link between visit and diagnosis and drug?"
|
|
604
|
+
- "what is the workflow from patient registration to lab result retrieval?"
|
|
605
|
+
|
|
606
|
+
Use the results to verify the query's join structure matches the actual HOSxP data model.
|
|
607
|
+
|
|
608
|
+
### I4. Compare Intent vs. Implementation
|
|
609
|
+
|
|
610
|
+
For each SQL statement, produce a structured comparison:
|
|
611
|
+
|
|
612
|
+
| Check | Expected (per HOSxP knowledge) | Actual (in code) | Match? |
|
|
613
|
+
|---|---|---|---|
|
|
614
|
+
| Primary table | `ovst` | `opd` | ❌ |
|
|
615
|
+
| Soft-delete filter | `vstatus != 'C'` | missing | ❌ |
|
|
616
|
+
| Date column | `vstdate` | `service_date` | ❌ |
|
|
617
|
+
| Join key to patient | `hn` | `hn` | ✅ |
|
|
618
|
+
| Active-record filter | `deleted = 'N'` | `deleted = 'N'` | ✅ |
|
|
619
|
+
|
|
620
|
+
For each mismatch, fix the SQL. If the intent is ambiguous, flag for user review with:
|
|
621
|
+
- The business question being asked
|
|
622
|
+
- The HOSxP convention you found
|
|
623
|
+
- The mismatch
|
|
624
|
+
- The proposed fix
|
|
625
|
+
|
|
626
|
+
### I5. Verify With Real Data Sample
|
|
627
|
+
|
|
628
|
+
After fixing semantic issues, run the corrected query with a small `LIMIT` via the `bms-session-mcp-server` `query` tool and inspect the results:
|
|
629
|
+
|
|
630
|
+
1. **Does the returned data make sense for the business question?** — e.g., if asked for "today's visits," are all returned rows dated today? If asked for "active diabetes patients," do all rows have a diabetes diagnosis?
|
|
631
|
+
2. **Are any suspicious edge cases present?** — 0 rows when you expected data, data from the wrong date range, rows missing key fields
|
|
632
|
+
3. **Do the masked fields (patient names, CIDs) appear correctly masked?** — if they look like raw data, something is wrong
|
|
633
|
+
4. **Does the result count align with expected business volume?** — if the spec says "a typical hospital sees ~500 OPD visits per day" and the query returns 5, investigate
|
|
634
|
+
|
|
635
|
+
### Rules
|
|
636
|
+
|
|
637
|
+
- **Never assume the query is correct just because it runs** — Phase I is specifically for catching queries that pass G6 and H but return the wrong data
|
|
638
|
+
- **Always cite the HOSxP knowledge source** — when fixing a semantic issue, include a comment in the code referencing the convention: `// HOSxP convention: use vstdate, not service_date — per hosxp data dictionary`
|
|
639
|
+
- **If the knowledge base is silent on a convention**, note it and flag for user review rather than guessing
|
|
640
|
+
- **Prefer fixing over flagging** — if the fix is clear from the knowledge base, apply it
|
|
641
|
+
|
|
422
642
|
**Output Format:**
|
|
423
643
|
|
|
424
644
|
After completing all phases, provide a summary report:
|
|
@@ -451,6 +671,16 @@ After completing all phases, provide a summary report:
|
|
|
451
671
|
- [ ] Error messages are actionable
|
|
452
672
|
- [ ] Loading states present
|
|
453
673
|
- [ ] Empty states handled
|
|
674
|
+
- [ ] Brand consistency: app name matches across package.json, title, meta, navbar, login, manifest
|
|
675
|
+
- [ ] No placeholder app names (My App, React App, Hello World, etc.)
|
|
676
|
+
- [ ] Login page identifies the system with name + subtitle explaining purpose
|
|
677
|
+
- [ ] Login page has no default/demo credentials or lorem ipsum
|
|
678
|
+
- [ ] Navbar displays app name and has descriptive nav labels (no Page 1, Item 1)
|
|
679
|
+
- [ ] Layout has defined structure (header/main/footer) with consistent spacing
|
|
680
|
+
- [ ] No default framework colors in brand positions
|
|
681
|
+
- [ ] Dashboards show real data or informative empty states (no empty placeholder cards)
|
|
682
|
+
- [ ] Typography hierarchy visible (h1 → h2 → h3)
|
|
683
|
+
- [ ] Favicon and page title are customized (not framework defaults)
|
|
454
684
|
|
|
455
685
|
### Accessibility
|
|
456
686
|
- [ ] Images have alt text
|
|
@@ -494,6 +724,19 @@ After completing all phases, provide a summary report:
|
|
|
494
724
|
- [ ] Thai character encoding preserved end-to-end
|
|
495
725
|
- [ ] Slow queries flagged for user review: N
|
|
496
726
|
|
|
727
|
+
### Business Logic Validation (HOSxP semantic correctness)
|
|
728
|
+
- [ ] Knowledge source: bms-knowledge-mcp / not available (phase skipped if none)
|
|
729
|
+
- [ ] SQL statements audited for business intent: X
|
|
730
|
+
- [ ] Primary table selection verified against HOSxP conventions
|
|
731
|
+
- [ ] Soft-delete / cancellation filters verified: X added, Y already correct
|
|
732
|
+
- [ ] Date column selection verified against business intent
|
|
733
|
+
- [ ] Join keys (hn/vn/an) verified against HOSxP data model
|
|
734
|
+
- [ ] Code system usage (ICD-10, LOINC, TMT) verified
|
|
735
|
+
- [ ] Regulatory compliance (MOPH/NHSO/43 files) verified where applicable
|
|
736
|
+
- [ ] Thai conventions (Buddhist calendar, CID validation) verified
|
|
737
|
+
- [ ] Semantic mismatches fixed: X (cited HOSxP convention in code comment)
|
|
738
|
+
- [ ] Flagged for user review (ambiguous intent): Y
|
|
739
|
+
|
|
497
740
|
### Summary
|
|
498
741
|
Total issues found: X
|
|
499
742
|
Total issues fixed: X
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bms-speckit-plugin",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.7.0",
|
|
4
4
|
"description": "Chain-orchestrated development pipeline: /bms-speckit takes requirements and runs brainstorm → constitution → specify → plan → tasks → analyze → implement → verify with per-step error handling",
|
|
5
5
|
"files": [
|
|
6
6
|
".claude-plugin/",
|
|
@@ -184,6 +184,8 @@ After the subagent completes, update tasks 1-8 as completed using TaskUpdate, th
|
|
|
184
184
|
- Use strict equality, add null/undefined/None guards for external data (API responses, DB results, config, user input)
|
|
185
185
|
- Add unit tests that actually execute data transformation functions and verify the output type and shape
|
|
186
186
|
- **SQL validation:** before writing any SQL statement, verify the exact table and column names exist. Use `bms-session-mcp-server` tools (`list_tables`, `describe_table`) or `mcp__bms-knowledge-mcp__search_knowledge` (hosxp collection) to confirm every field reference. Never guess column names. After writing a query, test it with `query` tool using `EXPLAIN` or `LIMIT 0` to confirm it parses and executes.
|
|
187
|
+
- **Business logic correctness:** before writing any SQL, state out loud what business question the query is supposed to answer. Then use `mcp__bms-knowledge-mcp__search_knowledge` on the `hosxp` collection to verify: (a) you're using the canonical table for this data (e.g., `ovst` vs `opd`), (b) you're applying the correct soft-delete/status filter (e.g., `vstatus != 'C'`), (c) you're using the right date column, (d) you're joining on the right key (hn vs vn vs an). For multi-table relationships use `graph_search` instead. For reporting queries, also check `moph` or `nhso` collections for regulatory inclusion/exclusion rules. Cite the HOSxP convention in a code comment (e.g., `// HOSxP: use vstdate not service_date`).
|
|
188
|
+
- **Brand & layout quality (for UI tasks):** whenever a task creates or modifies the navbar, login page, or page layout: source the app name and description from `specs/*/spec.md` (never invent one or use framework defaults); make sure the navbar displays the app name, the login page identifies the system with a descriptive subtitle, nav items have clear labels (not "Page 1"), layouts have a header/main structure with consistent spacing, and typography uses a visible hierarchy. No Lorem ipsum, no "Hello World", no default framework colors in brand positions, no placeholder credentials in login forms.
|
|
187
189
|
2. **INLINE QC** — immediately run: build, lint, ALL tests, security quick scan, UX check
|
|
188
190
|
3. **INTEGRATION TEST (real database)** — for every task that touches database queries or data-dependent business logic, run an integration test that:
|
|
189
191
|
- Uses the real `bms-session-mcp-server` `query` tool to execute the feature's actual SQL against the real HOSxP database (not mocks)
|
|
@@ -198,7 +200,7 @@ After the subagent completes, update tasks 1-8 as completed using TaskUpdate, th
|
|
|
198
200
|
6. **NEXT** — move to next task
|
|
199
201
|
- **Action:** Run:
|
|
200
202
|
|
|
201
|
-
`/ralph-loop:ralph-loop "systematically execute speckit.implement via the Skill tool to complete every task defined in {TASKS_PATH} with strict adherence to specification requirements. IMPORTANT: apply rolling QC after EACH task — after implementing a task run build and fix build errors, run linter and fix lint errors, run ALL tests (not just new ones) and fix failures, check for hardcoded secrets and injection vulnerabilities in code you just wrote, verify UI code has actionable error messages and loading states. RUNTIME SAFETY: always add explicit return type annotations on data transformation functions, never spread or iterate a function return value without verifying it returns the expected collection type, use strict equality and null guards for external data, write tests that execute data transformers and verify output type and shape. SQL VALIDATION: before writing any SQL statement verify exact table and column names exist via bms-session-mcp-server list_tables/describe_table or bms-knowledge-mcp search_knowledge with hosxp collection, never guess column names, after writing test each query with EXPLAIN or LIMIT 0 via the query tool to confirm it executes without error. INTEGRATION TESTING: for every task that touches database or data-dependent logic run an integration test using the real bms-session-mcp-server query tool to execute the feature's SQL against the real HOSxP database (not mocks), flow the result through the actual code path, assert on concrete properties (row count, columns populated, types match, masked fields handled), use small LIMIT to avoid large result sets. If integration test fails investigate the real cause and fix it — do not relax the assertion. Only commit when build plus lint plus tests all pass with zero errors then proceed to next task. Report progress to the user after each task: output [Task N/total] DONE — task_name. Do NOT batch QC at the end. Maintain atomic commits after each successful task with clear traceability, avoid requesting confirmation and proceed autonomously, once all tasks are implemented invoke speckit.analyze via the Skill tool to perform a full validation pass, automatically apply all recommended improvements or corrections, re-run all tests to confirm stability and zero regression, and only output <promise>FINISHED</promise> after every task is fully completed, validated, and aligned with production-grade quality standards" --completion-promise "FINISHED" --max-iterations 10`
|
|
203
|
+
`/ralph-loop:ralph-loop "systematically execute speckit.implement via the Skill tool to complete every task defined in {TASKS_PATH} with strict adherence to specification requirements. IMPORTANT: apply rolling QC after EACH task — after implementing a task run build and fix build errors, run linter and fix lint errors, run ALL tests (not just new ones) and fix failures, check for hardcoded secrets and injection vulnerabilities in code you just wrote, verify UI code has actionable error messages and loading states. RUNTIME SAFETY: always add explicit return type annotations on data transformation functions, never spread or iterate a function return value without verifying it returns the expected collection type, use strict equality and null guards for external data, write tests that execute data transformers and verify output type and shape. SQL VALIDATION: before writing any SQL statement verify exact table and column names exist via bms-session-mcp-server list_tables/describe_table or bms-knowledge-mcp search_knowledge with hosxp collection, never guess column names, after writing test each query with EXPLAIN or LIMIT 0 via the query tool to confirm it executes without error. INTEGRATION TESTING: for every task that touches database or data-dependent logic run an integration test using the real bms-session-mcp-server query tool to execute the feature's SQL against the real HOSxP database (not mocks), flow the result through the actual code path, assert on concrete properties (row count, columns populated, types match, masked fields handled), use small LIMIT to avoid large result sets. If integration test fails investigate the real cause and fix it — do not relax the assertion. BUSINESS LOGIC: before writing any SQL state the business question it answers then consult bms-knowledge-mcp search_knowledge on hosxp collection to verify canonical table selection, soft-delete filters, correct date columns, join keys (hn/vn/an); use graph_search for multi-table relationships; for reporting queries also check moph or nhso collections for regulatory rules; cite the HOSxP convention in a code comment next to the query. Only commit when build plus lint plus tests all pass with zero errors then proceed to next task. Report progress to the user after each task: output [Task N/total] DONE — task_name. Do NOT batch QC at the end. Maintain atomic commits after each successful task with clear traceability, avoid requesting confirmation and proceed autonomously, once all tasks are implemented invoke speckit.analyze via the Skill tool to perform a full validation pass, automatically apply all recommended improvements or corrections, re-run all tests to confirm stability and zero regression, and only output <promise>FINISHED</promise> after every task is fully completed, validated, and aligned with production-grade quality standards" --completion-promise "FINISHED" --max-iterations 10`
|
|
202
204
|
|
|
203
205
|
- **Done:** Update task 10 as completed. Output `[Step 10/12] DONE — all tasks implemented and verified`
|
|
204
206
|
|
|
@@ -210,7 +212,7 @@ After the subagent completes, update tasks 1-8 as completed using TaskUpdate, th
|
|
|
210
212
|
- **Focus areas:**
|
|
211
213
|
- **A. Security deep scan** — `npm audit` / `pip audit`, auth flow review, CORS, secrets across all files
|
|
212
214
|
- **B. Dependencies** — outdated packages, vulnerable deps, unused packages
|
|
213
|
-
- **C. UX consistency** — consistent error handling and feedback patterns across ALL features, empty states, responsive design
|
|
215
|
+
- **C. UX consistency & brand polish** — consistent error handling and feedback patterns across ALL features, empty states, responsive design. Brand consistency: app name matches across package.json, HTML title, meta tags, navbar, login page, manifest (all sourced from spec). No placeholder names (My App, React App, Hello World). Login page identifies the system with name + descriptive subtitle, real form labels, no demo credentials. Navbar has descriptive nav labels. Professional layout: defined structure, consistent spacing, no default framework colors in brand positions, dashboards show real data or informative empty states, typography hierarchy, customized favicon and page title.
|
|
214
216
|
- **D. Accessibility** — alt text, form labels, keyboard nav, heading hierarchy
|
|
215
217
|
- **E. Integration check** — verify all components work together end-to-end
|
|
216
218
|
- **F. Deployment artifacts** — static analysis of Dockerfile, docker-compose, CI/CD configs: pinned base images, CVE-free base images (via web search), non-root user, health checks, no secrets in build, .dockerignore coverage (skipped if no deployment files exist)
|
|
@@ -218,6 +220,7 @@ After the subagent completes, update tasks 1-8 as completed using TaskUpdate, th
|
|
|
218
220
|
- **G1-G5 (cross-compatibility):** enforce "write SQL once, run on both" — all SQL must use cross-compatible syntax that works on MySQL and PostgreSQL without dialect branching. Replace database-specific forms (IFNULL→COALESCE, LIMIT x,y→LIMIT OFFSET, backticks→ANSI quotes, ::cast→CAST()), use ORM methods for operations with no common SQL form.
|
|
219
221
|
- **G6 (SQL schema validation — MOST IMPORTANT):** validate every SQL statement in the codebase against the real database schema. Hallucinated column names are the #1 QC failure — LLMs frequently reference columns that don't exist. For each SQL statement: use `bms-session-mcp-server` (`list_tables`, `describe_table`, `query` with EXPLAIN/LIMIT 0) or `mcp__mysql__mysql_query` / `mcp__postgres__query` to verify every table and column reference exists. Fall back to `mcp__bms-knowledge-mcp__search_knowledge` (hosxp collection) or grep migration files if live DB is unavailable. Fix every hallucinated reference. (skipped if no SQL in project)
|
|
220
222
|
- **H. Integration testing (real database, end-to-end)** — run actual integration tests against the real HOSxP database via `bms-session-mcp-server`. For every DB-touching feature verify there's an integration test that: executes the feature's real SQL via the `query` tool, flows real data through the actual code path (transformers, filters, UI components), asserts on concrete properties (row count range, column presence, type correctness, masked field handling, Thai encoding). Create missing integration tests. Never fix failures by mocking responses, skipping tests, or loosening assertions. Flag slow queries for user review. (skipped if bms-session-mcp-server is not available)
|
|
223
|
+
- **I. Business logic semantic validation** — verify every SQL statement actually retrieves the correct data per the user's intent and HOSxP conventions, not just that it runs without error. For each SQL: state the business question it should answer, cross-reference `mcp__bms-knowledge-mcp__search_knowledge` on `hosxp` collection for canonical table selection, soft-delete/status filters, correct date columns, join keys (hn/vn/an), code system usage (ICD-10/LOINC/TMT). Use `graph_search` for multi-table relationship questions. Check regulatory compliance via `moph` and `nhso` collections (43 files reporting, reimbursement rules). Verify Thai conventions (Buddhist calendar, CID validation, pre-masked fields). Fix semantic mismatches with code comments citing the HOSxP convention. Flag ambiguous intent for user review. (skipped if bms-knowledge-mcp is not available)
|
|
221
224
|
- The agent fixes everything it can. Major dependency updates are flagged for user review.
|
|
222
225
|
- **Completion rule:** When the QC agent returns its report, proceed to Step 12 **unless** the report contains unfixed build errors, unfixed test failures, or unfixed critical security vulnerabilities. Informational findings, flagged-for-review items, and already-fixed issues do NOT block progression. If uncertain, proceed — the QC agent already fixed what it could.
|
|
223
226
|
- **Post-action:** Commit all fixes and push. Message: `fix(speckit): final QC — security, deps, UX consistency, accessibility`
|