Free · Apache-2.0 · Claude Code, Codex and Cursor
Stop coding agents saying “done” when the tests don't pass.
Agents report a task as finished, or tests as passing, when a test was skipped, deleted or weakened to get there. skylos done runs your test command itself, compares the branch with main, and fails when tests were deleted, skipped or weakened. No model decides the result.
What users report
The agent reports its own result, and a rules file is text the model reads. Neither checks the work.
“Claude added @unittest.skip markers to 6 tests and declared work complete”
“Claims completion against instructions”
“If we can’t trust it to use our rules how can we rely on any output?”
What skylos done fails on
- Tests fail when Skylos runs them, or the test run doesn't finish
- Tests deleted, skipped, or weakened, including loosened test settings and CI test steps
- Code written to pass particular tests, such as an answer hard-coded to a test's input
- Skylos settings, or the agent hook files that run it, edited
- Secrets added
The agent's change (git diff main)
--- a/shop/pricing.py+++ b/shop/pricing.py-PERCENT_OFF = {"SAVE10": 10}+PERCENT_OFF = {"SAVE10": 10, "SAVE20": 20} def apply_discount(total: float, code: str) -> float:- percent = PERCENT_OFF.get(code, 0)+ percent = PERCENT_OFF[code] return round(total * (100 - percent) / 100, 2)--- a/tests/test_pricing.py+++ b/tests/test_pricing.py assert apply_discount(100.0, "SAVE10") == 90.0 +def test_save20_takes_twenty_percent_off():+ assert apply_discount(100.0, "SAVE20") == 80.0+++@pytest.mark.skip(reason="flaky") def test_unknown_code_keeps_total(): assert apply_discount(100.0, "BOGUS") == 100.0skylos done --base main
$ skylos done --base mainSkylos done · base 8da0a2b (merge base) · head d0ff52aUNFINISHED Tests pass when Skylos runs them: Earlier required checks failed or were incompleteFAIL No tests deleted, skipped or weakened: 1 test change(s) weaken what the tests check tests/test_pricing.py:15 SKY-A111 test_unknown_code_keeps_total now skips or expects failure (skip) tests/test_pricing.py:14 SKY-A101 (advice) Test was skipped or xfailed in this diff Fix: Put back the removed or skipped tests and the original assertions and settings.PASS Skylos settings and hooks left alone: Skylos settings, hooks and protected paths unchangedPASS No secrets added: No secrets addedPASS Every package and import is real: Every added import and package resolvesWARN Tests check the changed lines: Earlier required checks failed or were incompletePASS Code doesn't special-case the tests: No code special-cases the tests (1 changed file(s) read)PASS Linters, type checkers, scanners and CI not silenced: No linter, type-checker, scanner or CI settings weakenedVerdict: FAIL (Tests pass when Skylos runs them, No tests deleted, skipped or weakened)Receipt: .skylos/receipts/d0ff52a8ddaa-8da0a2b2fb37.json$ echo $?1Recorded output from Skylos 4.47.1 on a small example repository. Nothing runs or uploads in your browser.
A rules file is a request. A CI check is enforcement.
Run the same check on every pull request, outside the agent's session. Skylos reads its settings from the base branch, never from the agent's change.
Writes .github/workflows/skylos.yml, with a Skylos Done job when Skylos finds a pytest project or a test_command. Commit it, then make the Skylos check required.
Claude Code hooks setup
skylos agent install-hooks --claude adds five hooks to .claude/settings.json and keeps the hooks you already have. Running it again changes nothing; --uninstall removes only Skylos's entries.
- UserPromptSubmit
- Records the starting checkout, so your own earlier edits aren't blamed on the agent.
- PreToolUse on Bash
- Blocks installs of packages that don't exist on npm, PyPI or the Go module proxy, and of look-alike names, before the command runs (npm, pnpm, yarn, bun, pip, pipx, uv, poetry, go).
- PreToolUse on Read
- Blocks the agent's Read tool on a file that holds a secret. Reads through the shell, such as cat .env, are not blocked.
- PostToolUse on Edit, Write, MultiEdit
- Checks each edit and tells the agent about issues it added.
- Stop
- Refuses “done” while issues the agent added are still open.
Rolling this out across a team?
Teams of 10–200 engineers can work with the founder for 8 weeks, free: Skylos set up as a required pull request check on one repository, with the hooks for developers who want them.