bigpowers 2.86.0 → 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 (82) hide show
  1. package/.agents/skills/diagnose-root/SKILL.md +1 -1
  2. package/.agents/skills/migrate-spec/SKILL.md +3 -3
  3. package/.agents/skills/plan-work/SKILL.md +1 -1
  4. package/.agents/skills/security-review/SKILL.md +3 -1
  5. package/.agents/skills/smoke-test/SKILL.md +1 -1
  6. package/.agents/skills/trace-requirement/SKILL.md +1 -1
  7. package/.codebuddy/skills/diagnose-root/SKILL.md +1 -1
  8. package/.codebuddy/skills/migrate-spec/SKILL.md +3 -3
  9. package/.codebuddy/skills/plan-work/SKILL.md +1 -1
  10. package/.codebuddy/skills/security-review/SKILL.md +3 -1
  11. package/.codebuddy/skills/smoke-test/SKILL.md +1 -1
  12. package/.codebuddy/skills/trace-requirement/SKILL.md +1 -1
  13. package/.codex/skills/diagnose-root/SKILL.md +1 -1
  14. package/.codex/skills/migrate-spec/SKILL.md +3 -3
  15. package/.codex/skills/plan-work/SKILL.md +1 -1
  16. package/.codex/skills/security-review/SKILL.md +3 -1
  17. package/.codex/skills/smoke-test/SKILL.md +1 -1
  18. package/.codex/skills/trace-requirement/SKILL.md +1 -1
  19. package/.hermes/skills/diagnose-root/SKILL.md +1 -1
  20. package/.hermes/skills/migrate-spec/SKILL.md +3 -3
  21. package/.hermes/skills/plan-work/SKILL.md +1 -1
  22. package/.hermes/skills/security-review/SKILL.md +3 -1
  23. package/.hermes/skills/smoke-test/SKILL.md +1 -1
  24. package/.hermes/skills/trace-requirement/SKILL.md +1 -1
  25. package/.kilocode/rules/diagnose-root.md +1 -1
  26. package/.kilocode/rules/migrate-spec.md +3 -3
  27. package/.kilocode/rules/plan-work.md +1 -1
  28. package/.kilocode/rules/security-review.md +3 -1
  29. package/.kilocode/rules/smoke-test.md +1 -1
  30. package/.kilocode/rules/trace-requirement.md +1 -1
  31. package/.mimocode/skills/diagnose-root/SKILL.md +1 -1
  32. package/.mimocode/skills/migrate-spec/SKILL.md +3 -3
  33. package/.mimocode/skills/plan-work/SKILL.md +1 -1
  34. package/.mimocode/skills/security-review/SKILL.md +3 -1
  35. package/.mimocode/skills/smoke-test/SKILL.md +1 -1
  36. package/.mimocode/skills/trace-requirement/SKILL.md +1 -1
  37. package/.pi/package.json +1 -1
  38. package/.pi/prompts/diagnose-root.md +1 -1
  39. package/.pi/prompts/migrate-spec.md +3 -3
  40. package/.pi/prompts/plan-work.md +1 -1
  41. package/.pi/prompts/security-review.md +3 -1
  42. package/.pi/prompts/smoke-test.md +1 -1
  43. package/.pi/prompts/trace-requirement.md +1 -1
  44. package/.pi/skills/diagnose-root/SKILL.md +1 -1
  45. package/.pi/skills/migrate-spec/SKILL.md +3 -3
  46. package/.pi/skills/plan-work/SKILL.md +1 -1
  47. package/.pi/skills/security-review/SKILL.md +3 -1
  48. package/.pi/skills/smoke-test/SKILL.md +1 -1
  49. package/.pi/skills/trace-requirement/SKILL.md +1 -1
  50. package/.trae/skills/diagnose-root/SKILL.md +1 -1
  51. package/.trae/skills/migrate-spec/SKILL.md +3 -3
  52. package/.trae/skills/plan-work/SKILL.md +1 -1
  53. package/.trae/skills/security-review/SKILL.md +3 -1
  54. package/.trae/skills/smoke-test/SKILL.md +1 -1
  55. package/.trae/skills/trace-requirement/SKILL.md +1 -1
  56. package/.windsurf/rules/diagnose-root.md +1 -1
  57. package/.windsurf/rules/migrate-spec.md +3 -3
  58. package/.windsurf/rules/plan-work.md +1 -1
  59. package/.windsurf/rules/security-review.md +3 -1
  60. package/.windsurf/rules/smoke-test.md +1 -1
  61. package/.windsurf/rules/trace-requirement.md +1 -1
  62. package/.zcode/skills/diagnose-root/SKILL.md +1 -1
  63. package/.zcode/skills/migrate-spec/SKILL.md +3 -3
  64. package/.zcode/skills/plan-work/SKILL.md +1 -1
  65. package/.zcode/skills/security-review/SKILL.md +3 -1
  66. package/.zcode/skills/smoke-test/SKILL.md +1 -1
  67. package/.zcode/skills/trace-requirement/SKILL.md +1 -1
  68. package/CHANGELOG.md +15 -0
  69. package/package.json +1 -1
  70. package/scripts/lib/__pycache__/link_utils.cpython-312.pyc +0 -0
  71. package/scripts/lib/__pycache__/srp_engine_links.cpython-312.pyc +0 -0
  72. package/scripts/run-skill-verify.sh +97 -10
  73. package/scripts/verify-cwe-fixture-sync.sh +88 -0
  74. package/skills/diagnose-root/SKILL.md +1 -1
  75. package/skills/migrate-spec/SKILL.md +3 -3
  76. package/skills/plan-work/SKILL.md +1 -1
  77. package/skills/security-review/SKILL.md +3 -1
  78. package/skills/security-review/fixtures/CWE-639-idor-negative.go +48 -0
  79. package/skills/security-review/fixtures/CWE-639-idor-positive.go +29 -0
  80. package/skills/smoke-test/SKILL.md +1 -1
  81. package/skills/trace-requirement/SKILL.md +1 -1
  82. package/skills-lock.json +6 -6
