.claude-plugin/skills/fixture-timeout-calibration/SKILL.md
# Skill: fixture-timeout-calibration ## Overview | Field | Value | |-------|-------| | Date | 2026-02-21 | | PR | #884 | | Objective | Update `timeout_seconds` in all 47 test fixture YAML files with calibrated values derived from observed batch run durations | | Outcome | Success — total timeout sum reduced from ~147,900s to ~29,820s (~80% reduction) | | Category | testing | ## When to Use Trigger this skill when: - Batch E2E runs finish but many tests use generic default timeout values tha
npx skillsauth add homericintelligence/projectscylla .claude-plugin/skills/fixture-timeout-calibrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Field | Value |
|-------|-------|
| Date | 2026-02-21 |
| PR | #884 |
| Objective | Update timeout_seconds in all 47 test fixture YAML files with calibrated values derived from observed batch run durations |
| Outcome | Success — total timeout sum reduced from ~147,900s to ~29,820s (~80% reduction) |
| Category | testing |
Trigger this skill when:
timeout_seconds = max(180, ceil(actual_duration * 3 / 60) * 60)
| Observed Duration | Raw (3x) | Rounded to 60s | Final | |-------------------|----------|----------------|-------| | 28s | 84s | 120s | 180s (floor) | | 45s | 135s | 180s | 180s | | 72s | 216s | 240s | 240s | | 150s | 450s | 480s | 480s | | 300s | 900s | 900s | 900s |
| Metric | Before | After | |--------|--------|-------| | Files updated | 47 | 47 | | Total timeout sum | ~147,900s | ~29,820s | | Reduction | — | ~80% | | Files at old default (300s) | many | 0 | | Minimum value | 300s | 180s |
Run the batch E2E suite and extract actual durations from the results. Durations are typically in the
run_metadata.json or in the test result YAML output for each test.
# Example: gather durations from results
grep -r "duration_seconds" tests/fixtures/results/ | sort
Apply the formula to each observed duration:
import math
def calibrate_timeout(actual_duration_seconds: float) -> int:
raw = actual_duration_seconds * 3
rounded = math.ceil(raw / 60) * 60
return max(180, rounded)
Read 9-10 files at a time to understand the current structure before editing:
# Verify structure of a representative file first
cat tests/fixtures/tests/test-001/test.yaml
Typical fixture structure:
task:
description: "..."
timeout_seconds: 300 # <-- field to update
...
Edit files in groups of 9-10. This is efficient and stays within tool concurrency limits.
For each file, change only the timeout_seconds field. Do not touch any other fields.
tests/fixtures/tests/test-001/test.yaml -> timeout_seconds: 180
tests/fixtures/tests/test-002/test.yaml -> timeout_seconds: 240
...
tests/fixtures/tests/test-047/test.yaml -> timeout_seconds: 360
Before committing, search the entire test suite for any hardcoded references to the old timeout value:
grep -r "timeout_seconds" tests/unit/
grep -r "timeout_seconds" tests/
grep -rn "== 300" tests/unit/
grep -rn "timeout_seconds ==" tests/
Update any hardcoded assertions to match the new floor value (180) or to be data-driven.
git add tests/fixtures/tests/
git add tests/unit/ # if any unit tests were updated
git commit -m "test(fixtures): calibrate timeout_seconds using 3x observed duration formula"
git push -u origin <branch>
gh pr create --title "test(fixtures): calibrate timeout_seconds to observed durations" \
--body "Closes #<issue>"
gh pr merge --auto --rebase
What happened: After editing all 47 fixture YAML files and committing, the pre-commit hook ran
tests/unit/test_config_loader.py and the following assertion failed:
FAILED tests/unit/test_config_loader.py::test_load_test - AssertionError:
assert test.task.timeout_seconds == 300
Line 78 of tests/unit/test_config_loader.py had a hardcoded assert test.task.timeout_seconds == 300.
When the fixture file test-001/test.yaml was updated from 300s to 180s (the new floor), the assertion
broke because the test was checking the literal value loaded from the fixture, not a calculated value.
Fix: Update tests/unit/test_config_loader.py:78 from:
assert test.task.timeout_seconds == 300
to:
assert test.task.timeout_seconds == 180
Then amend the commit and push again. The pre-commit hook passed on the second attempt.
Key lesson: When updating fixture files that are exercised by unit tests, always grep the test suite for the old values before committing:
grep -rn "== 300" tests/
grep -rn "timeout_seconds" tests/unit/
git checkout blocked by Safety NetWhat happened: During branch switching, the command git checkout -b skill/testing/fixture-timeout-calibration
was blocked by the repository's Safety Net configuration.
Fix: Use git switch instead of git checkout for all branch operations:
# WRONG — may be blocked
git checkout -b skill/testing/fixture-timeout-calibration
# CORRECT — always works
git switch -c skill/testing/fixture-timeout-calibration
git switch main
git switch <existing-branch>
git-worktree-collision-fix — E2E batch runner error eliminationwired-runner-fixture — Shared pytest fixture extraction patternsdevelopment
# Skill: docs-status-fix ## Overview | Field | Value | |------------|----------------------------------------------------| | Date | 2026-02-19 | | Category | documentation | | Objective | Fix stale "Current Status" in CLAUDE.md | | Issue | #753 | | PR | #810
tools
# Skill: preflight-closing-issues-fix ## Overview | Field | Value | |-------|-------| | Date | 2026-02-21 | | Issue | #802 | | PR | #912 | | Category | tooling | | Objective | Fix `preflight_check.sh` Check 3 false positives caused by free-text PR search matching issue numbers in unrelated PR titles/bodies | | Outcome | Success — 6 bash tests pass, all pre-commit hooks green, PR created with auto-merge | ## When to Use Trigger this skill when: - A preflight/guard script uses `gh pr list --s
tools
# Preflight Check Skill Propagation ## Overview | Field | Value | |-------|-------| | Date | 2026-02-21 | | Issue | #803 | | Objective | Add preflight check to `worktree-create` skill so developers bypassing `gh-implement-issue` still run the 6-check safety gate | | Outcome | Success — PR #917 created, auto-merge enabled | | Files Changed | `tests/claude-code/shared/skills/worktree/worktree-create/SKILL.md` | ## When to Use Use this pattern when: - A safety/quality gate exists in one entry-
tools
# Orphan Config Detection ## Overview | Field | Value | |------------|-----------------------------------------------------------------| | Date | 2026-02-20 | | Issue | #777 | | PR | #824 | | Objective | Warn when a `config/models/*.yaml` file