@kiwidata/grimoire 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +8 -0
- package/AGENTS.md +217 -0
- package/README.md +748 -0
- package/bin/grimoire.js +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +42 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.d.ts +3 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +22 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/branch-check.d.ts +3 -0
- package/dist/commands/branch-check.d.ts.map +1 -0
- package/dist/commands/branch-check.js +16 -0
- package/dist/commands/branch-check.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +22 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +3 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +18 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +10 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/docs.d.ts +3 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +11 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +13 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +21 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +15 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/map.d.ts +3 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +17 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +17 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +12 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test-quality.d.ts +3 -0
- package/dist/commands/test-quality.d.ts.map +1 -0
- package/dist/commands/test-quality.js +37 -0
- package/dist/commands/test-quality.js.map +1 -0
- package/dist/commands/trace.d.ts +3 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +12 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +22 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +17 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/archive.d.ts +9 -0
- package/dist/core/archive.d.ts.map +1 -0
- package/dist/core/archive.js +92 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/branch-check.d.ts +27 -0
- package/dist/core/branch-check.d.ts.map +1 -0
- package/dist/core/branch-check.js +205 -0
- package/dist/core/branch-check.js.map +1 -0
- package/dist/core/check.d.ts +24 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +372 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/ci.d.ts +24 -0
- package/dist/core/ci.d.ts.map +1 -0
- package/dist/core/ci.js +162 -0
- package/dist/core/ci.js.map +1 -0
- package/dist/core/detect.d.ts +10 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +368 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/diff.d.ts +29 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +197 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/doc-style.d.ts +16 -0
- package/dist/core/doc-style.d.ts.map +1 -0
- package/dist/core/doc-style.js +192 -0
- package/dist/core/doc-style.js.map +1 -0
- package/dist/core/docs.d.ts +6 -0
- package/dist/core/docs.d.ts.map +1 -0
- package/dist/core/docs.js +478 -0
- package/dist/core/docs.js.map +1 -0
- package/dist/core/health.d.ts +7 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +489 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/hooks.d.ts +5 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +168 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/init.d.ts +9 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +563 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/list.d.ts +4 -0
- package/dist/core/list.d.ts.map +1 -0
- package/dist/core/list.js +170 -0
- package/dist/core/list.js.map +1 -0
- package/dist/core/log.d.ts +8 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +150 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/map.d.ts +9 -0
- package/dist/core/map.d.ts.map +1 -0
- package/dist/core/map.js +302 -0
- package/dist/core/map.js.map +1 -0
- package/dist/core/pr.d.ts +9 -0
- package/dist/core/pr.d.ts.map +1 -0
- package/dist/core/pr.js +273 -0
- package/dist/core/pr.js.map +1 -0
- package/dist/core/shared-setup.d.ts +52 -0
- package/dist/core/shared-setup.d.ts.map +1 -0
- package/dist/core/shared-setup.js +221 -0
- package/dist/core/shared-setup.js.map +1 -0
- package/dist/core/status.d.ts +6 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +114 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/test-quality.d.ts +33 -0
- package/dist/core/test-quality.d.ts.map +1 -0
- package/dist/core/test-quality.js +378 -0
- package/dist/core/test-quality.js.map +1 -0
- package/dist/core/trace.d.ts +6 -0
- package/dist/core/trace.d.ts.map +1 -0
- package/dist/core/trace.js +211 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/core/update.d.ts +10 -0
- package/dist/core/update.d.ts.map +1 -0
- package/dist/core/update.js +149 -0
- package/dist/core/update.js.map +1 -0
- package/dist/core/validate.d.ts +20 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +275 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +61 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +172 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +17 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +38 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +35 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/spawn.d.ts +5 -0
- package/dist/utils/spawn.d.ts.map +1 -0
- package/dist/utils/spawn.js +34 -0
- package/dist/utils/spawn.js.map +1 -0
- package/package.json +68 -0
- package/skills/grimoire-apply/SKILL.md +274 -0
- package/skills/grimoire-audit/SKILL.md +129 -0
- package/skills/grimoire-branch-guard/SKILL.md +111 -0
- package/skills/grimoire-bug/SKILL.md +160 -0
- package/skills/grimoire-bug-explore/SKILL.md +242 -0
- package/skills/grimoire-bug-report/SKILL.md +237 -0
- package/skills/grimoire-bug-session/SKILL.md +222 -0
- package/skills/grimoire-bug-triage/SKILL.md +274 -0
- package/skills/grimoire-commit/SKILL.md +150 -0
- package/skills/grimoire-discover/SKILL.md +297 -0
- package/skills/grimoire-draft/SKILL.md +202 -0
- package/skills/grimoire-plan/SKILL.md +329 -0
- package/skills/grimoire-pr/SKILL.md +134 -0
- package/skills/grimoire-pr-review/SKILL.md +240 -0
- package/skills/grimoire-refactor/SKILL.md +251 -0
- package/skills/grimoire-remove/SKILL.md +112 -0
- package/skills/grimoire-review/SKILL.md +247 -0
- package/skills/grimoire-verify/SKILL.md +223 -0
- package/skills/references/bug-classification.md +154 -0
- package/skills/references/build-vs-buy.md +77 -0
- package/skills/references/elicitation-personas.md +118 -0
- package/skills/references/refactor-register-format.md +88 -0
- package/skills/references/refactor-scan-categories.md +102 -0
- package/skills/references/schema-format.md +68 -0
- package/skills/references/security-compliance.md +110 -0
- package/skills/references/testing-contracts.md +93 -0
- package/templates/context.yml +110 -0
- package/templates/debt-exceptions.yml +61 -0
- package/templates/decision.md +50 -0
- package/templates/dupignore +93 -0
- package/templates/example.feature +24 -0
- package/templates/manifest.md +29 -0
- package/templates/mapignore +58 -0
- package/templates/mapkeys +65 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grimoire-bug-report
|
|
3
|
+
description: Structured bug reporting for testers. Guides creation of reproducible, context-rich bug reports that link to existing feature specs. Accepts output from testing tools (Playwright, Cypress, etc.) via MCP or directly. Use when a tester or non-developer needs to file a bug.
|
|
4
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
5
|
+
metadata:
|
|
6
|
+
author: kiwi-data
|
|
7
|
+
version: "0.1"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# grimoire-bug-report
|
|
11
|
+
|
|
12
|
+
Guided bug reporting workflow for testers. Produces structured, reproducible bug reports that developers can act on without back-and-forth. Can ingest test tool output (Playwright traces, Cypress screenshots, API responses, performance reports) to auto-populate reports.
|
|
13
|
+
|
|
14
|
+
## Triggers
|
|
15
|
+
- A tester or non-developer wants to report a bug
|
|
16
|
+
- User says "report a bug", "file a bug", "I found a bug"
|
|
17
|
+
- User pastes test output, a failing test trace, or a screenshot from a testing tool
|
|
18
|
+
- Loose match: "bug report", "report issue", "found a problem", "something's wrong", "test failed"
|
|
19
|
+
|
|
20
|
+
## Routing
|
|
21
|
+
- Developer wanting to fix a bug → `grimoire-bug`
|
|
22
|
+
- Developer investigating/triaging → `grimoire-bug-triage`
|
|
23
|
+
- Looking for test gaps proactively → `grimoire-bug-explore`
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
- A grimoire project (`.grimoire/config.yaml` exists)
|
|
27
|
+
- Ideally, feature files exist in `features/` so the report can reference violated specs
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
### 1. Check for Test Tool Input
|
|
32
|
+
|
|
33
|
+
Before starting the interview, check if the reporter is providing output from a testing tool:
|
|
34
|
+
|
|
35
|
+
**MCP-connected testing tools** — read `.grimoire/config.yaml` for `testing_tools` with MCP servers configured. If a Playwright MCP, Cypress, or other testing tool is available:
|
|
36
|
+
- Offer to pull the latest test results, screenshots, traces, or failure logs directly
|
|
37
|
+
- Use the MCP tools to get structured failure data (failed assertions, screenshots, network logs, console errors)
|
|
38
|
+
- Auto-extract: what failed, reproduction steps (from the test), environment details, and evidence
|
|
39
|
+
|
|
40
|
+
**Direct test output** — if the reporter pastes or provides:
|
|
41
|
+
- Playwright/Cypress test output → extract the failing test name, assertion, screenshot paths, and trace URL
|
|
42
|
+
- API test output (Postman, Bruno, curl) → extract endpoint, status code, request/response bodies
|
|
43
|
+
- Performance test output (k6, Artillery, Lighthouse) → extract metrics, thresholds breached, and resource URLs
|
|
44
|
+
- Any structured test report (JUnit XML, JSON) → extract failing test cases and error messages
|
|
45
|
+
|
|
46
|
+
**If test tool input is available**, pre-fill as much of the report as possible and confirm with the reporter rather than asking them to re-describe what the tool already captured. Skip to step 1b for any gaps.
|
|
47
|
+
|
|
48
|
+
### 1b. Gather Bug Details (Interview)
|
|
49
|
+
|
|
50
|
+
Walk the reporter through a structured interview for anything not already captured from test tools. Ask these one section at a time — don't dump a template and ask them to fill it out.
|
|
51
|
+
|
|
52
|
+
**What happened?**
|
|
53
|
+
- What did you observe? (actual behavior)
|
|
54
|
+
- What did you expect instead? (expected behavior)
|
|
55
|
+
|
|
56
|
+
**How do you trigger it?**
|
|
57
|
+
- Step-by-step reproduction: what actions, in what order?
|
|
58
|
+
- Is it consistent or intermittent?
|
|
59
|
+
|
|
60
|
+
**Where does it happen?**
|
|
61
|
+
- Which page, endpoint, feature area, or workflow?
|
|
62
|
+
- What environment? (see Environment section below)
|
|
63
|
+
|
|
64
|
+
**How bad is it?**
|
|
65
|
+
- **critical** — blocks a core workflow, data loss, security issue
|
|
66
|
+
- **major** — significant feature broken, no workaround
|
|
67
|
+
- **minor** — feature works but behaves incorrectly in an edge case
|
|
68
|
+
- **cosmetic** — visual or text issue, no functional impact
|
|
69
|
+
|
|
70
|
+
**How often does it happen?**
|
|
71
|
+
- **always** — reproduces every time
|
|
72
|
+
- **intermittent** — reproduces sometimes (ask: roughly what percentage? any pattern?)
|
|
73
|
+
- **rare** — happened once or twice, hard to reproduce
|
|
74
|
+
- Intermittent and rare bugs need different investigation strategies — capturing frequency early saves time later.
|
|
75
|
+
|
|
76
|
+
**Is this a regression?**
|
|
77
|
+
- **yes** — "this used to work" (ask: when did it last work? what changed?)
|
|
78
|
+
- **no** — never worked, or new feature
|
|
79
|
+
- **unknown** — not sure
|
|
80
|
+
|
|
81
|
+
If yes, this changes priority — regressions mean something broke that was previously working, which usually points to a specific change.
|
|
82
|
+
|
|
83
|
+
**Is there a workaround?**
|
|
84
|
+
- If the reporter has found a way to accomplish their goal despite the bug, capture it explicitly — this unblocks the team while the fix is pending.
|
|
85
|
+
- Example: "I can export as PDF instead of CSV" or "clearing the cache fixes it temporarily."
|
|
86
|
+
|
|
87
|
+
**How many users are affected?**
|
|
88
|
+
- **one user** — specific account or configuration
|
|
89
|
+
- **some users** — a subset (ask: what do affected users have in common?)
|
|
90
|
+
- **all users** — everyone hitting this flow
|
|
91
|
+
- This is a severity multiplier — a minor bug affecting all users may outrank a major bug affecting one.
|
|
92
|
+
|
|
93
|
+
If the reporter provides screenshots, logs, error messages, or network traces — capture those references. Don't require them, but note what's available.
|
|
94
|
+
|
|
95
|
+
### 1c. Security Screening
|
|
96
|
+
|
|
97
|
+
After gathering details, check whether this might be a security issue. Look for signals in what the reporter described:
|
|
98
|
+
|
|
99
|
+
- **Authentication/authorization bypass** — accessing something they shouldn't, or acting as another user
|
|
100
|
+
- **Data exposure** — seeing other users' data, PII in logs, sensitive info in error messages
|
|
101
|
+
- **Injection** — unusual characters causing unexpected behavior (SQL, XSS, command injection)
|
|
102
|
+
- **Credential/secret exposure** — API keys, tokens, or passwords visible in UI, URLs, or logs
|
|
103
|
+
- **Privilege escalation** — performing actions above their role (e.g., normal user accessing admin functions)
|
|
104
|
+
- **Denial of service** — actions that crash or freeze the system for other users
|
|
105
|
+
|
|
106
|
+
**If any security signals are detected:**
|
|
107
|
+
|
|
108
|
+
1. **Warn the reporter** — "This looks like it might be a security issue. Security bugs need special handling to avoid exposing the vulnerability before it's fixed."
|
|
109
|
+
2. **Set `security: true`** in the report frontmatter
|
|
110
|
+
3. **Don't include exploit details in public trackers** — if the team's bug tracker is public (e.g., public GitHub repo), note that the full reproduction steps are in the local report only. The external ticket should describe the impact without providing a step-by-step exploit guide.
|
|
111
|
+
4. **Flag for priority triage** — security issues should skip the queue
|
|
112
|
+
|
|
113
|
+
The reporter doesn't need to make the security determination themselves. This screening happens automatically based on the described behavior. If in doubt, flag it — it's better to over-flag and have triage clear it than to miss a real vulnerability.
|
|
114
|
+
|
|
115
|
+
### 2. Match to Feature Specs
|
|
116
|
+
|
|
117
|
+
Search `features/` for scenarios that describe the expected behavior:
|
|
118
|
+
|
|
119
|
+
1. Read feature files in the area the bug relates to
|
|
120
|
+
2. Identify which scenario(s) the bug violates — quote the specific scenario name(s)
|
|
121
|
+
3. If no scenario covers this behavior, note it as a **spec gap** — this is valuable information for triage
|
|
122
|
+
|
|
123
|
+
This step is what makes grimoire bug reports better than plain text. Linking a bug to its spec removes ambiguity about what "correct" means.
|
|
124
|
+
|
|
125
|
+
### 3. Check for Duplicates
|
|
126
|
+
|
|
127
|
+
Before writing the report:
|
|
128
|
+
1. Check `.grimoire/bugs/` for existing reports in the same area
|
|
129
|
+
2. Check `.grimoire/changes/` for any active bug fixes that might address this
|
|
130
|
+
3. If bug trackers are configured in `.grimoire/config.yaml` (`bug_trackers` with MCP), search the external tracker for similar issues
|
|
131
|
+
4. Search git log for recent commits mentioning the same area
|
|
132
|
+
5. If a potential duplicate exists, flag it to the reporter and ask if it's the same issue
|
|
133
|
+
|
|
134
|
+
### 4. Write the Bug Report
|
|
135
|
+
|
|
136
|
+
Create `.grimoire/bugs/<bug-id>/report.md`:
|
|
137
|
+
|
|
138
|
+
```markdown
|
|
139
|
+
---
|
|
140
|
+
id: <bug-id>
|
|
141
|
+
status: reported
|
|
142
|
+
severity: <critical|major|minor|cosmetic>
|
|
143
|
+
frequency: <always|intermittent|rare>
|
|
144
|
+
regression: <yes|no|unknown>
|
|
145
|
+
security: <true|false>
|
|
146
|
+
environment: <dev|qa|staging|production>
|
|
147
|
+
affected-users: <one|some|all>
|
|
148
|
+
reported-by: <name or role>
|
|
149
|
+
date: <YYYY-MM-DD>
|
|
150
|
+
area: <feature area>
|
|
151
|
+
source: <manual|playwright|cypress|postman|k6|other>
|
|
152
|
+
ticket: <external ticket URL or ID, if created>
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
# Bug: <short descriptive title>
|
|
156
|
+
|
|
157
|
+
## What Happens
|
|
158
|
+
<Actual behavior — what the reporter observed>
|
|
159
|
+
|
|
160
|
+
## What Should Happen
|
|
161
|
+
<Expected behavior — ideally referencing a feature spec>
|
|
162
|
+
|
|
163
|
+
## Reproduction Steps
|
|
164
|
+
1. <step>
|
|
165
|
+
2. <step>
|
|
166
|
+
3. <step>
|
|
167
|
+
|
|
168
|
+
## Environment
|
|
169
|
+
- **Target**: <dev|qa|staging|production>
|
|
170
|
+
- **Browser/Client**: <browser, OS, API client, mobile device>
|
|
171
|
+
- **Config**: <relevant feature flags, user role, tenant, data conditions>
|
|
172
|
+
- **Version/Build**: <commit SHA, release tag, deploy timestamp — whatever identifies the build>
|
|
173
|
+
|
|
174
|
+
## Violated Specs
|
|
175
|
+
<!-- Which feature scenarios describe the expected behavior? -->
|
|
176
|
+
- `features/<area>/<file>.feature`: "Scenario name"
|
|
177
|
+
<!-- Or: No existing scenario covers this behavior (spec gap) -->
|
|
178
|
+
|
|
179
|
+
## Evidence
|
|
180
|
+
<!-- Screenshots, logs, error messages, network traces — whatever the reporter provided -->
|
|
181
|
+
<!-- For test tool output: include trace URLs, screenshot paths, assertion details -->
|
|
182
|
+
- <evidence description and location>
|
|
183
|
+
|
|
184
|
+
## Test Tool Output
|
|
185
|
+
<!-- Omit this section if the bug was reported manually -->
|
|
186
|
+
- **Tool**: <playwright|cypress|postman|k6|other>
|
|
187
|
+
- **Test**: <test name or ID that failed>
|
|
188
|
+
- **Assertion**: <what the test expected vs what it got>
|
|
189
|
+
- **Artifacts**: <paths to screenshots, traces, HAR files, recordings>
|
|
190
|
+
|
|
191
|
+
## Workaround
|
|
192
|
+
<!-- Omit if none. Capture any way the reporter can accomplish their goal despite the bug. -->
|
|
193
|
+
<workaround or "None known">
|
|
194
|
+
|
|
195
|
+
## Reporter Notes
|
|
196
|
+
<!-- Anything else the reporter mentioned — related issues, context -->
|
|
197
|
+
<notes>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Bug ID format:** `bug-<short-description>` (kebab-case, e.g., `bug-login-timeout-on-2fa`, `bug-csv-export-missing-headers`)
|
|
201
|
+
|
|
202
|
+
### 5. Confirm with Reporter
|
|
203
|
+
|
|
204
|
+
Show the completed report to the reporter and ask:
|
|
205
|
+
- Does this accurately describe what you saw?
|
|
206
|
+
- Anything to add or correct?
|
|
207
|
+
|
|
208
|
+
Make edits if needed. The goal is that a developer can pick this up without needing to ask the reporter any questions.
|
|
209
|
+
|
|
210
|
+
### 6. Notify
|
|
211
|
+
|
|
212
|
+
Check `.grimoire/config.yaml` for configured `bug_trackers` with MCP servers. If available:
|
|
213
|
+
- Create a ticket/issue in the configured tracker from the report
|
|
214
|
+
- Link the local bug report to the external ticket (update the `ticket:` field in frontmatter)
|
|
215
|
+
- Post a notification to the relevant channel if a communication MCP is available
|
|
216
|
+
|
|
217
|
+
If multiple bug trackers are configured, ask which one to use for this report.
|
|
218
|
+
|
|
219
|
+
**Security reports get special handling:**
|
|
220
|
+
- If the bug tracker is public (e.g., public GitHub repo), do NOT create a public ticket. Use GitHub's private security advisory feature, or create the ticket in a private tracker only.
|
|
221
|
+
- The external ticket should describe the **impact** ("users can access other users' data") without the **exploit** ("by changing the user_id parameter in the URL to another user's ID").
|
|
222
|
+
- Full reproduction steps stay in the local `.grimoire/bugs/` report only.
|
|
223
|
+
- If a private security channel exists (e.g., `#security` Slack channel, private Jira project), notify there instead of the general channel.
|
|
224
|
+
|
|
225
|
+
If no MCP tools are configured, tell the reporter the report is at `.grimoire/bugs/<bug-id>/report.md` and they can share it however they normally would.
|
|
226
|
+
|
|
227
|
+
## Important
|
|
228
|
+
- **The reporter is not a developer.** Don't ask for stack traces, code references, or technical root causes. Ask for what they saw and how to see it again.
|
|
229
|
+
- **Don't diagnose during reporting.** This skill captures the bug. Diagnosis happens in `grimoire-bug-triage`.
|
|
230
|
+
- **Severity is the reporter's assessment.** The developer may reclassify during triage, and that's fine.
|
|
231
|
+
- **Environment matters.** A bug on production is different from a bug on dev. Always capture which environment.
|
|
232
|
+
- **Link to specs, not code.** Feature files are readable by testers. Source code references are not helpful here.
|
|
233
|
+
- **One bug per report.** If the reporter describes multiple issues, create separate reports.
|
|
234
|
+
- **Test tool output is evidence, not the report.** Even with rich test output, the report should be human-readable. The test output goes in the Evidence/Test Tool Output sections.
|
|
235
|
+
|
|
236
|
+
## Done
|
|
237
|
+
When the report is confirmed by the reporter and saved to `.grimoire/bugs/`, the workflow is complete. Suggest `grimoire-bug-triage` to classify and route the bug.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grimoire-bug-session
|
|
3
|
+
description: Guided exploratory testing sessions with charter, progress tracking, session notes, and debrief. Use when a tester wants to spend focused time exploring an area of the application.
|
|
4
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
5
|
+
metadata:
|
|
6
|
+
author: kiwi-data
|
|
7
|
+
version: "0.1"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# grimoire-bug-session
|
|
11
|
+
|
|
12
|
+
Guided exploratory testing sessions. Create a charter, track coverage as you work, take notes, file bugs inline, and produce a session debrief when the timebox expires. This is the difference between "I poked around for an hour" and "I systematically explored auth for 45 minutes and here's what I found."
|
|
13
|
+
|
|
14
|
+
## Triggers
|
|
15
|
+
- User wants to do a focused exploratory testing session
|
|
16
|
+
- User says "start a testing session", "explore [area] for [time]", "session-based testing"
|
|
17
|
+
- Loose match: "testing session", "session charter", "timebox testing", "exploratory session", "let's explore"
|
|
18
|
+
|
|
19
|
+
## Routing
|
|
20
|
+
- Want AI analysis of specs/code without interactive testing → `grimoire-bug-explore`
|
|
21
|
+
- Want to file a specific bug → `grimoire-bug-report`
|
|
22
|
+
- Want to fix a bug → `grimoire-bug`
|
|
23
|
+
|
|
24
|
+
## Prerequisites
|
|
25
|
+
- A grimoire project with feature files in `features/`
|
|
26
|
+
- Ideally, a previous `grimoire-bug-explore` run or knowledge of what areas are risky (but not required)
|
|
27
|
+
|
|
28
|
+
## Workflow
|
|
29
|
+
|
|
30
|
+
### 1. Create the Charter
|
|
31
|
+
|
|
32
|
+
A session charter defines the mission before the tester starts clicking. Ask the tester:
|
|
33
|
+
|
|
34
|
+
**Mission** — What are you trying to learn or find?
|
|
35
|
+
- "Find edge cases in the checkout flow"
|
|
36
|
+
- "Explore what happens with large datasets in reporting"
|
|
37
|
+
- "Test the new auth changes for regressions"
|
|
38
|
+
|
|
39
|
+
If the tester isn't sure, help them pick a mission based on:
|
|
40
|
+
- Areas flagged by `grimoire-bug-explore` (if a findings report exists)
|
|
41
|
+
- Recent changes (`git log --since="1 week ago"`)
|
|
42
|
+
- Open bugs in `.grimoire/bugs/` that might indicate broader issues
|
|
43
|
+
- Areas with sparse automation coverage (feature files with few or no step definitions)
|
|
44
|
+
|
|
45
|
+
**Scope** — What's in bounds and what's out?
|
|
46
|
+
- In: specific feature areas, pages, workflows, API endpoints
|
|
47
|
+
- Out: explicitly exclude areas that aren't the focus (reduces scope creep)
|
|
48
|
+
|
|
49
|
+
**Timebox** — How long?
|
|
50
|
+
- Suggest 30-60 minutes for focused sessions. Shorter than 20 minutes is too shallow; longer than 90 minutes leads to fatigue.
|
|
51
|
+
- The timebox is a guide, not a hard stop. But the skill will prompt a wrap-up when time is close.
|
|
52
|
+
|
|
53
|
+
**Risk areas** — What are you especially watching for?
|
|
54
|
+
- Performance under load, data integrity, permission bypasses, error handling, cross-browser issues
|
|
55
|
+
- Pull from `grimoire-bug-explore` findings if available
|
|
56
|
+
|
|
57
|
+
Create the session directory and charter:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
.grimoire/sessions/<session-id>/charter.md
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
---
|
|
65
|
+
id: <session-id>
|
|
66
|
+
status: active
|
|
67
|
+
tester: <name or role>
|
|
68
|
+
started: <YYYY-MM-DD HH:MM>
|
|
69
|
+
timebox: <N> minutes
|
|
70
|
+
area: <feature area>
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
# Session: <mission summary>
|
|
74
|
+
|
|
75
|
+
## Mission
|
|
76
|
+
<What are we trying to learn or find?>
|
|
77
|
+
|
|
78
|
+
## Scope
|
|
79
|
+
- **In**: <what's included>
|
|
80
|
+
- **Out**: <what's excluded>
|
|
81
|
+
|
|
82
|
+
## Risk Areas
|
|
83
|
+
- <specific risks to watch for>
|
|
84
|
+
|
|
85
|
+
## Test Ideas
|
|
86
|
+
<!-- Seeded from explore findings, specs, and risk areas -->
|
|
87
|
+
- [ ] <test idea 1>
|
|
88
|
+
- [ ] <test idea 2>
|
|
89
|
+
- [ ] <test idea 3>
|
|
90
|
+
- [ ] <test idea 4>
|
|
91
|
+
- [ ] <test idea 5>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Session ID format:** `session-<area>-<YYYYMMDD>` (e.g., `session-auth-20260411`, `session-checkout-20260411`)
|
|
95
|
+
|
|
96
|
+
### 2. Seed Test Ideas
|
|
97
|
+
|
|
98
|
+
Before the tester starts, generate a list of things to try based on:
|
|
99
|
+
|
|
100
|
+
1. **Feature specs** — read scenarios in the scoped area. For each happy path, suggest the corresponding negative/edge cases (same analysis as `grimoire-bug-explore` step 2, but targeted to the session scope).
|
|
101
|
+
|
|
102
|
+
2. **Automation coverage** — check which scenarios have step definitions and which don't. Prioritize manually testing what isn't automated.
|
|
103
|
+
|
|
104
|
+
3. **Explore findings** — if a `grimoire-bug-explore` report exists for this area, pull in the flagged gaps as test ideas.
|
|
105
|
+
|
|
106
|
+
4. **Recent changes** — `git log` the area's implementation files. Recent changes → specific things to test.
|
|
107
|
+
|
|
108
|
+
5. **Open bugs** — check `.grimoire/bugs/` for reports in this area. Related bugs suggest patterns to probe.
|
|
109
|
+
|
|
110
|
+
Add these as checkable items in the charter. The tester can add their own as they go.
|
|
111
|
+
|
|
112
|
+
### 3. Track Progress During the Session
|
|
113
|
+
|
|
114
|
+
As the tester works, they'll report what they're doing and finding. Track this in real time:
|
|
115
|
+
|
|
116
|
+
**When the tester reports trying something:**
|
|
117
|
+
- Check off the test idea if it matches one in the charter
|
|
118
|
+
- Update the coverage map: "you've covered 4 of 7 test ideas in this area"
|
|
119
|
+
- Suggest what's left: "you haven't tried the error cases yet — want to explore those next?"
|
|
120
|
+
|
|
121
|
+
**When the tester finds something interesting:**
|
|
122
|
+
- Capture it as a session note in `.grimoire/sessions/<session-id>/notes.md`:
|
|
123
|
+
```markdown
|
|
124
|
+
## Notes
|
|
125
|
+
|
|
126
|
+
### <HH:MM> — <short description>
|
|
127
|
+
<what the tester observed>
|
|
128
|
+
<why it's interesting>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**When the tester finds a bug:**
|
|
132
|
+
- Offer to file it immediately via `grimoire-bug-report` (the session context pre-fills the report: area, environment, what they were doing)
|
|
133
|
+
- Track it in the session: "Bug filed: `bug-<id>` — <title>"
|
|
134
|
+
- Don't interrupt the session flow — file quickly and keep exploring
|
|
135
|
+
|
|
136
|
+
**When the tester goes off-charter:**
|
|
137
|
+
- This is fine — exploratory testing should follow interesting threads. Note the detour but don't block it.
|
|
138
|
+
- If they've strayed far from the mission, gently note it: "You've moved into the reporting area — that's outside the session scope. Want to add it to scope or note it for a separate session?"
|
|
139
|
+
|
|
140
|
+
### 4. Timebox Management
|
|
141
|
+
|
|
142
|
+
LLMs cannot track wall-clock time. Use interaction counting as a proxy:
|
|
143
|
+
|
|
144
|
+
- **Set a checkpoint interval** at charter creation: every N interactions (suggest 8-10), pause and summarize progress.
|
|
145
|
+
- **At each checkpoint**: report test ideas covered vs remaining, suggest what to prioritize next.
|
|
146
|
+
- **After 3 checkpoints** (or when the user signals): prompt wrap-up and debrief.
|
|
147
|
+
- **The user controls pacing.** They can say "keep going", "wrap up", or "extend". The skill tracks coverage, not the clock.
|
|
148
|
+
|
|
149
|
+
### 5. Generate Session Debrief
|
|
150
|
+
|
|
151
|
+
When the session ends (timebox or tester decides to stop), produce a structured debrief:
|
|
152
|
+
|
|
153
|
+
Create `.grimoire/sessions/<session-id>/debrief.md`:
|
|
154
|
+
|
|
155
|
+
```markdown
|
|
156
|
+
---
|
|
157
|
+
id: <session-id>
|
|
158
|
+
status: completed
|
|
159
|
+
tester: <name or role>
|
|
160
|
+
started: <YYYY-MM-DD HH:MM>
|
|
161
|
+
ended: <YYYY-MM-DD HH:MM>
|
|
162
|
+
duration: <actual minutes>
|
|
163
|
+
area: <feature area>
|
|
164
|
+
bugs-filed: <count>
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# Session Debrief: <mission summary>
|
|
168
|
+
|
|
169
|
+
## Coverage
|
|
170
|
+
- Test ideas completed: <N> of <total>
|
|
171
|
+
- Test ideas skipped: <list with reasons>
|
|
172
|
+
- Areas explored outside charter: <list>
|
|
173
|
+
|
|
174
|
+
## Bugs Filed
|
|
175
|
+
- `<bug-id>`: <title> (<severity>)
|
|
176
|
+
- `<bug-id>`: <title> (<severity>)
|
|
177
|
+
|
|
178
|
+
## Observations
|
|
179
|
+
<!-- Interesting things that aren't bugs but are worth noting -->
|
|
180
|
+
- <observation>
|
|
181
|
+
|
|
182
|
+
## Risks Identified
|
|
183
|
+
<!-- Things that need more investigation or a separate session -->
|
|
184
|
+
- <risk>
|
|
185
|
+
|
|
186
|
+
## Automation Gaps Discovered
|
|
187
|
+
<!-- Scenarios or behaviors that should be automated but aren't -->
|
|
188
|
+
- <gap> — suggested scenario: `<Given/When/Then>`
|
|
189
|
+
|
|
190
|
+
## Recommendations
|
|
191
|
+
- <what to explore next>
|
|
192
|
+
- <what to automate>
|
|
193
|
+
- <what to escalate>
|
|
194
|
+
|
|
195
|
+
## Session Quality
|
|
196
|
+
- **Charter adherence**: <stayed focused / moderate detours / significant scope change>
|
|
197
|
+
- **Time usage**: <efficient / some idle time / ran long>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Update the charter status to `completed`.
|
|
201
|
+
|
|
202
|
+
### 6. Follow-Up
|
|
203
|
+
|
|
204
|
+
After the debrief:
|
|
205
|
+
|
|
206
|
+
- **Bugs filed during the session** are already in `.grimoire/bugs/` — they'll flow through normal triage.
|
|
207
|
+
- **Automation gaps** — offer to create the missing scenarios now (via `grimoire-bug-explore` step 6 workflow) or add them to a backlog.
|
|
208
|
+
- **Follow-up sessions** — if significant areas were skipped, suggest a follow-up session with a new charter.
|
|
209
|
+
- **Link to explore** — if this session revealed patterns (e.g., "error handling is weak across the board"), suggest a broader `grimoire-bug-explore` run.
|
|
210
|
+
|
|
211
|
+
## Important
|
|
212
|
+
- **The tester drives the session.** The skill guides and tracks, but doesn't dictate what to test next. Suggest, don't command.
|
|
213
|
+
- **Notes are lightweight.** Don't ask the tester to write essays. A timestamp and a sentence is enough. The skill fills in structure.
|
|
214
|
+
- **File bugs fast.** When the tester finds something, capture it in 30 seconds and get back to exploring. Don't let bug reporting break the flow.
|
|
215
|
+
- **The charter is a guide, not a contract.** Good exploratory testing follows interesting threads. Track detours but don't prevent them.
|
|
216
|
+
- **Sessions are not test plans.** A test plan is comprehensive and repeatable. A session is focused and adaptive. Don't try to cover everything in one session.
|
|
217
|
+
- **Debrief is mandatory.** The value of a session is in the debrief — what was found, what wasn't covered, what to do next. Without it, the session is just unstructured clicking.
|
|
218
|
+
- **Respect the timebox.** Sessions without time limits become aimless. The timebox creates focus and urgency. Extend if productive, but always be conscious of time.
|
|
219
|
+
- **Build on previous sessions.** Check `.grimoire/sessions/` for past sessions in the same area. What was covered before? What was flagged for follow-up?
|
|
220
|
+
|
|
221
|
+
## Done
|
|
222
|
+
When the session debrief is generated and follow-up actions are identified, the workflow is complete. The debrief is saved to `.grimoire/sessions/`. Bugs filed during the session flow through normal triage.
|