bigpowers 2.88.18 → 2.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.gemini/extensions/bigpowers/gemini-extension.json +2 -2
  2. package/.pi/package.json +2 -2
  3. package/CHANGELOG.md +14 -0
  4. package/CLAUDE.md +1 -1
  5. package/CONVENTIONS.md +0 -1
  6. package/README.md +1 -1
  7. package/SKILL-INDEX.md +43 -44
  8. package/package.json +1 -1
  9. package/scripts/bp-churn-rank.sh +3 -2
  10. package/scripts/check-spec-version-gap.sh +2 -1
  11. package/scripts/generate-skill-index.sh +1 -1
  12. package/scripts/land-branch.sh +7 -3
  13. package/scripts/lib/__pycache__/link_utils.cpython-310.pyc +0 -0
  14. package/scripts/lib/__pycache__/srp_engine_links.cpython-310.pyc +0 -0
  15. package/scripts/lib/__pycache__/srp_engine_okf.cpython-310.pyc +0 -0
  16. package/scripts/lib/doc-fetch-cache.sh +1 -1
  17. package/scripts/lib/golden-suite-gates.sh +2 -0
  18. package/scripts/lib/parallel-review-worktrees.sh +3 -1
  19. package/scripts/lib/sync-post.sh +1 -1
  20. package/scripts/run-smoke.sh +3 -2
  21. package/scripts/test-pipefail-pipe-race.sh +68 -0
  22. package/scripts/validate-doctrine.sh +3 -3
  23. package/scripts/validate-skill-catalog.sh +1 -1
  24. package/skills-lock.json +0 -5
  25. package/.agents/skills/context7-mcp/SKILL.md +0 -55
  26. package/.cline/skills/context7-mcp/SKILL.md +0 -55
  27. package/.codebuddy/skills/context7-mcp/SKILL.md +0 -55
  28. package/.codex/skills/context7-mcp/SKILL.md +0 -55
  29. package/.continue/rules/context7-mcp.md +0 -0
  30. package/.copilot/skills/context7-mcp/SKILL.md +0 -55
  31. package/.cursor/rules/context7-mcp.mdc +0 -54
  32. package/.gemini/extensions/bigpowers/commands/prompts/context7-mcp.md +0 -54
  33. package/.gemini/extensions/bigpowers/skills/context7-mcp/SKILL.md +0 -56
  34. package/.hermes/skills/context7-mcp/SKILL.md +0 -55
  35. package/.kilocode/rules/context7-mcp.md +0 -55
  36. package/.mimocode/skills/context7-mcp/SKILL.md +0 -55
  37. package/.opencode/skills/context7-mcp/SKILL.md +0 -55
  38. package/.pi/prompts/context7-mcp.md +0 -54
  39. package/.pi/skills/context7-mcp/SKILL.md +0 -55
  40. package/.qwen/skills/context7-mcp/SKILL.md +0 -55
  41. package/.trae/skills/context7-mcp/SKILL.md +0 -55
  42. package/.windsurf/rules/context7-mcp.md +0 -55
  43. package/.zcode/skills/context7-mcp/SKILL.md +0 -55
  44. package/skills/context7-mcp/SKILL.md +0 -57
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.18",
4
- "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
3
+ "version": "2.89.1",
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
  "gemini-extension"
7
7
  ],
