@sun-asterisk/sungen 2.7.0-beta.0 → 3.0.0-beta.71

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.
Files changed (256) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/add.js +3 -3
  3. package/dist/cli/commands/add.js.map +1 -1
  4. package/dist/cli/commands/audit.d.ts +3 -0
  5. package/dist/cli/commands/audit.d.ts.map +1 -0
  6. package/dist/cli/commands/audit.js +134 -0
  7. package/dist/cli/commands/audit.js.map +1 -0
  8. package/dist/cli/commands/blindspot.d.ts +3 -0
  9. package/dist/cli/commands/blindspot.d.ts.map +1 -0
  10. package/dist/cli/commands/blindspot.js +58 -0
  11. package/dist/cli/commands/blindspot.js.map +1 -0
  12. package/dist/cli/commands/challenge.d.ts +3 -0
  13. package/dist/cli/commands/challenge.d.ts.map +1 -0
  14. package/dist/cli/commands/challenge.js +102 -0
  15. package/dist/cli/commands/challenge.js.map +1 -0
  16. package/dist/cli/commands/feedback.d.ts +3 -0
  17. package/dist/cli/commands/feedback.d.ts.map +1 -0
  18. package/dist/cli/commands/feedback.js +72 -0
  19. package/dist/cli/commands/feedback.js.map +1 -0
  20. package/dist/cli/commands/generate.d.ts.map +1 -1
  21. package/dist/cli/commands/generate.js +22 -0
  22. package/dist/cli/commands/generate.js.map +1 -1
  23. package/dist/cli/commands/ledger.d.ts +3 -0
  24. package/dist/cli/commands/ledger.d.ts.map +1 -0
  25. package/dist/cli/commands/ledger.js +71 -0
  26. package/dist/cli/commands/ledger.js.map +1 -0
  27. package/dist/cli/commands/manifest.d.ts +3 -0
  28. package/dist/cli/commands/manifest.d.ts.map +1 -0
  29. package/dist/cli/commands/manifest.js +101 -0
  30. package/dist/cli/commands/manifest.js.map +1 -0
  31. package/dist/cli/commands/script-check.d.ts +3 -0
  32. package/dist/cli/commands/script-check.d.ts.map +1 -0
  33. package/dist/cli/commands/script-check.js +97 -0
  34. package/dist/cli/commands/script-check.js.map +1 -0
  35. package/dist/cli/commands/trace.d.ts +3 -0
  36. package/dist/cli/commands/trace.d.ts.map +1 -0
  37. package/dist/cli/commands/trace.js +110 -0
  38. package/dist/cli/commands/trace.js.map +1 -0
  39. package/dist/cli/commands/update.d.ts.map +1 -1
  40. package/dist/cli/commands/update.js +22 -9
  41. package/dist/cli/commands/update.js.map +1 -1
  42. package/dist/cli/index.js +16 -0
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +1 -0
  45. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/all-contain-assertion.hbs +7 -0
  46. package/dist/generators/test-generator/patterns/capture-patterns.d.ts +16 -0
  47. package/dist/generators/test-generator/patterns/capture-patterns.d.ts.map +1 -0
  48. package/dist/generators/test-generator/patterns/capture-patterns.js +54 -0
  49. package/dist/generators/test-generator/patterns/capture-patterns.js.map +1 -0
  50. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  51. package/dist/generators/test-generator/patterns/index.js +2 -0
  52. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  53. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  54. package/dist/generators/test-generator/step-mapper.js +1 -0
  55. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  56. package/dist/generators/test-generator/utils/data-resolver.d.ts +5 -0
  57. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  58. package/dist/generators/test-generator/utils/data-resolver.js +17 -0
  59. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  60. package/dist/harness/audit.d.ts +24 -0
  61. package/dist/harness/audit.d.ts.map +1 -0
  62. package/dist/harness/audit.js +115 -0
  63. package/dist/harness/audit.js.map +1 -0
  64. package/dist/harness/blindspot.d.ts +15 -0
  65. package/dist/harness/blindspot.d.ts.map +1 -0
  66. package/dist/harness/blindspot.js +85 -0
  67. package/dist/harness/blindspot.js.map +1 -0
  68. package/dist/harness/catalog/universal-viewpoints.yaml +114 -0
  69. package/dist/harness/challenge.d.ts +21 -0
  70. package/dist/harness/challenge.d.ts.map +1 -0
  71. package/dist/harness/challenge.js +151 -0
  72. package/dist/harness/challenge.js.map +1 -0
  73. package/dist/harness/feedback.d.ts +29 -0
  74. package/dist/harness/feedback.d.ts.map +1 -0
  75. package/dist/harness/feedback.js +106 -0
  76. package/dist/harness/feedback.js.map +1 -0
  77. package/dist/harness/intent.d.ts +11 -0
  78. package/dist/harness/intent.d.ts.map +1 -0
  79. package/dist/harness/intent.js +86 -0
  80. package/dist/harness/intent.js.map +1 -0
  81. package/dist/harness/ledger.d.ts +42 -0
  82. package/dist/harness/ledger.d.ts.map +1 -0
  83. package/dist/harness/ledger.js +171 -0
  84. package/dist/harness/ledger.js.map +1 -0
  85. package/dist/harness/manifest.d.ts +42 -0
  86. package/dist/harness/manifest.d.ts.map +1 -0
  87. package/dist/harness/manifest.js +209 -0
  88. package/dist/harness/manifest.js.map +1 -0
  89. package/dist/harness/parse.d.ts +22 -0
  90. package/dist/harness/parse.d.ts.map +1 -0
  91. package/dist/harness/parse.js +163 -0
  92. package/dist/harness/parse.js.map +1 -0
  93. package/dist/harness/script-check.d.ts +16 -0
  94. package/dist/harness/script-check.d.ts.map +1 -0
  95. package/dist/harness/script-check.js +169 -0
  96. package/dist/harness/script-check.js.map +1 -0
  97. package/dist/harness/secret-scan.d.ts +8 -0
  98. package/dist/harness/secret-scan.d.ts.map +1 -0
  99. package/dist/harness/secret-scan.js +88 -0
  100. package/dist/harness/secret-scan.js.map +1 -0
  101. package/dist/harness/sensors.d.ts +88 -0
  102. package/dist/harness/sensors.d.ts.map +1 -0
  103. package/dist/harness/sensors.js +232 -0
  104. package/dist/harness/sensors.js.map +1 -0
  105. package/dist/harness/trace.d.ts +31 -0
  106. package/dist/harness/trace.d.ts.map +1 -0
  107. package/dist/harness/trace.js +173 -0
  108. package/dist/harness/trace.js.map +1 -0
  109. package/dist/orchestrator/ai-rules-updater.d.ts +1 -0
  110. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  111. package/dist/orchestrator/ai-rules-updater.js +55 -11
  112. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  113. package/dist/orchestrator/figma/spec-figma-renderer.d.ts +2 -2
  114. package/dist/orchestrator/figma/spec-figma-renderer.js +2 -2
  115. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts +1 -1
  116. package/dist/orchestrator/figma/spec-figma-section-renderers.js +1 -1
  117. package/dist/orchestrator/project-initializer.d.ts +5 -0
  118. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  119. package/dist/orchestrator/project-initializer.js +26 -6
  120. package/dist/orchestrator/project-initializer.js.map +1 -1
  121. package/dist/orchestrator/templates/ai-instructions/claude-agent-challenge.md +46 -0
  122. package/dist/orchestrator/templates/ai-instructions/claude-agent-discovery.md +32 -0
  123. package/dist/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +37 -0
  124. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +3 -3
  125. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +5 -5
  126. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +45 -13
  127. package/dist/orchestrator/templates/ai-instructions/claude-cmd-design.md +12 -0
  128. package/dist/orchestrator/templates/ai-instructions/claude-cmd-feedback.md +36 -0
  129. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +27 -30
  130. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +8 -3
  131. package/dist/orchestrator/templates/ai-instructions/claude-config.md +1 -4
  132. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-mcp.md +82 -0
  133. package/dist/orchestrator/templates/ai-instructions/{github-skill-sungen-figma-source.md → claude-skill-capture-mode-figma-pat.md} +14 -48
  134. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-live.md +60 -0
  135. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-local.md +38 -0
  136. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture.md +35 -0
  137. package/dist/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +84 -0
  138. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +57 -11
  139. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +41 -31
  140. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +53 -1
  141. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +3 -3
  142. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +4 -4
  143. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +27 -11
  144. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-design.md +13 -0
  145. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +24 -0
  146. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +20 -30
  147. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +6 -3
  148. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +1 -4
  149. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md +82 -0
  150. package/{src/orchestrator/templates/ai-instructions/claude-skill-figma-source.md → dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md} +14 -48
  151. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md +60 -0
  152. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md +38 -0
  153. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md +35 -0
  154. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +84 -0
  155. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +62 -16
  156. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +41 -31
  157. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +40 -1
  158. package/dist/orchestrator/templates/qa-context.md +90 -0
  159. package/dist/orchestrator/templates/readme.md +16 -13
  160. package/dist/orchestrator/templates/specs-test-data.ts +9 -0
  161. package/dist/tools/figma/figma-auth.d.ts +5 -2
  162. package/dist/tools/figma/figma-auth.d.ts.map +1 -1
  163. package/dist/tools/figma/figma-auth.js +19 -9
  164. package/dist/tools/figma/figma-auth.js.map +1 -1
  165. package/docs/orchestration-spec.md +267 -0
  166. package/package.json +10 -6
  167. package/src/cli/commands/add.ts +3 -3
  168. package/src/cli/commands/audit.ts +92 -0
  169. package/src/cli/commands/blindspot.ts +48 -0
  170. package/src/cli/commands/challenge.ts +55 -0
  171. package/src/cli/commands/feedback.ts +65 -0
  172. package/src/cli/commands/generate.ts +19 -0
  173. package/src/cli/commands/ledger.ts +61 -0
  174. package/src/cli/commands/manifest.ts +55 -0
  175. package/src/cli/commands/script-check.ts +50 -0
  176. package/src/cli/commands/trace.ts +60 -0
  177. package/src/cli/commands/update.ts +30 -10
  178. package/src/cli/index.ts +16 -0
  179. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +1 -0
  180. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/all-contain-assertion.hbs +7 -0
  181. package/src/generators/test-generator/patterns/capture-patterns.ts +59 -0
  182. package/src/generators/test-generator/patterns/index.ts +2 -0
  183. package/src/generators/test-generator/step-mapper.ts +1 -0
  184. package/src/generators/test-generator/utils/data-resolver.ts +20 -0
  185. package/src/harness/audit.ts +112 -0
  186. package/src/harness/blindspot.ts +51 -0
  187. package/src/harness/catalog/universal-viewpoints.yaml +114 -0
  188. package/src/harness/challenge.ts +131 -0
  189. package/src/harness/feedback.ts +84 -0
  190. package/src/harness/intent.ts +58 -0
  191. package/src/harness/ledger.ts +155 -0
  192. package/src/harness/manifest.ts +173 -0
  193. package/src/harness/parse.ts +145 -0
  194. package/src/harness/script-check.ts +149 -0
  195. package/src/harness/secret-scan.ts +51 -0
  196. package/src/harness/sensors.ts +279 -0
  197. package/src/harness/trace.ts +138 -0
  198. package/src/orchestrator/ai-rules-updater.ts +57 -10
  199. package/src/orchestrator/figma/spec-figma-renderer.ts +2 -2
  200. package/src/orchestrator/figma/spec-figma-section-renderers.ts +1 -1
  201. package/src/orchestrator/project-initializer.ts +30 -7
  202. package/src/orchestrator/templates/ai-instructions/claude-agent-challenge.md +46 -0
  203. package/src/orchestrator/templates/ai-instructions/claude-agent-discovery.md +32 -0
  204. package/src/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +37 -0
  205. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +3 -3
  206. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +5 -5
  207. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +45 -13
  208. package/src/orchestrator/templates/ai-instructions/claude-cmd-design.md +12 -0
  209. package/src/orchestrator/templates/ai-instructions/claude-cmd-feedback.md +36 -0
  210. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +27 -30
  211. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +8 -3
  212. package/src/orchestrator/templates/ai-instructions/claude-config.md +1 -4
  213. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-mcp.md +82 -0
  214. package/{dist/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md → src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-pat.md} +14 -48
  215. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-live.md +60 -0
  216. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-local.md +38 -0
  217. package/src/orchestrator/templates/ai-instructions/claude-skill-capture.md +35 -0
  218. package/src/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +84 -0
  219. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +57 -11
  220. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +41 -31
  221. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +53 -1
  222. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +3 -3
  223. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +4 -4
  224. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +27 -11
  225. package/src/orchestrator/templates/ai-instructions/copilot-cmd-design.md +13 -0
  226. package/src/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +24 -0
  227. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +20 -30
  228. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +6 -3
  229. package/src/orchestrator/templates/ai-instructions/copilot-config.md +1 -4
  230. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md +82 -0
  231. package/{dist/orchestrator/templates/ai-instructions/claude-skill-figma-source.md → src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md} +14 -48
  232. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md +60 -0
  233. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md +38 -0
  234. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md +35 -0
  235. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +84 -0
  236. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +62 -16
  237. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +41 -31
  238. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +40 -1
  239. package/src/orchestrator/templates/qa-context.md +90 -0
  240. package/src/orchestrator/templates/readme.md +16 -13
  241. package/src/orchestrator/templates/specs-test-data.ts +9 -0
  242. package/src/tools/figma/figma-auth.ts +20 -9
  243. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +0 -142
  244. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +0 -112
  245. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +0 -73
  246. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +0 -142
  247. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +0 -112
  248. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +0 -73
  249. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +0 -142
  250. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +0 -112
  251. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +0 -73
  252. package/src/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +0 -151
  253. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +0 -142
  254. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +0 -112
  255. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +0 -73
  256. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +0 -151
