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.
- package/.agents/skills/diagnose-root/SKILL.md +1 -1
- package/.agents/skills/migrate-spec/SKILL.md +3 -3
- package/.agents/skills/plan-work/SKILL.md +1 -1
- package/.agents/skills/security-review/SKILL.md +3 -1
- package/.agents/skills/smoke-test/SKILL.md +1 -1
- package/.agents/skills/trace-requirement/SKILL.md +1 -1
- package/.codebuddy/skills/diagnose-root/SKILL.md +1 -1
- package/.codebuddy/skills/migrate-spec/SKILL.md +3 -3
- package/.codebuddy/skills/plan-work/SKILL.md +1 -1
- package/.codebuddy/skills/security-review/SKILL.md +3 -1
- package/.codebuddy/skills/smoke-test/SKILL.md +1 -1
- package/.codebuddy/skills/trace-requirement/SKILL.md +1 -1
- package/.codex/skills/diagnose-root/SKILL.md +1 -1
- package/.codex/skills/migrate-spec/SKILL.md +3 -3
- package/.codex/skills/plan-work/SKILL.md +1 -1
- package/.codex/skills/security-review/SKILL.md +3 -1
- package/.codex/skills/smoke-test/SKILL.md +1 -1
- package/.codex/skills/trace-requirement/SKILL.md +1 -1
- package/.hermes/skills/diagnose-root/SKILL.md +1 -1
- package/.hermes/skills/migrate-spec/SKILL.md +3 -3
- package/.hermes/skills/plan-work/SKILL.md +1 -1
- package/.hermes/skills/security-review/SKILL.md +3 -1
- package/.hermes/skills/smoke-test/SKILL.md +1 -1
- package/.hermes/skills/trace-requirement/SKILL.md +1 -1
- package/.kilocode/rules/diagnose-root.md +1 -1
- package/.kilocode/rules/migrate-spec.md +3 -3
- package/.kilocode/rules/plan-work.md +1 -1
- package/.kilocode/rules/security-review.md +3 -1
- package/.kilocode/rules/smoke-test.md +1 -1
- package/.kilocode/rules/trace-requirement.md +1 -1
- package/.mimocode/skills/diagnose-root/SKILL.md +1 -1
- package/.mimocode/skills/migrate-spec/SKILL.md +3 -3
- package/.mimocode/skills/plan-work/SKILL.md +1 -1
- package/.mimocode/skills/security-review/SKILL.md +3 -1
- package/.mimocode/skills/smoke-test/SKILL.md +1 -1
- package/.mimocode/skills/trace-requirement/SKILL.md +1 -1
- package/.pi/package.json +1 -1
- package/.pi/prompts/diagnose-root.md +1 -1
- package/.pi/prompts/migrate-spec.md +3 -3
- package/.pi/prompts/plan-work.md +1 -1
- package/.pi/prompts/security-review.md +3 -1
- package/.pi/prompts/smoke-test.md +1 -1
- package/.pi/prompts/trace-requirement.md +1 -1
- package/.pi/skills/diagnose-root/SKILL.md +1 -1
- package/.pi/skills/migrate-spec/SKILL.md +3 -3
- package/.pi/skills/plan-work/SKILL.md +1 -1
- package/.pi/skills/security-review/SKILL.md +3 -1
- package/.pi/skills/smoke-test/SKILL.md +1 -1
- package/.pi/skills/trace-requirement/SKILL.md +1 -1
- package/.trae/skills/diagnose-root/SKILL.md +1 -1
- package/.trae/skills/migrate-spec/SKILL.md +3 -3
- package/.trae/skills/plan-work/SKILL.md +1 -1
- package/.trae/skills/security-review/SKILL.md +3 -1
- package/.trae/skills/smoke-test/SKILL.md +1 -1
- package/.trae/skills/trace-requirement/SKILL.md +1 -1
- package/.windsurf/rules/diagnose-root.md +1 -1
- package/.windsurf/rules/migrate-spec.md +3 -3
- package/.windsurf/rules/plan-work.md +1 -1
- package/.windsurf/rules/security-review.md +3 -1
- package/.windsurf/rules/smoke-test.md +1 -1
- package/.windsurf/rules/trace-requirement.md +1 -1
- package/.zcode/skills/diagnose-root/SKILL.md +1 -1
- package/.zcode/skills/migrate-spec/SKILL.md +3 -3
- package/.zcode/skills/plan-work/SKILL.md +1 -1
- package/.zcode/skills/security-review/SKILL.md +3 -1
- package/.zcode/skills/smoke-test/SKILL.md +1 -1
- package/.zcode/skills/trace-requirement/SKILL.md +1 -1
- package/CHANGELOG.md +15 -0
- package/package.json +1 -1
- package/scripts/lib/__pycache__/link_utils.cpython-312.pyc +0 -0
- package/scripts/lib/__pycache__/srp_engine_links.cpython-312.pyc +0 -0
- package/scripts/run-skill-verify.sh +97 -10
- package/scripts/verify-cwe-fixture-sync.sh +88 -0
- package/skills/diagnose-root/SKILL.md +1 -1
- package/skills/migrate-spec/SKILL.md +3 -3
- package/skills/plan-work/SKILL.md +1 -1
- package/skills/security-review/SKILL.md +3 -1
- package/skills/security-review/fixtures/CWE-639-idor-negative.go +48 -0
- package/skills/security-review/fixtures/CWE-639-idor-positive.go +29 -0
- package/skills/smoke-test/SKILL.md +1 -1
- package/skills/trace-requirement/SKILL.md +1 -1
- 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
|
|
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 -
|
|
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 -
|
|
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: `
|
|
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: `
|
|
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
|
|
97
|
+
> → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
|
|
98
98
|
|
|
99
|
-
→ verify: `ls specs/*.md 2>/dev/null |
|
|
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
|
|
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 -
|
|
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 -
|
|
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: `
|
|
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: `
|
|
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
|
|
97
|
+
> → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
|
|
98
98
|
|
|
99
|
-
→ verify: `ls specs/*.md 2>/dev/null |
|
|
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
|
|
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 -
|
|
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 -
|
|
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: `
|
|
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: `
|
|
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
|
|
97
|
+
> → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
|
|
98
98
|
|
|
99
|
-
→ verify: `ls specs/*.md 2>/dev/null |
|
|
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
|
|
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 -
|
|
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 -
|
|
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
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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: `
|
|
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: `
|
|
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
|
|
97
|
+
> → verify: `git rev-parse --git-dir >/dev/null 2>&1 && test -d specs`
|
|
98
98
|
|
|
99
|
-
→ verify: `ls specs/*.md 2>/dev/null |
|
|
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
|
|
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`
|