Also from Kynth Studios
Built for the same person as RuleStack
danielvm-git/bigpowers · .windsurf/rules/generate-allure-report.md · RuleStack
Configs / Windsurf rules / danielvm-git/bigpowers Windsurf rules .windsurf/rules/generate-allure-report.md Generate Allure-ready reports from bigpowers YAML metadata. Reads execution-status.yaml, release-plan.yaml, epic capsules, task YAMLs, cycle-times.yaml, and bug registry to produce allure-results/junit-results.xml, categories.json, and executor.json. Use when preparing progress dashboards, integrating with Allure TestOps, or generating CI reports.
Windsurf rules
Quality
58/100
Scores the file, not the repository. Length
911 words
25 headings · 7 code blocks Repository
139
— · pushed 7 days ago Last changed
14 days ago
First indexed 14 days ago.
Also from Kynth Studios
Built for the same person as RuleStack
danielvm-git/bigpowers/.windsurf/rules/generate-allure-report.md Raw GitHub Copy Sections
Generate Allure Report Quick Start What It Produces Data Sources Verify Handoff generate-allure-report — Reference Data Sources Script Body 1. Read execution-status.yaml Build cycle-times lookup 2. Build JUnit XML Counts for testsuite attributes 3. Build categories.json Add bug-based categories 4. Build executor.json Summary JUnit XML Schema Categories JSON Schema Executor JSON Schema Example Usage Generate reports Verify output Serve with Allure Or open the Allure TestOps UI Stack — with the evidence
Format
Windsurf rules
Cursor's activation model with a different vocabulary — trigger modes instead of rule types — plus hard character caps, which is the one place a format here will silently drop instructions rather than fail loudly.
What the corpus says about it
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
Similar configs Same format, overlapping stack, ranked by quality.
Put this measurement in your README A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/danielvm-git-bigpowers-windsurf-rules-generate-allure-report)Copy markdown Copy HTML
Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain: Copy the shields.io line
Published by Toolproof , the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology , and the whole thing is readable as JSON with no key at /api .
15
```
19 Three files in `allure-results/` :
23 | `junit-results.xml` | One `<testcase>` per story with `<properties>` for risk, security, WSJF, tier, wave, and status. Incomplete stories get a `<failure>` element. |
24 | `categories.json` | Custom Allure categories for filtering by epic, risk level (P0), and security reviews. |
25 | `executor.json` | Build metadata — name, type, version from release-plan.yaml, build order. |
29 See [REFERENCE.md](REFERENCE.md)
34 test -f a llure-results/junit-results.xm l && test -f a llure-results/ca tegories.json && test -f a llure-results/executor.json
39 - next_skill: null (terminal skill — no downstream workflow step)
43 # generate-allure-report — Reference
47 The script reads five YAML sources from the project:
49 | Source | Path | Fields Used |
50 |--------|------|-------------|
51 | Execution status | `specs/execution-status.yaml` | `epics` , `stories` , `development_status` |
52 | Release plan | `specs/release-plan.yaml` | `release.version` , `release.status` , `bugs` summary |
53 | Epic capsules | `specs/epics/**/epic.yaml` + `-tasks.yaml` | Epic metadata, task pass/fail counts |
54 | Cycle times | `specs/metrics/cycle-times.yaml` | Story-level `cycle_minutes` , `bcp_per_hour` , `source` |
55 | Bug registry | `specs/bugs/registry.yaml` | Bug counts by status and severity |
59 `scripts/generate-allure-report.sh` :
64 source & quot; $(dirna m e & quot; ${BASH_SOURCE[0]} & quot; )/lib/p ython-env.sh& quot;
65 ROOT=& quot; $(git rev-p a rse --show-toplevel 2 & gt; /dev/null)& quot; || ROOT=& quot; $(dirna m e & quot; ${BASH_SOURCE[0]} & quot; )/..& quot;
67 mkdir -p & quot; $ROOT /a llure-results& quot;
69 $PYTHON - & quot; $ROOT & quot; & lt; & lt; 'PY'
72 import xm l.etree.Elem entTree a s ET
73 from p a thlib im p ort Pa th
75 root = Pa th(sys.a rgv[1 ])
76 out = root / & quot; a llure-results& quot;
78 # 1. Read execution-status.yaml
79 exec_status_file = root / & quot; sp ecs& quot; / & quot; execution-sta tus.ya m l& quot;
80 release_plan_file = root / & quot; sp ecs& quot; / & quot; relea se-p la n.ya m l& quot;
81 cycle_times_file = root / & quot; sp ecs& quot; / & quot; m etrics& quot; / & quot; cycle-tim es.ya m l& quot;
82 bugs_registry_file = root / & quot; sp ecs& quot; / & quot; bugs& quot; / & quot; registry.ya m l& quot;
84 sys.p a th.insert(0 , str(root / & quot; scrip ts& quot; / & quot; lib& quot; ))
85 from sim p le_ya m l im p ort p a rse_sim p le_ya m l
87 exec_status = p a rse_sim p le_ya m l(exec_sta tus_file.rea d_text()) if exec_sta tus_file.exists() else {}
88 release_plan = p a rse_sim p le_ya m l(relea se_p la n_file.rea d_text()) if relea se_p la n_file.exists() else {}
89 cycle_times = p a rse_sim p le_ya m l(cycle_tim es_file.rea d_text()) if cycle_tim es_file.exists() else {& quot; stories& quot; : []}
90 bugs_registry = p a rse_sim p le_ya m l(bugs_registry_file.rea d_text()) if bugs_registry_file.exists() else {& quot; bugs& quot; : []}
92 # Build cycle-times lookup
94 for ct in cycle_tim es.get(& quot; stories& quot; , []):
95 if isinsta nce(ct, dict):
96 ct_lookup [ct.get(& quot; id& quot; , & quot; & quot; )] = ct
99 stories = exec_sta tus.get(& quot; stories& quot; , {})
101 # Counts for testsuite attributes
102 total_stories = len(stories)
103 incomplete = sum (1 for s in stories.va lues() if isinsta nce(s, dict) a nd s.get(& quot; sta tus& quot; ) != & quot; done & quot; )
105 testsuite = ET.Elem ent(& quot; testsuite& quot; , {
106 & quot; na m e& quot; : & quot; bigp owers-ep ic-p rogress& quot; ,
107 & quot; tests& quot; : str(tota l_stories),
108 & quot; fa ilures& quot; : str(incom p lete),
109 & quot; errors& quot; : & quot; 0 & quot; ,
110 & quot; skip p ed& quot; : & quot; 0 & quot; ,
113 for story_id in sorted(stories.keys()):
114 story = stories[story_id]
115 if not isinsta nce(story, dict):
118 epic_id = story.get(& quot; ep ic& quot; , & quot; unknown& quot; )
119 title = story.get(& quot; title& quot; , story_id)
120 bcps = story.get(& quot; bcp s& quot; , 0 )
121 status = story.get(& quot; sta tus& quot; , & quot; ba cklog& quot; )
122 risk_max = story.get(& quot; risk_m a x& quot; , & quot; none& quot; )
123 security_max = story.get(& quot; security_m a x& quot; , & quot; none& quot; )
125 # Enrich with cycle-times data
126 ct_data = ct_lookup .get(story_id, {})
127 cycle_minutes = ct_da ta .get(& quot; cycle_m inutes& quot; , 0 )
128 bcp_per_hour = ct_da ta .get(& quot; bcp _p er_hour& quot; , 0 )
130 # Time: cycle_minutes * 60 for seconds in Allure display
131 time_seconds = cycle_m inutes * 60.0 if cycle_m inutes else 0.0
133 testcase = ET.SubElem ent(testsuite, & quot; testca se& quot; , {
134 & quot; cla ssna m e& quot; : ep ic_id,
135 & quot; na m e& quot; : f& quot; {story_id}: {title}& quot; ,
136 & quot; tim e& quot; : str(round(tim e_seconds, 3 )),
139 props = ET.SubElem ent(testca se, & quot; p rop erties& quot; )
140 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; risk& quot; , & quot; va lue& quot; : risk_m a x})
141 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; security& quot; , & quot; va lue& quot; : security_m a x})
142 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; bcp s& quot; , & quot; va lue& quot; : str(bcp s)})
143 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; sta tus& quot; , & quot; va lue& quot; : sta tus})
144 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; bcp _p er_hour& quot; , & quot; va lue& quot; : str(bcp _p er_hour)})
145 ET.SubElem ent(p rop s, & quot; p rop erty& quot; , {& quot; na m e& quot; : & quot; lea d_tim e_m inutes& quot; , & quot; va lue& quot; : str(cycle_m inutes)})
147 if sta tus != & quot; done & quot; :
148 ET.SubElem ent(testca se, & quot; fa ilure& quot; , {
149 & quot; m essa ge& quot; : f& quot; Story {story_id} is {sta tus} [risk={risk_m a x}, security={security_m a x}]& quot; ,
150 & quot; typ e& quot; : & quot; StoryIncom p lete& quot;
153 tree = ET.Elem entTree(testsuite)
154 ET.indent(tree, sp a ce=& quot; & quot; )
155 tree.write(str(out / & quot; junit-results.xm l& quot; ), encoding=& quot; utf-8 & quot; , xm l_decla ra tion=True)
157 # 3. Build categories.json
158 epics = exec_sta tus.get(& quot; ep ics& quot; , {})
161 for ep ic_id in sorted(ep ics.keys()):
162 epic = ep ics[ep ic_id]
163 if isinsta nce(ep ic, dict) a nd ep ic.get(& quot; sta tus& quot; ) != & quot; done & quot; :
165 & quot; na m e& quot; : f& quot; Ep ic: {ep ic.get('title' , ep ic_id)}& quot; ,
166 & quot; m a tchedSta tuses& quot; : [& quot; fa iled& quot; ],
167 & quot; m essa geRegex& quot; : f& quot; .*{ep ic_id}:.*& quot;
171 & quot; na m e& quot; : & quot; P0 Risk& quot; ,
172 & quot; m a tchedSta tuses& quot; : [& quot; fa iled& quot; ],
173 & quot; m essa geRegex& quot; : & quot; .*risk.*P0.*& quot;
176 & quot; na m e& quot; : & quot; Security Review& quot; ,
177 & quot; m a tchedSta tuses& quot; : [& quot; fa iled& quot; ],
178 & quot; m essa geRegex& quot; : & quot; .*security.*(?:m edium | high).*& quot;
181 # Add bug-based categories
182 bug_list = bugs_registry.get(& quot; bugs& quot; , [])
183 bug_count = len(bug_list) if isinsta nce(bug_list, list) else 0
184 open_bugs = sum (1 for b in bug_list if isinsta nce(b, dict) a nd b.get(& quot; sta tus& quot; ) not in (& quot; fixed& quot; , & quot; closed& quot; , None))
187 & quot; na m e& quot; : & quot; Op en Bugs& quot; ,
188 & quot; m a tchedSta tuses& quot; : [& quot; fa iled& quot; ],
189 & quot; m essa geRegex& quot; : & quot; .*Bug.*& quot;
192 (out / & quot; ca tegories.json& quot; ).write_text(json.dum p s(ca tegories, indent=2 ))
194 # 4. Build executor.json
195 rl = relea se_p la n.get(& quot; relea se& quot; , {}) if isinsta nce(relea se_p la n.get(& quot; relea se& quot; ), dict) else {}
197 & quot; na m e& quot; : & quot; bigp owers& quot; ,
198 & quot; typ e& quot; : & quot; bigp owers& quot; ,
199 & quot; buildNa m e& quot; : rl.get(& quot; version& quot; , & quot; unknown& quot; ) if isinsta nce(rl, dict) else & quot; unknown& quot; ,
200 & quot; buildOrder& quot; : len(exec_sta tus.get(& quot; develop m ent_sta tus& quot; , {})),
202 (out / & quot; executor.json& quot; ).write_text(json.dum p s(executor, indent=2 ))
205 epic_count = len([e for e in ep ics.va lues() if isinsta nce(e, dict) a nd e.get(& quot; sta tus& quot; ) == & quot; done & quot; ])
206 total_epics = len(ep ics)
207 p rint(f& quot; genera te-a llure-rep ort: {tota l_stories} stories, {ep ic_count}/{tota l_ep ics} ep ics done , {bug_count} bugs& quot; )
208 p rint(f& quot; -& gt; {out}/junit-results.xm l& quot; )
209 p rint(f& quot; -& gt; {out}/ca tegories.json& quot; )
210 p rint(f& quot; -& gt; {out}/executor.json& quot; )
217 <?xml version ="1.0" encoding ="utf-8"?>
218 <testsuite name ="bigpowers-epic-progress" tests ="N" failures ="F" errors ="0" skipped ="0">
219 <testcase classname ="e01" name ="e01s01: Security slopcheck tags" time ="0.75">
221 <property name ="risk" value ="none"/>
222 <property name ="security" value ="none"/>
223 <property name ="bcps" value ="1"/>
224 <property name ="status" value ="done"/>
225 <property name ="bcp_per_hour" value ="1.3"/>
226 <property name ="lead_time_minutes" value ="45"/>
229 <testcase classname ="e01" name ="e01s99: Some incomplete story" time ="0.0">
230 <properties > ...</properties >
231 <failure message ="Story e01s99 is backlog [risk =P0, security =high]" type ="StoryIncomplete"/>
236 ## Categories JSON Schema
241 "name": "Epic: Quality Core - Skill Hardening",
242 "matchedStatuses": [ "failed"] ,
243 "messageRegex": ".*e45: .*"
247 "matchedStatuses": [ "failed"] ,
248 "messageRegex": ".*risk.*P0.*"
251 "name": "Security Review",
252 "matchedStatuses": [ "failed"] ,
253 "messageRegex": ".*security.*(?: medium|high).*"
258 ## Executor JSON Schema
264 "buildName": "2.76 .2 ",
273 bash scrip ts/genera te-a llure-rep ort.sh
276 test -f a llure-results/junit-results.xm l && echo & quot; JUnit OK& quot;
277 test -f a llure-results/ca tegories.json && echo & quot; Ca tegories OK& quot;
278 test -f a llure-results/executor.json && echo & quot; Executor OK& quot;
281 allure serve a llure-results/
283 # Or open the Allure TestOps UI
284 allure op en a llure-results/