@@ -7,7 +7,7 @@ user-invocable: false
7
7
  ## ⚠️ Gotchas — read before generating
8
8
 
9
9
  - `spec_figma.md` exists → read file only, **NEVER** call `mcp__figma__*`
10
- → PAT auth flow already done by `sungen-figma-source`; re-calling fails or duplicates work.
10
+ → PAT auth flow already done by `sungen-capture` (mode figma-pat); re-calling fails or duplicates work.
11
11
 
12
12
  - `selectors.yaml` → do **NOT** generate — handled by `run-test`
13
13
  → Selectors need live DOM inspection via Playwright MCP, only `run-test` triggers it.
@@ -105,6 +105,14 @@ Auto-detected by `create-test` before invoking this skill:
105
105
  2. Each row / bullet / item = 1 viewpoint → add to `Viewpoint items` in Coverage Map.
106
106
  3. Do NOT pre-classify into buckets before scanning — classify only when
107
107
  writing the scenario.
108
+ - `qa/context.md` — project-wide context set by the QA lead. Read ONCE before building the Coverage Map; apply to every screen. Extraction rules:
109
+ - **Roles** → for each role in the table: add to the `@auth:X` tag pool; generate a VP-SEC blocked-access scenario for every role boundary relevant to this screen.
110
+ - **Testing strategy → Focus areas** → if `security` listed: VP-SEC is mandatory Tier 1 for every free-text input regardless of spec risk level; if `ui` not listed: all VP-UI scenarios move to Tier 2 minimum.
111
+ - **Testing strategy → Mandatory coverage** → each line is a hard override applied to this screen regardless of spec risk; document in `Context constraints` of the Coverage Map.
112
+ - **Testing strategy → Deprioritize/skip** → record in `Context constraints`; suppress those VP categories from Tier 1 generation.
113
+ - **Global business rules** → add each to the `Business rules` section tagged `[G]` (e.g. `[G1 – soft-delete only]`); treat as `HIGH` risk unless stated otherwise.
114
+ - **Error patterns** → use as fallback only when `spec.md` does not give exact error text; never override spec-specified messages.
115
+ - If `qa/context.md` is absent: proceed without it — no impact on the generation flow.
108
116
 
