crapkit 0.4.6__tar.gz → 0.4.8__tar.gz
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.
- {crapkit-0.4.6 → crapkit-0.4.8}/PKG-INFO +152 -6
- crapkit-0.4.6/src/crapkit.egg-info/PKG-INFO → crapkit-0.4.8/README.md +1118 -1011
- {crapkit-0.4.6 → crapkit-0.4.8}/pyproject.toml +1 -1
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/__init__.py +1 -1
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/admin.py +16 -6
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/claude_hook.py +127 -4
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/lanes.py +115 -18
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/scaffold.py +30 -10
- crapkit-0.4.6/README.md → crapkit-0.4.8/src/crapkit.egg-info/PKG-INFO +1157 -972
- {crapkit-0.4.6 → crapkit-0.4.8}/LICENSE +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/setup.cfg +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/__main__.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/_pygdefer.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/analyze.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cache.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/churn.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/churn_cache.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/churn_log.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/__init__.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/_shared.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/analyses.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/parser.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/queue.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/ratchet_cmds.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/reports.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/scoring.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/cli/verifying.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/config.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/coupling.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/coupling_cache.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/coverage_istanbul.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/coverage_py.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/covstream.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/diffparse.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/digest.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/discover.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/doctor.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/dup.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/errors.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/gitio.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/hook.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/junitparse.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/keys.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/lizardcognitive.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/lizardpowershell.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/lizardrust.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/lizardshell.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/mcp_server.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/merge.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/mutate.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/mutate_pool.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/override.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/packet.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/procs.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/ratchet.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/ratchet_report.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/report.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/sarif.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/sarifio.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/score.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/snapshot.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/store.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/uncovered.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/universe.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/verify.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/watch.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit/worklist.py +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit.egg-info/SOURCES.txt +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit.egg-info/dependency_links.txt +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit.egg-info/entry_points.txt +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit.egg-info/requires.txt +0 -0
- {crapkit-0.4.6 → crapkit-0.4.8}/src/crapkit.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crapkit
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.8
|
|
4
4
|
Summary: Scores every function on complexity times uncovered risk, ranks the worst, and blocks commits that add more.
|
|
5
5
|
Author: Jean-Francois Gagne
|
|
6
6
|
License: MIT
|
|
@@ -44,6 +44,8 @@ Dynamic: license-file
|
|
|
44
44
|
[](https://pypi.org/project/crapkit/)
|
|
45
45
|
[](LICENSE)
|
|
46
46
|
|
|
47
|
+

|
|
48
|
+
|
|
47
49
|
crapkit scores every function in your repo on complexity times uncovered risk, ranks the
|
|
48
50
|
worst ones by how often the file changes, and blocks commits that add more. It reads
|
|
49
51
|
Python, TypeScript, TSX, JavaScript, Swift, Go, Rust, shell, PowerShell, C and C++,
|
|
@@ -145,7 +147,7 @@ changing crapkit.
|
|
|
145
147
|
|
|
146
148
|
```
|
|
147
149
|
$ crapkit --version
|
|
148
|
-
crapkit 0.4.
|
|
150
|
+
crapkit 0.4.8
|
|
149
151
|
```
|
|
150
152
|
|
|
151
153
|
`python -m crapkit` works identically to the console script and is what to use from a
|
|
@@ -227,6 +229,33 @@ ceiling. It adds no files to your repo, and it needs the crapkit CLI on PATH.
|
|
|
227
229
|
A repo with no `crapkit.toml` costs a silent sub-50 ms no-op per edit. Other agent
|
|
228
230
|
runtimes have no marketplace: copy `plugin/skills/*` into their skills directory instead.
|
|
229
231
|
|
|
232
|
+
The hook registers on `Edit|Write`, which is every write that names a file. An agent that
|
|
233
|
+
writes its source through a shell heredoc names none, so a `Bash` event is judged off the
|
|
234
|
+
working tree instead. That half is yours to register, because it costs two
|
|
235
|
+
git spawns per shell call. Add a second PostToolUse entry to your own settings, same
|
|
236
|
+
command, matcher `Bash`:
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"hooks": {
|
|
241
|
+
"PostToolUse": [
|
|
242
|
+
{
|
|
243
|
+
"matcher": "Bash",
|
|
244
|
+
"hooks": [
|
|
245
|
+
{ "type": "command", "command": "crapkit claude-hook --protocol 1", "timeout": 20 }
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
The cost is one `git rev-parse --show-toplevel` and one `git status --porcelain -z -uall`
|
|
254
|
+
per shell call in any git repo, whether or not crapkit measures it: about 30 ms together
|
|
255
|
+
on crapkit's own checkout, and more on a bigger tree. What comes back is the dirty or
|
|
256
|
+
untracked `*.py` files written in the last 12 seconds, 25 at most, each judged the way an
|
|
257
|
+
edit is. Python only, so a TypeScript or Go repo pays the two spawns and hears nothing.
|
|
258
|
+
|
|
230
259
|
## Languages
|
|
231
260
|
|
|
232
261
|
14 languages, two coverage parsers. Coverage joins where a parser exists; everything else
|
|
@@ -346,7 +375,7 @@ crapkit ships a `.pre-commit-hooks.yaml` declaring `id: crapkit-gate`. In your
|
|
|
346
375
|
repos:
|
|
347
376
|
- repo: https://github.com/JeanFrancoisGagne/crapkit
|
|
348
377
|
# crapkit's release step rewrites this line to the tag it just cut
|
|
349
|
-
rev: v0.4.
|
|
378
|
+
rev: v0.4.8
|
|
350
379
|
hooks:
|
|
351
380
|
- id: crapkit-gate
|
|
352
381
|
```
|
|
@@ -442,6 +471,122 @@ commit, and a row in the override log. All three land or nothing does, and an un
|
|
|
442
471
|
`alert_command` refuses the override outright. See
|
|
443
472
|
[docs/ratchet.md](docs/ratchet.md#overrides-and-the-audit-trail).
|
|
444
473
|
|
|
474
|
+
## The GitHub Action
|
|
475
|
+
|
|
476
|
+
[action.yml](action.yml) at this repository's root is a composite action, so a reviewer
|
|
477
|
+
sees crapkit's numbers on the pull request without installing anything. Four lines add it
|
|
478
|
+
to a workflow, and every input has a default:
|
|
479
|
+
|
|
480
|
+
```yaml
|
|
481
|
+
- uses: actions/checkout@v4
|
|
482
|
+
with:
|
|
483
|
+
fetch-depth: 0
|
|
484
|
+
- uses: JeanFrancoisGagne/crapkit@v0.4.8
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
The whole job those four lines sit in:
|
|
488
|
+
|
|
489
|
+
```yaml
|
|
490
|
+
on: pull_request
|
|
491
|
+
jobs:
|
|
492
|
+
crapkit:
|
|
493
|
+
runs-on: ubuntu-latest
|
|
494
|
+
permissions:
|
|
495
|
+
pull-requests: write # the comment, and nothing else
|
|
496
|
+
steps:
|
|
497
|
+
- uses: actions/checkout@v4
|
|
498
|
+
with:
|
|
499
|
+
fetch-depth: 0 # the diff, and verify's baseline commit
|
|
500
|
+
- run: pip install -e ".[dev]" # whatever your lanes need to run
|
|
501
|
+
- uses: JeanFrancoisGagne/crapkit@v0.4.8
|
|
502
|
+
with:
|
|
503
|
+
gate: "false"
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
That `pip install` step is the one people leave out, and it is the same one Route 4 above
|
|
507
|
+
names: the action installs crapkit and nothing else, so your lanes still need whatever
|
|
508
|
+
your test command needs. Without it the lane writes no artifact and the comment says so.
|
|
509
|
+
|
|
510
|
+
`fetch-depth: 0` is the other one. `actions/checkout` clones a single commit; the action
|
|
511
|
+
reads the pull request's changed files out of git and `verify` reads the diff against the
|
|
512
|
+
baseline's commit. With a shallow clone the file list comes back empty and the comment
|
|
513
|
+
ranks the whole repository instead of the diff.
|
|
514
|
+
|
|
515
|
+
The action installs crapkit from `$GITHUB_ACTION_PATH`, which is its own checkout of the
|
|
516
|
+
ref you pinned in `uses:`. So `@v0.4.8` scores your tree with 0.4.8's crapkit rather than
|
|
517
|
+
with whatever released last, and pinning a tag is the whole version policy.
|
|
518
|
+
|
|
519
|
+
### What the comment looks like
|
|
520
|
+
|
|
521
|
+
One comment per pull request, edited in place on every push. A hidden
|
|
522
|
+
`<!-- crapkit-action -->` line is how the next run finds it, so a fifteen-push branch
|
|
523
|
+
carries one comment and not fifteen. On a `push` event there is no pull request to carry
|
|
524
|
+
it, and the same text goes to the job log instead.
|
|
525
|
+
|
|
526
|
+
Rendered against this repository's own store, with a base commit fifteen back standing in
|
|
527
|
+
for a pull request:
|
|
528
|
+
|
|
529
|
+
```markdown
|
|
530
|
+
<!-- crapkit-action -->
|
|
531
|
+
|
|
532
|
+
## crapkit
|
|
533
|
+
|
|
534
|
+
1333 functions in 61 files, 0 over target, CRAP load 3713.89, grade A+.
|
|
535
|
+
|
|
536
|
+
**verify passed.** Run 2 against baseline 1, 7 changed files.
|
|
537
|
+
|
|
538
|
+
### Worklist: 39 changed files
|
|
539
|
+
|
|
540
|
+
| File | Function | ccn | risk | remedy |
|
|
541
|
+
|---|---|---:|---:|---|
|
|
542
|
+
| `src/crapkit/cli/admin.py:1026` | `_recorded_roots( recorded )` | 6 | 10.9908 | ok |
|
|
543
|
+
| `src/crapkit/lanes.py:646` | `build_retest_command( template : str , tests : set [ str ] )` | 6 | 10.8234 | ok |
|
|
544
|
+
| `src/crapkit/cli/admin.py:80` | `_next_step( scopes : dict , lanes : tuple )` | 5 | 9.159 | ok |
|
|
545
|
+
| `src/crapkit/cli/admin.py:239` | `_pytest_cov_probe( command : str )` | 5 | 9.159 | ok |
|
|
546
|
+
| `src/crapkit/cli/admin.py:505` | `_segment_problems( name : str , cwd : Path , tokens : list [ str ] )` | 5 | 9.159 | ok |
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
The rows are the ranked worklist for the files the pull request changed, worst first,
|
|
550
|
+
`top` of them. `risk` is ccn times churn weight, the number `crapkit worklist` ranks on,
|
|
551
|
+
and `remedy` is the run's own verdict for that function: `decompose`, `add-tests` or `ok`.
|
|
552
|
+
A pull request that touches no ranked function gets the heading and no table.
|
|
553
|
+
|
|
554
|
+
The two file counts describe two different diffs, and both are wanted. `39 changed files`
|
|
555
|
+
is the pull request's own list, `git diff --name-only` against the base commit, and it is
|
|
556
|
+
what the table is filtered to. `7 changed files` on the verdict line is what `verify`
|
|
557
|
+
measured against its baseline run, which is the section below.
|
|
558
|
+
|
|
559
|
+
### The inputs
|
|
560
|
+
|
|
561
|
+
| Input | Default | What it does |
|
|
562
|
+
|---|---|---|
|
|
563
|
+
| `gate` | `"false"` | `"true"` exits with `crapkit verify`'s own code, so a finding fails the check. Anything else exits 0 and the comment is the whole output |
|
|
564
|
+
| `top` | `"5"` | worklist rows rendered in the table |
|
|
565
|
+
| `python-version` | `"3.12"` | the interpreter `actions/setup-python` installs crapkit into |
|
|
566
|
+
|
|
567
|
+
`gate: "false"` is the default on purpose. A team adopts the action before it has decided
|
|
568
|
+
which findings should stop a merge, and a check that fails on day one gets turned off on
|
|
569
|
+
day two.
|
|
570
|
+
|
|
571
|
+
### What the verdict line covers
|
|
572
|
+
|
|
573
|
+
The action runs `crapkit coverage --json` and then `crapkit verify --json
|
|
574
|
+
--reuse-artifacts`, so the baseline is the run written a step earlier, at this same
|
|
575
|
+
commit. On a clean checkout that diff is empty: the verdict line reports the tree's own
|
|
576
|
+
health and the exit code verify returned, not the pull request's delta. The gate that
|
|
577
|
+
judges the delta is the portable baseline in [Route 4](#route-4-ci): commit
|
|
578
|
+
`crapkit-baseline.tsv` on the default branch and run `crapkit verify --baseline-tsv
|
|
579
|
+
crapkit-baseline.tsv` in a step of your own beside this one.
|
|
580
|
+
|
|
581
|
+
`--reuse-artifacts` is what keeps the job to one test run. `coverage` ran the lanes
|
|
582
|
+
moments earlier on this same tree, and verify parses those artifacts rather than running
|
|
583
|
+
your whole suite a second time for the same numbers.
|
|
584
|
+
|
|
585
|
+
The comment is posted with `gh api` and the job's own `GITHUB_TOKEN`, which needs
|
|
586
|
+
`pull-requests: write`. Two things it cannot do: a pull request from a fork gets a
|
|
587
|
+
read-only token, so the POST is a 403 there, and a self-hosted runner without the `gh` CLI
|
|
588
|
+
on PATH fails that step. Both leave the rendered text in the job log.
|
|
589
|
+
|
|
445
590
|
## Subcommands
|
|
446
591
|
|
|
447
592
|
Every subcommand takes `--repo PATH` (default `.`), and the flag goes **after** the
|
|
@@ -488,7 +633,7 @@ crapkit: error: argument command: invalid choice: '/path/to/repo' (choose from '
|
|
|
488
633
|
| `mutate [--files F ...] [--max-mutants N] [--drop-pool] [--json]` | Diff-scoped mutation testing: flips comparisons, boundary shifts, boolean connectives and boolean literals on changed lines, runs `mutation_command` per mutant, lists survivors. `--files` replaces diff scope with the whole file. `--max-mutants` (default 100) caps the run and the cap warning goes to stderr only, so `mutants` in `--json` is the capped count. Shell and PowerShell files are refused by name on stderr rather than mutated: `<` and `>` are redirections there, not comparisons. With `mutation_workers > 1` the worker worktrees are kept at `.crapkit/mutate-pool/` and re-prepared per run (30.6 s to build four on a 31,459-file repo, 0.46 s to re-prepare them); `--drop-pool` removes them and exits. |
|
|
489
634
|
| `test-scoped FILE ...` | Runs each owning scope's `[crapkit.scoped_tests]` template on the files (quoted, longest-prefix scope wins). A template with no `{files}` runs as written, which is how a scope whose tests live outside its own paths runs its whole suite. Exit code only; a nonzero runner exits 1. |
|
|
490
635
|
| `hook-precommit` | The cc-only gate on staged blobs. No coverage, no snapshot, no repo-wide cache. Exit 6 on a violation. |
|
|
491
|
-
| `claude-hook [--protocol N]` | Reads one Claude Code PostToolUse payload from stdin and judges the file it edited: ccn against the scope ceiling, on functions the edit changed, minus functions a ratchet mark already covers. Advisory only
|
|
636
|
+
| `claude-hook [--protocol N]` | Reads one Claude Code PostToolUse payload from stdin and judges the file it edited: ccn against the scope ceiling, on functions the edit changed, minus functions a ratchet mark already covers. Advisory only: the edit has landed, and `hook-precommit` stays the enforcement point. Exit 2 and an advisory on stderr is the only thing it ever says, one block per judged file (a head line, one line per breaching function, a closing line): no `crapkit.toml` above the edited file, an unscoped file, mid-rebase or mid-merge, a `--protocol` other than 1, source that parses to no functions, or any internal failure all exit 0 in silence. The root is the first `crapkit.toml` above the edited file; the walk stops at a `.git` entry, so a worktree never borrows its parent's config. A `Bash` event names no file, so it judges the working tree instead: the dirty or untracked `*.py` files touched in the last 12 seconds, 25 at most, each through the same ladder, and silence for a clean tree or a cwd outside any repo. That half fires only where you register a `Bash` matcher ([The Claude Code plugin](#the-claude-code-plugin)). It opens no snapshot and writes nothing. |
|
|
492
637
|
| `watch [--interval SECONDS] [--cycles N]` | Rescores tracked files as they change (mtime polling, default 2s, subprocess-isolated so a half-saved syntax error never kills the watcher). `--cycles N` polls exactly N times and exits 0; without it the loop runs until ctrl-c. |
|
|
493
638
|
| `mcp` | A dependency-free stdio MCP server (newline JSON-RPC 2.0) exposing nine read-only tools. Every tool shells to the CLI's own `--json` surface, so the MCP view cannot drift from what the CLI reports. Answering from a kept in-process store was benchmarked and rejected: a packet's `source` would go stale behind the edit it describes. See [docs/agent-json.md](docs/agent-json.md#mcp-server). |
|
|
494
639
|
|
|
@@ -616,7 +761,7 @@ crapkit: run 3 is an inventory run (no coverage was measured) and cannot serve a
|
|
|
616
761
|
| 2 | Usage error from argparse: unknown flag, missing positional. Raised before crapkit's own error handling. |
|
|
617
762
|
| 3 | Config error: `crapkit.toml` missing or unparseable, an unknown language or parser, a lane command the shell that runs it reads as a narrowed suite, a ratchet metric-stamp mismatch ([Upgrading from 0.4.4](#upgrading-from-044)), a `test-scoped` file under no scope or under a scope with no template. |
|
|
618
763
|
| 4 | Git error: not a repository, a baseline commit rewritten out of the history. |
|
|
619
|
-
| 5 | Tool error: lizard not importable, a lane produced no artifact
|
|
764
|
+
| 5 | Tool error: lizard not importable, a lane that produced no artifact, one that measured a different tree, one that measured this tree and reported it in absolute paths (the join is root-relative, so those match nothing either; the refusal names the runner's own switch, `relative_files = true` under `[tool.coverage.run]` for a coveragepy lane, the reporter's `cwd`/`root` option for an istanbul one), a lane that timed out past its retries, an override alert command that failed. A `timeout_seconds` kills the whole process tree, so no orphan suite keeps running behind the failure. |
|
|
620
765
|
| 6 | Gate violation. A function the diff touched is over its ceiling and past any ratchet mark it carries: an edit that leaves a marked function at or under its mark is the debt the repo signed for and is exempt. Also `rescore --gate`, which applies the same rule, and `hook-precommit`, which exempts on the mark's existence instead. |
|
|
621
766
|
| 7 | Ratchet regression the diff never touched. A marked function scores worse than its recorded high-water mark; a touched one past its mark reports 6. |
|
|
622
767
|
| 8 | New test failures against the baseline run. Failures the baseline already had do not count. |
|
|
@@ -671,7 +816,8 @@ coverage lane from what the repo already has: a pytest marker file (`pyproject.t
|
|
|
671
816
|
the matching `run` for the rest), because a bare `python` binds to whichever venv the shell
|
|
672
817
|
has active rather than the one the repo pins — see
|
|
673
818
|
[The interpreter a lane binds to](docs/lanes.md#the-interpreter-a-lane-binds-to). Whatever
|
|
674
|
-
it detects, it also leaves commented templates for the runners it did not find
|
|
819
|
+
it detects, it also leaves commented templates for the runners it did not find, and those
|
|
820
|
+
carry the same launcher, so uncommenting one cannot hand the bare `python` back. Every lane
|
|
675
821
|
it writes reports into `.crapkit/cov/`, which is why the `.gitignore` list is so short: see
|
|
676
822
|
[Where artifacts live](docs/lanes.md#where-artifacts-live).
|
|
677
823
|
|