@sun-asterisk/sungen 3.2.20-beta.1 → 3.2.20-beta.3

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 (67) hide show
  1. package/dist/cli/commands/audit.d.ts.map +1 -1
  2. package/dist/cli/commands/audit.js +8 -0
  3. package/dist/cli/commands/audit.js.map +1 -1
  4. package/dist/cli/commands/delivery.d.ts.map +1 -1
  5. package/dist/cli/commands/delivery.js +7 -0
  6. package/dist/cli/commands/delivery.js.map +1 -1
  7. package/dist/exporters/matrix/export.d.ts.map +1 -1
  8. package/dist/exporters/matrix/export.js +11 -0
  9. package/dist/exporters/matrix/export.js.map +1 -1
  10. package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
  11. package/dist/exporters/matrix/render-xlsx.js +15 -0
  12. package/dist/exporters/matrix/render-xlsx.js.map +1 -1
  13. package/dist/exporters/matrix/types.d.ts +2 -0
  14. package/dist/exporters/matrix/types.d.ts.map +1 -1
  15. package/dist/exporters/matrix/types.js.map +1 -1
  16. package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
  17. package/dist/exporters/playwright-report-parser.js +1 -0
  18. package/dist/exporters/playwright-report-parser.js.map +1 -1
  19. package/dist/exporters/types.d.ts +2 -0
  20. package/dist/exporters/types.d.ts.map +1 -1
  21. package/dist/harness/audit.d.ts +2 -0
  22. package/dist/harness/audit.d.ts.map +1 -1
  23. package/dist/harness/audit.js +79 -9
  24. package/dist/harness/audit.js.map +1 -1
  25. package/dist/harness/flow-contract.d.ts +71 -0
  26. package/dist/harness/flow-contract.d.ts.map +1 -0
  27. package/dist/harness/flow-contract.js +235 -0
  28. package/dist/harness/flow-contract.js.map +1 -0
  29. package/dist/harness/flow-plan.d.ts +3 -0
  30. package/dist/harness/flow-plan.d.ts.map +1 -1
  31. package/dist/harness/flow-plan.js +6 -2
  32. package/dist/harness/flow-plan.js.map +1 -1
  33. package/dist/harness/parse.d.ts +5 -0
  34. package/dist/harness/parse.d.ts.map +1 -1
  35. package/dist/harness/parse.js +29 -1
  36. package/dist/harness/parse.js.map +1 -1
  37. package/dist/harness/perf.d.ts +40 -0
  38. package/dist/harness/perf.d.ts.map +1 -0
  39. package/dist/harness/perf.js +136 -0
  40. package/dist/harness/perf.js.map +1 -0
  41. package/dist/harness/sensors.d.ts.map +1 -1
  42. package/dist/harness/sensors.js +13 -1
  43. package/dist/harness/sensors.js.map +1 -1
  44. package/dist/harness/spec-coverage.d.ts.map +1 -1
  45. package/dist/harness/spec-coverage.js +22 -3
  46. package/dist/harness/spec-coverage.js.map +1 -1
  47. package/dist/orchestrator/templates/ai-src/commands/add-flow.md +41 -3
  48. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +35 -16
  49. package/dist/orchestrator/templates/qa-context.md +14 -1
  50. package/package.json +3 -3
  51. package/src/cli/commands/audit.ts +8 -0
  52. package/src/cli/commands/delivery.ts +6 -0
  53. package/src/exporters/matrix/export.ts +11 -0
  54. package/src/exporters/matrix/render-xlsx.ts +15 -0
  55. package/src/exporters/matrix/types.ts +2 -0
  56. package/src/exporters/playwright-report-parser.ts +2 -0
  57. package/src/exporters/types.ts +2 -0
  58. package/src/harness/audit.ts +82 -10
  59. package/src/harness/flow-contract.ts +229 -0
  60. package/src/harness/flow-plan.ts +10 -3
  61. package/src/harness/parse.ts +31 -1
  62. package/src/harness/perf.ts +112 -0
  63. package/src/harness/sensors.ts +13 -1
  64. package/src/harness/spec-coverage.ts +19 -2
  65. package/src/orchestrator/templates/ai-src/commands/add-flow.md +41 -3
  66. package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +35 -16
  67. package/src/orchestrator/templates/qa-context.md +14 -1
@@ -605,22 +605,40 @@ error:
605
605
 
606
606
  > **Auto-detect**: if path is `qa/flows/<name>/` → use this section. Skip Steps 1–4 above.
607
607
 
608
+ **Read `requirements/flow-contract.yaml` FIRST — it is the flow's boundary and the yardstick
609
+ `sungen audit` scores the flow against** (`flowCoverage` axis = journey phases HP/ER/EH automated;
610
+ `FLOW-OUTCOME-UNPROVEN`; `FLOW-SCOPE-CREEP`). No contract yet → author it with the user via the
611
+ boundary checklist in `add-flow` (one business goal · clear trigger · ONE observable outcome
612
+ valuable to the actor · name = "Verb + outcome"), THEN generate. **A filled contract is an INPUT —
613
+ never rewrite it to match your output** (same rule as `test-viewpoint.md`).
614
+
608
615
  | Aspect | Screen | Flow |
609
616
  |---|---|---|
610
- | Section focus | UI patterns per section | Journey phases across screens |
617
+ | Section focus | UI patterns per section | Journey phases toward ONE declared outcome |
611
618
  | Selector format | `[Element]` | `[Screen:Element]` (namespaced) |