109
117
  **Single screen focus**: one URL = one screen. Modals on same page = part of this screen.
110
118
  This means: do not test other screens' UI layout or navigation. It does NOT mean skip documenting business outcomes that your screen's actions cause on other surfaces. Those cross-surface outcomes must appear in the Coverage Map and be covered by at least `@manual` scenarios.
@@ -129,6 +137,11 @@ Read `spec.md` fully, then extract into a Coverage Map **before writing any scen
129
137
  **Risk tags:** HIGH = complex business rules, cascading fields, multi-step state changes, auth/integration. LOW = display-only, static labels, read-only fields.
130
138
 
131
139
  ```
140
+ Context constraints: [populated from qa/context.md before writing any scenario]
141
+ roles: [list roles, e.g. admin / manager / staff]
142
+ strategy: [active overrides, e.g. "VP-SEC mandatory T1", "VP-UI → T2 only"]
143
+ global rules: [G1 – ...] → also appear in Business rules below tagged [G]
144
+ → leave empty if qa/context.md is absent or has no entries applicable to this screen
132
145
  User journeys: [J1 – ...], [J2 – ...]
133
146
  Validation rules: [V1 – field → "exact error text"], [V2 – ...]
134
147
  Business rules: [B1 HIGH – ...], [B2 LOW – ...]
@@ -208,6 +221,45 @@ Security: [S1 – admin only]
208
221
 
209
222
  **✅ Good** — see admin notice example above: `Display surfaces` lists every URL spec mentions as output, `Cross-surface rules` maps each admin action to its user-facing outcome, `Inclusive bounds` flags every `<=`/`>=` for BVA. Every item maps to a VP-ID in `Tier 1 output`.
210
223
 
224
+ #### Critical business-viewpoint pre-gate — pass `sungen audit` on the FIRST pass
225
+
226
+ > The harness gate FAILS (and forces repair rounds → wasted tokens) when a page-type's critical **business** viewpoints are missing or **shallow**. Generate them correctly the first time. A business-critical `Then` must assert **DATA**, never just `see [X] page/section/modal`.
227
+
228
+ **By page-type, generate a DEEP scenario for each (before expanding UI/validation/subscription):**
229
+
230
+ | Page-type | Must-cover viewpoints (each with a data assertion) |
231
+ |---|---|
232
+ | **e-commerce list / home** | list-data (card has image+name+price+add) · product-detail-consistency · cart-correctness · category-filter-correctness · **brand-filter-correctness (separate from category)** · add-to-cart success · nav-core |
233
+ | **form** | required-validation · format/boundary · submit-success |
234
+ | **auth** | valid-login · invalid-credential · access-control |
235
+
236
+ **Required assertion shapes (use these, not bare visibility):**
237
+ - Card info: assert at **card level** (image+name+price together), e.g. `User see all [Product Card] contain {{...}}` — not `see [Section]` (section-level passes even if one card lacks price).
238
+ - Cross-screen consistency (detail/cart): **capture then compare** —
239
+ ```gherkin
240
+ When User remember [Product Name] text as {{selected_product_name}}
241
+ And User remember [Product Price] text as {{selected_product_price}}
242
+ And User click [View Product] link
243
+ Then User see [Detail Product Name] header with {{selected_product_name}}
244
+ And User see [Detail Product Price] text contains {{selected_product_price}}
245
+ ```
246
+ Cross-screen target → tag `@manual` + `# Deferred to a flow (home -> detail)`.
247
+ - Filter result (category AND brand, separately): `Then User see all [Result Product Name] contain {{selected_category}}` — proves EVERY item belongs, not one.
248
+
249
+ **Depth is a GATE dimension (harness-roadmap P1) — self-raise, never silently go shallow:**
250
+ - For every data-correctness theme the catalog marks `depth.requires: data-assertion`, emit its `depth.template` shape by **default** — don't wait for the repair loop. `sungen audit` measures `businessDepth` (ratio of these scenarios that assert data) against an intent threshold (functional ≥ 0.70); below it the **gate FAILs**.
251
+ - `depth.cross_screen: true` (cart / detail / filter / brand correctness) → write the deep capture/compare shape but tag `@manual` + `# Deferred to a flow (...)`. These are excluded from the ratio (they're correctly deferred), so they don't hurt depth.
252
+ - **If the spec lacks the concrete value** a deep assertion needs (exact message, price, count): still write the deep shape with a `{{var}}` placeholder and leave a `# SPEC-GAP: <field> value not in spec` comment — do **not** downgrade to `see [X] section`. A visible gap is better than a silent shallow pass.
253
+ - **Blind-Spot Memory:** before finishing, run `sungen blindspot list --prompt` (Bash) and make sure the suite satisfies each recorded pattern (e.g. "for any Add/Create action: check success + resulting data state + duplicate/double-submit"). These are gaps QA hit before — don't repeat them.
254
+
255
+ **First-pass anti-patterns (these are exactly what the gate/reviewer reject — avoid them):**
256
+ - Title↔steps mismatch: e.g. a "no-result state" scenario that clicks a query which **returns** products. Steps must create the condition the title claims.
257
+ - Tautology `Then`: `click [Next Slide]` → `see [Carousel] section` (always visible, proves nothing). Assert the change (new slide title differs).
258
+ - Business-critical scenario ending at `see [Added] modal` / `see [Cart] page` / `see [Category Products] page` with no data assertion.
259
+ - Brand filter covered only as navigation (must assert products belong to the brand).
260
+
261
+ **Balance:** cover all the above (deep) BEFORE expanding subscription / UI-presence / extra validation edge cases. Do not over-invest in subscription while cart/detail/filter correctness are shallow.
262
+
211
263
  #### Tier 1 guard — minimum before writing scenarios
212
264
 
213
265
  | Spec section | Minimum requirement | Tag |
@@ -48,9 +48,9 @@ Record the screen list — you will need it for:
48
48
  ### 2. Capture visual source
49
49
 
50
50
  Ask: *"Pick a visual source for this flow's screens:"*
51
- - **Figma designs** (Recommended for pre-launch) — invoke `sungen-capture-figma` skill for each screen
52
- - **Live page scan** (dev/staging is up) — invoke `sungen-capture-live` skill for each screen URL
53
- - **Local images** — invoke `sungen-capture-local` skill to load from `requirements/ui/`
51
+ - **Figma designs** (Recommended for pre-launch) — invoke `sungen-capture` skill (mode figma-mcp) for each screen
52
+ - **Live page scan** (dev/staging is up) — invoke `sungen-capture` skill (mode live) for each screen URL
53
+ - **Local images** — invoke `sungen-capture` skill (mode local) to load from `requirements/ui/`
54
54
  - **Skip** — user will drop images manually into `requirements/ui/` later
55
55
 
56
56
  Each capture skill writes outputs into `qa/flows/${input:flow}/requirements/ui/` and reports back a summary. Do not inline capture logic here — always delegate to the skill.
@@ -72,7 +72,7 @@ This CLI command automatically:
72
72
 
73
73
  ### 1a. Synthesize narrative sections (Figma branch only)
74
74
 
75
- After `sungen add --figma` succeeds, the envelope of `spec_figma.md` is deterministic but the narrative below the `<!-- SYNTHESIS-BELOW -->` marker is empty. Invoke the `sungen-figma-source` skill:
75
+ After `sungen add --figma` succeeds, the envelope of `spec_figma.md` is deterministic but the narrative below the `<!-- SYNTHESIS-BELOW -->` marker is empty. Invoke the `sungen-capture` skill (mode figma-pat):
76
76
 
77
77
  1. Read `qa/screens/${input:screen}/requirements/spec_figma.md` frontmatter for `file_key`, `node_id`, `figma_version_id`.
78
78
  2. Read the cached raw node JSON at `.sungen/figma-cache/<file_key>/<figma_version_id>/<safe_node_id>-raw.json` (colons in node_id become underscores).
@@ -89,11 +89,11 @@ After `sungen add --figma` succeeds, the envelope of `spec_figma.md` is determin
89
89
 
90
90
  **If Figma branch (Step 1) already downloaded PNGs** → visuals already exist. Offer:
91
91
  - **1) Continue** — Figma visuals are enough (Recommended)
