bigpowers 2.86.1 → 2.86.2

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 (33) hide show
  1. package/.agents/skills/security-review/SKILL.md +3 -1
  2. package/.agents/skills/smoke-test/SKILL.md +1 -1
  3. package/.codebuddy/skills/security-review/SKILL.md +3 -1
  4. package/.codebuddy/skills/smoke-test/SKILL.md +1 -1
  5. package/.codex/skills/security-review/SKILL.md +3 -1
  6. package/.codex/skills/smoke-test/SKILL.md +1 -1
  7. package/.hermes/skills/security-review/SKILL.md +3 -1
  8. package/.hermes/skills/smoke-test/SKILL.md +1 -1
  9. package/.kilocode/rules/security-review.md +3 -1
  10. package/.kilocode/rules/smoke-test.md +1 -1
  11. package/.mimocode/skills/security-review/SKILL.md +3 -1
  12. package/.mimocode/skills/smoke-test/SKILL.md +1 -1
  13. package/.pi/package.json +1 -1
  14. package/.pi/prompts/security-review.md +3 -1
  15. package/.pi/prompts/smoke-test.md +1 -1
  16. package/.pi/skills/security-review/SKILL.md +3 -1
  17. package/.pi/skills/smoke-test/SKILL.md +1 -1
  18. package/.trae/skills/security-review/SKILL.md +3 -1
  19. package/.trae/skills/smoke-test/SKILL.md +1 -1
  20. package/.windsurf/rules/security-review.md +3 -1
  21. package/.windsurf/rules/smoke-test.md +1 -1
  22. package/.zcode/skills/security-review/SKILL.md +3 -1
  23. package/.zcode/skills/smoke-test/SKILL.md +1 -1
  24. package/CHANGELOG.md +7 -0
  25. package/package.json +1 -1
  26. package/scripts/lib/__pycache__/link_utils.cpython-312.pyc +0 -0
  27. package/scripts/lib/__pycache__/srp_engine_links.cpython-312.pyc +0 -0
  28. package/scripts/verify-cwe-fixture-sync.sh +88 -0
  29. package/skills/security-review/SKILL.md +3 -1
  30. package/skills/security-review/fixtures/CWE-639-idor-negative.go +48 -0
  31. package/skills/security-review/fixtures/CWE-639-idor-positive.go +29 -0
  32. package/skills/smoke-test/SKILL.md +1 -1
  33. package/skills-lock.json +2 -2
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
package/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.86.1",
3
+ "version": "2.86.2",
4
4
  "description": "80 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -57,6 +57,8 @@ Every **new detection rule** added to this skill MUST:
57
57
  |------|-----|------------------|------------------|
58
58
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
59
59
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
60
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
61
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
60
62
 
61
63
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
62
64
 
@@ -108,7 +110,7 @@ Each finding: **`File:Line` — Severity — Category**
108
110
 
109
111
  ## Verify
110
112
 
111
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
113
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
112
114
 
113
115
  ---
114
116
 
@@ -77,7 +77,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
77
77
 
78
78
  ## Verify
79
79
 
80
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
80
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
81
81
 
82
82
  ---
83
83
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
58
58
  |------|-----|------------------|------------------|
59
59
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
60
60
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
61
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
62
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
61
63
 
62
64
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
63
65
 
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
109
111
 
110
112
  ## Verify
111
113
 
112
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
114
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
113
115
 
114
116
  ---
115
117
 
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
78
78
 
79
79
  ## Verify
80
80
 
81
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
81
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
82
82
 
83
83
  ---