612
619
  | Test data keys | `{{variable}}` | `{{phase.variable}}` |
613
620
  | Feature tag | `@auto` / `@smoke` etc. | `@flow` (required) |
614
- | Viewpoints | VP-UI/VAL/LOGIC/SEC per section | VP-LOGIC (transitions), VP-SEC (auth persistence), VP-VAL (cross-screen data) |
621
+ | Scenario ids | `VP-<CATEGORY>-NNN` | `FL-<PHASE>-NNN` phases: `HP` (happy path), `ER` (error recovery), `EH` (guards), `UI` (journey UI states, optional) |
615
622
 
616
- **Scenarios to generate:**
623
+ **Scenarios to generate — every phase demanded by the contract, automated:**
617
624
 
618
- | Category | What to test |
619
- |---|---|
620
- | Happy path | Complete flow end-to-end with valid data |
621
- | Auth persistence | Auth state maintained across screen transitions |
622
- | Error recovery | Invalid input mid-flow fixcontinue |
623
- | Cross-screen data | Data entered on screen A visible on screen B |
625
+ | Phase | What to test | Scoring |
626
+ |---|---|---|
627
+ | `FL-HP` happy path | The complete journey ending in the contract's `outcome.assertion` — an AUTOMATED **data** assertion on `outcome.screen` (an order number, a summed total — not just "page visible"). This scenario is WHY the flow exists: it is the regression proof after a lib/framework upgrade. | uncovered → `flowCoverage` drops + `FLOW-OUTCOME-UNPROVEN` |
628
+ | `FL-ER` error recovery | Invalid input mid-flow error shown → fix → the journey still completes. Validation must not trap the journey. | uncovered → `flowCoverage` drops |
629
+ | `FL-EH` guards | Direct URL access without the precondition · browser back · refresh · expired context — each ends in a safe observable state. | uncovered `flowCoverage` drops |
630
+ | Cross-screen handoff | After every screen transition, assert the CARRIED state on the new screen (the added product's name in the cart, the email echoed on the sent screen). | blind tails cap `businessDepth` (`FLOW-HANDOFF-SHALLOW`) |
631
+ | Stateful regression (when `stateful:` declared) | Count/quantity proof · teardown (remove → empty) · multi-source add. | missing dims cap `businessDepth` (`FLOW-DEPTH`) |
632
+
633
+ **Boundary discipline while generating:** every scenario must serve the contract's goal. A scenario
634
+ that never touches `outcome.screen` and is not a guard (`EH`) or error-recovery (`ER`) belongs in a
635
+ DIFFERENT flow — propose the split instead of writing it here (`FLOW-SCOPE-CREEP` will flag it).
636
+ Auth persistence across transitions is part of `EH` unless the project declares it its own phase.
637
+
638
+ **Manual in flows**: always `@manual:Mx` with the reason code — bare `@manual` is flagged
639
+ (`MANUAL-CODE-MISSING`) because the capability planner cannot route it. Typical flow deferrals:
640
+ inbox/mail oracle → `M5`, network-request count → `M3`, context expiry control → `M7`. A
641
+ cross-screen scenario inside the flow's own goal is NOT manual — automate it here.
624
642
 
625
643
  ```gherkin
626
644
  @flow @auth:user
@@ -630,19 +648,20 @@ Feature: Award Submission Flow
630
648
  Given User is on [Login] page
631
649
 
632
650
  @high
633
- Scenario: User logs in successfully
651
+ Scenario: FL-HP-001 A signed-in user's nomination is submitted and confirmed
634
652
  When User fill [Login:Email] field with {{login.email}}
635
653
  And User fill [Login:Password] field with {{login.password}}
636
654
  And User click [Login:Submit] button
637
655
  Then User see [Dashboard] page
638
-
639
- @high
640
- Scenario: User submits nomination
641
656
  When User click [Dashboard:Awards] link
642
- Then User see [Awards] page
643
- When User fill [Awards:Nominee] field with {{submission.nominee}}
657
+ And User fill [Awards:Nominee] field with {{submission.nominee}}
644
658
  And User click [Awards:Submit] button
645
- Then User see {{success_message}} message
659
+ Then User see [Awards:Success Message] text with {{success_message}}
660
+
661
+ @high
662
+ Scenario: FL-EH-001 Direct access to the award form without login redirects to login
663
+ When User go to [Awards] page
664
+ Then User see [Login] page
646
665
  ```
647
666
 
648
667
  ```yaml
@@ -45,8 +45,21 @@ Example:
45
45
 
46
46
  ## Testing Strategy
47
47
 
48
+ Machine-readable intent — `sungen audit` reads these keys (Intent Profile). Values here are
49
+ live even when the surrounding text changes; an invalid value silently falls back to the default.
50
+
51
+ focus: functional
52
+ <!-- focus: functional | e-commerce | security | smoke — drives the audit's depth threshold -->
53
+
54
+ risk_tier: normal
55
+ <!-- risk_tier: high | normal | low -->
56
+
57
+ To silence driver suggestions in audit findings, add a line: capability_suggestions with value off.
58
+
48
59
  **Focus areas** — what to cover thoroughly:
49
- <!-- List from: functional, security, ui, accessibility, performance -->
60
+ <!-- Prose for humans; the parseable value is the `focus:` key above.
61
+ Response-time budgets are NOT a focus value — declare them in qa/perf.yaml
62
+ (percentile + scenario_ms budgets; reported by `sungen delivery`). -->
50
63
  <!-- Example: functional, security -->
51
64
 
52
65
  **Mandatory coverage:**