@@ -84,7 +84,7 @@ After writing capsule tasks, suggest `kickoff-branch` (if not already on a featu
84
84
 
85
85
  ## Verify
86
86
 
87
- → verify: `test -f scripts/lib/plan-consistency-check.sh && bash scripts/lib/plan-consistency-check.sh specs/epics/e45-quality-core/ 2>&1 | head -5`
87
+ → verify: `test -f scripts/lib/plan-consistency-check.sh && EPIC=$(ls -d specs/epics/*/ 2>/dev/null | grep -v archive | sort | head -1) && test -n "$EPIC" && bash scripts/lib/plan-consistency-check.sh "$EPIC" >/dev/null 2>&1`
88
88
 
89
89
 
90
90
 
@@ -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
 
@@ -32,7 +32,7 @@ Look for `// story: X.Y` or `# story: X.Y` comments in source files and tests:
32
32
  grep -rn "story: " . --include="*.ts" --include="*.js" --include="*.py" --include="*.sh" | grep -v node_modules
33
33
  ```
34
34
 
35
- → verify: `grep -rn "story: " . --include="*.ts" --include="*.sh" | wc -l`
35
+ → verify: `[ "$(grep -rl "story: " . --include="*.ts" --include="*.sh" --include="*.py" 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
36
36
 
37
37
  ### 3. Build the matrix
38
38
 
@@ -21,4 +21,4 @@ Four phases — do not skip. Update the active `specs/bugs/BUG-*.md` file at eac
21
21
 
22
22
  ## Verify
23
23
 
24
- → verify: `BUG_FILE=$(ls -t specs/bugs/BUG-*.md 2>/dev/null | head -1); test -n "$BUG_FILE" && [ "$(grep -cE 'Reproduce|Isolate|Hypothesize|Verify' "$BUG_FILE")" -ge 4 ]`
24
+ → verify: `[ "$(grep -lE 'Reproduce' specs/bugs/BUG-*.md 2>/dev/null | grep -cv "\.okf\.md$")" -ge 1 ]`
@@ -58,7 +58,7 @@ List every artifact found matching the detected framework. Present the list to t
58
58
 
59
59
  See [REFERENCE.md](REFERENCE.md) — `Detected: GSD...`
60
60
 
61
- → verify: `find . -maxdepth 4 \( -name "ROADMAP.md" -o -name "spec.md" -o -name "prd.md" -o -name "REQUIREMENTS.md" \) 2>/dev/null | grep -v ".git" | head -15`
61
+ → verify: `test -d specs && test -w specs`
62
62
 
63
63
  ### Step 3 — Transform (one artifact at a time, show diffs)
64
64
 
@@ -94,9 +94,9 @@ See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirement
94
94
 
95
95
  > **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
96
96
  >
97
- > → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
97
+ > → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
98
98
 
99
- → verify: `ls specs/*.md 2>/dev/null | head -15`
99
+ → verify: `test -d specs && [ "$(ls specs/*.md specs/*.yaml 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
100
100
 
101
101
  ### Step 4 — Generate state.yaml
102
102
 
@@ -84,7 +84,7 @@ After writing capsule tasks, suggest `kickoff-branch` (if not already on a featu
84
84
 
85
85
  ## Verify
86
86
 
87
- → verify: `test -f scripts/lib/plan-consistency-check.sh && bash scripts/lib/plan-consistency-check.sh specs/epics/e45-quality-core/ 2>&1 | head -5`
87
+ → verify: `test -f scripts/lib/plan-consistency-check.sh && EPIC=$(ls -d specs/epics/*/ 2>/dev/null | grep -v archive | sort | head -1) && test -n "$EPIC" && bash scripts/lib/plan-consistency-check.sh "$EPIC" >/dev/null 2>&1`
88
88
 
89
89
 
90
90
 
@@ -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
 
@@ -32,7 +32,7 @@ Look for `// story: X.Y` or `# story: X.Y` comments in source files and tests:
32
32
  grep -rn "story: " . --include="*.ts" --include="*.js" --include="*.py" --include="*.sh" | grep -v node_modules
33
33
  ```
34
34
 
35
- → verify: `grep -rn "story: " . --include="*.ts" --include="*.sh" | wc -l`
35
+ → verify: `[ "$(grep -rl "story: " . --include="*.ts" --include="*.sh" --include="*.py" 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
36
36
 
37
37
  ### 3. Build the matrix
38
38
 
@@ -21,4 +21,4 @@ Four phases — do not skip. Update the active `specs/bugs/BUG-*.md` file at eac
21
21
 
22
22
  ## Verify
23
23
 
24
- → verify: `BUG_FILE=$(ls -t specs/bugs/BUG-*.md 2>/dev/null | head -1); test -n "$BUG_FILE" && [ "$(grep -cE 'Reproduce|Isolate|Hypothesize|Verify' "$BUG_FILE")" -ge 4 ]`
24
+ → verify: `[ "$(grep -lE 'Reproduce' specs/bugs/BUG-*.md 2>/dev/null | grep -cv "\.okf\.md$")" -ge 1 ]`
@@ -58,7 +58,7 @@ List every artifact found matching the detected framework. Present the list to t
58
58
 
59
59
  See [REFERENCE.md](REFERENCE.md) — `Detected: GSD...`
60
60
 
61
- → verify: `find . -maxdepth 4 \( -name "ROADMAP.md" -o -name "spec.md" -o -name "prd.md" -o -name "REQUIREMENTS.md" \) 2>/dev/null | grep -v ".git" | head -15`
61
+ → verify: `test -d specs && test -w specs`
62
62
 
63
63
  ### Step 3 — Transform (one artifact at a time, show diffs)
64
64
 
@@ -94,9 +94,9 @@ See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirement
94
94
 
95
95
  > **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
96
96
  >
97
- > → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
97
+ > → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
98
98
 
99
- → verify: `ls specs/*.md 2>/dev/null | head -15`
99
+ → verify: `test -d specs && [ "$(ls specs/*.md specs/*.yaml 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
100
100
 
101
101
  ### Step 4 — Generate state.yaml
102
102
 
@@ -84,7 +84,7 @@ After writing capsule tasks, suggest `kickoff-branch` (if not already on a featu
84
84
 
85
85
  ## Verify
86
86
 
87
- → verify: `test -f scripts/lib/plan-consistency-check.sh && bash scripts/lib/plan-consistency-check.sh specs/epics/e45-quality-core/ 2>&1 | head -5`
87
+ → verify: `test -f scripts/lib/plan-consistency-check.sh && EPIC=$(ls -d specs/epics/*/ 2>/dev/null | grep -v archive | sort | head -1) && test -n "$EPIC" && bash scripts/lib/plan-consistency-check.sh "$EPIC" >/dev/null 2>&1`
88
88
 
89
89
 
90
90
 
@@ -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
 
@@ -32,7 +32,7 @@ Look for `// story: X.Y` or `# story: X.Y` comments in source files and tests:
32
32
  grep -rn "story: " . --include="*.ts" --include="*.js" --include="*.py" --include="*.sh" | grep -v node_modules
33
33
  ```
34
34
 
35
- → verify: `grep -rn "story: " . --include="*.ts" --include="*.sh" | wc -l`
35
+ → verify: `[ "$(grep -rl "story: " . --include="*.ts" --include="*.sh" --include="*.py" 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
36
36
 
37
37
  ### 3. Build the matrix
38
38
 
@@ -21,4 +21,4 @@ Four phases — do not skip. Update the active `specs/bugs/BUG-*.md` file at eac
21
21
 
22
22
  ## Verify
23
23
 
24
- → verify: `BUG_FILE=$(ls -t specs/bugs/BUG-*.md 2>/dev/null | head -1); test -n "$BUG_FILE" && [ "$(grep -cE 'Reproduce|Isolate|Hypothesize|Verify' "$BUG_FILE")" -ge 4 ]`
24
+ → verify: `[ "$(grep -lE 'Reproduce' specs/bugs/BUG-*.md 2>/dev/null | grep -cv "\.okf\.md$")" -ge 1 ]`
@@ -58,7 +58,7 @@ List every artifact found matching the detected framework. Present the list to t
58
58
 
59
59
  See [REFERENCE.md](REFERENCE.md) — `Detected: GSD...`
60
60
 
61
- → verify: `find . -maxdepth 4 \( -name "ROADMAP.md" -o -name "spec.md" -o -name "prd.md" -o -name "REQUIREMENTS.md" \) 2>/dev/null | grep -v ".git" | head -15`
61
+ → verify: `test -d specs && test -w specs`
62
62
 
63
63
  ### Step 3 — Transform (one artifact at a time, show diffs)
64
64
 
@@ -94,9 +94,9 @@ See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirement
94
94
 
95
95
  > **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
96
96
  >
97
- > → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
97
+ > → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
98
98
 
99
- → verify: `ls specs/*.md 2>/dev/null | head -15`
99
+ → verify: `test -d specs && [ "$(ls specs/*.md specs/*.yaml 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
100
100
 
101
101
  ### Step 4 — Generate state.yaml
102
102
 
@@ -84,7 +84,7 @@ After writing capsule tasks, suggest `kickoff-branch` (if not already on a featu
84
84
 
85
85
  ## Verify
86
86
 
87
- → verify: `test -f scripts/lib/plan-consistency-check.sh && bash scripts/lib/plan-consistency-check.sh specs/epics/e45-quality-core/ 2>&1 | head -5`
87
+ → verify: `test -f scripts/lib/plan-consistency-check.sh && EPIC=$(ls -d specs/epics/*/ 2>/dev/null | grep -v archive | sort | head -1) && test -n "$EPIC" && bash scripts/lib/plan-consistency-check.sh "$EPIC" >/dev/null 2>&1`
88
88
 
89
89
 
90
90
 
@@ -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
 
@@ -32,7 +32,7 @@ Look for `// story: X.Y` or `# story: X.Y` comments in source files and tests:
32
32
  grep -rn "story: " . --include="*.ts" --include="*.js" --include="*.py" --include="*.sh" | grep -v node_modules
33
33
  ```
34
34
 
35
- → verify: `grep -rn "story: " . --include="*.ts" --include="*.sh" | wc -l`
35
+ → verify: `[ "$(grep -rl "story: " . --include="*.ts" --include="*.sh" --include="*.py" 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
36
36
 
37
37
  ### 3. Build the matrix
38
38
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
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
+
8
+ ## [2.86.1](https://github.com/danielvm-git/bigpowers/compare/v2.86.0...v2.86.1) (2026-07-26)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **ci:** make skill-verify bash-3.2 safe and gate release on it ([a5fee16](https://github.com/danielvm-git/bigpowers/commit/a5fee16c70b29094bad0bd803a43797c9b4bd7b6)), closes [#96](https://github.com/danielvm-git/bigpowers/issues/96) [#96](https://github.com/danielvm-git/bigpowers/issues/96) [#99](https://github.com/danielvm-git/bigpowers/issues/99)
14
+ * **ci:** restore truncated SKILL-INDEX and exempt comments from bash-4 guard ([c680896](https://github.com/danielvm-git/bigpowers/commit/c680896528732cff131161e2a1524730db15fd13))
15
+
1
16
  # [2.86.0](https://github.com/danielvm-git/bigpowers/compare/v2.85.2...v2.86.0) (2026-07-25)
2
17
 
3
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.86.0",
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": {
@@ -25,9 +25,46 @@ SKILLS_ROOT="$REPO_ROOT"
25
25
  PASS=0; FAIL=0; SKIP=0
26
26
  TARGET="${1:-}"
27
27
 
28
+ # A directive is fail-open when it cannot exit non-zero on a broken repo.
29
+ # Two families, both checked syntactically because a pipeline's exit status
30
+ # is the status of its LAST command:
31
+ # 1. explicit swallow — `|| echo ...`, `|| true`, `|| :`, `; true`, `; exit 0`
32
+ # 2. non-asserting tail — pipeline ends in a filter that always exits 0
33
+ # (head/wc/cat/tee/sort/tr/sed/awk/echo/true/:). `grep x | wc -l` is the
34
+ # canonical offender: wc always succeeds, so the grep result is discarded.
35
+ # Use an assertion instead, e.g. [ "$(... | wc -l)" -gt 0 ].
36
+ FAIL_OPEN_TAIL_CMDS='head|wc|cat|tee|sort|tr|sed|awk|echo|true|:'
37
+
28
38
  is_fail_open_directive() {
29
39
  local cmd="$1"
30
- echo "$cmd" | grep -qE '\|\|[[:space:]]*echo|\|[[:space:]]*awk'
40
+
41
+ # Family 1: explicit exit-status swallowing.
42
+ if echo "$cmd" | grep -qE '\|\|[[:space:]]*(echo|true|:)|;[[:space:]]*(true|:|exit[[:space:]]+0)[[:space:]]*$'; then
43
+ return 0
44
+ fi
45
+
46
+ # Family 2: pipeline whose last stage never fails.
47
+ # Strip $(...) first — a pipe inside a command substitution feeds an
48
+ # assertion, e.g. [ "$(ls x | wc -l)" -gt 0 ], and is NOT fail-open.
49
+ local stripped="$cmd" prev=""
50
+ while [ "$stripped" != "$prev" ]; do
51
+ prev="$stripped"
52
+ stripped=$(printf '%s' "$stripped" | sed 's/\$([^()]*)/SUBST/g')
53
+ done
54
+
55
+ # Only inspect the segment after the final `|` that is not part of `||`.
56
+ local tail_seg
57
+ tail_seg=$(printf '%s' "$stripped" | sed 's/||/\
58
+ /g' | tail -1)
59
+ case "$tail_seg" in
60
+ *\|*)
61
+ tail_seg=${tail_seg##*|}
62
+ tail_seg=$(printf '%s' "$tail_seg" | sed 's/^[[:space:]]*//')
63
+ echo "$tail_seg" | grep -qE "^($FAIL_OPEN_TAIL_CMDS)([[:space:]]|$)" && return 0
64
+ ;;
65
+ esac
66
+
67
+ return 1
31
68
  }
32
69
 
33
70
  normalize_verify_cmd() {
@@ -48,7 +85,7 @@ run_verify_cmd() {
48
85
  local label="${3:-$skill}"
49
86
 
50
87
  if is_fail_open_directive "$cmd"; then
51
- echo "FAIL: $label — fail-open pattern (|| echo or | awk): $cmd"
88
+ echo "FAIL: $label — fail-open directive (cannot exit non-zero; swallowed status or non-asserting pipeline tail): $cmd"
52
89
  FAIL=$((FAIL + 1))
53
90
  return 1
54
91
  fi
@@ -71,7 +108,13 @@ run_skill() {
71
108
  local skill
72
109
  skill=$(dirname "$skill_md")
73
110
 
74
- mapfile -t verify_lines < <(grep -E '^(> )?→ verify:' "$skill_md" 2>/dev/null || true)
111
+ # bash 3.2 (macOS default shell) has no `mapfile`. Read the lines portably —
112
+ # regression guard for the class of BUG-2026-07-02T103911 (`declare -A`).
113
+ local verify_lines=()
114
+ local _line
115
+ while IFS= read -r _line; do
116
+ [ -n "$_line" ] && verify_lines+=("$_line")
117
+ done < <(grep -E '^(> )?→ verify:' "$skill_md" 2>/dev/null || true)
75
118
 
76
119
  if [ "${#verify_lines[@]}" -eq 0 ]; then
77
120
  echo "SKIP: $skill"
@@ -112,13 +155,47 @@ run_negative_fixture_self_test() {
112
155
  FAIL=$((FAIL + 1))
113
156
  return 1
114
157
  fi
115
- local fail_open_cmd='test -f /nonexistent/path/for/skill-verify-self-test && echo OK || echo FAIL'
116
- if ! is_fail_open_directive "$fail_open_cmd"; then
117
- echo "FAIL: self-test — fail-open detector did not match canonical || echo pattern"
118
- FAIL=$((FAIL + 1))
119
- return 1
120
- fi
121
- echo "PASS: self-test — fail-open detector rejects || echo pattern"
158
+ # Every known fail-open idiom must be rejected. Add a row here whenever a new
159
+ # evasion is found — this is the anti-vacuity proof for the detector itself.
160
+ local bad_patterns='test -f /nope && echo OK || echo FAIL
161
+ test -f /nope || true
162
+ test -f /nope || :
163
+ test -f /nope; true
164
+ test -f /nope; exit 0
165
+ grep -rn "x" . | wc -l
166
+ ls specs/*.md 2>/dev/null | head -15
167
+ git diff --name-only HEAD | head -20
168
+ find . -name "*.md" | cat
169
+ grep x file | awk "{print}"'
170
+ local bad_line
171
+ while IFS= read -r bad_line; do
172
+ [ -z "$bad_line" ] && continue
173
+ if ! is_fail_open_directive "$bad_line"; then
174
+ echo "FAIL: self-test — detector missed fail-open idiom: $bad_line"
175
+ FAIL=$((FAIL + 1))
176
+ return 1
177
+ fi
178
+ done <<EOF
179
+ $bad_patterns
180
+ EOF
181
+ echo "PASS: self-test — detector rejects all $(printf '%s\n' "$bad_patterns" | grep -c .) known fail-open idioms"
182
+
183
+ # And must NOT reject genuine assertions that merely contain a pipe inside $().
184
+ local good_patterns='[ "$(ls specs/*.yaml 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]
185
+ test -d specs && test -f specs/state.yaml
186
+ [ "$(find specs -name "*.yaml" | wc -l | tr -d " ")" -ge 1 ]'
187
+ local good_line
188
+ while IFS= read -r good_line; do
189
+ [ -z "$good_line" ] && continue
190
+ if is_fail_open_directive "$good_line"; then
191
+ echo "FAIL: self-test — detector false-positived on a real assertion: $good_line"
192
+ FAIL=$((FAIL + 1))
193
+ return 1
194
+ fi
195
+ done <<EOF
196
+ $good_patterns
197
+ EOF
198
+ echo "PASS: self-test — detector accepts genuine assertions with \$() pipes"
122
199
  local real_fail_cmd='test -f /nonexistent/path/for/skill-verify-self-test'
123
200
  local output
124
201
  if output=$(run_with_timeout "$real_fail_cmd"); then
@@ -157,4 +234,14 @@ fi
157
234
 
158
235
  echo ""
159
236
  echo "Results: $PASS PASS, $FAIL FAIL, $SKIP SKIP"
237
+
238
+ # SKIP ratchet: skills with no (or non-executable) → verify: are invisible to
239
+ # this gate. Cap the count so the blind spot can only shrink. Lower the ceiling
240
+ # as skills gain real directives; see issue #97.
241
+ SKIP_CEILING="${SKILL_VERIFY_SKIP_CEILING:-34}"
242
+ if [ -z "$TARGET" ] && [ "$SKIP" -gt "$SKIP_CEILING" ]; then
243
+ echo "FAIL: SKIP count $SKIP exceeds ceiling $SKIP_CEILING — new skills must ship a → verify: directive"
244
+ FAIL=$((FAIL + 1))
245
+ fi
246
+
160
247
  [ "$FAIL" -eq 0 ]
@@ -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
@@ -22,4 +22,4 @@ Four phases — do not skip. Update the active `specs/bugs/BUG-*.md` file at eac
22
22
 
23
23
  ## Verify
24
24
 
25
- → verify: `BUG_FILE=$(ls -t specs/bugs/BUG-*.md 2>/dev/null | head -1); test -n "$BUG_FILE" && [ "$(grep -cE 'Reproduce|Isolate|Hypothesize|Verify' "$BUG_FILE")" -ge 4 ]`
25
+ → verify: `[ "$(grep -lE 'Reproduce' specs/bugs/BUG-*.md 2>/dev/null | grep -cv "\.okf\.md$")" -ge 1 ]`
@@ -58,7 +58,7 @@ List every artifact found matching the detected framework. Present the list to t
58
58
 
59
59
  See [REFERENCE.md](REFERENCE.md) — `Detected: GSD...`
60
60
 
61
- → verify: `find . -maxdepth 4 \( -name "ROADMAP.md" -o -name "spec.md" -o -name "prd.md" -o -name "REQUIREMENTS.md" \) 2>/dev/null | grep -v ".git" | head -15`
61
+ → verify: `test -d specs && test -w specs`
62
62
 
63
63
  ### Step 3 — Transform (one artifact at a time, show diffs)
64
64
 
@@ -94,9 +94,9 @@ See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirement
94
94
 
95
95
  > **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
96
96
  >
97
- > → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
97
+ > → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
98
98
 
99
- → verify: `ls specs/*.md 2>/dev/null | head -15`
99
+ → verify: `test -d specs && [ "$(ls specs/*.md specs/*.yaml 2>/dev/null | wc -l | tr -d " ")" -gt 0 ]`
100
100
 
101
101
  ### Step 4 — Generate state.yaml
102
102
 
@@ -90,7 +90,7 @@ After writing capsule tasks, suggest `kickoff-branch` (if not already on a featu
90
90
 
91
91
  ## Verify
92
92
 
93
- → verify: `test -f scripts/lib/plan-consistency-check.sh && bash scripts/lib/plan-consistency-check.sh specs/epics/e45-quality-core/ 2>&1 | head -5`
93
+ → verify: `test -f scripts/lib/plan-consistency-check.sh && EPIC=$(ls -d specs/epics/*/ 2>/dev/null | grep -v archive | sort | head -1) && test -n "$EPIC" && bash scripts/lib/plan-consistency-check.sh "$EPIC" >/dev/null 2>&1`
94
94
 
95
95
 
96
96
 
@@ -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`