84
84
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [2.86.2](https://github.com/danielvm-git/bigpowers/compare/v2.86.1...v2.86.2) (2026-07-26)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **verify:** repair two gates that could not fail ([#97](https://github.com/danielvm-git/bigpowers/issues/97), [#98](https://github.com/danielvm-git/bigpowers/issues/98)) ([5f54699](https://github.com/danielvm-git/bigpowers/commit/5f54699f11875da2db1bae939f313d69c2fa7adf))
7
+
1
8
  ## [2.86.1](https://github.com/danielvm-git/bigpowers/compare/v2.86.0...v2.86.1) (2026-07-26)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.86.1",
3
+ "version": "2.86.2",
4
4
  "description": "73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env bash
2
+ # story: e80s05
3
+ # Assert security-review's CWE rule table and its fixtures/ directory agree.
4
+ #
5
+ # e80s05 ("security-review fixture table growth") was marked done while the
6
+ # fixtures directory gained a class the table never listed. Remembering to
7
+ # update both is exactly the kind of discipline that decays, so this makes the
8
+ # drift mechanical instead: every fixture class needs a table row, and every
9
+ # table row needs both fixtures on disk.
10
+ #
11
+ # Usage:
12
+ # bash scripts/verify-cwe-fixture-sync.sh [--self-test]
13
+ set -uo pipefail
14
+
15
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
16
+ SKILL_MD="$REPO_ROOT/skills/security-review/SKILL.md"
17
+ FIXTURES="$REPO_ROOT/skills/security-review/fixtures"
18
+
19
+ fail=0
20
+ note() { echo " $1"; }
21
+
22
+ check_sync() {
23
+ local skill_md="$1" fixtures="$2"
24
+ local rc=0
25
+
26
+ [ -f "$skill_md" ] || { echo "FAIL: missing $skill_md"; return 1; }
27
+ [ -d "$fixtures" ] || { echo "FAIL: missing $fixtures"; return 1; }
28
+
29
+ # Classes present on disk, derived from the -positive fixture filenames.
30
+ local disk_classes
31
+ disk_classes=$(find "$fixtures" -name '*-positive.*' -exec basename {} \; 2>/dev/null \
32
+ | sed 's/-positive\..*$//' | sort -u)
33
+
34
+ # Every disk class must appear in the rule table.
35
+ local c
36
+ for c in $disk_classes; do
37
+ if ! grep -q "$c" "$skill_md"; then
38
+ note "FAIL: fixture class '$c' has no row in the CWE rule table"
39
+ rc=1
40
+ fi
41
+ done
42
+
43
+ # Every fixture referenced by the table must exist, both polarities.
44
+ local ref
45
+ for ref in $(grep -oE 'fixtures/[A-Za-z0-9._-]+' "$skill_md" | sed 's|fixtures/||' | sort -u); do
46
+ if [ ! -f "$fixtures/$ref" ]; then
47
+ note "FAIL: table references fixtures/$ref which does not exist"
48
+ rc=1
49
+ fi
50
+ done
51
+
52
+ for c in $disk_classes; do
53
+ local pos neg
54
+ pos=$(find "$fixtures" -name "$c-positive.*" | head -1)
55
+ neg=$(find "$fixtures" -name "$c-negative.*" | head -1)
56
+ if [ -z "$pos" ] || [ -z "$neg" ]; then
57
+ note "FAIL: class '$c' needs BOTH a -positive and a -negative fixture"
58
+ rc=1
59
+ fi
60
+ done
61
+
62
+ return $rc
63
+ }
64
+
65
+ # --self-test proves this gate can fail: point it at a fixtures dir holding a
66
+ # class the table does not list, and require a non-zero exit.
67
+ if [ "${1:-}" = "--self-test" ]; then
68
+ tmp=$(mktemp -d)
69
+ trap 'rm -rf "$tmp"' EXIT
70
+ mkdir -p "$tmp/fixtures"
71
+ printf '| Rule | CWE | Positive fixture | Negative fixture |\n' > "$tmp/SKILL.md"
72
+ : > "$tmp/fixtures/CWE-999-unlisted-positive.py"
73
+ : > "$tmp/fixtures/CWE-999-unlisted-negative.py"
74
+
75
+ if check_sync "$tmp/SKILL.md" "$tmp/fixtures" >/dev/null 2>&1; then
76
+ echo "FAIL: self-test — gate passed on an unlisted fixture class (it cannot fail)"
77
+ exit 1
78
+ fi
79
+ echo "PASS: self-test — gate rejects a fixture class missing from the table"
80
+ exit 0
81
+ fi
82
+
83
+ if check_sync "$SKILL_MD" "$FIXTURES"; then
84
+ echo "PASS: CWE rule table and fixtures/ are in sync"
85
+ exit 0
86
+ fi
87
+ echo "FAIL: security-review CWE table and fixtures/ have drifted"
88
+ exit 1
@@ -64,6 +64,8 @@ Every **new detection rule** added to this skill MUST:
64
64
  |------|-----|------------------|------------------|
65
65
  | SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
66
66
  | XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
67
+ | Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
68
+ | Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
67
69
 
68
70
  Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
69
71
 
@@ -115,4 +117,4 @@ Each finding: **`File:Line` — Severity — Category**
115
117
 
116
118
  ## Verify
117
119
 
118
- → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
120
+ → verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
@@ -0,0 +1,48 @@
1
+ // story: e80s05
2
+ // Negative fixture: correctly scoped tenant query (must NOT be flagged).
3
+ //
4
+ // The org comes from the authenticated context, never from the request, and it
5
+ // is part of the WHERE clause. A caller from another organization gets zero
6
+ // rows rather than someone else's site.
7
+ //
8
+ // Note the retrofit trap this deliberately avoids: bigbase's BUG-2026-07-24T184443
9
+ // added `org_id INTEGER NOT NULL DEFAULT 0`, which passed tests on new rows and
10
+ // hid 8 of 9 production sites whose legacy rows defaulted to org 0. Scope on a
11
+ // real, backfilled org_id — never a placeholder default.
12
+ package fixtures
13
+
14
+ import (
15
+ "database/sql"
16
+ "net/http"
17
+ )
18
+
19
+ func orgIDFromContext(r *http.Request) (string, bool) {
20
+ v, ok := r.Context().Value(ctxOrgID).(string)
21
+ return v, ok && v != ""
22
+ }
23
+
24
+ type ctxKey string
25
+
26
+ const ctxOrgID ctxKey = "org_id"
27
+
28
+ func handleGetSiteNegative(w http.ResponseWriter, r *http.Request, db *sql.DB) {
29
+ orgID, ok := orgIDFromContext(r)
30
+ if !ok {
31
+ http.Error(w, "forbidden", http.StatusForbidden)
32
+ return
33
+ }
34
+ siteID := r.URL.Query().Get("site_id")
35
+
36
+ // SAFE: the tenant predicate is not optional and does not come from input.
37
+ row := db.QueryRow(
38
+ `SELECT id, name, domain FROM sites WHERE id = ? AND org_id = ?`,
39
+ siteID, orgID,
40
+ )
41
+
42
+ var id, name, domain string
43
+ if err := row.Scan(&id, &name, &domain); err != nil {
44
+ http.Error(w, "not found", http.StatusNotFound)
45
+ return
46
+ }
47
+ _, _ = w.Write([]byte(name + " " + domain))
48
+ }
@@ -0,0 +1,29 @@
1
+ // story: e80s05
2
+ // Positive fixture: IDOR / missing tenant scoping (must be flagged).
3
+ //
4
+ // Modelled on the bigbase family (BUG-129/130/133/135/136/140/143): the
5
+ // handler authenticates the caller, then trusts an ID from the request and
6
+ // queries by that ID alone. Authentication is proven; authorization is not.
7
+ // Nothing in the type system or a diff-scoped review makes this look wrong —
8
+ // the bug is a predicate that was never written.
9
+ package fixtures
10
+
11
+ import (
12
+ "database/sql"
13
+ "net/http"
14
+ )
15
+
16
+ func handleGetSitePositive(w http.ResponseWriter, r *http.Request, db *sql.DB) {
17
+ siteID := r.URL.Query().Get("site_id")
18
+
19
+ // VULNERABLE: scoped by primary key only. Any authenticated caller from any
20
+ // organization can read any site by guessing or enumerating site_id.
21
+ row := db.QueryRow(`SELECT id, name, domain FROM sites WHERE id = ?`, siteID)
22
+
23
+ var id, name, domain string
24
+ if err := row.Scan(&id, &name, &domain); err != nil {
25
+ http.Error(w, "not found", http.StatusNotFound)
26
+ return
27
+ }
28
+ _, _ = w.Write([]byte(name + " " + domain))
29
+ }
@@ -81,4 +81,4 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
81
81
 
82
82
  ## Verify
83
83
 
84
- → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -qv 'See \[REFERENCE.md\]' skills/smoke-test/SKILL.md && echo OK`
84
+ → verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
package/skills-lock.json CHANGED
@@ -303,7 +303,7 @@
303
303
  },
304
304
  "security-review": {
305
305
  "description": ">",
306
- "sha256": "0265010d9bd22e27",
306
+ "sha256": "3d046f443689fc1e",
307
307
  "path": "skills/security-reviewSKILL.md"
308
308
  },
309
309
  "seed-conventions": {
@@ -333,7 +333,7 @@
333
333
  },
334
334
  "smoke-test": {
335
335
  "description": "\"Post-deploy health-check against a live URL. Validates HTTP status, response content, and critical endpoints. Runnable standalone OR as the final step of the deploy skill.\"",
336
- "sha256": "f75e9e57d4003209",
336
+ "sha256": "050170d66ada581e",
337
337
  "path": "skills/smoke-testSKILL.md"
338
338
  },
339
339
  "spike-prototype": {