92
- - **2) Also capture live page** — supplement Figma with real page scan (invoke `sungen-capture-live` skill)
92
+ - **2) Also capture live page** — supplement Figma with real page scan (invoke `sungen-capture` skill (mode live))
93
93
 
94
94
  **If standard path (no --figma)** → go straight to source selection:
95
- - **1) Figma design** (Recommended for pre-launch) — invoke `sungen-capture-figma` skill
96
- - **2) Live page scan** (dev/staging is up) — invoke `sungen-capture-live` skill
95
+ - **1) Figma design** (Recommended for pre-launch) — invoke `sungen-capture` skill (mode figma-mcp)
96
+ - **2) Live page scan** (dev/staging is up) — invoke `sungen-capture` skill (mode live)
97
97
  - **3) Skip** — user will drop images manually into `requirements/ui/` later
98
98
 
99
99
  Each capture skill writes outputs into `qa/screens/${input:screen}/requirements/ui/` and reports back. Do not inline capture logic here — delegate to the skill so behavior stays consistent with `/sungen-create-test`.
@@ -12,6 +12,8 @@ tools: [vscode, execute, read, agent, edit, search, web, browser, todo, 'playwri
12
12
 
13
13
  You are a **Senior QA Engineer**. You structure test cases by viewpoint categories and translate UI into Gherkin test cases following the `sungen-gherkin-syntax` and `sungen-tc-generation` skills. **Tier 1 (critical+high) first** — expand coverage later. **Gherkin scenarios and test data only** — selectors are handled during `/sungen-run-test`.
14
14
 
15
+ **Quality is built in.** After generating, run a **harness loop**: `sungen audit` measures the output and you **repair the findings** until critical viewpoints are covered — the user does not ask for this. Use the `sungen-harness-audit` skill. (`/sungen-design` is an **alias** of this command.)
16
+
15
17
  ## Parameters
16
18
 
17
19
  - **name** — ${input:name:screen or flow name (e.g., login, award-submission)}
@@ -27,7 +29,15 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
27
29
  - If no → fresh creation. Ask generation scope:
28
30
  - **1) Tier 1 — Critical & High priority** — ~10-15 scenarios/section covering happy paths, core validation, security basics **(Recommended)**
29
31
  - **2) Full coverage — All tiers at once** — generates Tier 1 + 2 + 3 in one run. Large output (~40-60 scenarios/section), best for experienced users who want complete coverage immediately
30
- 3. **Read requirements & resolve visual source** — check `<base>/${input:name}/requirements/`:
32
+ 3. **Read project context + screen requirements**
33
+
34
+ **Project context** — check `qa/context.md` (project root, not screen-specific):
35
+ - If exists → read it. Extract: roles, testing strategy directives, global business rules, error patterns.
36
+ - Summarize what you found in one line (e.g. `"Roles: admin/staff/user | Strategy: focus security, skip VP-UI T1 | 2 global rules"`).
37
+ - These are carried into the Coverage Map when invoking the `sungen-tc-generation` skill.
38
+ - If absent → continue without it, no action needed.
39
+
40
+ **Screen requirements** — check `<base>/${input:name}/requirements/`:
31
41
  - If `spec.md` exists → read it as PRIMARY source (sections, fields, validation rules, business rules, states).
32
42
  - If `test-viewpoint.md` exists → read it. If it only contains HTML comments (scaffold template), ask:
33
43
  - **1) Fill test-viewpoint.md first** — identify edge cases, known issues, and design decisions before generating tests
@@ -36,35 +46,41 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
36
46
  **Auto-detect visual source** — do NOT ask the user to pick a source. Instead, check what already exists and use it:
37
47
  1. If `spec_figma.md` exists → read it as Figma supplement (PAT flow already completed during `add-screen`). Do NOT call any `mcp__figma__*` tool.
38
48
  2. If `ui/` has images (`.png`, `.jpg`, etc.) → read them for visual context (layout, element positions, states).
39
- 3. If neither exists → ask: *"No visual source found. Pick one:"*
40
- - **1) Figma PAT** — ask for URL, run `sungen add --screen ${input:name} --figma '<url>'`, then invoke `sungen-figma-source` skill
41
- - **2) Figma MCP** — invoke `sungen-capture-figma` skill
42
- - **3) Live page scan** — invoke `sungen-capture-live` skill
49
+ 3. If neither exists → ask: *"No visual source found. Pick one:"* — then invoke the **`sungen-capture`** skill with the matching **mode** (read only that mode's file):
50
+ - **1) Figma PAT** — ask for URL, run `sungen add --screen ${input:name} --figma '<url>'`, then `sungen-capture` **mode figma-pat**
51
+ - **2) Figma MCP** — `sungen-capture` **mode figma-mcp**
52
+ - **3) Live page scan** — `sungen-capture` **mode live**
43
53
  - **4) Skip** — generate from spec.md only
44
54
 
55
+ (When `spec_figma.md` exists, that is also `sungen-capture` **mode figma-pat**; when `ui/` images exist, that is **mode local**.)
56
+
45
57
  **Cross-check**: if both `spec.md` and visual sources exist, flag any discrepancies (missing fields, different labels) before moving on. When `spec_figma.md` is present, follow the Figma supplement rules in `sungen-tc-generation` skill (reading order, Text Inventory, conflict handling).
46
58
 
47
59
  Summarize what you found in requirements and present to the user.
48
60
 
49
61
  4. Follow the `sungen-tc-generation` skill for section identification, viewpoint generation, and output format. **For flows**, use the "Flow Test Generation" section in the skill. When requirements exist, use the "Requirements-Driven Generation" strategy. **For Tier 1**, apply the **Lightweight Guard** — verify required fields, validation rules, business rules, security checks, and key state transitions all have TCs after generation. **For Tier 2+**, **MUST** apply the full **Mapping Contract** — walk every `spec.md` section top-to-bottom and produce the indicated TCs per Table 1; handle `test-viewpoint.md` per Table 2. Do not silently skip sections. Present sections as a numbered list and let user pick.
