Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Operate the GRACE 4 CLI for .grace linting, status, module navigation, verification navigation, and file-local semantic markup.
.claude/skills/osovv-grace-cli/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -15% | 0% |
<skill> <installation_contract>Invoke the installed stable grace binary directly. If it is missing, install it with bun add -g @osovv/grace-cli. Do not default to bunx, npx, or the rc dist-tag.</installation_contract>
<commands>
grace lint --path PROJECT --assertions currentgrace lint --path PROJECT --change C-ID --assertions baseline (add --run-commands when the baseline declares MustPassCommand)grace lint --path PROJECT --change C-ID --assertions target --run-commandsgrace lint --path PROJECT --change C-ID --assertions final --run-commandsgrace lint --path PROJECT --parallel-preflightgrace status --path PROJECT --with modules --jsongrace module find|show, grace verification find|show, and grace file show.</commands>
<command_run_contract> --run-commands executes each declared MustPassCommand value once per lint, fail-fast, with a default 600s per-command timeout (--command-timeout SECONDS overrides, 0 disables). Plan, progress, and per-command result lines go to stderr; the lint report and JSON go to stdout, so piping stdout stays safe. Agents and pipes get compact output by default; interactive terminals see live streamed command output. Force modes with --verbose (live) or --quiet (compact); they are mutually exclusive, and --format json is always compact. Full combined output of every command is stored per run under ~/.cache/grace/run-commands/<project>/runs/<run>/ (respecting XDG_CACHE_HOME) with a machine-readable meta.json; failing commands print a bounded output tail plus the absolute log path. meta.json records the VCS identity the run executed against (head, branch, dirty, all null outside a git repository) plus the writing pid; it is written at run start with status running and rewritten on completion, and a running record whose process is gone is reclassified as killed on a later run. Pruning keeps the newest passing run of every change indefinitely, so the evidence an archived change cites stays on disk; the retention count applies only to non-passing runs — failed, timed out, interrupted, superseded by a newer pass of the same change, unbound to a change, or missing a readable meta.json. The count defaults to 10, is set project-wide by runLogRetention in .grace-lint.json, and is overridden per run by --keepRuns N. --keepRuns 0 keeps no non-passing runs at all, which deletes the current run as soon as it fails and leaves its printed log path dangling. Interrupted runs (SIGINT/SIGTERM) kill the whole command process group, record interrupted status in meta.json, and exit 130.</command_run_contract>
<lifecycle_command_contract>current evaluates active approved baselines and is not end-state evidence. Keep MustPassCommand entries as leaf project checks; do not nest grace lint, grace status, or another GRACE lifecycle command inside plan assertions. Run selected target/final lint externally.</lifecycle_command_contract>
<failure_contract> Lint, status, and navigation commands validate before returning records. JSON argument/runtime failures are one { "schemaVersion": "1.0.0", "ok": false, "error": { ... } } object on stdout. Text failures are one concise actionable line with a nonzero exit code and no stack trace. </failure_contract>
<runtime_contract> TypeScript/JavaScript analysis is bundled. Python and Dart governed files require their runtimes on PATH; missing runtimes fail closed with actionable analysis.runtime-missing diagnostics instead of silently dropping parity checks. </runtime_contract>
<migration_boundary>GRACE 4 commands do not dual-validate legacy GRACE 3 docs. Use grace-migrate.</migration_boundary> </skill>
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 9,501 | 10,923 | +15% | 1 | 1 | 0% | 1,459 | 1,115 | -24% | 0 | 0 | — |
case-02 | fail→fail | 7,701 | 6,537 | -15% | 1 | 1 | 0% | 223 | 1,207 | +441% | 0 | 0 | — |
case-03 | fail→fail | 19,909 | 5,964 | -70% | 1 | 1 | 0% | 2,986 | 1,103 | -63% | 0 | 0 | — |
case-04 | fail→pass | 8,107 | 3,044 | -62% | 1 | 1 | 0% | 1,256 | 1,211 | -4% | 0 | 0 | — |
case-05 | fail→fail | 17,147 | 9,373 | -45% | 1 | 1 | 0% | 2,493 | 1,405 | -44% | 0 | 0 | — |
case-06 | fail→pass | 7,273 | 4,014 | -45% | 1 | 1 | 0% | 1,131 | 1,567 | +39% | 0 | 0 | — |
case-07 | fail→pass | 6,902 | 2,779 | -60% | 1 | 1 | 0% | 1,035 | 1,265 | +22% | 0 | 0 | — |
case-08 | fail→fail | 8,579 | 4,452 | -48% | 1 | 1 | 0% | 1,318 | 1,521 | +15% | 0 | 0 | — |
case-09 | pass→pass | 25,448 | 3,307 | -87% | 1 | 1 | 0% | 2,992 | 1,306 | -56% | 0 | 0 | — |
case-10 | fail→pass | 13,906 | 9,408 | -32% | 1 | 1 | 0% | 1,941 | 1,658 | -15% | 0 | 0 | — |
case-11 | fail→pass | 7,384 | 4,620 | -37% | 1 | 1 | 0% | 847 | 1,581 | +87% | 0 | 0 | — |
case-12 | pass→pass | 12,704 | 8,387 | -34% | 1 | 1 | 0% | 1,568 | 2,124 | +35% | 0 | 0 | — |
case-13 | fail→pass | 11,450 | 4,828 | -58% | 1 | 1 | 0% | 1,660 | 1,666 | +0% | 0 | 0 | — |
case-14 | pass→pass | 12,271 | 4,333 | -65% | 1 | 1 | 0% | 1,824 | 1,571 | -14% | 0 | 0 | — |
case-15 | pass→pass | 8,679 | 4,095 | -53% | 1 | 1 | 0% | 1,376 | 1,474 | +7% | 0 | 0 | — |
case-16 | pass→pass | 12,534 | 3,579 | -71% | 1 | 1 | 0% | 1,821 | 1,299 | -29% | 0 | 0 | — |
case-17 | fail→pass | 15,112 | 5,077 | -66% | 1 | 1 | 0% | 2,381 | 1,365 | -43% | 0 | 0 | — |
case-18 | fail→pass | 28,919 | 2,820 | -90% | 1 | 1 | 0% | 4,581 | 1,202 | -74% | 0 | 0 | — |
case-19 | fail→pass | 10,712 | 4,438 | -59% | 1 | 1 | 0% | 1,554 | 1,450 | -7% | 0 | 0 | — |
case-20 | fail→pass | 10,027 | 2,470 | -75% | 1 | 1 | 0% | 1,638 | 1,181 | -28% | 0 | 0 | — |
case-21 | fail→fail | 11,966 | 8,836 | -26% | 1 | 1 | 0% | 1,846 | 1,769 | -4% | 0 | 0 | — |
case-22 | pass→fail | 9,962 | 33,523 | +237% | 1 | 1 | 0% | 1,598 | 1,165 | -27% | 0 | 0 | — |
case-23 | fail→fail | 15,416 | 2,238 | -85% | 1 | 1 | 0% | 2,394 | 1,188 | -50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 18 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +43 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 9/3/2026 | +27% |
| gemini-3.6-flash | verified | 8/24/2026 | +45% |
Other measured skills in the registry, with their headline benchmark lift.