package/.pi/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.18",
4
- "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
3
+ "version": "2.89.1",
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"
7
7
  ],
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [2.89.1](https://github.com/danielvm-git/bigpowers/compare/v2.89.0...v2.89.1) (2026-11-03)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **scripts:** remove pipefail SIGPIPE races from git and long-output pipelines ([#186](https://github.com/danielvm-git/bigpowers/issues/186)) ([f55cbb7](https://github.com/danielvm-git/bigpowers/commit/f55cbb7d8883dd0af4777ac2467d5b550fde23db))
7
+
8
+ # [2.89.0](https://github.com/danielvm-git/bigpowers/compare/v2.88.18...v2.89.0) (2026-11-02)
9
+
10
+
11
+ ### Features
12
+
13
+ * **skills:** remove context7-mcp skill for provider-agnostic catalog ([#180](https://github.com/danielvm-git/bigpowers/issues/180)) ([514826b](https://github.com/danielvm-git/bigpowers/commit/514826b9c5c003aad45349e9cf54b2f09976a7ce))
14
+
1
15
  ## [2.88.18](https://github.com/danielvm-git/bigpowers/compare/v2.88.17...v2.88.18) (2026-11-02)
2
16
 
3
17
 
package/CLAUDE.md CHANGED
@@ -173,7 +173,7 @@ Before any task, run this sequence — not optional:
173
173
  - Search with `bts find` before opening files to locate a symbol or pattern.
174
174
  - Pipe anything > 200 lines through `bts compress` before adding to context.
175
175
  - Run `bts map` when asked for a repo overview.
176
- - Use `bts docs <lib>` before answering questions about library APIs. Doc fetches use `scripts/lib/doc-fetch-cache.sh` (ETag-revalidated, 300s TTL — see `context7-mcp` skill, e45s20).
176
+ - Use `bts docs <lib>` before answering questions about library APIs. Doc fetches use `scripts/lib/doc-fetch-cache.sh` (ETag-revalidated, 300s TTL).
177
177
  - If a tool is missing, say so and run `bts doctor` — do not silently substitute.
178
178
 
179
179
  <!-- BEGIN rtk-pretooluse-hook (e45s16 — mechanical PreToolUse backstop; remove block to disable) -->
package/CONVENTIONS.md CHANGED
@@ -380,7 +380,6 @@ name must return < 5 results across the repo.
380
380
  | `visual-dashboard` | adjective-noun | `view-dashboard` implies read-only; `show-dashboard` collides with `show` verbs |
381
381
  | `deploy` | single verb | Well-known DevOps single-word concept; renames like `deploy-app` or `deploy-service` are redundant since deploy always targets an application |
382
382
  | `grill-with-docs` | three-word verb-prep-noun | Variant of `grill-me`; the `-with-docs` suffix is the distinguishing feature — collapsing it would hide the doc-grounded contract |
383
- | `context7-mcp` | noun-noun (product + protocol) | Names the external service and protocol it fronts; a verb-noun rename (`fetch-docs`) would collide with generic doc-fetch skills and hide which provider is used |
384
383
  | `generate-allure-report` | three-word verb-noun-noun | `generate-report` is ambiguous across report types; `allure` names the specific output format consumers integrate with |
385
384
  | `simple-english` | adjective-noun | Names the recognizable STE brand users search for (`simplify-english` / `write-plain` hide intent and break searchability for users coming from the upstream skill) |
386
385
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)
4
4
  ![npm version](https://img.shields.io/npm/v/bigpowers.svg)
5
- ![Skills](https://img.shields.io/badge/skills-81-brightgreen.svg)
5
+ ![Skills](https://img.shields.io/badge/skills-80-brightgreen.svg)
6
6
 
7
7
  **Agent skills synthesizing 17 years of software engineering discipline — from Clean Code to AI-native architecture — into a single, prescriptive methodology for solo developers.**
8
8
 
package/SKILL-INDEX.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > **DO NOT EDIT** — This file is auto-generated by `scripts/generate-skill-index.sh`.
4
4
  > Edit `SKILL.md` source files or `skills-lock.json` instead. Run `bash scripts/sync-skills.sh` to regenerate.
5
5
 
6
- **Skills:** 81
6
+ **Skills:** 80
7
7
 
8
8
  ---
9
9
 
@@ -15,10 +15,10 @@
15
15
  | Design | 7 | `deepen-architecture, define-language, define-success, design-interface, grill-me, grill-with-docs, model-domain` |
16
16
  | Plan | 9 | `assess-impact, change-request, plan-refactor, plan-release, plan-work, run-planning, scope-work, seed-conventions, slice-tasks` |
17
17
  | Build | 17 | `align-grid, build-epic, craft-skill, deploy, develop-tdd, execute-plan, extract-design, guard-git, hook-commits, kickoff-branch, orchestrate-project, publish-package, quick-fix, setup-environment, spike-prototype, wire-ci, wire-observability` |
18
- | Verify | 20 | `audit-code, context7-mcp, diagnose-root, diagnose-stall, enforce-first, fix-bug, gate-trace, generate-allure-report, inspect-quality, investigate-bug, plan-tests, request-review, respond-review, run-evals, security-review, smoke-test, trace-requirement, validate-contracts, validate-fix, verify-work` |
18
+ | Verify | 19 | `audit-code, diagnose-root, diagnose-stall, enforce-first, fix-bug, gate-trace, generate-allure-report, inspect-quality, investigate-bug, plan-tests, request-review, respond-review, run-evals, security-review, smoke-test, trace-requirement, validate-contracts, validate-fix, verify-work` |
19
19
  | Release | 2 | `commit-message, release-branch` |
20
20
  | Sustain | 18 | `compose-workflow, delegate-task, dispatch-agents, edit-document, evolve-skill, harden-vps, maintain-wiki, migrate-spec, organize-workspace, reset-baseline, run-benchmark, session-state, simple-english, simulate-agents, stocktake-skills, terse-mode, visual-dashboard, write-document` |
21
- | **TOTAL** | **81** | |
21
+ | **TOTAL** | **80** | |
22
22
 
23
23
  ---
24
24
 
@@ -68,47 +68,46 @@
68
68
  | 40 | Build | `wire-ci` | "CI pipeline setup with bundled, forge-neutral templates and local validation. D | ✅ Active |
69
69
  | 41 | Build | `wire-observability` | Add structured JSON logging, observability commands, and idempotent setup script | ✅ Active |
70
70
  | 42 | Verify | `audit-code` | Self-review checklist for the coding agent to run before dispatching a reviewer. | ✅ Active |
71
- | 43 | Verify | `context7-mcp` | Fetch current library docs via Context7 MCP instead of training data. Use when u | ✅ Active |
72
- | 44 | Verify | `diagnose-root` | Run 4-phase root cause analysis — reproduce, isolate, hypothesize, verify. Use | ✅ Active |
73
- | 45 | Verify | `diagnose-stall` | Diagnose why agent orchestration stopped producing progress — silent stalls in | ✅ Active |
74
- | 46 | Verify | `enforce-first` | Apply the F.I.R.S.T test quality rubric (per CONVENTIONS.md §Tests) to a test s | ✅ Active |
75
- | 47 | Verify | `fix-bug` | Bug fix orchestrator — active_flow fix_bug; reads specs/bugs/BUG-*.md; chains | ✅ Active |
76
- | 48 | Verify | `gate-trace` | "Deterministic traceability quality gate — reads coverage matrix + blind-spot | ✅ Active |
77
- | 49 | Verify | `generate-allure-report` | "Generate Allure-ready reports from bigpowers YAML metadata. Reads execution-sta | ✅ Active |
78
- | 50 | Verify | `inspect-quality` | Interactive QA session where user reports bugs or issues conversationally, and t | ✅ Active |
79
- | 51 | Verify | `investigate-bug` | Investigate a bug or issue by exploring the codebase to find root cause, then wr | ✅ Active |
80
- | 52 | Verify | `plan-tests` | "Design a risk-scaled test architecture for an epic before implementation begins | ✅ Active |
81
- | 53 | Verify | `request-review` | Dispatch a fresh reviewer agent with a clean context to critique the code after | ✅ Active |
82
- | 54 | Verify | `respond-review` | Act on a reviewer agent's feedback systematically — categorize findings, apply | ✅ Active |
83
- | 55 | Verify | `run-evals` | Eval-Driven Development — define capability and regression evals before buildi | ✅ Active |
84
- | 56 | Verify | `security-review` | > | ✅ Active |
85
- | 57 | Verify | `smoke-test` | "Post-deploy health-check against a live URL. Validates HTTP status, response co | ✅ Active |
86
- | 58 | Verify | `trace-requirement` | Link story IDs from specs/release-plan.yaml + epic capsule directories to the im | ✅ Active |
87
- | 59 | Verify | `validate-contracts` | "Assert data shape consistency across system boundaries — live API responses a | ✅ Active |
88
- | 60 | Verify | `validate-fix` | Prove a fix works before declaring done — re-run the failing test, run the ful | ✅ Active |
89
- | 61 | Verify | `verify-work` | Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-b | ✅ Active |
90
- | 62 | Release | `commit-message` | Reviews working-tree changes, then drafts a Conventional Commits title/body and | ✅ Active |
91
- | 63 | Release | `release-branch` | Make the merge/PR/keep/discard decision for a feature branch, verify coverage ga | ✅ Active |
92
- | 64 | Sustain | `compose-workflow` | Chain multiple bigpowers skills into a custom workflow recipe saved in specs/. U | ✅ Active |
93
- | 65 | Sustain | `delegate-task` | Delegate one complex task to a single subagent, review its work in two stages be | ✅ Active |
94
- | 66 | Sustain | `dispatch-agents` | Dispatch multiple subagents in parallel on independent tasks. No waiting between | ✅ Active |
95
- | 67 | Sustain | `edit-document` | Edit and improve documents by restructuring sections, improving clarity, and tig | ✅ Active |
96
- | 68 | Sustain | `evolve-skill` | Benchmark-gated skill evolution — consume bigpowers-benchmark report, propose | ✅ Active |
97
- | 69 | Sustain | `harden-vps` | "Harden a production Linux VPS for your application across three layers — appl | ✅ Active |
98
- | 70 | Sustain | `maintain-wiki` | "Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across | ✅ Active |
99
- | 71 | Sustain | `migrate-spec` | Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers Y | ✅ Active |
100
- | 72 | Sustain | `organize-workspace` | Scans the active workspace for disposable artifacts—logs, caches, stale build | ✅ Active |
101
- | 73 | Sustain | `reset-baseline` | Restore the project to a known clean state between agent runs or experiments. Us | ✅ Active |
102
- | 74 | Sustain | `run-benchmark` | Run skill quality benchmarks from specs/benchmarks/ definitions — N-run with/w | ✅ Active |
103
- | 75 | Sustain | `session-state` | Track implementation decisions and progress in specs/state.yaml to prevent conte | ✅ Active |
104
- | 76 | Sustain | `simple-english` | Write or rewrite technical text with the rules of ASD-STE100 Simplified Technica | ✅ Active |
105
- | 77 | Sustain | `simulate-agents` | Run Mock User and Auditor agents against a feature in fresh contexts before huma | ✅ Active |
106
- | 78 | Sustain | `stocktake-skills` | Sequential subagent batch audit of the bigpowers skill catalog — Quick Scan (c | ✅ Active |
107
- | 79 | Sustain | `terse-mode` | Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping | ✅ Active |
108
- | 80 | Sustain | `visual-dashboard` | Start a browser-based dashboard that visualizes architecture, implementation pla | ✅ Active |
109
- | 81 | Sustain | `write-document` | Write, organize, and sync high-integrity technical documents using the BMAD meth | ✅ Active |
110
-
111
- **Total: 81 active skills.**
71
+ | 43 | Verify | `diagnose-root` | Run 4-phase root cause analysis — reproduce, isolate, hypothesize, verify. Use | ✅ Active |
72
+ | 44 | Verify | `diagnose-stall` | Diagnose why agent orchestration stopped producing progress — silent stalls in | ✅ Active |
73
+ | 45 | Verify | `enforce-first` | Apply the F.I.R.S.T test quality rubric (per CONVENTIONS.md §Tests) to a test s | ✅ Active |
74
+ | 46 | Verify | `fix-bug` | Bug fix orchestrator — active_flow fix_bug; reads specs/bugs/BUG-*.md; chains | ✅ Active |
75
+ | 47 | Verify | `gate-trace` | "Deterministic traceability quality gate — reads coverage matrix + blind-spot | ✅ Active |
76
+ | 48 | Verify | `generate-allure-report` | "Generate Allure-ready reports from bigpowers YAML metadata. Reads execution-sta | ✅ Active |
77
+ | 49 | Verify | `inspect-quality` | Interactive QA session where user reports bugs or issues conversationally, and t | ✅ Active |
78
+ | 50 | Verify | `investigate-bug` | Investigate a bug or issue by exploring the codebase to find root cause, then wr | ✅ Active |
79
+ | 51 | Verify | `plan-tests` | "Design a risk-scaled test architecture for an epic before implementation begins | ✅ Active |
80
+ | 52 | Verify | `request-review` | Dispatch a fresh reviewer agent with a clean context to critique the code after | ✅ Active |
81
+ | 53 | Verify | `respond-review` | Act on a reviewer agent's feedback systematically — categorize findings, apply | ✅ Active |
82
+ | 54 | Verify | `run-evals` | Eval-Driven Development — define capability and regression evals before buildi | ✅ Active |
83
+ | 55 | Verify | `security-review` | > | ✅ Active |
84
+ | 56 | Verify | `smoke-test` | "Post-deploy health-check against a live URL. Validates HTTP status, response co | ✅ Active |
85
+ | 57 | Verify | `trace-requirement` | Link story IDs from specs/release-plan.yaml + epic capsule directories to the im | ✅ Active |
86
+ | 58 | Verify | `validate-contracts` | "Assert data shape consistency across system boundaries — live API responses a | ✅ Active |
87
+ | 59 | Verify | `validate-fix` | Prove a fix works before declaring done — re-run the failing test, run the ful | ✅ Active |
88
+ | 60 | Verify | `verify-work` | Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-b | ✅ Active |
89
+ | 61 | Release | `commit-message` | Reviews working-tree changes, then drafts a Conventional Commits title/body and | ✅ Active |
90
+ | 62 | Release | `release-branch` | Make the merge/PR/keep/discard decision for a feature branch, verify coverage ga | ✅ Active |
91
+ | 63 | Sustain | `compose-workflow` | Chain multiple bigpowers skills into a custom workflow recipe saved in specs/. U | ✅ Active |
92
+ | 64 | Sustain | `delegate-task` | Delegate one complex task to a single subagent, review its work in two stages be | ✅ Active |
93
+ | 65 | Sustain | `dispatch-agents` | Dispatch multiple subagents in parallel on independent tasks. No waiting between | ✅ Active |
94
+ | 66 | Sustain | `edit-document` | Edit and improve documents by restructuring sections, improving clarity, and tig | ✅ Active |
95
+ | 67 | Sustain | `evolve-skill` | Benchmark-gated skill evolution — consume bigpowers-benchmark report, propose | ✅ Active |
96
+ | 68 | Sustain | `harden-vps` | "Harden a production Linux VPS for your application across three layers — appl | ✅ Active |
97
+ | 69 | Sustain | `maintain-wiki` | "Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across | ✅ Active |
98
+ | 70 | Sustain | `migrate-spec` | Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers Y | ✅ Active |
99
+ | 71 | Sustain | `organize-workspace` | Scans the active workspace for disposable artifacts—logs, caches, stale build | ✅ Active |
100
+ | 72 | Sustain | `reset-baseline` | Restore the project to a known clean state between agent runs or experiments. Us | ✅ Active |
101
+ | 73 | Sustain | `run-benchmark` | Run skill quality benchmarks from specs/benchmarks/ definitions — N-run with/w | ✅ Active |
102
+ | 74 | Sustain | `session-state` | Track implementation decisions and progress in specs/state.yaml to prevent conte | ✅ Active |
103
+ | 75 | Sustain | `simple-english` | Write or rewrite technical text with the rules of ASD-STE100 Simplified Technica | ✅ Active |
104
+ | 76 | Sustain | `simulate-agents` | Run Mock User and Auditor agents against a feature in fresh contexts before huma | ✅ Active |
105
+ | 77 | Sustain | `stocktake-skills` | Sequential subagent batch audit of the bigpowers skill catalog — Quick Scan (c | ✅ Active |
106
+ | 78 | Sustain | `terse-mode` | Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping | ✅ Active |
107
+ | 79 | Sustain | `visual-dashboard` | Start a browser-based dashboard that visualizes architecture, implementation pla | ✅ Active |
108
+ | 80 | Sustain | `write-document` | Write, organize, and sync high-integrity technical documents using the BMAD meth | ✅ Active |
109
+
110
+ **Total: 80 active skills.**
112
111
 
113
112
  ---
114
113
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.18",
3
+ "version": "2.89.1",
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": {
@@ -45,5 +45,6 @@ git log --since="$SINCE" --name-only --pretty=format: $PATHSPEC \
45
45
  | sort \
46
46
  | uniq -c \
47
47
  | sort -rn \
48
- | head -n "$LIMIT" \
49
- | awk '{printf "%4d %s\n", $1, $2}'
48
+ | awk -v limit="$LIMIT" 'NR <= limit {printf "%4d %s\n", $1, $2}'
49
+ # awk reads to the end instead of `head -n`, which closed the pipe early and
50
+ # made `sort` die with SIGPIPE under pipefail (BUG-2026-11-02-pipefail-pipe-race).
@@ -81,7 +81,8 @@ yaml_value_set() {
81
81
  }
82
82
 
83
83
  has_dirty_specs() {
84
- [[ -d "$SPECS" ]] && git -C "$PROJECT_DIR" status --porcelain -- specs/ 2>/dev/null | grep -q .
84
+ # Test the captured output, not `git status | grep -q .` — a pipefail race (BUG-2026-11-02-pipefail-pipe-race).
85
+ [[ -d "$SPECS" ]] && [[ -n "$(git -C "$PROJECT_DIR" status --porcelain -- specs/ 2>/dev/null)" ]]
85
86
  }
86
87
 
87
88
  is_blocking_active_flow() {
@@ -44,7 +44,7 @@ phase_of() {
44
44
  # Build
45
45
  develop-tdd|kickoff-branch|execute-plan|build-epic|spike-prototype|craft-skill|quick-fix|setup-environment|wire-observability|wire-ci|publish-package|align-grid|orchestrate-project|guard-git|hook-commits|deploy|smoke-test|validate-contracts|extract-design) echo "Build" ;;
46
46
  # Verify
47
- verify-work|validate-fix|audit-code|enforce-first|run-evals|investigate-bug|diagnose-root|fix-bug|inspect-quality|request-review|respond-review|trace-requirement|security-review|context7-mcp|diagnose-stall|gate-trace|generate-allure-report|plan-tests) echo "Verify" ;;
47
+ verify-work|validate-fix|audit-code|enforce-first|run-evals|investigate-bug|diagnose-root|fix-bug|inspect-quality|request-review|respond-review|trace-requirement|security-review|diagnose-stall|gate-trace|generate-allure-report|plan-tests) echo "Verify" ;;
48
48
  # Release
49
49
  release-branch|commit-message) echo "Release" ;;
50
50
  # Sustain
@@ -86,8 +86,11 @@ if ! git show-ref --verify --quiet "refs/heads/$FEATURE_BRANCH"; then
86
86
  land_branch_deny "Feature branch '$FEATURE_BRANCH' does not exist"
87
87
  fi
88
88
 
89
- # Scan all commits in feature branch for Co-authored-by: footers
90
- if git log "$DEFAULT_BRANCH..$FEATURE_BRANCH" --format="%B" 2>/dev/null | grep -qiE '^co[- ]authored[- ]by:'; then
89
+ # Scan all commits in feature branch for Co-authored-by: footers.
90
+ # Capture first: `git log | grep -q` under pipefail fails at random when grep
91
+ # exits before git finishes writing (SIGPIPE) — BUG-2026-11-02-pipefail-pipe-race.
92
+ FEATURE_BODIES="$(git log "$DEFAULT_BRANCH..$FEATURE_BRANCH" --format="%B" 2>/dev/null || true)"
93
+ if grep -qiE '^co[- ]authored[- ]by:' <<<"$FEATURE_BODIES"; then
91
94
  land_branch_deny "Feature branch '$FEATURE_BRANCH' contains Co-authored-by: footer(s). Amend commits to remove all AI agent attribution before landing."
92
95
  fi
93
96
 
@@ -194,7 +197,8 @@ fi
194
197
 
195
198
  # Worktree cleanup
196
199
  WORKTREE_PATH="../$FEATURE_BRANCH"
197
- if git worktree list --porcelain 2>/dev/null | grep -q "^worktree $WORKTREE_PATH$"; then
200
+ WORKTREES="$(git worktree list --porcelain 2>/dev/null || true)"
201
+ if grep -q "^worktree $WORKTREE_PATH$" <<<"$WORKTREES"; then
198
202
  echo "==> Removing worktree $WORKTREE_PATH"
199
203
  git worktree remove "$WORKTREE_PATH" 2>/dev/null || git worktree remove -f "$WORKTREE_PATH"
200
204
  fi
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # story: e45s20
3
- # doc-fetch-cache.sh — ETag-revalidated fetch cache for Context7 / bts docs queries.
3
+ # doc-fetch-cache.sh — ETag-revalidated fetch cache for bts docs queries.
4
4
  # Usage:
5
5
  # bash scripts/lib/doc-fetch-cache.sh get <cache-key> # print cached body or empty
6
6
  # bash scripts/lib/doc-fetch-cache.sh put <key> <etag> <body-file>
@@ -79,6 +79,8 @@ GOLDEN_GATES=(
79
79
  "specs-parse:bash scripts/validate-specs-yaml.sh:false"
80
80
  # The runner itself: failing output is shown, skips are named and reasoned.
81
81
  "golden-gate-runner:bash scripts/test-golden-gate-runner.sh:false"
82
+ # Pipefail SIGPIPE races: fix shapes hold, git output never feeds grep -q/head.
83
+ "pipefail-pipe-race:bash scripts/test-pipefail-pipe-race.sh:false"
82
84
  # One pipeline, release needs: every gate, pinned runner and actions.
83
85
  "ci-pipeline-contract-selftest:bash scripts/test-ci-pipeline-contract.sh --self-test:false"
84
86
  "ci-pipeline-contract:bash scripts/test-ci-pipeline-contract.sh:false"
@@ -11,7 +11,9 @@ cd "$REPO_ROOT"
11
11
  BASE=".bigpowers/worktrees/review-${CHECK}"
12
12
  mkdir -p "$(dirname "$BASE")"
13
13
 
14
- if git worktree list | grep -q "$BASE"; then
14
+ # Capture first: `git worktree list | grep -q` is a pipefail race (BUG-2026-11-02-pipefail-pipe-race).
15
+ WORKTREES="$(git worktree list)"
16
+ if grep -q "$BASE" <<<"$WORKTREES"; then
15
17
  git worktree remove --force "$BASE" 2>/dev/null || true
16
18
  fi
17
19
 
@@ -73,7 +73,7 @@ sync_post_run() {
73
73
  bash "$REPO_ROOT/scripts/build-skill-index.sh" || true
74
74
  fi
75
75
 
76
- local CURSOR_KEEP="context7.mdc" mdc mdc_base
76
+ local CURSOR_KEEP="" mdc mdc_base
77
77
  for mdc in "$CURSOR_RULES"/*.mdc; do
78
78
  [[ -e "$mdc" ]] || continue
79
79
  mdc_base=$(basename "$mdc")
@@ -46,7 +46,8 @@ run_single_url_check() {
46
46
 
47
47
  # Assert content signal
48
48
  if [ -n "$content_signal" ]; then
49
- if echo "$body" | grep -qiE "$content_signal"; then
49
+ # Here-string, not `echo "$body" | grep -q`: a large body races pipefail (BUG-2026-11-02-pipefail-pipe-race).
50
+ if grep -qiE "$content_signal" <<<"$body"; then
50
51
  echo " PASS: body matches \"$content_signal\""
51
52
  else
52
53
  echo " FAIL: body does not match \"$content_signal\""
@@ -165,7 +166,7 @@ run_parsed_check() {
165
166
 
166
167
  # Assert content signal
167
168
  if [ -n "$content_signal" ]; then
168
- if echo "$body" | grep -qiE "$content_signal"; then
169
+ if grep -qiE "$content_signal" <<<"$body"; then
169
170
  echo " PASS: body matches \"$content_signal\""
170
171
  checks_passed=$((checks_passed + 1))
171
172
  else
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env bash
2
+ # story: BUG-2026-11-02-pipefail-pipe-race
3
+ # test-pipefail-pipe-race.sh — regression guard for SIGPIPE races under pipefail.
4
+ #
5
+ # `producer | grep -q` (or `| head`) fails at random under `set -o pipefail`:
6
+ # the reader exits early, the producer dies with SIGPIPE (141), and pipefail
7
+ # reports the pipeline as failed — a found match reads as "not found".
8
+ #
9
+ # (a) anti-vacuity: the racy shape really fails on this host
10
+ # (b) each fix shape used in the repo passes RUNS times with a long producer
11
+ # (c) static guard: no pipefail script pipes git output into an early-exit reader
12
+ #
13
+ # Usage: bash scripts/test-pipefail-pipe-race.sh
14
+
15
+ set -euo pipefail
16
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
17
+ resolve_repo_root
18
+ cd "$REPO_ROOT"
19
+
20
+ source scripts/lib/test-assertions.sh
21
+ TA_PASS=0
22
+ TA_FAIL=0
23
+ RUNS=20
24
+
25
+ # ~2 MB of output: far past any pipe buffer, so an early reader always wins.
26
+ long_producer() { seq 1 300000; }
27
+
28
+ # Runs "$@" RUNS times; prints how many runs returned non-zero.
29
+ count_failures() {
30
+ local i fails=0
31
+ for ((i = 0; i < RUNS; i++)); do
32
+ "$@" || fails=$((fails + 1))
33
+ done
34
+ echo "$fails"
35
+ }
36
+
37
+ racy_grep_q() { long_producer | grep -q '^1$'; }
38
+ fixed_capture() { local out; out="$(long_producer)"; grep -q '^1$' <<<"$out"; }
39
+ fixed_nonempty() { [[ -n "$(long_producer)" ]]; }
40
+ fixed_awk_limit() { long_producer | awk -v limit=3 'NR <= limit' >/dev/null; }
41
+ fixed_sed_range() { long_producer | sed -n '1,5p' >/dev/null; }
42
+
43
+ echo "=== test-pipefail-pipe-race.sh ==="
44
+
45
+ fails=$(count_failures racy_grep_q)
46
+ [[ "$fails" -gt 0 ]] \
47
+ && ta_pass "(a) racy 'producer | grep -q' fails under pipefail ($fails/$RUNS)" \
48
+ || ta_fail "(a) racy shape never failed — test cannot detect the race on this host"
49
+
50
+ for fix in fixed_capture fixed_nonempty fixed_awk_limit fixed_sed_range; do
51
+ fails=$(count_failures "$fix")
52
+ [[ "$fails" -eq 0 ]] \
53
+ && ta_pass "(b) $fix: 0/$RUNS failures" \
54
+ || ta_fail "(b) $fix: $fails/$RUNS failures"
55
+ done
56
+
57
+ # run-skill-verify.sh holds `git diff ... | head -20` as a fixture string of
58
+ # fail-open verify directives, not as a command it runs.
59
+ hits=$(grep -rlE 'pipefail' scripts hooks --include='*.sh' \
60
+ | grep -v '^scripts/run-skill-verify\.sh$' \
61
+ | xargs grep -nE 'git [a-z-]+[^|]*\|[[:space:]]*(grep -[a-zA-Z]*[qm]|head)' \
62
+ | grep -vE '^[^:]+:[0-9]+:[[:space:]]*#' || true)
63
+ [[ -z "$hits" ]] \
64
+ && ta_pass "(c) no pipefail script pipes git output into grep -q/-m or head" \
65
+ || ta_fail "(c) git output piped into an early-exit reader:"$'\n'"$hits"
66
+
67
+ echo "$TA_PASS passed, $TA_FAIL failed"
68
+ [[ "$TA_FAIL" -eq 0 ]]
@@ -55,7 +55,7 @@ else
55
55
  grep -rE "PLAN\.md|STATE\.md|PROJECT\.md|CONTEXT\.md|SUMMARY\.md|VERIFICATION\.md|RESEARCH\.md|RELEASE-PLAN\.md" \
56
56
  docs/ 2>/dev/null \
57
57
  | grep -v "docs/archive/" \
58
- | grep -v "specs/archive" | head -20 >&2
58
+ | grep -v "specs/archive" | sed -n '1,20p' >&2 # sed reads to the end; `head` races pipefail (BUG-2026-11-02-pipefail-pipe-race)
59
59
  fi
60
60
 
61
61
  # ── Epic 1: Skill count consistency ───────────────────────────────────────────
@@ -94,7 +94,7 @@ else
94
94
  2>/dev/null \
95
95
  | grep -v "specs/archive\|specs/epics/archive\|docs/archive/\|\.git\|node_modules\|\.gemini\|\.cursor" \
96
96
  | grep -v "CHANGELOG\.md\|specs/verifications/reports/\|PLAN-evolve-structure\.md" \
97
- | head -10 >&2
97
+ | sed -n '1,10p' >&2
98
98
  fi
99
99
 
100
100
  # ── Epic 3: BCP slop guard ────────────────────────────────────────────────────
@@ -107,7 +107,7 @@ if [[ "$BCP_SLOP" -eq 0 ]]; then
107
107
  else
108
108
  doctrine_fail "'Build Commit Point' found ($BCP_SLOP hits) — canonical term is 'Business Complexity Points'; see docs/references/bcp.md"
109
109
  grep -ri "build commit point" . 2>/dev/null \
110
- | grep -v "specs/archive\|\.git\|node_modules\|\.gemini\|\.cursor\|validate-doctrine\.sh" | head -5 >&2
110
+ | grep -v "specs/archive\|\.git\|node_modules\|\.gemini\|\.cursor\|validate-doctrine\.sh" | sed -n '1,5p' >&2
111
111
  fi
112
112
 
113
113
  # ── Epic 4: SKILL.md size cap ─────────────────────────────────────────────────
@@ -18,7 +18,7 @@ VIOLATIONS=0
18
18
  WARNINGS=0
19
19
 
20
20
  # Documented naming exceptions (craft-skill REFERENCE.md)
21
- VERB_NOUN_EXCEPTIONS="grill-me grill-with-docs context7-mcp using-bigpowers deploy generate-allure-report"
21
+ VERB_NOUN_EXCEPTIONS="grill-me grill-with-docs using-bigpowers deploy generate-allure-report"
22
22
 
23
23
  catalog_usage() {
24
24
  echo "Usage: bash scripts/validate-skill-catalog.sh [--archive] [--strict] [--skill <name>]"
package/skills-lock.json CHANGED
@@ -41,11 +41,6 @@
41
41
  "sha256": "5dc23c0642af9d2b",
42
42
  "path": "skills/compose-workflow/SKILL.md"
43
43
  },
44
- "context7-mcp": {
45
- "description": "Fetch current library docs via Context7 MCP instead of training data. Use when user asks about frameworks, APIs, setup, or code examples for React, Next.js, Prisma, etc.",
46
- "sha256": "f58dcec5aff6a0bf",
47
- "path": "skills/context7-mcp/SKILL.md"
48
- },
49
44
  "craft-skill": {
50
45
  "description": "Create new bigpowers skills with proper structure, progressive disclosure, and bundled resources. Use when user wants to create, write, or build a new skill for the bigpowers lifecycle.",
51
46
  "sha256": "7acb068f458fa1b4",
@@ -1,55 +0,0 @@
1
- ---
2
- name: context7-mcp
3
- model: haiku
4
- description: "Fetch current library docs via Context7 MCP instead of training data. Use when user asks about frameworks, APIs, setup, or code examples for React, Next.js, Prisma, etc."
5
- ---
6
-
7
- # Context7 MCP
8
-
9
- > **HARD GATE** — Max **3** Context7 tool calls per user question (`resolve-library-id` + `query-docs` count toward the cap). On quota/rate-limit errors, emit an explicit **CONTEXT7_UNAVAILABLE** block — do NOT silently answer from training data.
10
- >
11
- > **HARD GATE** — Before HTTP fetch, check `bash scripts/lib/doc-fetch-cache.sh get "<libraryId>:<query>"`. Cache hit within TTL → use cached body (no round-trip). On ETag mismatch after conditional refresh, replace cache entry.
12
-
13
- ## When to Use
14
-
15
- - Setup/configuration questions ("How do I configure Next.js middleware?")
16
- - Code involving libraries ("Write a Prisma query for…")
17
- - API references ("What are the Supabase auth methods?")
18
- - User mentions specific frameworks (React, Vue, Svelte, Express, Tailwind, etc.)
19
-
20
- ## Bounded Retry (max 3x)
21
-
22
- | Attempt | Action |
23
- |---------|--------|
24
- | 1 | `resolve-library-id` → pick best match |
25
- | 2 | `query-docs` with selected `libraryId` |
26
- | 3 | Retry `query-docs` once with refined query (narrower scope) |
27
-
28
- After 3 failures, stop and print:
29
-
30
- ```
31
- CONTEXT7_UNAVAILABLE
32
- Reason: <quota|rate-limit|no-match|timeout>
33
- Action: Ask user to retry later, paste official docs URL, or run `bts docs <lib>`.
34
- Do NOT substitute training-data answers without labeling them UNVERIFIED.
35
- ```
36
-
37
- ## Fetch Cache (ETag-revalidated)
38
-
39
- 1. **Cache key:** `"<libraryId>:<normalized-query>"` (lowercase, trimmed).
40
- 2. **Read:** `bash scripts/lib/doc-fetch-cache.sh get "<key>"` — exit 0 → use cached body.
41
- 3. **Miss / stale:** call `query-docs`; store via `doc-fetch-cache.sh put`.
42
- 4. **TTL:** 300s default (`DOC_CACHE_TTL`). Stale entries refresh on next fetch; honor `ETag` when MCP returns it.
43
-
44
- `bts docs <lib>` shares the same cache helper when invoked from this skill.
45
-
46
- ## Process
47
-
48
- 1. `resolve-library-id` with `libraryName` + full user `query`.
49
- 2. Select match: name similarity, reputation, benchmark score; prefer version-specific IDs when user names a version.
50
- 3. `query-docs` with `libraryId` + specific question (one concept per call).
51
- 4. Answer using fetched docs; cite library/version when relevant.
52
-
53
- ## Verify
54
-
55
- → verify: `test -f scripts/lib/doc-fetch-cache.sh`
@@ -1,55 +0,0 @@
1
- ---
2
- name: context7-mcp
3
- model: haiku
4
- description: "Fetch current library docs via Context7 MCP instead of training data. Use when user asks about frameworks, APIs, setup, or code examples for React, Next.js, Prisma, etc."
5
- ---
6
-
7
- # Context7 MCP
8
-
9
- > **HARD GATE** — Max **3** Context7 tool calls per user question (`resolve-library-id` + `query-docs` count toward the cap). On quota/rate-limit errors, emit an explicit **CONTEXT7_UNAVAILABLE** block — do NOT silently answer from training data.
10
- >
11
- > **HARD GATE** — Before HTTP fetch, check `bash scripts/lib/doc-fetch-cache.sh get "<libraryId>:<query>"`. Cache hit within TTL → use cached body (no round-trip). On ETag mismatch after conditional refresh, replace cache entry.
12
-
13
- ## When to Use
14
-
15
- - Setup/configuration questions ("How do I configure Next.js middleware?")
16
- - Code involving libraries ("Write a Prisma query for…")
17
- - API references ("What are the Supabase auth methods?")
18
- - User mentions specific frameworks (React, Vue, Svelte, Express, Tailwind, etc.)
19
-
20
- ## Bounded Retry (max 3x)
21
-
22
- | Attempt | Action |
23
- |---------|--------|
24
- | 1 | `resolve-library-id` → pick best match |
25
- | 2 | `query-docs` with selected `libraryId` |
26
- | 3 | Retry `query-docs` once with refined query (narrower scope) |
27
-
28
- After 3 failures, stop and print:
29
-
30
- ```
31
- CONTEXT7_UNAVAILABLE
32
- Reason: <quota|rate-limit|no-match|timeout>
33
- Action: Ask user to retry later, paste official docs URL, or run `bts docs <lib>`.
34
- Do NOT substitute training-data answers without labeling them UNVERIFIED.
35
- ```
36
-
37
- ## Fetch Cache (ETag-revalidated)
38
-
39
- 1. **Cache key:** `"<libraryId>:<normalized-query>"` (lowercase, trimmed).
40
- 2. **Read:** `bash scripts/lib/doc-fetch-cache.sh get "<key>"` — exit 0 → use cached body.
41
- 3. **Miss / stale:** call `query-docs`; store via `doc-fetch-cache.sh put`.
42
- 4. **TTL:** 300s default (`DOC_CACHE_TTL`). Stale entries refresh on next fetch; honor `ETag` when MCP returns it.
43
-
44
- `bts docs <lib>` shares the same cache helper when invoked from this skill.
45
-
46
- ## Process
47
-
48
- 1. `resolve-library-id` with `libraryName` + full user `query`.
49
- 2. Select match: name similarity, reputation, benchmark score; prefer version-specific IDs when user names a version.
50
- 3. `query-docs` with `libraryId` + specific question (one concept per call).
51
- 4. Answer using fetched docs; cite library/version when relevant.
52
-
53
- ## Verify
54
-
55
- → verify: `test -f scripts/lib/doc-fetch-cache.sh`