50
62
  5. Generate or update `.feature` + `test-data.yaml` following `sungen-gherkin-syntax` and `sungen-tc-generation` skills. **For flows**: use `[Screen:Element]` namespace format, namespace test-data by phase, add `@flow` tag.
51
- 6. Show summary and offer next steps based on which tier was just generated:
63
+ 5.5. **Quality gate & repair (harness — always run).** Per `sungen-harness-audit`: run `sungen audit --screen ${input:name}` (structural), THEN do an **independent semantic review inline** using the `sungen-reviewer` criteria (does each scenario's steps PROVE its title/viewpoint? observable Thens? business-critical assertion depth?). Merge both sets of issues; if gate FAILs / findings exist, repair (budget 3) and re-audit — GATE missing theme → generate it (cross-screen → write data assertions, tag `@manual`, comment `# Deferred to a flow`); DEPTH → add data assertions; BALANCE → add business-core first; TRACE → align VP ids. Never fake a pass.
64
+ 5.6. **Record.** `sungen manifest --screen ${input:name}`. Ledger **each phase** (not just repair) — pick one `runId` at the start and pass it so `trace`/`ledger report` show THIS run, not a mix: `sungen ledger record --screen ${input:name} --run <runId> --step <discovery|viewpoint|gherkin|audit|repair:N> --ms <elapsed>`. On re-run, start with `sungen manifest --screen ${input:name} --diff` and only regenerate changed sections.
65
+ 6. **Converge — show the trace.** Run `sungen trace --screen ${input:name}` and present: process map (phases + repair rounds), bottlenecks, **HUMAN-LOOP FOCUS** (@manual to verify), audit score + gate + residual gaps. Then offer next steps based on which tier was just generated:
66
+
67
+ > The harness gate + reviewer already ran above — `/sungen-review` is the independent checkpoint (hand/prompt-authored or pre-delivery), not a needed next step here.
68
+
69
+ **Optional — exploration mode (Loop 2).** The suite above is the deterministic official output. To push past "same output every time", offer the **challenge pass**: run `sungen challenge --screen ${input:name}` (deterministic structural critics), then apply the `sungen-challenge` criteria inline for semantic + novelty candidates. Advisory only — surfaces blind spots + ≤20% novelty candidates, never auto-merges. Record a confirmed recurring miss with `sungen blindspot add` so future runs don't repeat it.
52
70
 
53
71
  **After Tier 1 generation:**
54
- - **`/sungen-review ${input:name}`** — Review syntax, coverage, viewpoint quality (Recommended)
55
- - **`/sungen-run-test ${input:name}`** — Skip review, generate selectors and run tests now
72
+ - **`/sungen-run-test ${input:name}`** — Generate selectors and run tests now (Recommended)
56
73
  - **`/sungen-create-test ${input:name}`** — Expand coverage: add @normal + @low scenarios (Tier 2)
57
74
  - **Done for now** — I'll come back later
58
75
 
59
76
  **After Tier 2 generation:**
60
77
  - **`/sungen-create-test ${input:name}`** — Deep coverage: add BVA combos, cross-field validation, negative inputs, race conditions (Tier 3) (Recommended)
61
- - **`/sungen-review ${input:name}`** — Review syntax, coverage, viewpoint quality
62
78
  - **`/sungen-run-test ${input:name}`** — Generate selectors and run tests now
63
79
  - **Done for now** — I'll come back later
64
80
 
65
81
  **After Tier 3 or Full generation:**
66
- - **`/sungen-review ${input:name}`** — Review syntax, coverage, viewpoint quality (Recommended)
67
- - **`/sungen-run-test ${input:name}`** — Generate selectors and run tests now
82
+ - **`/sungen-run-test ${input:name}`** — Generate selectors and run tests now (Recommended)
83
+ - **`/sungen-create-test ${input:name}`** — Add more sections if the screen changed
68
84
  - **Done for now** — I'll come back later
69
85
 
70
86
  **No selectors.yaml** — selectors are generated during `/sungen-run-test`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: sungen-design
3
+ description: 'Alias of create-test. Generates test cases AND runs the quality harness (gate + repair). Kept for discoverability; create-test now does this by default.'
4
+ argument-hint: '[screen-name]'
5
+ agent: 'agent'
6
+ tools: [vscode, execute, read, agent, edit, search, web, browser, todo, 'playwright/*']
7
+ ---
8
+
9
+ ## `/sungen-design` is an alias of `/sungen-create-test`
10
+
11
+ As of v3.0 the quality harness (discovery → viewpoint overview → generate → **`sungen audit` gate → repair loop** → manifest/ledger) is built into **`/sungen-create-test`** by default — no second command needed for quality.
12
+
13
+ **Do exactly what `/sungen-create-test <name>` does** — follow that command verbatim, including the mandatory harness gate & repair step and the `sungen-harness-audit` skill. This entry exists only to keep the `design` name discoverable.
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: sungen-feedback
3
+ description: 'Record QA feedback locally (test-design knowledge or product telemetry). Auto-attaches context and stores to .sungen/feedback/.'
4
+ argument-hint: '[message]'
5
+ agent: 'agent'
6
+ tools: [vscode, execute, read, search]
7
+ ---
8
+
9
+ ## Role
10
+ Capture QA feedback and store it **locally** (no server) via `sungen feedback record`. Closes the learning loop inside the project; the harness can reuse it later.
11
+
12
+ ## Steps
13
+ 1. Read message from arguments (ask if empty).
14
+ 2. **Classify**: `test-design` (viewpoint/scenario wrong/missing/duplicate/add), `product` (Sungen itself misbehaved), or `other`. Infer; confirm only if ambiguous.
15
+ 3. **Auto-attach context** (don't make the user repeat): `--screen <name>` (current focus), `--target <ref>` (VP id / scenario / command / artifact), `--decision <accept|reject|edit|add|none>`, `--reason <text>`.
16
+ 4. Run:
17
+ ```bash
18
+ sungen feedback record --type <type> --screen <name> --target "<ref>" --decision <d> --message "<msg>" --reason "<why>"
19
+ ```
20
+ 5. Confirm what/where (`.sungen/feedback/feedback.jsonl`). It is **local**; cross-project sync is opt-in later.
21
+ 6. If feedback implies an action (missing critical viewpoint), offer `sungen-design <name>` (regenerate with gate) or `sungen-add-flow` (cross-screen gap).
22
+
23
+ ## Notes
24
+ - Never send anywhere — local file only. Keep `product` vs `test-design` distinct. View: `sungen feedback list`.
@@ -1,48 +1,38 @@
1
1
  ---
2
2
  name: sungen-review
3
- description: 'Review test cases for a Sungen screen validate syntax, score coverage, check viewpoint quality.'
3
+ description: 'Independent quality checkpoint for test cases runs the harness (audit gate + reviewer criteria + script-check) and presents one unified scorecard. Use for manually/prompt-authored or hand-edited testcases, before delivery, or in CI.'
4
4
  argument-hint: '[screen-name]'
5
5
  agent: 'agent'
6
- tools: [vscode, read, edit, search, todo]
6
+ tools: [vscode, execute, read, edit, search, todo]
7
7
  ---
8
8
 
9
9
  **Input**: Screen or flow name (e.g., `/sungen-review admin-users`).
10
10
 
11
11
  ## Role
12
12
 
13
- You are a **Senior QA Reviewer**. You evaluate Gherkin test cases using the `sungen-tc-review`, `sungen-viewpoint`, and `sungen-gherkin-syntax` skills.
13
+ You are an **independent QA Reviewer** — you did not author these tests. You do **not** invent a parallel score; you run the **harness** and present its signals as a human scorecard. Skills: `sungen-tc-review` (presentation rubric), `sungen-viewpoint`, `sungen-gherkin-syntax`.
14
14
 
15
- ## Parameters
15
+ ## When this matters
16
16
 
17
- - **name** ${input:name:screen or flow name (e.g., login, award-submission)}
17
+ `/sungen-create-test` already runs the harness gate while generating, so you don't need to review right after it. Run `/sungen-review` when the harness did **not** run or you need an independent sign-off: hand/prompt-authored testcases, a hand-edited `.feature`, **before `/sungen-delivery`**, or in **CI**.
18
18
 
19
- **Auto-detect context**: check if `qa/flows/<name>/` exists → flow mode (base path: `qa/flows/<name>/`). Else check `qa/screens/<name>/` → screen mode (base path: `qa/screens/<name>/`).
19
+ ## Parameters
20
+ - **name** — ${input:name:screen or flow name}
21
+ **Auto-detect context**: `qa/flows/<name>/` → flow, else `qa/screens/<name>/` → screen.
20
22
 
21
23
  ## Steps
22
24
 
23
- 1. **Enumerate feature files** — glob `<base>/<name>/features/*.feature`. A screen may have one main file (`<name>.feature`) plus sub-features (`<name>-<sub>.feature` like `awards-modal.feature`); a flow has a single `<name>.feature`. If zero `.feature` files found → `/sungen-create-test` first.
24
- 2. **Review every feature file** for each `<basename>.feature` discovered in step 1:
25
- - Read `<basename>.feature` and the matching `test-data/<basename>.yaml`.
26
- - Apply the `sungen-tc-review` skill — score the **7-dimension rubric (100 pts)**: Structure & Format (15), Coverage (30), Assertion Quality (20), Test Data (10), Security & Permission (10), Automation Readiness (10), Maintainability (5). **For flows**, also apply the flow-specific checks (Layer A7 "Tags & Flow"). Use `sungen-viewpoint` for pattern checklists.
27
- - Apply the **Unverified Selectors check** if `<base>/<name>/selectors/<basename>.yaml` exists, count lines matching `@needs-live-verify`. Include in the per-file report as a non-scoring metric. Does NOT affect the score or the PASS threshold.
28
- 3. **Aggregated output** present scores in a per-feature table, then a screen-level rollup:
29
-
25
+ 1. **Enumerate** `<base>/${input:name}/features/*.feature`. If none → `/sungen-create-test` first.
26
+ 2. **Run the harness (source of truth) no separate rubric:**
27
+ - `sungen audit --screen ${input:name}` gate, business-weighted score, findings, gaps.
28
+ - Apply the **`sungen-reviewer` criteria inline** semantic verdict (do steps prove the title? observable Then? business-critical depth? @manual justified?).
29
+ - `sungen script-check --screen ${input:name}` spec is 1:1 with the Gherkin (flags hand-edit / stale drift; only if a spec exists).
30
+ 3. **Unified scorecard** per feature, anchored on harness signals (the `sungen-tc-review` 7 dimensions are a presentation layer, not a competing score):
30
31
  ```
31
- Feature Total Verdict Unverified
32
- ─────────────────────────────────────────────────────
33
- home.feature 88 PASS 0
34
- home-modal.feature 64 CONDITIONAL 2
35
- ─────────────────────────────────────────────────────
36
- Screen rollup (mean) 76 PASS
32
+ Feature Gate Score Reviewer Spec 1:1 Verdict
33
+ home.feature PASS 8.4/10 2 minor issues in-sync PASS
37
34
  ```
38
-
39
- - **>= 70**: PASS that file.
40
- - **50–69**: CONDITIONALfix before execution.
41
- - **< 50**: FAIL revise & re-review.
42
- - "Unverified" = count of `@needs-live-verify` selectors (non-scoring). Show the full per-file report (dimension breakdown, recommendations, top issues) **only for files that are CONDITIONAL or FAIL**, or when the user asks for the deep report.
43
- 4. If any file is CONDITIONAL or FAIL and user confirms → update that file's test cases following `sungen-gherkin-syntax` and `sungen-tc-generation` skills, then re-review **only those files** (skip already-passing ones to save time).
44
- 5. After all files PASS (or user decides to proceed), offer next steps:
45
-
46
- - **`/sungen-run-test ${input:name}`** — Generate selectors, compile, and run tests for **every feature** in this screen (Recommended)
47
- - **`/sungen-create-test ${input:name}`** — Add more test cases before running
48
- - **Done for now** — I'll come back later
35
+ PASS = gate PASS + reviewer clean + spec in-sync. Else CONDITIONAL/FAIL with findings + fixes. Score = audit score adjusted by unresolved reviewer issues — never contradicting the gate.
36
+ 4. **Repair (on confirm)** — apply audit findings + reviewer fixes (use `remember`/`see all` per `sungen-harness-audit`), re-run step 2 on the affected file. On drift → `sungen generate` to resync (never hand-edit the spec).
37
+ 5. **Trace + next** `sungen trace --screen ${input:name}` (human-loop focus), then offer:
38
+ - **`/sungen-run-test ${input:name}`** (Recommended) · **`/sungen-delivery ${input:name}`** · **`/sungen-create-test ${input:name}`** · Done.
@@ -41,11 +41,13 @@ Skip when `--env` matches the base locale.
41
41
  Phase 0 — Selector Generation decision tree
42
42
 
43
43
  Live page reachable? (URL provided and loads without error)
44
- YES → existing flow: browser_navigate → one browser_snapshot generate selectors.yaml (verified entries)
44
+ YES → existing flow: browser_navigate → wait for page to fully load (no spinner/skeleton/empty table)
45
+ one browser_snapshot → cross-verify every [Reference] label vs snapshot name →
46
+ generate selectors.yaml (verified entries; explicit YAML for any label≠DOM-name mismatch)
45
47
  NO → spec_figma.md exists in requirements/?
46
- YES → provisional flow (sungen-figma-source + sungen-selector-fix skills):
48
+ YES → provisional flow (sungen-capture mode figma-pat + sungen-selector-fix skills):
47
49
  1. Read filtered Figma node data from spec_figma.md (## Components + ## Text Inventory)
48
- 2. Apply selector heuristics from sungen-figma-source skill (testid > role+name > placeholder > label > locator > text)
50
+ 2. Apply selector priority from sungen-selector-fix § Step 3 (testid > role+name > label > placeholder > text > locator CSS last)
49
51
  3. Write selectors.yaml — every provisional entry gets this comment on the line above:
50
52
  # @needs-live-verify source=figma node_id=<id>
51
53
  4. Compile: Screen: sungen generate --screen <name>. Flow: sungen generate --flow <name> — must succeed
@@ -81,6 +83,7 @@ Skip when `--env` matches the base locale.
81
83
  6. **Phase 2 — Priority Wave**: Run all `@high` scenarios. Fix only failures from this wave. Max 2 attempts. Shared selectors fixed here cascade to later phases.
82
84
  7. **Phase 3 — Full Run**: Run all tests. Fix only **new** failures (elements unique to `@normal`/`@low`). Max 1 attempt. Don't loop on low-priority failures.
83
85
  8. **Phase 4 — Regression**: One final full run. Report results. No more fix loops.
86
+ 9. **Integrity & trace (always run after the final run).** `sungen script-check --screen <name>` — verify the spec is a **1:1** of the Gherkin; if **DRIFT**, re-run `sungen generate --screen <name>` (never hand-edit the `.spec.ts` — auto-fix edits `selectors.yaml`). Then `sungen ledger record --screen <name> --step run --ms <elapsed>` and `sungen trace --screen <name>` to show the process map + bottlenecks + **HUMAN-LOOP FOCUS**.
84
87
 
85
88
  ## Playwright command guidelines
86
89
 
@@ -16,10 +16,7 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
16
16
  | `sungen-selector-keys` | YAML key generation from `[Reference]` names, suffixes, lookup priority |
17
17
  | `sungen-selector-fix` | Selector generation from live page, auto-fix strategy |
18
18
  | `sungen-delivery` | Export Gherkin + Playwright results → CSV test case deliverable |
19
- | `sungen-capture-figma` | Fetch design context + PNG from a Figma frame URL via Figma Dev Mode MCP |
20
- | `sungen-capture-local` | Load existing UI assets (screenshots, mockups, Figma exports) from `requirements/ui/` |
21
- | `sungen-capture-live` | Capture a live running page via Playwright MCP (snapshot + screenshot) |
22
- | `sungen-figma-source` | Figma URL → spec_figma.md + ui/*.png + provisional selectors |
19
+ | `sungen-capture` | Acquire visual/design context one skill, 4 modes: figma-mcp (Dev Mode MCP), figma-pat (URL spec_figma.md), live (Playwright MCP scan), local (images in `requirements/ui/`) |
23
20
  | `sungen-locale` | Bootstrap i18n — audit selectors, detect locale switch mechanism, generate test-data overlay |
24
21
 
25
22
  ## Workflow (7 AI commands)
@@ -0,0 +1,82 @@
1
+ # Capture mode: figma-mcp
2
+
3
+ Pull **structured design data** (layout, typography, colors, component tree, design tokens) and a **PNG screenshot** from a Figma frame URL via the **Figma Dev Mode MCP**, so `sungen-tc-generation` can author Gherkin + test-data before a live domain exists. Use when the project is pre-launch or Figma is the source of truth and the live build lags the design.
4
+
5
+ ## Prerequisites
6
+
7
+ - **Figma MCP server** (`https://mcp.figma.com/mcp`, HTTP transport) connected in `.mcp.json` — `sungen init` scaffolds this. On first use, Claude Code opens a browser for Figma OAuth. Official tools: `get_design_context`, `get_variable_defs`, `get_screenshot`.
8
+ - Figma account signed in with access to the file. **Dev/Full seats** get per-minute rate limits; **Starter/View seats** get monthly tool-call limits.
9
+ - A Figma URL with both **fileKey** and **nodeId**.
10
+
11
+ If the MCP is not connected, **do not fail silently** — tell the user:
12
+ > "Figma MCP not detected. Run `sungen init` to scaffold the config, or manually add `figma` with `url: https://mcp.figma.com/mcp` to `.mcp.json`. Then sign in when Claude Code prompts."
13
+
14
+ Then stop.
15
+
16
+ ## Steps
17
+
18
+ ### 1. Resolve Figma URL
19
+
20
+ Prefer in this order:
21
+ 1. `Figma URL` field in `requirements/spec.md` (Overview section)
22
+ 2. If empty/missing → `AskUserQuestion`: *"Paste the Figma frame URL"* (free text)
23
+
24
+ Accept any of these shapes:
25
+ ```
26
+ https://www.figma.com/file/<fileKey>/<title>?node-id=<nodeId>
27
+ https://www.figma.com/design/<fileKey>/<title>?node-id=<nodeId>
28
+ https://www.figma.com/proto/<fileKey>/<title>?node-id=<nodeId>
29
+ ```
30
+ Parse: `fileKey` = segment after `/file/`, `/design/`, or `/proto/`; `nodeId` = the `node-id` query param (pass `-` or `:` through as-is). If `node-id` is missing, ask the user to select a frame in Figma and copy the **frame URL** (not the file root).
31
+
32
+ ### 2. Fetch design context
33
+
34
+ Call **both** in parallel:
35
+ ```
36
+ get_design_context({ fileKey, nodeId })
37
+ get_variable_defs({ fileKey, nodeId })
38
+ ```
39
+ `get_design_context` → layout, typography, colors, component structure, spacing. `get_variable_defs` → named design tokens.
40
+
41
+ ### 3. Fetch screenshot
42
+
43
+ ```
44
+ get_screenshot({ fileKey, nodeId })
45
+ ```
46
+ Save the PNG to `requirements/ui/figma-<sanitized-nodeId>.png` (replace `:` and `-` with `_`, e.g. `42-15` → `figma-42_15.png`).
47
+
48
+ ### 4. Write metadata dump
49
+
50
+ Combine design context + variables into `requirements/ui/figma-meta.md`:
51
+ ```markdown
52
+ # Figma Capture — <nodeId>
53
+ **Source:** <full Figma URL>
54
+ **Captured:** <ISO date>
55
+ ## Components
56
+ <component names + variants>
57
+ ## Typography
58
+ <font families, sizes, weights, line heights>
59
+ ## Colors
60
+ <color tokens + raw hex>
61
+ ## Spacing & Layout
62
+ <spacing tokens, auto-layout specs>
63
+ ## Text Content
64
+ <visible text strings — used by tc-generation to populate test-data>
65
+ ```
66
+ Consumed by `sungen-tc-generation` as a secondary source alongside `spec.md`.
67
+
68
+ ### 5. Report back
69
+
70
+ > Captured Figma frame `<nodeId>`: Components N · Text strings M · Design tokens K · Screenshot `requirements/ui/figma-<nodeId>.png` · Metadata `requirements/ui/figma-meta.md`
71
+
72
+ Then hand back to the calling command.
73
+
74
+ ## Error handling
75
+
76
+ | Error | Action |
77
+ |---|---|
78
+ | MCP tool not available | Print setup instructions, stop, do not fall back silently |
79
+ | `fileKey` missing from URL | Ask user to paste a valid frame URL |
80
+ | `nodeId` missing from URL | Ask user to right-click a frame in Figma → *Copy link to selection* |
81
+ | `get_design_context` 403 | Ask user to check Dev Mode seat on that file |
82
+ | `get_screenshot` returns no image | Continue with metadata only; warn no PNG was captured |
@@ -1,18 +1,6 @@
1
- ---
2
- name: sungen-figma-source
3
- description: 'Figma URL → spec_figma.md envelope + LLM-synthesized narrative from cached raw node JSON. Auto-loaded when --figma flag present or spec_figma.md exists.'
4
- user-invocable: false
5
- ---
1
+ # Capture mode: figma-pat
6
2
 
7
- ## When This Skill Loads
8
-
9
- Auto-load triggers (any one is sufficient):
10
-
11
- - Any sungen AI command invoked with `--figma` flag
12
- - `requirements/spec_figma.md` exists in the screen directory
13
- - User mentions a Figma URL or says "generate from Figma"
14
-
15
- ---
3
+ Figma URL → `spec_figma.md` envelope + LLM-synthesized narrative from cached raw node JSON. This mode is the active one when any of these is true: a sungen command was invoked with `--figma`, `requirements/spec_figma.md` exists, or the user says "generate from Figma".
16
4
 
17
5
  ## Prerequisites
18
6
 
@@ -22,8 +10,6 @@ Auto-load triggers (any one is sufficient):
22
10
 
23
11
  **Never paste the PAT into any transcript, spec file, or commit.**
24
12
 
25
- ---
26
-
27
13
  ## Two-Layer Architecture
28
14
 
29
15
  `spec_figma.md` has two layers separated by the `<!-- SYNTHESIS-BELOW -->` marker:
@@ -31,34 +17,27 @@ Auto-load triggers (any one is sufficient):
31
17
  | Layer | Producer | Overwrite Rule |
32
18
  |---|---|---|
33
19
  | **Envelope** (above marker) | sungen CLI | Regenerated each `sungen figma` run — deterministic |
34
- | **Narrative** (below marker) | This skill (LLM) | Replaced on re-synthesis — everything from marker to EOF |
20
+ | **Narrative** (below marker) | This mode (LLM) | Replaced on re-synthesis — everything from marker to EOF |
35
21
 
36
22
  The envelope contains: YAML frontmatter, Frame metadata, Screenshots. The narrative is synthesized by YOU from the cached raw Figma node JSON.
37
23
 
38
- ---
39
-
40
24
  ## Inputs You Read
41
25
 
42
26
  The scaffolder persists a raw (unfiltered) Figma node tree to:
43
-
44
27
  ```
45
28
  .sungen/figma-cache/<fileKey>/<versionId>/<nodeId>-raw.json
46
29
  ```
47
-
48
30
  Read this file + the envelope frontmatter of `requirements/spec_figma.md` + any PNGs under `requirements/ui/`. You MUST NOT call the Figma REST API directly — the PAT is not available to you.
49
31
 
50
- ---
51
-
52
32
  ## Synthesis Task
53
33
 
54
- Append 7 narrative sections below `<!-- SYNTHESIS-BELOW -->`. Each section is inferred from the raw node tree (names, types, `characters`, layout bounds, auto-layout direction, componentProperties):
34
+ Append 7 narrative sections below `<!-- SYNTHESIS-BELOW -->`. Each is inferred from the raw node tree (names, types, `characters`, layout bounds, auto-layout direction, componentProperties):
55
35
 
56
36
  ### 1. Purpose
57
37
  One paragraph. What screen is this? Primary user goal? Infer from frame name + top-level text + dominant CTA.
58
38
 
59
39
  ### 2. ASCII Layout
60
- Rough spatial sketch using box characters. Reflect top-bottom / left-right ordering from absoluteBoundingBox. Keep under ~20 lines. Example:
61
-
40
+ Rough spatial sketch using box characters. Reflect top-bottom / left-right ordering from absoluteBoundingBox. Keep under ~20 lines:
62
41
  ```
63
42
  ┌──────────────────────────────────────┐
64
43
  │ [Logo] [Sign In] │
@@ -72,55 +51,46 @@ Rough spatial sketch using box characters. Reflect top-bottom / left-right order
72
51
  ```
73
52
 
74
53
  ### 3. Regions
75
- Bulleted list of the major layout regions (header, sidebar, main, footer, modal, etc.) with a one-line purpose each. Use auto-layout frames as region hints.
54
+ Bulleted list of major layout regions (header, sidebar, main, footer, modal) with a one-line purpose each. Use auto-layout frames as region hints.
76
55
 
77
56
  ### 4. Actions
78
- Every interactive element the user can trigger. Derive from nodes whose name/type suggests a button, link, icon-button, menu-item, toggle, etc. Format:
79
-
57
+ Every interactive element the user can trigger (button, link, icon-button, menu-item, toggle…):
80
58
  ```
81
59
  - **<Action name>** — <what it does> (source: <node name>)
82
60
  ```
83
61
 
84
62
  ### 5. Form Fields
85
- Every input the user can fill. Include label, type (text/email/password/select/checkbox/radio/textarea/date), required hint if inferable, and placeholder.
86
-
63
+ Every input. Include label, type (text/email/password/select/checkbox/radio/textarea/date), required hint if inferable, placeholder:
87
64
  ```
88
65
  | Label | Type | Required | Placeholder |
89
66
  |---|---|---|---|
90
67
  ```
91
-
92
- Omit entirely (write `_none_`) if no inputs exist.
68
+ Omit (write `_none_`) if no inputs exist.
93
69
 
94
70
  ### 6. Data Columns
95
- If the screen shows a table, list, or card grid — enumerate the columns/fields displayed per row. Otherwise write `_none_`.
71
+ If the screen shows a table/list/card grid — enumerate the columns/fields per row. Otherwise `_none_`.
96
72
 
97
73
  ### 7. Navigation
98
- Outgoing links, tab bars, breadcrumbs, back buttons — anything that moves the user to another screen. Include both explicit navigation components and implicit CTAs that navigate.
99
-
100
- ---
74
+ Outgoing links, tab bars, breadcrumbs, back buttons — anything that moves to another screen. Include explicit nav components and implicit CTAs that navigate.
101
75
 
102
76
  ## Synthesis Workflow
103
77
 
104
78
  1. Read `requirements/spec_figma.md` — note `file_key`, `node_id`, `figma_version_id` from frontmatter
105
79
  2. Read `.sungen/figma-cache/<file_key>/<figma_version_id>/<safe_node_id>-raw.json` (colons in node_id become underscores)
106
- 3. Traverse the tree. Collect: names, types, `characters`, `componentProperties`, `absoluteBoundingBox`
80
+ 3. Traverse the tree. Collect names, types, `characters`, `componentProperties`, `absoluteBoundingBox`
107
81
  4. Produce the 7 sections above
108
82
  5. **Locate the insertion point** in `spec_figma.md`:
109
83
  - **If `<!-- SYNTHESIS-BELOW -->` is present** → replace everything from the marker (inclusive) to EOF with: the marker line, a blank line, then the 7 sections.
110
- - **If the marker is NOT present** (older `spec_figma.md` pre-envelope-refactor, or hand-edited file) → locate the last non-empty line of the envelope (usually the end of `## Screenshots`), append a blank line, then write the marker, another blank line, then the 7 sections. Do NOT delete any existing envelope content.
84
+ - **If the marker is NOT present** (older file or hand-edited) → locate the last non-empty line of the envelope (usually the end of `## Screenshots`), append a blank line, then the marker, another blank line, then the 7 sections. Do NOT delete any envelope content.
111
85
  - **If the file is missing entirely** → advise the user to re-run `sungen add --screen <screen> --figma <url> --refresh` to regenerate the envelope first. Do not fabricate one.
112
86
  6. Preserve the envelope (frontmatter + Frame + Screenshots) byte-for-byte. Never touch content above the marker.
113
87
 
114
- ---
115
-
116
88
  ## Re-synthesis
117
89
 
118
90
  - If the envelope's `figma_version_id` changed → envelope is fresh; re-run synthesis
119
- - If only the narrative is stale (user wants a rewrite) → truncate from marker to EOF and regenerate
91
+ - If only the narrative is stale → truncate from marker to EOF and regenerate
120
92
  - Never edit content ABOVE the marker — that is the scaffolder's territory
121
93
 
122
- ---
123
-
124
94
  ## Selector Heuristics (for downstream `run-test`)
125
95
 
126
96
  During `run-test` Phase 0, provisional selectors can be seeded from the raw JSON:
@@ -135,15 +105,11 @@ During `run-test` Phase 0, provisional selectors can be seeded from the raw JSON
135
105
  | Node name ends `Icon` | `role: img` + `name: "<accessible name>"` |
136
106
 
137
107
  Every provisional entry MUST carry:
138
-
139
108
  ```
140
109
  # @needs-live-verify source=figma node_id=<id>
141
110
  ```
142
-
143
111
  Provisional selectors feed `selectors.yaml` as candidates. `run-test` Phase 0 verifies them against the live page and overwrites incorrect entries.
144
112
 
145
- ---
146
-
147
113
  ## Security
148
114
 
149
115
  - Never include the PAT in `spec_figma.md`, selectors, test data, or any committed file