@qball-inc/the-bulwark 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +43 -0
- package/agents/bulwark-fix-validator.md +633 -0
- package/agents/bulwark-implementer.md +391 -0
- package/agents/bulwark-issue-analyzer.md +308 -0
- package/agents/bulwark-standards-reviewer.md +221 -0
- package/agents/plan-creation-architect.md +323 -0
- package/agents/plan-creation-eng-lead.md +352 -0
- package/agents/plan-creation-po.md +300 -0
- package/agents/plan-creation-qa-critic.md +334 -0
- package/agents/product-ideation-competitive-analyzer.md +298 -0
- package/agents/product-ideation-idea-validator.md +268 -0
- package/agents/product-ideation-market-researcher.md +292 -0
- package/agents/product-ideation-pattern-documenter.md +308 -0
- package/agents/product-ideation-segment-analyzer.md +303 -0
- package/agents/product-ideation-strategist.md +259 -0
- package/agents/statusline-setup.md +97 -0
- package/hooks/hooks.json +59 -0
- package/package.json +45 -0
- package/scripts/hooks/cleanup-stale.sh +13 -0
- package/scripts/hooks/enforce-quality.sh +166 -0
- package/scripts/hooks/implementer-quality.sh +256 -0
- package/scripts/hooks/inject-protocol.sh +52 -0
- package/scripts/hooks/suggest-pipeline.sh +175 -0
- package/scripts/hooks/track-pipeline-start.sh +37 -0
- package/scripts/hooks/track-pipeline-stop.sh +52 -0
- package/scripts/init-rules.sh +35 -0
- package/scripts/init.sh +151 -0
- package/skills/anthropic-validator/SKILL.md +607 -0
- package/skills/anthropic-validator/references/agents-checklist.md +131 -0
- package/skills/anthropic-validator/references/commands-checklist.md +102 -0
- package/skills/anthropic-validator/references/hooks-checklist.md +151 -0
- package/skills/anthropic-validator/references/mcp-checklist.md +136 -0
- package/skills/anthropic-validator/references/plugins-checklist.md +148 -0
- package/skills/anthropic-validator/references/skills-checklist.md +85 -0
- package/skills/assertion-patterns/SKILL.md +296 -0
- package/skills/bug-magnet-data/SKILL.md +284 -0
- package/skills/bug-magnet-data/context/cli-args.md +91 -0
- package/skills/bug-magnet-data/context/db-query.md +104 -0
- package/skills/bug-magnet-data/context/file-contents.md +103 -0
- package/skills/bug-magnet-data/context/http-body.md +91 -0
- package/skills/bug-magnet-data/context/process-spawn.md +123 -0
- package/skills/bug-magnet-data/data/booleans/boundaries.yaml +143 -0
- package/skills/bug-magnet-data/data/collections/arrays.yaml +114 -0
- package/skills/bug-magnet-data/data/collections/objects.yaml +123 -0
- package/skills/bug-magnet-data/data/concurrency/race-conditions.yaml +118 -0
- package/skills/bug-magnet-data/data/concurrency/state-machines.yaml +115 -0
- package/skills/bug-magnet-data/data/dates/boundaries.yaml +137 -0
- package/skills/bug-magnet-data/data/dates/invalid.yaml +132 -0
- package/skills/bug-magnet-data/data/dates/timezone.yaml +118 -0
- package/skills/bug-magnet-data/data/encoding/charset.yaml +79 -0
- package/skills/bug-magnet-data/data/encoding/normalization.yaml +105 -0
- package/skills/bug-magnet-data/data/formats/email.yaml +154 -0
- package/skills/bug-magnet-data/data/formats/json.yaml +187 -0
- package/skills/bug-magnet-data/data/formats/url.yaml +165 -0
- package/skills/bug-magnet-data/data/language-specific/javascript.yaml +182 -0
- package/skills/bug-magnet-data/data/language-specific/python.yaml +174 -0
- package/skills/bug-magnet-data/data/language-specific/rust.yaml +148 -0
- package/skills/bug-magnet-data/data/numbers/boundaries.yaml +161 -0
- package/skills/bug-magnet-data/data/numbers/precision.yaml +89 -0
- package/skills/bug-magnet-data/data/numbers/special.yaml +69 -0
- package/skills/bug-magnet-data/data/strings/boundaries.yaml +109 -0
- package/skills/bug-magnet-data/data/strings/injection.yaml +208 -0
- package/skills/bug-magnet-data/data/strings/special-chars.yaml +190 -0
- package/skills/bug-magnet-data/data/strings/unicode.yaml +139 -0
- package/skills/bug-magnet-data/references/external-lists.md +115 -0
- package/skills/bulwark-brainstorm/SKILL.md +563 -0
- package/skills/bulwark-brainstorm/references/at-teammate-prompts.md +60 -0
- package/skills/bulwark-brainstorm/references/role-critical-analyst.md +78 -0
- package/skills/bulwark-brainstorm/references/role-development-lead.md +66 -0
- package/skills/bulwark-brainstorm/references/role-product-delivery-lead.md +79 -0
- package/skills/bulwark-brainstorm/references/role-product-manager.md +62 -0
- package/skills/bulwark-brainstorm/references/role-project-sme.md +59 -0
- package/skills/bulwark-brainstorm/references/role-technical-architect.md +66 -0
- package/skills/bulwark-research/SKILL.md +298 -0
- package/skills/bulwark-research/references/viewpoint-contrarian.md +63 -0
- package/skills/bulwark-research/references/viewpoint-direct-investigation.md +62 -0
- package/skills/bulwark-research/references/viewpoint-first-principles.md +65 -0
- package/skills/bulwark-research/references/viewpoint-practitioner.md +62 -0
- package/skills/bulwark-research/references/viewpoint-prior-art.md +66 -0
- package/skills/bulwark-scaffold/SKILL.md +330 -0
- package/skills/bulwark-statusline/SKILL.md +161 -0
- package/skills/bulwark-statusline/scripts/statusline.sh +144 -0
- package/skills/bulwark-verify/SKILL.md +519 -0
- package/skills/code-review/SKILL.md +428 -0
- package/skills/code-review/examples/anti-patterns/linting.ts +181 -0
- package/skills/code-review/examples/anti-patterns/security.ts +91 -0
- package/skills/code-review/examples/anti-patterns/standards.ts +195 -0
- package/skills/code-review/examples/anti-patterns/type-safety.ts +108 -0
- package/skills/code-review/examples/recommended/linting.ts +195 -0
- package/skills/code-review/examples/recommended/security.ts +154 -0
- package/skills/code-review/examples/recommended/standards.ts +231 -0
- package/skills/code-review/examples/recommended/type-safety.ts +181 -0
- package/skills/code-review/frameworks/angular.md +218 -0
- package/skills/code-review/frameworks/django.md +235 -0
- package/skills/code-review/frameworks/express.md +207 -0
- package/skills/code-review/frameworks/flask.md +298 -0
- package/skills/code-review/frameworks/generic.md +146 -0
- package/skills/code-review/frameworks/react.md +152 -0
- package/skills/code-review/frameworks/vue.md +244 -0
- package/skills/code-review/references/linting-patterns.md +221 -0
- package/skills/code-review/references/security-patterns.md +125 -0
- package/skills/code-review/references/standards-patterns.md +246 -0
- package/skills/code-review/references/type-safety-patterns.md +130 -0
- package/skills/component-patterns/SKILL.md +131 -0
- package/skills/component-patterns/references/pattern-cli-command.md +118 -0
- package/skills/component-patterns/references/pattern-database.md +166 -0
- package/skills/component-patterns/references/pattern-external-api.md +139 -0
- package/skills/component-patterns/references/pattern-file-parser.md +168 -0
- package/skills/component-patterns/references/pattern-http-server.md +162 -0
- package/skills/component-patterns/references/pattern-process-spawner.md +133 -0
- package/skills/continuous-feedback/SKILL.md +327 -0
- package/skills/continuous-feedback/references/collect-instructions.md +81 -0
- package/skills/continuous-feedback/references/specialize-code-review.md +82 -0
- package/skills/continuous-feedback/references/specialize-general.md +98 -0
- package/skills/continuous-feedback/references/specialize-test-audit.md +81 -0
- package/skills/create-skill/SKILL.md +359 -0
- package/skills/create-skill/references/agent-conventions.md +194 -0
- package/skills/create-skill/references/agent-template.md +195 -0
- package/skills/create-skill/references/content-guidance.md +291 -0
- package/skills/create-skill/references/decision-framework.md +124 -0
- package/skills/create-skill/references/template-pipeline.md +217 -0
- package/skills/create-skill/references/template-reference-heavy.md +111 -0
- package/skills/create-skill/references/template-research.md +210 -0
- package/skills/create-skill/references/template-script-driven.md +172 -0
- package/skills/create-skill/references/template-simple.md +80 -0
- package/skills/create-subagent/SKILL.md +353 -0
- package/skills/create-subagent/references/agent-conventions.md +268 -0
- package/skills/create-subagent/references/content-guidance.md +232 -0
- package/skills/create-subagent/references/decision-framework.md +134 -0
- package/skills/create-subagent/references/template-single-agent.md +192 -0
- package/skills/fix-bug/SKILL.md +241 -0
- package/skills/governance-protocol/SKILL.md +116 -0
- package/skills/init/SKILL.md +341 -0
- package/skills/issue-debugging/SKILL.md +385 -0
- package/skills/issue-debugging/references/anti-patterns.md +245 -0
- package/skills/issue-debugging/references/debug-report-schema.md +227 -0
- package/skills/mock-detection/SKILL.md +511 -0
- package/skills/mock-detection/references/false-positive-prevention.md +402 -0
- package/skills/mock-detection/references/stub-patterns.md +236 -0
- package/skills/pipeline-templates/SKILL.md +215 -0
- package/skills/pipeline-templates/references/code-change-workflow.md +277 -0
- package/skills/pipeline-templates/references/code-review.md +336 -0
- package/skills/pipeline-templates/references/fix-validation.md +421 -0
- package/skills/pipeline-templates/references/new-feature.md +335 -0
- package/skills/pipeline-templates/references/research-brainstorm.md +161 -0
- package/skills/pipeline-templates/references/research-planning.md +257 -0
- package/skills/pipeline-templates/references/test-audit.md +389 -0
- package/skills/pipeline-templates/references/test-execution-fix.md +238 -0
- package/skills/plan-creation/SKILL.md +497 -0
- package/skills/product-ideation/SKILL.md +372 -0
- package/skills/product-ideation/references/analysis-frameworks.md +161 -0
- package/skills/session-handoff/SKILL.md +139 -0
- package/skills/session-handoff/references/examples.md +223 -0
- package/skills/setup-lsp/SKILL.md +312 -0
- package/skills/setup-lsp/references/server-registry.md +85 -0
- package/skills/setup-lsp/references/troubleshooting.md +135 -0
- package/skills/subagent-output-templating/SKILL.md +415 -0
- package/skills/subagent-output-templating/references/examples.md +440 -0
- package/skills/subagent-prompting/SKILL.md +364 -0
- package/skills/subagent-prompting/references/examples.md +342 -0
- package/skills/test-audit/SKILL.md +531 -0
- package/skills/test-audit/references/known-limitations.md +41 -0
- package/skills/test-audit/references/priority-classification.md +30 -0
- package/skills/test-audit/references/prompts/deep-mode-detection.md +83 -0
- package/skills/test-audit/references/prompts/synthesis.md +57 -0
- package/skills/test-audit/references/rewrite-instructions.md +46 -0
- package/skills/test-audit/references/schemas/audit-output.yaml +100 -0
- package/skills/test-audit/references/schemas/diagnostic-output.yaml +49 -0
- package/skills/test-audit/scripts/data-flow-analyzer.ts +509 -0
- package/skills/test-audit/scripts/integration-mock-detector.ts +462 -0
- package/skills/test-audit/scripts/package.json +20 -0
- package/skills/test-audit/scripts/skip-detector.ts +211 -0
- package/skills/test-audit/scripts/verification-counter.ts +295 -0
- package/skills/test-classification/SKILL.md +310 -0
- package/skills/test-fixture-creation/SKILL.md +295 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
metadata:
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
last_updated: "2026-02-01"
|
|
4
|
+
source_urls: []
|
|
5
|
+
|
|
6
|
+
category: collections
|
|
7
|
+
subcategory: arrays
|
|
8
|
+
tier: T0
|
|
9
|
+
|
|
10
|
+
bugs_caught:
|
|
11
|
+
- "Index out of bounds"
|
|
12
|
+
- "Empty array handling"
|
|
13
|
+
- "Array mutation bugs"
|
|
14
|
+
|
|
15
|
+
values:
|
|
16
|
+
empty:
|
|
17
|
+
value: []
|
|
18
|
+
bugs_caught:
|
|
19
|
+
- "Empty array iteration"
|
|
20
|
+
- "First/last element access on empty"
|
|
21
|
+
- "Reduce without initial value"
|
|
22
|
+
safe_for_automation: true
|
|
23
|
+
|
|
24
|
+
single_element:
|
|
25
|
+
value: ["only"]
|
|
26
|
+
bugs_caught:
|
|
27
|
+
- "Single element handling"
|
|
28
|
+
- "prev/next navigation edge"
|
|
29
|
+
safe_for_automation: true
|
|
30
|
+
|
|
31
|
+
two_elements:
|
|
32
|
+
value: ["first", "last"]
|
|
33
|
+
bugs_caught:
|
|
34
|
+
- "Two-element array"
|
|
35
|
+
- "First !== last distinction"
|
|
36
|
+
safe_for_automation: true
|
|
37
|
+
|
|
38
|
+
large_array:
|
|
39
|
+
value_template: "Array(10000).fill('item')"
|
|
40
|
+
bugs_caught:
|
|
41
|
+
- "Performance with large arrays"
|
|
42
|
+
- "Memory allocation"
|
|
43
|
+
safe_for_automation: true
|
|
44
|
+
|
|
45
|
+
nested_arrays:
|
|
46
|
+
value: [["a", "b"], ["c", "d"]]
|
|
47
|
+
bugs_caught:
|
|
48
|
+
- "Nested array handling"
|
|
49
|
+
- "Flattening operations"
|
|
50
|
+
safe_for_automation: true
|
|
51
|
+
|
|
52
|
+
deeply_nested:
|
|
53
|
+
value: [[[[["deep"]]]]]
|
|
54
|
+
bugs_caught:
|
|
55
|
+
- "Deep nesting handling"
|
|
56
|
+
- "Stack overflow on recursion"
|
|
57
|
+
safe_for_automation: true
|
|
58
|
+
|
|
59
|
+
mixed_types:
|
|
60
|
+
value: [1, "two", true, null, {"key": "value"}]
|
|
61
|
+
bugs_caught:
|
|
62
|
+
- "Mixed type array handling"
|
|
63
|
+
- "Type assumptions"
|
|
64
|
+
safe_for_automation: true
|
|
65
|
+
|
|
66
|
+
sparse_array:
|
|
67
|
+
value_template: "[1, , , 4]"
|
|
68
|
+
bugs_caught:
|
|
69
|
+
- "Sparse array holes"
|
|
70
|
+
- "undefined vs hole distinction"
|
|
71
|
+
safe_for_automation: true
|
|
72
|
+
note: "Array with holes (not undefined values)"
|
|
73
|
+
|
|
74
|
+
array_with_undefined:
|
|
75
|
+
value: [1, "undefined", 3]
|
|
76
|
+
bugs_caught:
|
|
77
|
+
- "Explicit undefined values"
|
|
78
|
+
safe_for_automation: true
|
|
79
|
+
|
|
80
|
+
array_with_null:
|
|
81
|
+
value: [1, null, 3]
|
|
82
|
+
bugs_caught:
|
|
83
|
+
- "Null values in array"
|
|
84
|
+
- "Filter/map with nulls"
|
|
85
|
+
safe_for_automation: true
|
|
86
|
+
|
|
87
|
+
duplicate_elements:
|
|
88
|
+
value: ["a", "b", "a", "c", "a"]
|
|
89
|
+
bugs_caught:
|
|
90
|
+
- "Duplicate handling"
|
|
91
|
+
- "Set conversion edge cases"
|
|
92
|
+
safe_for_automation: true
|
|
93
|
+
|
|
94
|
+
array_like:
|
|
95
|
+
value_template: "{0: 'a', 1: 'b', length: 2}"
|
|
96
|
+
bugs_caught:
|
|
97
|
+
- "Array-like object handling"
|
|
98
|
+
- "Array.from requirements"
|
|
99
|
+
safe_for_automation: true
|
|
100
|
+
note: "Object with numeric keys and length"
|
|
101
|
+
|
|
102
|
+
negative_index:
|
|
103
|
+
access: "arr[-1]"
|
|
104
|
+
bugs_caught:
|
|
105
|
+
- "Negative index access"
|
|
106
|
+
- "Language-specific behavior (Python vs JS)"
|
|
107
|
+
safe_for_automation: true
|
|
108
|
+
|
|
109
|
+
float_index:
|
|
110
|
+
access: "arr[1.5]"
|
|
111
|
+
bugs_caught:
|
|
112
|
+
- "Non-integer index"
|
|
113
|
+
- "Implicit truncation"
|
|
114
|
+
safe_for_automation: true
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
metadata:
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
last_updated: "2026-02-01"
|
|
4
|
+
source_urls: []
|
|
5
|
+
|
|
6
|
+
category: collections
|
|
7
|
+
subcategory: objects
|
|
8
|
+
tier: T0
|
|
9
|
+
|
|
10
|
+
bugs_caught:
|
|
11
|
+
- "Null reference on property access"
|
|
12
|
+
- "Prototype pollution"
|
|
13
|
+
- "Circular reference handling"
|
|
14
|
+
|
|
15
|
+
values:
|
|
16
|
+
empty:
|
|
17
|
+
value: {}
|
|
18
|
+
bugs_caught:
|
|
19
|
+
- "Empty object handling"
|
|
20
|
+
- "Object.keys empty check"
|
|
21
|
+
safe_for_automation: true
|
|
22
|
+
|
|
23
|
+
single_property:
|
|
24
|
+
value: {"key": "value"}
|
|
25
|
+
bugs_caught:
|
|
26
|
+
- "Single property access"
|
|
27
|
+
safe_for_automation: true
|
|
28
|
+
|
|
29
|
+
nested:
|
|
30
|
+
value: {"a": {"b": {"c": "deep"}}}
|
|
31
|
+
bugs_caught:
|
|
32
|
+
- "Nested property access"
|
|
33
|
+
- "Optional chaining need"
|
|
34
|
+
safe_for_automation: true
|
|
35
|
+
|
|
36
|
+
deeply_nested:
|
|
37
|
+
value: {"l1": {"l2": {"l3": {"l4": {"l5": "value"}}}}}
|
|
38
|
+
bugs_caught:
|
|
39
|
+
- "Deep nesting handling"
|
|
40
|
+
- "Stack overflow on recursion"
|
|
41
|
+
safe_for_automation: true
|
|
42
|
+
|
|
43
|
+
null_value:
|
|
44
|
+
value: {"key": null}
|
|
45
|
+
bugs_caught:
|
|
46
|
+
- "Null property value"
|
|
47
|
+
- "hasOwnProperty vs truthy check"
|
|
48
|
+
safe_for_automation: true
|
|
49
|
+
|
|
50
|
+
undefined_value:
|
|
51
|
+
value: {"key": "undefined"}
|
|
52
|
+
bugs_caught:
|
|
53
|
+
- "Undefined property value"
|
|
54
|
+
safe_for_automation: true
|
|
55
|
+
|
|
56
|
+
numeric_keys:
|
|
57
|
+
value: {"0": "zero", "1": "one"}
|
|
58
|
+
bugs_caught:
|
|
59
|
+
- "Numeric string keys"
|
|
60
|
+
- "Array-like object confusion"
|
|
61
|
+
safe_for_automation: true
|
|
62
|
+
|
|
63
|
+
special_keys:
|
|
64
|
+
value: {"": "empty", " ": "space", "a.b": "dotted"}
|
|
65
|
+
bugs_caught:
|
|
66
|
+
- "Special key handling"
|
|
67
|
+
- "Dot notation failure"
|
|
68
|
+
safe_for_automation: true
|
|
69
|
+
|
|
70
|
+
# Prototype pollution vectors
|
|
71
|
+
proto_key:
|
|
72
|
+
value: {"__proto__": {"polluted": true}}
|
|
73
|
+
bugs_caught:
|
|
74
|
+
- "Prototype pollution"
|
|
75
|
+
- "__proto__ key handling"
|
|
76
|
+
safe_for_automation: true
|
|
77
|
+
severity: security
|
|
78
|
+
|
|
79
|
+
constructor_key:
|
|
80
|
+
value: {"constructor": {"prototype": {}}}
|
|
81
|
+
bugs_caught:
|
|
82
|
+
- "Constructor pollution"
|
|
83
|
+
safe_for_automation: true
|
|
84
|
+
severity: security
|
|
85
|
+
|
|
86
|
+
prototype_key:
|
|
87
|
+
value: {"prototype": {"polluted": true}}
|
|
88
|
+
bugs_caught:
|
|
89
|
+
- "Prototype key confusion"
|
|
90
|
+
safe_for_automation: true
|
|
91
|
+
|
|
92
|
+
# Special built-in keys
|
|
93
|
+
hasownproperty_key:
|
|
94
|
+
value: {"hasOwnProperty": "overwritten"}
|
|
95
|
+
bugs_caught:
|
|
96
|
+
- "Built-in method shadowing"
|
|
97
|
+
safe_for_automation: true
|
|
98
|
+
|
|
99
|
+
tostring_key:
|
|
100
|
+
value: {"toString": "not a function"}
|
|
101
|
+
bugs_caught:
|
|
102
|
+
- "toString override"
|
|
103
|
+
- "String coercion failure"
|
|
104
|
+
safe_for_automation: true
|
|
105
|
+
|
|
106
|
+
# Circular reference
|
|
107
|
+
circular:
|
|
108
|
+
value_template: "let obj = {}; obj.self = obj;"
|
|
109
|
+
bugs_caught:
|
|
110
|
+
- "Circular reference handling"
|
|
111
|
+
- "JSON.stringify failure"
|
|
112
|
+
- "Infinite recursion"
|
|
113
|
+
safe_for_automation: true
|
|
114
|
+
note: "Object containing reference to itself"
|
|
115
|
+
|
|
116
|
+
# Symbol keys
|
|
117
|
+
symbol_key:
|
|
118
|
+
value_template: "{[Symbol('key')]: 'value'}"
|
|
119
|
+
bugs_caught:
|
|
120
|
+
- "Symbol key enumeration"
|
|
121
|
+
- "Object.keys misses symbols"
|
|
122
|
+
safe_for_automation: true
|
|
123
|
+
note: "JavaScript Symbol as key"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
metadata:
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
last_updated: "2026-02-01"
|
|
4
|
+
source_urls: []
|
|
5
|
+
|
|
6
|
+
category: concurrency
|
|
7
|
+
subcategory: race-conditions
|
|
8
|
+
tier: T2
|
|
9
|
+
type: scenario_pattern
|
|
10
|
+
|
|
11
|
+
bugs_caught:
|
|
12
|
+
- "Race conditions"
|
|
13
|
+
- "Data corruption"
|
|
14
|
+
- "Lost updates"
|
|
15
|
+
|
|
16
|
+
scenarios:
|
|
17
|
+
double_submit:
|
|
18
|
+
description: "User submits form twice rapidly"
|
|
19
|
+
setup: "Create pending transaction or form state"
|
|
20
|
+
action: "Submit same request 2x with <100ms delay"
|
|
21
|
+
expected_behavior: "Second request rejected or idempotent"
|
|
22
|
+
bugs_caught:
|
|
23
|
+
- "Duplicate records created"
|
|
24
|
+
- "Double charge/action"
|
|
25
|
+
- "Non-idempotent operations"
|
|
26
|
+
safe_for_automation: true
|
|
27
|
+
|
|
28
|
+
concurrent_edit:
|
|
29
|
+
description: "Two users edit same record simultaneously"
|
|
30
|
+
setup: "User A and B both load record #123"
|
|
31
|
+
action: "User A saves, then User B saves"
|
|
32
|
+
expected_behavior: "Conflict detection or last-write-wins"
|
|
33
|
+
bugs_caught:
|
|
34
|
+
- "Lost updates"
|
|
35
|
+
- "Data corruption"
|
|
36
|
+
- "No optimistic locking"
|
|
37
|
+
safe_for_automation: true
|
|
38
|
+
|
|
39
|
+
read_modify_write:
|
|
40
|
+
description: "Increment counter from multiple sources"
|
|
41
|
+
setup: "Counter at value 10"
|
|
42
|
+
action: "Two processes read 10, add 1, write 11"
|
|
43
|
+
expected_behavior: "Final value should be 12"
|
|
44
|
+
bugs_caught:
|
|
45
|
+
- "Non-atomic operations"
|
|
46
|
+
- "Counter drift"
|
|
47
|
+
safe_for_automation: true
|
|
48
|
+
|
|
49
|
+
check_then_act:
|
|
50
|
+
description: "File exists check before operation"
|
|
51
|
+
setup: "File may or may not exist"
|
|
52
|
+
action: "Check exists, then read/delete"
|
|
53
|
+
expected_behavior: "Handle file disappearing between check and act"
|
|
54
|
+
bugs_caught:
|
|
55
|
+
- "TOCTOU (time-of-check-time-of-use)"
|
|
56
|
+
- "File deleted between check and use"
|
|
57
|
+
safe_for_automation: true
|
|
58
|
+
|
|
59
|
+
lazy_initialization:
|
|
60
|
+
description: "Singleton or lazy init from multiple threads"
|
|
61
|
+
setup: "Uninitialized shared resource"
|
|
62
|
+
action: "Multiple threads trigger initialization"
|
|
63
|
+
expected_behavior: "Only one instance created"
|
|
64
|
+
bugs_caught:
|
|
65
|
+
- "Multiple singleton instances"
|
|
66
|
+
- "Initialization race"
|
|
67
|
+
safe_for_automation: true
|
|
68
|
+
|
|
69
|
+
cache_stampede:
|
|
70
|
+
description: "Cache expires while many requests arrive"
|
|
71
|
+
setup: "Cached value about to expire"
|
|
72
|
+
action: "Many requests hit as cache expires"
|
|
73
|
+
expected_behavior: "Only one backend call, others wait"
|
|
74
|
+
bugs_caught:
|
|
75
|
+
- "Thundering herd"
|
|
76
|
+
- "Backend overload"
|
|
77
|
+
safe_for_automation: true
|
|
78
|
+
|
|
79
|
+
publish_subscribe_ordering:
|
|
80
|
+
description: "Message ordering in pub/sub"
|
|
81
|
+
setup: "Subscriber expecting ordered events"
|
|
82
|
+
action: "Publisher sends A, B, C rapidly"
|
|
83
|
+
expected_behavior: "Subscriber receives A, B, C in order"
|
|
84
|
+
bugs_caught:
|
|
85
|
+
- "Out-of-order messages"
|
|
86
|
+
- "Lost messages"
|
|
87
|
+
safe_for_automation: true
|
|
88
|
+
|
|
89
|
+
connection_pool_exhaustion:
|
|
90
|
+
description: "All connections in use when new request arrives"
|
|
91
|
+
setup: "Pool at max capacity"
|
|
92
|
+
action: "New request needs connection"
|
|
93
|
+
expected_behavior: "Timeout or queue, not hang"
|
|
94
|
+
bugs_caught:
|
|
95
|
+
- "Deadlock"
|
|
96
|
+
- "Infinite wait"
|
|
97
|
+
safe_for_automation: true
|
|
98
|
+
|
|
99
|
+
transaction_isolation:
|
|
100
|
+
description: "Concurrent transactions reading/writing same data"
|
|
101
|
+
setup: "Transaction A reads, Transaction B writes"
|
|
102
|
+
action: "A reads again after B commits"
|
|
103
|
+
expected_behavior: "Consistent read based on isolation level"
|
|
104
|
+
bugs_caught:
|
|
105
|
+
- "Phantom reads"
|
|
106
|
+
- "Non-repeatable reads"
|
|
107
|
+
- "Dirty reads"
|
|
108
|
+
safe_for_automation: true
|
|
109
|
+
|
|
110
|
+
websocket_reconnect:
|
|
111
|
+
description: "Reconnection during active operation"
|
|
112
|
+
setup: "WebSocket connection active with pending request"
|
|
113
|
+
action: "Connection drops, client reconnects"
|
|
114
|
+
expected_behavior: "Pending operation handled correctly"
|
|
115
|
+
bugs_caught:
|
|
116
|
+
- "Lost requests"
|
|
117
|
+
- "Duplicate processing on retry"
|
|
118
|
+
safe_for_automation: true
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
metadata:
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
last_updated: "2026-02-01"
|
|
4
|
+
source_urls: []
|
|
5
|
+
|
|
6
|
+
category: concurrency
|
|
7
|
+
subcategory: state-machines
|
|
8
|
+
tier: T2
|
|
9
|
+
type: scenario_pattern
|
|
10
|
+
|
|
11
|
+
bugs_caught:
|
|
12
|
+
- "Invalid state transitions"
|
|
13
|
+
- "Stuck states"
|
|
14
|
+
- "Interrupted workflows"
|
|
15
|
+
|
|
16
|
+
scenarios:
|
|
17
|
+
invalid_transition:
|
|
18
|
+
description: "Attempt transition that shouldn't be allowed"
|
|
19
|
+
setup: "Order in 'shipped' state"
|
|
20
|
+
action: "Try to mark as 'pending'"
|
|
21
|
+
expected_behavior: "Transition rejected with error"
|
|
22
|
+
bugs_caught:
|
|
23
|
+
- "Invalid state transition allowed"
|
|
24
|
+
- "Business rule violation"
|
|
25
|
+
safe_for_automation: true
|
|
26
|
+
|
|
27
|
+
skip_required_state:
|
|
28
|
+
description: "Jump directly to final state"
|
|
29
|
+
setup: "Order in 'pending' state"
|
|
30
|
+
action: "Try to mark as 'delivered' without 'shipped'"
|
|
31
|
+
expected_behavior: "Transition rejected"
|
|
32
|
+
bugs_caught:
|
|
33
|
+
- "Skipped required state"
|
|
34
|
+
- "Missing validation"
|
|
35
|
+
safe_for_automation: true
|
|
36
|
+
|
|
37
|
+
duplicate_transition:
|
|
38
|
+
description: "Apply same transition twice"
|
|
39
|
+
setup: "Order in 'pending' state"
|
|
40
|
+
action: "Ship order twice"
|
|
41
|
+
expected_behavior: "Second transition no-op or error"
|
|
42
|
+
bugs_caught:
|
|
43
|
+
- "Duplicate action processing"
|
|
44
|
+
- "Non-idempotent transitions"
|
|
45
|
+
safe_for_automation: true
|
|
46
|
+
|
|
47
|
+
interrupted_flow:
|
|
48
|
+
description: "Process crashes mid-transition"
|
|
49
|
+
setup: "Multi-step state change in progress"
|
|
50
|
+
action: "Crash after first step, before commit"
|
|
51
|
+
expected_behavior: "Rollback or resumable state"
|
|
52
|
+
bugs_caught:
|
|
53
|
+
- "Inconsistent state"
|
|
54
|
+
- "Orphaned records"
|
|
55
|
+
safe_for_automation: true
|
|
56
|
+
|
|
57
|
+
terminal_state_escape:
|
|
58
|
+
description: "Try to exit terminal state"
|
|
59
|
+
setup: "Order in 'cancelled' (terminal) state"
|
|
60
|
+
action: "Try to reopen or ship"
|
|
61
|
+
expected_behavior: "Transition rejected"
|
|
62
|
+
bugs_caught:
|
|
63
|
+
- "Terminal state escape"
|
|
64
|
+
- "Zombie records"
|
|
65
|
+
safe_for_automation: true
|
|
66
|
+
|
|
67
|
+
parallel_conflicting_transitions:
|
|
68
|
+
description: "Two valid transitions attempted simultaneously"
|
|
69
|
+
setup: "Order in 'pending' state"
|
|
70
|
+
action: "User A ships, User B cancels at same time"
|
|
71
|
+
expected_behavior: "One succeeds, one fails"
|
|
72
|
+
bugs_caught:
|
|
73
|
+
- "Both transitions applied"
|
|
74
|
+
- "Inconsistent final state"
|
|
75
|
+
safe_for_automation: true
|
|
76
|
+
|
|
77
|
+
timeout_transition:
|
|
78
|
+
description: "State expires without action"
|
|
79
|
+
setup: "Order in 'awaiting_payment' with 30min timeout"
|
|
80
|
+
action: "Wait for timeout"
|
|
81
|
+
expected_behavior: "Auto-transition to 'expired'"
|
|
82
|
+
bugs_caught:
|
|
83
|
+
- "Stuck in waiting state"
|
|
84
|
+
- "Timer not firing"
|
|
85
|
+
safe_for_automation: true
|
|
86
|
+
|
|
87
|
+
retry_failed_transition:
|
|
88
|
+
description: "Transition fails, then retry"
|
|
89
|
+
setup: "Payment transition failed"
|
|
90
|
+
action: "User retries payment"
|
|
91
|
+
expected_behavior: "Retry allowed from failed state"
|
|
92
|
+
bugs_caught:
|
|
93
|
+
- "Retry blocked"
|
|
94
|
+
- "Wrong state after failure"
|
|
95
|
+
safe_for_automation: true
|
|
96
|
+
|
|
97
|
+
conditional_branch:
|
|
98
|
+
description: "State transition with conditions"
|
|
99
|
+
setup: "Order with mixed inventory (some available, some not)"
|
|
100
|
+
action: "Process order"
|
|
101
|
+
expected_behavior: "Correct branch based on condition"
|
|
102
|
+
bugs_caught:
|
|
103
|
+
- "Wrong branch taken"
|
|
104
|
+
- "Condition evaluated incorrectly"
|
|
105
|
+
safe_for_automation: true
|
|
106
|
+
|
|
107
|
+
reentry_same_state:
|
|
108
|
+
description: "Transition to current state"
|
|
109
|
+
setup: "Order in 'processing' state"
|
|
110
|
+
action: "Mark as 'processing' again"
|
|
111
|
+
expected_behavior: "No-op or trigger side effects?"
|
|
112
|
+
bugs_caught:
|
|
113
|
+
- "Unexpected side effects on re-entry"
|
|
114
|
+
- "Counter increment on no-op"
|
|
115
|
+
safe_for_automation: true
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
metadata:
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
last_updated: "2026-02-01"
|
|
4
|
+
source_urls: []
|
|
5
|
+
|
|
6
|
+
category: dates
|
|
7
|
+
subcategory: boundaries
|
|
8
|
+
tier: T2
|
|
9
|
+
|
|
10
|
+
bugs_caught:
|
|
11
|
+
- "Epoch handling"
|
|
12
|
+
- "Y2K38 overflow"
|
|
13
|
+
- "Leap year calculations"
|
|
14
|
+
|
|
15
|
+
values:
|
|
16
|
+
epoch:
|
|
17
|
+
value: "1970-01-01T00:00:00Z"
|
|
18
|
+
timestamp: 0
|
|
19
|
+
bugs_caught:
|
|
20
|
+
- "Epoch/zero date handling"
|
|
21
|
+
- "Default date confusion"
|
|
22
|
+
safe_for_automation: true
|
|
23
|
+
|
|
24
|
+
before_epoch:
|
|
25
|
+
value: "1969-12-31T23:59:59Z"
|
|
26
|
+
timestamp: -1
|
|
27
|
+
bugs_caught:
|
|
28
|
+
- "Negative timestamp handling"
|
|
29
|
+
- "Pre-epoch dates"
|
|
30
|
+
safe_for_automation: true
|
|
31
|
+
|
|
32
|
+
y2k:
|
|
33
|
+
value: "2000-01-01T00:00:00Z"
|
|
34
|
+
bugs_caught:
|
|
35
|
+
- "Y2K date handling"
|
|
36
|
+
safe_for_automation: true
|
|
37
|
+
|
|
38
|
+
y2k38:
|
|
39
|
+
value: "2038-01-19T03:14:07Z"
|
|
40
|
+
timestamp: 2147483647
|
|
41
|
+
bugs_caught:
|
|
42
|
+
- "Y2K38 32-bit overflow"
|
|
43
|
+
- "Unix timestamp max"
|
|
44
|
+
safe_for_automation: true
|
|
45
|
+
|
|
46
|
+
y2k38_plus_1:
|
|
47
|
+
value: "2038-01-19T03:14:08Z"
|
|
48
|
+
timestamp: 2147483648
|
|
49
|
+
bugs_caught:
|
|
50
|
+
- "Y2K38 overflow"
|
|
51
|
+
- "32-bit signed integer overflow"
|
|
52
|
+
safe_for_automation: true
|
|
53
|
+
|
|
54
|
+
leap_year_feb_29:
|
|
55
|
+
value: "2024-02-29"
|
|
56
|
+
bugs_caught:
|
|
57
|
+
- "Leap year February 29"
|
|
58
|
+
safe_for_automation: true
|
|
59
|
+
|
|
60
|
+
non_leap_year_feb_28:
|
|
61
|
+
value: "2023-02-28"
|
|
62
|
+
bugs_caught:
|
|
63
|
+
- "Non-leap year February end"
|
|
64
|
+
safe_for_automation: true
|
|
65
|
+
|
|
66
|
+
century_non_leap:
|
|
67
|
+
value: "1900-02-28"
|
|
68
|
+
bugs_caught:
|
|
69
|
+
- "Century year not divisible by 400"
|
|
70
|
+
- "1900 was not a leap year"
|
|
71
|
+
safe_for_automation: true
|
|
72
|
+
|
|
73
|
+
century_leap:
|
|
74
|
+
value: "2000-02-29"
|
|
75
|
+
bugs_caught:
|
|
76
|
+
- "Century year divisible by 400"
|
|
77
|
+
- "2000 was a leap year"
|
|
78
|
+
safe_for_automation: true
|
|
79
|
+
|
|
80
|
+
month_31_days:
|
|
81
|
+
value: "2024-01-31"
|
|
82
|
+
bugs_caught:
|
|
83
|
+
- "31-day month end"
|
|
84
|
+
safe_for_automation: true
|
|
85
|
+
|
|
86
|
+
month_30_days:
|
|
87
|
+
value: "2024-04-30"
|
|
88
|
+
bugs_caught:
|
|
89
|
+
- "30-day month end"
|
|
90
|
+
safe_for_automation: true
|
|
91
|
+
|
|
92
|
+
year_end:
|
|
93
|
+
value: "2024-12-31T23:59:59Z"
|
|
94
|
+
bugs_caught:
|
|
95
|
+
- "Year end handling"
|
|
96
|
+
- "New Year rollover"
|
|
97
|
+
safe_for_automation: true
|
|
98
|
+
|
|
99
|
+
year_start:
|
|
100
|
+
value: "2024-01-01T00:00:00Z"
|
|
101
|
+
bugs_caught:
|
|
102
|
+
- "Year start handling"
|
|
103
|
+
safe_for_automation: true
|
|
104
|
+
|
|
105
|
+
far_future:
|
|
106
|
+
value: "9999-12-31T23:59:59Z"
|
|
107
|
+
bugs_caught:
|
|
108
|
+
- "Far future date handling"
|
|
109
|
+
safe_for_automation: true
|
|
110
|
+
|
|
111
|
+
far_past:
|
|
112
|
+
value: "0001-01-01T00:00:00Z"
|
|
113
|
+
bugs_caught:
|
|
114
|
+
- "Far past date handling"
|
|
115
|
+
- "Year 1 AD"
|
|
116
|
+
safe_for_automation: true
|
|
117
|
+
|
|
118
|
+
midnight:
|
|
119
|
+
value: "2024-06-15T00:00:00Z"
|
|
120
|
+
bugs_caught:
|
|
121
|
+
- "Midnight handling"
|
|
122
|
+
- "Day boundary"
|
|
123
|
+
safe_for_automation: true
|
|
124
|
+
|
|
125
|
+
end_of_day:
|
|
126
|
+
value: "2024-06-15T23:59:59Z"
|
|
127
|
+
bugs_caught:
|
|
128
|
+
- "End of day"
|
|
129
|
+
- "23:59:59 vs 24:00:00"
|
|
130
|
+
safe_for_automation: true
|
|
131
|
+
|
|
132
|
+
noon:
|
|
133
|
+
value: "2024-06-15T12:00:00Z"
|
|
134
|
+
bugs_caught:
|
|
135
|
+
- "Noon/12 PM handling"
|
|
136
|
+
- "AM/PM boundary"
|
|
137
|
+
safe_for_automation: true
|