bigpowers 2.73.0 → 2.73.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/.pi/package.json +1 -1
- package/CHANGELOG.md +14 -0
- package/audit-independent-unwaived-2026-07-06.md +49 -0
- package/package.json +1 -1
- package/scripts/check-blind-spots.sh +3 -0
- package/scripts/lib/trace-stories.py +3 -2
- package/scripts/sync-bugs-registry.sh +3 -1
- package/scripts/test-trace-strict.sh +132 -0
package/.pi/package.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [2.73.2](https://github.com/danielvm-git/bigpowers/compare/v2.73.1...v2.73.2) (2026-07-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **ci:** close BUG-2026-07-04-python-interpreter-fragility — python-env.sh resolver verified ([1f4fd30](https://github.com/danielvm-git/bigpowers/commit/1f4fd301f9ec19b2eb60100d43d79ac57891bed6))
|
|
7
|
+
|
|
8
|
+
## [2.73.1](https://github.com/danielvm-git/bigpowers/compare/v2.73.0...v2.73.1) (2026-07-06)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **ci:** skip unimplemented P0 stories in trace --strict gate ([e7a56bf](https://github.com/danielvm-git/bigpowers/commit/e7a56bfd94d5dbebf0f7736383e2c381016616b9))
|
|
14
|
+
|
|
1
15
|
# [2.73.0](https://github.com/danielvm-git/bigpowers/compare/v2.72.1...v2.73.0) (2026-07-06)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Independent Compliance Audit (Unwaived Mode)
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-07-06
|
|
4
|
+
**Mode**: Strict (All waivers disabled)
|
|
5
|
+
**Target**: `specs/verifications/features/`
|
|
6
|
+
**Result**: GATE: FAIL
|
|
7
|
+
|
|
8
|
+
## Summary of Execution
|
|
9
|
+
I executed the verification gates by temporarily bypassing `waivers.yaml` to run an independent compliance audit against the `bigpowers` principles and conventions without any exceptions. The `audit-compliance.sh` and `validate-doctrine.sh` scripts were successfully executed.
|
|
10
|
+
|
|
11
|
+
## Failed Verification Steps & Offending Scripts
|
|
12
|
+
|
|
13
|
+
By disabling the waivers, I isolated **4 failing verification steps**. Below is the mapping of each failure to its offending files and corresponding `bigpowers` skills:
|
|
14
|
+
|
|
15
|
+
### 1. Unique Public Symbols (`grep` < 5 results)
|
|
16
|
+
**Feature**: `akita.feature` (sourced from `conventions.feature`)
|
|
17
|
+
- **Reason**: Duplicate function names across multiple files (e.g., `agent_dry_run`, `assign_tier`, `cleanup`, `emit_json`, `fail`, `parse_frontmatter`, `pass`, `show_help`, `usage`).
|
|
18
|
+
- **Affected Core/Skills**: Common shared scripts and lifecycle utilities.
|
|
19
|
+
|
|
20
|
+
### 2. Context Window Constraint (< 300 lines)
|
|
21
|
+
**Feature**: `akita.feature`
|
|
22
|
+
- **Reason**: Scripts exceeding the 300-line limit for agent context windows.
|
|
23
|
+
- **Offending Files**:
|
|
24
|
+
- `scripts/sync-skills.sh` (Mapped to: `craft-skill`, `evolve-skill`, `maintain-wiki`)
|
|
25
|
+
- `scripts/migrate-version.sh` (Mapped to: `migrate-spec`)
|
|
26
|
+
- `scripts/run-verification-gates.sh` (Core harness)
|
|
27
|
+
- `scripts/validate-okf.sh` (Core harness)
|
|
28
|
+
- `scripts/audit-compliance.sh` (Core harness / `audit-code`)
|
|
29
|
+
- `scripts/run-golden-suite.sh` (Core harness)
|
|
30
|
+
- `scripts/lib/trace-matrix.py` (Mapped to: `gate-trace`)
|
|
31
|
+
- `scripts/lib/trace-stories.py` (Mapped to: `trace-requirement`)
|
|
32
|
+
|
|
33
|
+
### 3. Newspaper Metaphor (< 500 lines)
|
|
34
|
+
**Feature**: `cleancode.feature`
|
|
35
|
+
- **Reason**: Critical scripts exceeding the absolute 500-line hard cap.
|
|
36
|
+
- **Offending Files**:
|
|
37
|
+
- `scripts/sync-skills.sh` (Mapped to: `craft-skill`, `evolve-skill`)
|
|
38
|
+
- `scripts/migrate-version.sh` (Mapped to: `migrate-spec`)
|
|
39
|
+
- `scripts/lib/trace-matrix.py` (Mapped to: `gate-trace`)
|
|
40
|
+
|
|
41
|
+
### 4. Boolean Encapsulation (G28)
|
|
42
|
+
**Feature**: `cleancode.feature`
|
|
43
|
+
- **Reason**: Complex, multi-clause bash conditional logic not encapsulated in named functions.
|
|
44
|
+
- **Offending Files**:
|
|
45
|
+
- `scripts/migrate-version.sh` (Mapped to: `migrate-spec`)
|
|
46
|
+
- `scripts/check-spec-version-gap.sh` (Mapped to: `plan-release`)
|
|
47
|
+
|
|
48
|
+
## Restoration
|
|
49
|
+
After the test run concluded, the original `waivers.yaml` was restored to preserve environment integrity. No actual code modifications were made.
|
package/package.json
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
set -euo pipefail
|
|
13
13
|
source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
|
|
14
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
15
|
+
resolve_repo_root
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
BLIND_SPOTS_JSON="$REPO_ROOT/specs/blind-spots.json"
|
|
16
19
|
EXEC_STATUS="$REPO_ROOT/specs/execution-status.yaml"
|
|
@@ -30,6 +30,7 @@ MODE = sys.argv[6]
|
|
|
30
30
|
# 1. Parse YAML files → story inventory
|
|
31
31
|
# -----------------------------------------------------------------------
|
|
32
32
|
_MIN_STORY_BASELINE = 50 # floor assertion: --strict FAILs if story count drops below this
|
|
33
|
+
_STRICT_UNIMPLEMENTED_STATUSES = frozenset({"backlog", "todo", "planned"})
|
|
33
34
|
|
|
34
35
|
def _load_yaml(path: Path) -> dict:
|
|
35
36
|
"""Load a YAML file with PyYAML. Exits with code 1 if parse fails."""
|
|
@@ -290,10 +291,10 @@ if STRICT:
|
|
|
290
291
|
wsjf_sorted = sorted(set(s["wsjf"] for s in matrix_stories), reverse=True)
|
|
291
292
|
cutoff_idx = max(0, len(wsjf_sorted) // 4 - 1)
|
|
292
293
|
p0_threshold = wsjf_sorted[cutoff_idx] if cutoff_idx < len(wsjf_sorted) else 0
|
|
293
|
-
# Only flag
|
|
294
|
+
# Only flag stories expected to have implementation — skip backlog/todo/planned
|
|
294
295
|
uncovered_p0 = [s["id"] for s in matrix_stories
|
|
295
296
|
if s["wsjf"] >= p0_threshold and len(s["links"]) == 0
|
|
296
|
-
and s["status"]
|
|
297
|
+
and s["status"] not in _STRICT_UNIMPLEMENTED_STATUSES]
|
|
297
298
|
if uncovered_p0:
|
|
298
299
|
print(f"trace-stories.sh: STRICT FAIL — P0 stories with 0% coverage: {', '.join(uncovered_p0)}", file=sys.stderr)
|
|
299
300
|
sys.exit(2)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# story: e45s03
|
|
3
2
|
# sync-bugs-registry.sh — rebuild specs/bugs/registry.yaml + OKF concept bundles
|
|
4
3
|
set -euo pipefail
|
|
5
4
|
source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
|
|
6
5
|
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
6
|
+
resolve_repo_root
|
|
7
7
|
BUGS="$REPO_ROOT/specs/bugs"
|
|
8
8
|
mkdir -p "$BUGS"
|
|
9
9
|
|
|
@@ -18,6 +18,8 @@ repo_root = Path(sys.argv[2])
|
|
|
18
18
|
# ---- Phase 1: Build registry.yaml ----
|
|
19
19
|
entries = []
|
|
20
20
|
for path in sorted(bugs_dir.glob("BUG-*.md")):
|
|
21
|
+
if ".okf" in path.name:
|
|
22
|
+
continue
|
|
21
23
|
text = path.read_text(encoding="utf-8")
|
|
22
24
|
if not text.startswith("---"):
|
|
23
25
|
continue
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# test-trace-strict.sh — strict mode must not block unimplemented P0 stories
|
|
3
|
+
#
|
|
4
|
+
# Covers BUG-2026-07-06T205700:
|
|
5
|
+
# - todo/planned/backlog P0 stories with 0 links do not fail --strict
|
|
6
|
+
# - done P0 stories with 0 links still fail --strict
|
|
7
|
+
#
|
|
8
|
+
# Usage: bash scripts/test-trace-strict.sh
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
|
|
12
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
13
|
+
resolve_repo_root
|
|
14
|
+
|
|
15
|
+
RED='\033[0;31m'
|
|
16
|
+
GREEN='\033[0;32m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
TRACE_ENGINE="$REPO_ROOT/scripts/lib/trace-stories.py"
|
|
20
|
+
FAILURES=0
|
|
21
|
+
|
|
22
|
+
pass() { echo -e "${GREEN}PASS${NC} $1"; }
|
|
23
|
+
fail() { echo -e "${RED}FAIL${NC} $1"; FAILURES=$((FAILURES + 1)); }
|
|
24
|
+
|
|
25
|
+
run_strict() {
|
|
26
|
+
local root="$1"
|
|
27
|
+
local matrix_json
|
|
28
|
+
local trace_md
|
|
29
|
+
local okf_dir
|
|
30
|
+
matrix_json=$(mktemp)
|
|
31
|
+
trace_md=$(mktemp)
|
|
32
|
+
okf_dir=$(mktemp -d)
|
|
33
|
+
set +e
|
|
34
|
+
local output
|
|
35
|
+
output=$($PYTHON "$TRACE_ENGINE" "$root" "$matrix_json" "$trace_md" "$okf_dir" 1 "" 2>&1)
|
|
36
|
+
local exit_code=$?
|
|
37
|
+
set -e
|
|
38
|
+
rm -f "$matrix_json" "$trace_md"
|
|
39
|
+
rm -rf "$okf_dir"
|
|
40
|
+
printf '%s\n' "$output"
|
|
41
|
+
return "$exit_code"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
write_fixture() {
|
|
45
|
+
local root="$1"
|
|
46
|
+
local done_story="${2:-}"
|
|
47
|
+
|
|
48
|
+
mkdir -p "$root/specs/epics/e99-test"
|
|
49
|
+
cat >"$root/specs/release-plan.yaml" <<'EOF'
|
|
50
|
+
release:
|
|
51
|
+
version: "1.0.0"
|
|
52
|
+
codename: "Strict Test"
|
|
53
|
+
status: "proposed"
|
|
54
|
+
epics:
|
|
55
|
+
- id: e99
|
|
56
|
+
title: "Strict Test Epic"
|
|
57
|
+
wsjf: 5.0
|
|
58
|
+
bcps: 51
|
|
59
|
+
mode: capsule
|
|
60
|
+
status: proposed
|
|
61
|
+
capsule_dir: epics/e99-test
|
|
62
|
+
EOF
|
|
63
|
+
|
|
64
|
+
{
|
|
65
|
+
echo "stories:"
|
|
66
|
+
for i in $(seq 1 51); do
|
|
67
|
+
sid=$(printf 'e99s%02d' "$i")
|
|
68
|
+
printf ' - id: %s\n title: "Story %d"\n bcp: 1\n' "$sid" "$i"
|
|
69
|
+
done
|
|
70
|
+
} >"$root/specs/epics/e99-test/epic.yaml"
|
|
71
|
+
|
|
72
|
+
{
|
|
73
|
+
echo "development_status:"
|
|
74
|
+
for i in $(seq 1 51); do
|
|
75
|
+
sid=$(printf 'e99s%02d' "$i")
|
|
76
|
+
if [[ -n "$done_story" && "$sid" == "$done_story" ]]; then
|
|
77
|
+
echo " $sid: done"
|
|
78
|
+
else
|
|
79
|
+
echo " $sid: todo"
|
|
80
|
+
fi
|
|
81
|
+
done
|
|
82
|
+
} >"$root/specs/execution-status.yaml"
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
echo "=== trace-strict: integration (real repo) ==="
|
|
86
|
+
set +e
|
|
87
|
+
bash "$REPO_ROOT/scripts/trace-stories.sh" --strict --json >/dev/null 2>&1
|
|
88
|
+
repo_exit=$?
|
|
89
|
+
set -e
|
|
90
|
+
if [[ $repo_exit -eq 0 ]]; then
|
|
91
|
+
pass "trace-stories.sh --strict exits 0 on repo"
|
|
92
|
+
else
|
|
93
|
+
fail "trace-stories.sh --strict exits $repo_exit on repo (expected 0)"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo ""
|
|
97
|
+
echo "=== trace-strict: fixture — all todo P0, 0 links ==="
|
|
98
|
+
FIXTURE_ROOT=$(mktemp -d)
|
|
99
|
+
trap 'rm -rf "$FIXTURE_ROOT"' EXIT
|
|
100
|
+
write_fixture "$FIXTURE_ROOT"
|
|
101
|
+
set +e
|
|
102
|
+
todo_output=$(run_strict "$FIXTURE_ROOT")
|
|
103
|
+
todo_exit=$?
|
|
104
|
+
set -e
|
|
105
|
+
if [[ $todo_exit -eq 0 ]]; then
|
|
106
|
+
pass "strict passes when P0 stories are todo with 0 links"
|
|
107
|
+
else
|
|
108
|
+
fail "strict exits $todo_exit on all-todo fixture (expected 0)"
|
|
109
|
+
echo "$todo_output"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
echo ""
|
|
113
|
+
echo "=== trace-strict: fixture — done P0 with 0 links ==="
|
|
114
|
+
write_fixture "$FIXTURE_ROOT" "e99s01"
|
|
115
|
+
set +e
|
|
116
|
+
done_output=$(run_strict "$FIXTURE_ROOT")
|
|
117
|
+
done_exit=$?
|
|
118
|
+
set -e
|
|
119
|
+
if [[ $done_exit -eq 2 ]] && grep -q "P0 stories with 0% coverage" <<<"$done_output"; then
|
|
120
|
+
pass "strict fails when a done P0 story has 0 links"
|
|
121
|
+
else
|
|
122
|
+
fail "strict exits $done_exit on done-dark fixture (expected 2 with P0 message)"
|
|
123
|
+
echo "$done_output"
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
echo ""
|
|
127
|
+
if [[ $FAILURES -eq 0 ]]; then
|
|
128
|
+
echo "test-trace-strict: PASS"
|
|
129
|
+
exit 0
|
|
130
|
+
fi
|
|
131
|
+
echo "test-trace-strict: FAIL ($FAILURES failure(s))"
|
|
132
|
+
exit 1
|