projectbluefin/testsuite/quarantine-age
Claude Code and agent skill by projectbluefin/testsuite
- community
Checking that the SKILL.md file is still in the repository.
Quarantine policy and age limits for stale tests. Load when deciding whether to quarantine, unquarantine, or remove a scenario.
Install
npx vskill@latest install projectbluefin/testsuite/quarantine-ageSKILL.md
Quarantine age enforcement
When to Use
- Changing
scripts/check_quarantine_age.py - Changing the
quarantine-agejob in.github/workflows/pr-validate.yml - Debugging CI failures caused by expired
@quarantinescenarios
When NOT to Use
- Editing runtime skip behavior for
@quarantineor@pendingtags in behave hooks - Writing or debugging the quarantined scenarios themselves
- Changing reusable VM/e2e pipeline behavior unrelated to quarantine expiry
Core Process
- Scan current
tests/**/*.featurefiles and collect scenarios tagged@quarantine. - For each feature file, walk
git log --follow --name-only(newest first, reversed in Python because git ignores--followwith--reverse) and inspect file snapshots withgit show <sha>:<path-at-that-commit>. - Record the first commit where each scenario appears with
@quarantine; if history cannot prove it, fall back to the file's last git modification date. - Calculate age in days and fail when
age_days > (--max-days + --grace-days). - Print an actionable report with feature path, scenario name, quarantine date, age, and the required next action.
- Use
--jsononly for informational consumers (for example an Actions job summary); keep default CLI mode as the enforcement path that exits non-zero on expired quarantines.
What it does
scripts/check_quarantine_age.py scans current .feature files for @quarantine scenarios, walks git log --follow history for each feature file, and records the first commit where each scenario appears with the @quarantine tag.
The script fails when a quarantine age exceeds the configured threshold:
JSON mode (--json) emits every current quarantine entry, including days, quarantined_on, threshold_days, and date_source, and always exits 0 so workflow summaries can render counts without turning a reporting call into a job failure.
Workflow requirements
- The
quarantine-agejob lives in.github/workflows/pr-validate.yml. - That job must check out the repository with
fetch-depth: 0; shallow history breaks age detection. - The rollout job currently runs
python3 scripts/check_quarantine_age.py --grace-days 30to avoid blocking PRs immediately while still aging out stale quarantines. - Any workflow using
--jsonstill needs full history and the fulltests/tree checked out; otherwise age calculations and counts will be incomplete.
Choosing the right tag when a quarantine ages out
| Situation | Tag | Required comment | |
|---|---|---|---|
| Blocked on CI infrastructure (a masked service, unseeded state, headless session limits) | @pending | Name the blocker and the tracking issue | |
| Covers a feature or policy that has not shipped yet, or needs a harness that does not exist | @future | Name the feature/harness and the tracking issue | |
| The referenced upstream bug is closed | remove the tag | Note that the guard was re-activated and why | |
| Genuinely flaky and under active repair | @quarantine | You are committing to a fix inside 30 days |
Every converted scenario keeps an explanatory comment line immediately above its tags, in the style used by tests/developer/features/ptyxis.feature:
Never delete a scenario to clear the gate — the coverage intent is the asset. Never raise --max-days/--grace-days or edit the quarantine-age job thresholds to clear the gate.
Operator expectations
- If a quarantine ages out, fix the scenario or convert it to
@future/@pendingwhen it represents planned coverage rather than flaky regression coverage. @quarantine,@pendingand@futureare all skipped at runtime bytests/shared/quarantine.py, which every suite'sbefore_scenariohook calls. Reclassifying a tag therefore keeps the scenario skipped rather than turning it into a failure — but only because that helper handles all three tags. Do not drop one.- Keep the script dependency-free so it can run on
ubuntu-latestwith only checkout + Python setup. - Prefer snapshot-based history checks (
git show <sha>:<path>) over fragile diff hunk matching; the goal is stable CI enforcement, not perfect archeology.
Common Rationalizations
- "A shallow checkout is enough because the script only looks at the current file."
It is not; age detection depends on full git history, so fetch-depth: 0 is mandatory.
- "We should diff hunks around the scenario instead of reading historical snapshots."
Snapshot reads are simpler and more stable across refactors and formatting churn.
- "Grace days mean the rule is optional."
No; grace days are rollout padding, not a permanent exemption.
Red Flags
- The workflow runs the script after a shallow checkout
- The script starts depending on third-party Python packages for CI
- Report output omits the remediation path (
fix itorconvert to @future/@pending) - New quarantine-age behavior lands without updating this skill
Verification
- [ ]
python3 -m ruff check tests/ scripts/ --select E,F,W --ignore E501passes - [ ]
python3 -m pytest tests/unit/test_quarantine_age.py tests/unit/test_quarantine.py -vpasses - [ ]
python3 -m py_compile scripts/check_quarantine_age.pypasses - [ ] The workflow uses SHA-pinned actions and
actions/checkouthasfetch-depth: 0
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingdocs/skills/test-authoring/quarantine-age/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/projectbluefin/testsuite/quarantine-age)