Generated 2026-09-19T22:05:42+00:00 · commit 6c609930bbd17283882e7953c90fe97634f12bbb · branch main · root /Users/marshallguillory/repos/maintainability-agent · standard ISO/IEC 25010 maintainability-inspired 0-5 scale, rate-based
| Severity | Findings |
|---|---|
| Severe | 0 |
| High | 0 |
| Medium | 0 |
| Low | 0 |
| Total findings | 0 |
12 of 17 tools contributed — concerns all, depth heavy, license policy copyleft-any. Plus 8 built-in detectors.
| Source | Tier | Outcome | Version | Measurements | Findings |
|---|---|---|---|---|---|
| cohesion | analyzer | failed | — | — | — |
| eslint | analyzer | not-applicable | — | — | — |
| fortitude | analyzer | not-applicable | — | — | — |
| spotbugs | analyzer | not-applicable | — | — | — |
| pylint | analyzer | parse-error | pylint 4.0.7 | — | — |
| checkstyle | analyzer | ran | Checkstyle version: 14.0.0 | 0 | 119 |
| complexipy | analyzer | ran | 7.0.1 | 3967 | 0 |
| interrogate | analyzer | ran | interrogate, version 1.7.0 | 1 | 0 |
| jscpd | analyzer | ran | cpd 5.1.1 | 1 | 140 |
| lizard | analyzer | ran | 1.24.0 | 12720 | 0 |
| multimetric | analyzer | ran | usage: multimetric [-h] [--warn_compiler WARN_COMPILER] | 1776 | 0 |
| mypy | analyzer | ran | mypy 2.3.1 (compiled: yes) | 0 | 0 |
| pmd | analyzer | ran | PMD 7.26.0 (8fd38edf285a33e1164f66205ebe243441db9557, 2026-06-29T08:22:36Z) | 0 | 0 |
| pydocstyle | analyzer | ran | 6.3.0 | 0 | 570 |
| radon | analyzer | ran | 6.0.1 | 423 | 0 |
| ruff | analyzer | ran | ruff 0.16.5 | 0 | 1 |
| vulture | analyzer | ran | vulture 2.16 | 0 | 6 |
| competing-libraries | built-in | ran | — | 517 | 0 |
| dead-code | built-in | ran | — | 4205 | 0 |
| declaration-size | built-in | ran | — | 4205 | 78 |
| duplicate-blocks | built-in | ran | — | 517 | 0 |
| file-size | built-in | ran | — | 517 | 4 |
| history | built-in | ran | — | 516 | 74 |
| near-duplicates | built-in | ran | — | 4205 | 0 |
| risk-patterns | built-in | ran | — | 517 | 0 |
declarations measured by analyzers, completed by built-in detectors: no analyzer supplies cognitive_complexity for C, C#, C++, Fortran, Go, Java, JavaScript, PHP, Ruby, Rust, Swift, TypeScript, so the built-in scanner supplied it for those declarations and the analyzers supplied the rest; the criterion set is complete per declaration, which is what makes the rate comparable to the rubric's.
Nothing examined: testing.
These concerns are unmeasured, not clean. Install a tool that covers them, or widen analyzers.depth, to have them reported.
Analyzer children are not network-isolated. 12 external tools ran as local child processes. This agent does not transmit the audited source and opens no socket of its own, but it does not sandbox what it spawns: a third-party analyzer that reaches the network is outside what this run controls or observes. Determinism and no upload are the promise; a kernel air-gap is not.
| Recorded | Commit | Estimate | Findings |
|---|---|---|---|
| 2026-08-15T20:46:31Z | 008e8701 | 4.2 | 0 |
| 2026-08-15T20:46:33Z | 008e8701 | 4.2 | 0 |
| 2026-08-15T20:46:44Z | 008e8701 | 4.2 | 0 |
| 2026-08-16T01:18:28Z | 8fa548b2 | 4.2 | 0 |
| 2026-08-16T01:19:29Z | 8fa548b2 | 4.2 | 0 |
| 2026-08-16T01:19:50Z | 8fa548b2 | 4.2 | 0 |
| 2026-08-16T06:01:10Z | 2abf5112 | 4.2 | 0 |
| 2026-08-17T15:38:29Z | c8b267e3 | 4.2 | 1 |
| 2026-08-17T15:38:46Z | c8b267e3 | 4.2 | 1 |
| 2026-08-17T15:39:05Z | c8b267e3 | 4.2 | 1 |
| 2026-08-17T15:39:21Z | c8b267e3 | 4.2 | 1 |
| 2026-08-17T15:39:38Z | c8b267e3 | 4.2 | 1 |
| 2026-08-17T15:40:13Z | c8b267e3 | 4.2 | 0 |
| 2026-08-17T20:07:23Z | 413c7617 | 4.2 | 18 |
| 2026-08-17T20:07:39Z | 413c7617 | 4.2 | 18 |
| 2026-08-17T20:07:55Z | 413c7617 | 4.2 | 18 |
| 2026-08-17T20:18:57Z | 413c7617 | 4.2 | 0 |
| 2026-08-17T21:55:55Z | 6b2fb764 | 4.2 | 1 |
| 2026-08-17T21:56:12Z | 6b2fb764 | 4.2 | 1 |
| 2026-08-17T21:56:29Z | 6b2fb764 | 4.2 | 1 |
| 2026-08-17T22:00:26Z | 6b2fb764 | 4.2 | 0 |
| 2026-08-17T22:04:12Z | 6b2fb764 | 4.2 | 0 |
| 2026-08-17T22:58:36Z | 92f6270b | 4.2 | 0 |
| 2026-08-17T23:32:19Z | e6783b75 | 4.2 | 0 |
| 2026-08-17T23:52:26Z | fc5e9351 | 4.2 | 0 |
| 2026-08-18T01:23:51Z | 1af28aa6 | 4.2 | 0 |
| 2026-08-18T05:25:24Z | 3518bdc3 | 4.2 | 0 |
| 2026-08-18T17:46:36Z | eb8c7391 | 4.2 | 0 |
| 2026-08-18T18:00:16Z | c6fce1ff | 4.2 | 0 |
| 2026-08-18T22:41:24Z | 549fcad0 | 4.2 | 1 |
| 2026-08-18T22:41:41Z | 549fcad0 | 4.2 | 1 |
| 2026-08-18T22:41:53Z | 549fcad0 | 4.2 | 1 |
| 2026-08-18T22:45:39Z | 549fcad0 | 4.2 | 0 |
| 2026-08-19T01:18:32Z | 7ef71c16 | 4.1 | 13 |
| 2026-08-19T01:18:51Z | 7ef71c16 | 4.1 | 13 |
| 2026-08-19T01:19:13Z | 7ef71c16 | 4.1 | 13 |
| 2026-08-19T01:20:04Z | 7ef71c16 | 4.2 | 0 |
| 2026-08-19T02:28:12Z | 340ec98c | 4.2 | 0 |
| 2026-08-19T14:53:41Z | 6367c55b | 4.2 | 0 |
| 2026-08-19T15:03:23Z | 2e395c35 | 4.2 | 0 |
| 2026-08-19T17:17:40Z | 0be65cba | 4.2 | 0 |
| 2026-08-19T18:20:31Z | 742a49f5 | 4.2 | 0 |
| 2026-08-19T19:09:44Z | 9510c095 | 4.1 | 3 |
| 2026-08-19T19:10:06Z | 9510c095 | 4.1 | 3 |
| 2026-08-19T19:10:18Z | 9510c095 | 4.1 | 3 |
| 2026-08-19T19:10:57Z | 9510c095 | 4.1 | 3 |
| 2026-08-19T19:19:45Z | 9510c095 | 4.2 | 0 |
| 2026-08-19T20:19:25Z | 6a69d728 | 4.2 | 0 |
| 2026-08-19T22:00:41Z | 48293d3f | 4.1 | 2 |
| 2026-08-19T22:01:05Z | 48293d3f | 4.1 | 2 |
| 2026-08-19T22:01:18Z | 48293d3f | 4.1 | 2 |
| 2026-08-19T22:05:30Z | 48293d3f | 4.1 | 1 |
| 2026-08-19T22:05:52Z | 48293d3f | 4.1 | 1 |
| 2026-08-19T22:06:05Z | 48293d3f | 4.1 | 1 |
| 2026-08-19T22:06:38Z | 48293d3f | 4.2 | 0 |
| 2026-08-19T22:59:02Z | cc71cd17 | 4.1 | 2 |
| 2026-08-19T22:59:23Z | cc71cd17 | 4.1 | 2 |
| 2026-08-19T22:59:37Z | cc71cd17 | 4.1 | 2 |
| 2026-08-19T23:00:26Z | cc71cd17 | 4.1 | 1 |
| 2026-08-19T23:04:01Z | cc71cd17 | 4.2 | 0 |
| 2026-08-19T23:50:01Z | 8ab2c88a | 4.2 | 0 |
| 2026-08-20T16:20:52Z | 0f62cac7 | 4.0 | 26 |
| 2026-08-20T16:21:13Z | 0f62cac7 | 4.0 | 26 |
| 2026-08-20T16:21:40Z | 0f62cac7 | 4.0 | 26 |
| 2026-08-20T16:25:15Z | 0f62cac7 | 4.2 | 0 |
| 2026-08-21T03:30:32Z | d5b1c502 | 4.1 | 1 |
| 2026-08-21T03:30:53Z | d5b1c502 | 4.1 | 1 |
| 2026-08-21T03:31:07Z | d5b1c502 | 4.1 | 1 |
| 2026-08-21T03:31:30Z | d5b1c502 | 4.2 | 0 |
| 2026-08-21T06:12:28Z | 43c0d13c | 4.1 | 1 |
| 2026-08-21T06:12:48Z | 43c0d13c | 4.1 | 1 |
| 2026-08-21T06:13:03Z | 43c0d13c | 4.1 | 1 |
| 2026-08-21T06:17:05Z | 43c0d13c | 4.2 | 0 |
| 2026-08-21T14:50:36Z | 05bdb573 | 4.1 | 2 |
| 2026-08-21T14:50:56Z | 05bdb573 | 4.1 | 2 |
| 2026-08-21T14:51:10Z | 05bdb573 | 4.1 | 2 |
| 2026-08-21T14:53:03Z | 05bdb573 | 4.2 | 0 |
| 2026-08-21T15:03:47Z | 05bdb573 | 4.2 | 0 |
| 2026-08-21T15:18:51Z | 8025b4f9 | 4.2 | 1 |
| 2026-08-21T15:19:11Z | 8025b4f9 | 4.2 | 1 |
| 2026-08-21T15:19:25Z | 8025b4f9 | 4.2 | 1 |
| 2026-08-21T15:20:11Z | 8025b4f9 | 4.2 | 0 |
| 2026-08-21T17:10:09Z | 5a7857cd | 4.2 | 0 |
| 2026-08-21T17:14:10Z | 5a7857cd | 4.2 | 0 |
| 2026-08-21T18:17:10Z | 2f20acda | 4.1 | 1 |
| 2026-08-21T18:17:31Z | 2f20acda | 4.1 | 1 |
| 2026-08-21T18:17:45Z | 2f20acda | 4.1 | 1 |
| 2026-08-21T18:18:13Z | 2f20acda | 4.2 | 0 |
| 2026-08-21T18:32:29Z | 81c05d06 | 4.2 | 0 |
| 2026-08-28T13:05:26Z | 367adf9a | — | 1 |
| 2026-08-28T13:05:37Z | 367adf9a | — | 1 |
| 2026-08-28T13:07:10Z | 367adf9a | — | 0 |
| 2026-09-01T22:50:04Z | c76e7d10 | 4.1 | 3 |
| 2026-09-01T22:54:04Z | c76e7d10 | 4.1 | 3 |
| 2026-09-01T23:16:01Z | c76e7d10 | 4.1 | 0 |
| 2026-09-01T23:57:58Z | fc2024d8 | 4.1 | 0 |
| 2026-09-02T00:13:53Z | fc2024d8 | 4.1 | 0 |
| 2026-09-02T02:21:34Z | 950ccd08 | 4.1 | 0 |
| 2026-09-02T02:37:15Z | 8d31a919 | 4.1 | 0 |
| 2026-09-02T02:55:46Z | 8b399655 | 4.1 | 0 |
| 2026-09-02T03:10:30Z | 5a25a785 | 4.1 | 0 |
| 2026-09-02T04:13:12Z | 083dcfe7 | 4.1 | 1 |
| 2026-09-02T04:16:57Z | 083dcfe7 | 4.1 | 1 |
| 2026-09-02T04:20:42Z | 083dcfe7 | 4.1 | 1 |
| 2026-09-02T04:24:53Z | 083dcfe7 | 4.1 | 0 |
| 2026-09-02T04:32:59Z | 083dcfe7 | 4.1 | 0 |
| 2026-09-02T05:07:33Z | cebf47c6 | 4.1 | 0 |
| 2026-09-02T05:21:56Z | cebf47c6 | 4.1 | 0 |
| 2026-09-02T15:53:44Z | 82212f7c | 4.1 | 1 |
| 2026-09-02T15:57:42Z | 82212f7c | 4.1 | 1 |
| 2026-09-02T16:01:50Z | 82212f7c | 4.1 | 1 |
| 2026-09-02T16:09:57Z | 82212f7c | 4.1 | 0 |
| 2026-09-02T16:49:38Z | dd2e26e6 | 4.1 | 2 |
| 2026-09-02T16:53:22Z | dd2e26e6 | 4.1 | 2 |
| 2026-09-02T17:01:35Z | dd2e26e6 | 4.1 | 0 |
| 2026-09-02T17:16:02Z | 590a6986 | 4.1 | 0 |
| 2026-09-02T18:17:31Z | 9d3b5f1c | 4.1 | 0 |
| 2026-09-02T19:09:34Z | 1b87e7dd | 4.1 | 0 |
| 2026-09-02T19:48:51Z | 1b87e7dd | 4.1 | 1 |
| 2026-09-02T19:59:16Z | 1b87e7dd | 4.1 | 1 |
| 2026-09-02T20:03:02Z | 1b87e7dd | 4.1 | 1 |
| 2026-09-02T20:10:01Z | 1b87e7dd | 4.1 | 0 |
| 2026-09-02T20:57:23Z | 962f3e8c | 4.1 | 0 |
| 2026-09-02T21:22:31Z | 064b14ba | 4.1 | 0 |
| 2026-09-03T01:50:55Z | 064b14ba | 4.1 | 0 |
| 2026-09-03T03:14:36Z | eda313a7 | 4.1 | 1 |
| 2026-09-03T03:19:37Z | eda313a7 | 4.1 | 1 |
| 2026-09-03T03:26:28Z | eda313a7 | 4.1 | 0 |
| 2026-09-03T04:32:13Z | 5b76ed8e | 4.1 | 1 |
| 2026-09-03T04:37:32Z | 5b76ed8e | 4.1 | 1 |
| 2026-09-03T04:42:55Z | 5b76ed8e | 4.1 | 1 |
| 2026-09-03T04:48:08Z | 5b76ed8e | 4.1 | 1 |
| 2026-09-03T04:53:21Z | 5b76ed8e | 4.1 | 1 |
| 2026-09-03T04:59:23Z | 5b76ed8e | 4.1 | 0 |
| 2026-09-03T13:47:23Z | 1f6f9bbb | 4.1 | 0 |
| 2026-09-03T13:52:57Z | 1f6f9bbb | 4.1 | 0 |
| 2026-09-03T13:58:21Z | 1f6f9bbb | 4.1 | 0 |
| 2026-09-03T14:04:41Z | 1f6f9bbb | 4.1 | 0 |
| 2026-09-03T14:19:51Z | 1f6f9bbb | 4.1 | 1 |
| 2026-09-03T14:29:04Z | 1f6f9bbb | 4.1 | 1 |
| 2026-09-03T14:36:15Z | 1f6f9bbb | 4.1 | 1 |
| 2026-09-03T14:52:35Z | 1f6f9bbb | 4.1 | 0 |
| 2026-09-03T15:38:52Z | eaa6f67b | 4.1 | 0 |
| 2026-09-03T16:43:03Z | 65830eef | 4.1 | 1 |
| 2026-09-03T16:52:36Z | 65830eef | 4.1 | 1 |
| 2026-09-03T17:01:53Z | 65830eef | 4.1 | 1 |
| 2026-09-03T17:07:37Z | 65830eef | 4.1 | 0 |
| 2026-09-03T17:14:34Z | 65830eef | 4.1 | 0 |
| 2026-09-03T18:31:22Z | 08b59cae | 4.1 | 2 |
| 2026-09-03T18:36:27Z | 08b59cae | 4.1 | 2 |
| 2026-09-03T18:41:30Z | 08b59cae | 4.1 | 1 |
| 2026-09-03T18:46:23Z | 08b59cae | 4.1 | 1 |
| 2026-09-03T18:51:28Z | 08b59cae | 4.1 | 0 |
| 2026-09-03T19:10:28Z | 08b59cae | 4.1 | 1 |
| 2026-09-03T19:15:49Z | 08b59cae | 4.1 | 0 |
| 2026-09-03T19:47:08Z | 08b59cae | 4.1 | 1 |
| 2026-09-03T19:52:28Z | 08b59cae | 4.1 | 1 |
| 2026-09-03T19:57:41Z | 08b59cae | 4.1 | 0 |
| 2026-09-03T22:26:06Z | 08b59cae | 4.2 | 1 |
| 2026-09-03T22:34:50Z | 08b59cae | 4.2 | 1 |
| 2026-09-03T22:40:10Z | 08b59cae | 4.2 | 1 |
| 2026-09-03T22:45:44Z | 08b59cae | 4.2 | 0 |
| 2026-09-03T23:00:18Z | 08b59cae | 4.2 | 0 |
| 2026-09-04T02:59:22Z | 406d7347 | 4.2 | 0 |
| 2026-09-04T03:09:38Z | 406d7347 | 4.2 | 0 |
| 2026-09-04T03:36:55Z | dba2fade | 4.2 | 2 |
| 2026-09-04T03:48:53Z | dba2fade | 4.2 | 2 |
| 2026-09-04T03:58:42Z | dba2fade | 4.2 | 0 |
| 2026-09-04T04:12:38Z | 8d65e562 | 4.2 | 0 |
| 2026-09-04T04:25:28Z | 8d65e562 | 4.2 | 0 |
| 2026-09-04T04:53:43Z | e93bfa59 | 4.2 | 0 |
| 2026-09-04T05:23:22Z | 2b2de1ff | 4.2 | 1 |
| 2026-09-04T05:28:31Z | 2b2de1ff | 4.2 | 1 |
| 2026-09-04T05:34:39Z | 2b2de1ff | 4.2 | 0 |
| 2026-09-04T05:44:00Z | 2b2de1ff | 4.2 | 0 |
| 2026-09-04T05:56:43Z | 2b2de1ff | 4.2 | 0 |
| 2026-09-04T06:10:08Z | 81be3d12 | 4.2 | 0 |
| 2026-09-04T06:30:41Z | 1f6a669d | 4.2 | 0 |
| 2026-09-04T06:58:47Z | 0c2a399e | 4.2 | 0 |
| 2026-09-04T07:11:36Z | 0c2a399e | 4.2 | 0 |
| 2026-09-04T07:40:48Z | f521f37e | 4.2 | 0 |
| 2026-09-04T07:53:46Z | f521f37e | 4.2 | 0 |
| 2026-09-04T16:40:06Z | 2c6adbfa | 4.2 | 0 |
| 2026-09-04T17:56:04Z | 3077aa1c | 4.2 | 0 |
| 2026-09-04T19:08:33Z | f4c55794 | 4.2 | 0 |
| 2026-09-04T19:52:42Z | b3e050d2 | 4.2 | 3 |
| 2026-09-04T19:56:54Z | b3e050d2 | 4.2 | 3 |
| 2026-09-04T20:01:02Z | b3e050d2 | 4.2 | 3 |
| 2026-09-04T20:05:13Z | b3e050d2 | 4.2 | 3 |
| 2026-09-04T20:09:26Z | b3e050d2 | 4.2 | 3 |
| 2026-09-04T20:14:56Z | b3e050d2 | 4.2 | 2 |
| 2026-09-04T20:19:03Z | b3e050d2 | 4.2 | 2 |
| 2026-09-04T20:24:43Z | b3e050d2 | 4.2 | 1 |
| 2026-09-04T20:28:57Z | b3e050d2 | 4.2 | 0 |
| 2026-09-04T20:50:00Z | fb3cf0ba | 4.2 | 0 |
| 2026-09-04T21:24:29Z | e0d9144b | 4.2 | 0 |
| 2026-09-04T21:48:12Z | 016a5db1 | 4.2 | 1 |
| 2026-09-04T21:52:47Z | 016a5db1 | 4.2 | 1 |
| 2026-09-04T21:57:17Z | 016a5db1 | 4.2 | 1 |
| 2026-09-04T22:01:42Z | 016a5db1 | 4.2 | 0 |
| 2026-09-04T22:33:54Z | 9c91c3d1 | 4.2 | 0 |
| 2026-09-04T22:42:23Z | 9c91c3d1 | 4.2 | 0 |
| 2026-09-05T00:28:01Z | f51fbbc3 | 4.2 | 3 |
| 2026-09-05T00:32:12Z | f51fbbc3 | 4.2 | 3 |
| 2026-09-05T00:39:15Z | f51fbbc3 | 4.2 | 1 |
| 2026-09-05T00:43:18Z | f51fbbc3 | 4.2 | 1 |
| 2026-09-05T00:47:24Z | f51fbbc3 | 4.2 | 0 |
| 2026-09-05T00:59:02Z | 2379a7ce | 4.2 | 0 |
| 2026-09-05T01:34:47Z | 2b691367 | 4.2 | 1 |
| 2026-09-05T01:38:51Z | 2b691367 | 4.2 | 1 |
| 2026-09-05T01:42:53Z | 2b691367 | 4.2 | 1 |
| 2026-09-05T01:47:31Z | 2b691367 | 4.2 | 0 |
| 2026-09-05T02:30:32Z | fb6d2d5d | 4.2 | 0 |
| 2026-09-05T02:41:27Z | fb6d2d5d | 4.2 | 0 |
| 2026-09-05T03:18:17Z | 4d578d6d | 4.2 | 0 |
| 2026-09-05T05:12:56Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:17:04Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:21:10Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:28:40Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:32:42Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:36:49Z | 687c012b | 4.2 | 1 |
| 2026-09-05T05:43:54Z | 687c012b | 4.2 | 0 |
| 2026-09-05T06:06:22Z | b00770eb | 4.2 | 0 |
| 2026-09-05T14:51:23Z | 99aacf95 | 4.2 | 0 |
| 2026-09-05T15:09:49Z | 3b0ad5cc | 4.2 | 0 |
| 2026-09-05T16:25:16Z | a1ff4ac3 | 4.2 | 0 |
| 2026-09-05T16:43:43Z | ae7ff231 | 4.2 | 0 |
| 2026-09-05T17:03:59Z | 27c608f4 | 4.2 | 0 |
| 2026-09-05T17:49:27Z | 76200a00 | 4.2 | 0 |
| 2026-09-05T18:15:54Z | 18f061ab | 4.2 | 0 |
| 2026-09-05T19:52:45Z | 50d4d5ae | 4.2 | 0 |
| 2026-09-05T20:44:46Z | e9a7e2f4 | — | 0 |
| 2026-09-05T20:49:08Z | e9a7e2f4 | — | 0 |
| 2026-09-05T20:53:53Z | e9a7e2f4 | — | 0 |
| 2026-09-05T21:35:57Z | e9a7e2f4 | 4.2 | 1 |
| 2026-09-05T21:42:25Z | e9a7e2f4 | 4.2 | 0 |
| 2026-09-06T01:22:18Z | b4981e21 | 4.2 | 0 |
| 2026-09-06T03:28:11Z | b02dd5a9 | 4.2 | 0 |
| 2026-09-06T03:54:55Z | a569c833 | 4.2 | 4 |
| 2026-09-06T04:02:48Z | a569c833 | 4.2 | 3 |
| 2026-09-06T14:42:34Z | 2f5f0de9 | 4.2 | 1 |
| 2026-09-06T14:55:35Z | 5a70d53d | 4.2 | 0 |
| 2026-09-06T15:06:06Z | 3cfe463b | 4.2 | 0 |
| 2026-09-06T15:20:50Z | 92b9173a | 4.2 | 0 |
| 2026-09-06T15:43:18Z | 41c2093e | 4.2 | 0 |
| 2026-09-06T16:11:26Z | 41c2093e | 4.2 | 5 |
| 2026-09-06T18:17:55Z | 59bb6111 | 4.2 | 2 |
| 2026-09-06T18:22:46Z | 59bb6111 | 4.2 | 2 |
| 2026-09-06T18:28:54Z | 59bb6111 | 4.2 | 0 |
| 2026-09-06T18:48:06Z | aed00003 | 4.2 | 0 |
| 2026-09-06T18:55:57Z | af96de13 | 4.2 | 0 |
| 2026-09-07T18:48:35Z | 4ebdeb35 | 4.2 | 0 |
| 2026-09-07T20:46:27Z | f5b64d64 | 4.2 | 1 |
| 2026-09-07T20:58:48Z | f5b64d64 | 4.2 | 0 |
| 2026-09-07T23:54:18Z | 616af927 | 4.2 | 2 |
| 2026-09-07T23:58:45Z | 616af927 | 4.2 | 2 |
| 2026-09-08T00:03:26Z | 616af927 | 4.2 | 2 |
| 2026-09-08T00:14:00Z | 616af927 | 4.2 | 0 |
| 2026-09-08T07:43:59Z | ef9832b8 | 4.1 | 1 |
| 2026-09-08T07:52:12Z | ef9832b8 | 4.1 | 0 |
| 2026-09-08T15:51:51Z | dc8dc76c | 4.1 | 0 |
| 2026-09-08T16:52:49Z | dc8dc76c | 4.1 | 0 |
| 2026-09-08T17:45:09Z | ef76e1cd | 4.1 | 0 |
| 2026-09-08T19:04:32Z | 32a6a678 | 4.1 | 0 |
| 2026-09-09T15:28:08Z | a34c924d | 4.1 | 0 |
| 2026-09-09T15:45:03Z | a34c924d | 4.1 | 0 |
| 2026-09-09T15:51:34Z | a34c924d | 4.1 | 0 |
| 2026-09-09T15:57:18Z | a34c924d | 4.1 | 0 |
| 2026-09-09T16:03:21Z | a34c924d | 4.1 | 0 |
| 2026-09-09T16:26:16Z | a34c924d | 4.1 | 0 |
| 2026-09-10T22:48:20Z | 2c2dfdac | 4.4 | 0 |
| 2026-09-10T22:57:13Z | 2c2dfdac | 4.4 | 0 |
| 2026-09-10T22:59:13Z | 2c2dfdac | 4.4 | 0 |
| 2026-09-10T23:08:06Z | 34eeef96 | 4.4 | 0 |
| 2026-09-10T23:13:37Z | 34eeef96 | 4.4 | 0 |
| 2026-09-10T23:22:21Z | 34eeef96 | 4.4 | 0 |
| 2026-09-10T23:35:05Z | 08dbbebd | 4.4 | 0 |
| 2026-09-11T01:08:13Z | 075bda92 | 4.4 | 0 |
| 2026-09-11T01:13:43Z | 075bda92 | 4.4 | 0 |
| 2026-09-11T01:24:28Z | 64c2b454 | 4.4 | 0 |
| 2026-09-11T01:32:09Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T01:39:08Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T01:45:22Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T01:53:21Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T01:59:08Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T02:04:20Z | 64c2b454 | 4.5 | 0 |
| 2026-09-11T02:14:11Z | 7c1d8173 | 4.5 | 0 |
| 2026-09-11T02:21:15Z | 7c1d8173 | 4.5 | 0 |
| 2026-09-11T02:26:10Z | 7c1d8173 | 4.5 | 0 |
| 2026-09-11T05:11:47Z | 533e7b1c | 4.5 | 0 |
| 2026-09-11T17:41:40Z | 673e6673 | 4.5 | 0 |
| 2026-09-11T18:06:02Z | 673e6673 | 4.5 | 0 |
| 2026-09-11T18:29:17Z | 9b49baf3 | 4.5 | 0 |
| 2026-09-11T18:41:02Z | 4769dc36 | 4.5 | 0 |
| 2026-09-11T18:41:29Z | 4769dc36 | 4.5 | 0 |
| 2026-09-11T18:46:10Z | 4769dc36 | 4.5 | 0 |
| 2026-09-11T19:12:49Z | 0d7230dc | 4.4 | 1 |
| 2026-09-11T19:13:19Z | 0d7230dc | 4.4 | 1 |
| 2026-09-11T19:22:22Z | 0d7230dc | 4.4 | 1 |
| 2026-09-11T19:22:53Z | 0d7230dc | 4.4 | 1 |
| 2026-09-11T19:23:27Z | 0d7230dc | 4.4 | 1 |
| 2026-09-11T19:24:09Z | 0d7230dc | 4.5 | 0 |
| 2026-09-11T21:08:33Z | 51eb31a2 | 4.5 | 0 |
| 2026-09-11T21:29:07Z | e2fe2338 | 4.5 | 0 |
| 2026-09-11T22:43:02Z | 66358519 | 4.5 | 0 |
| 2026-09-11T22:47:45Z | 66358519 | 4.5 | 0 |
| 2026-09-11T22:52:49Z | d4a45cee | 4.5 | 0 |
| 2026-09-11T23:05:25Z | d4a45cee | 4.5 | 0 |
| 2026-09-11T23:21:19Z | e8f27dd1 | 4.5 | 0 |
| 2026-09-11T23:43:19Z | 55ce9cad | 4.5 | 0 |
| 2026-09-12T00:03:02Z | 7d196459 | 4.5 | 0 |
| 2026-09-12T00:17:35Z | 7d196459 | 4.5 | 0 |
| 2026-09-12T00:31:22Z | 136b7e3d | 4.5 | 0 |
| 2026-09-12T00:39:39Z | 136b7e3d | 4.5 | 0 |
| 2026-09-12T00:52:35Z | 934f7739 | 4.5 | 0 |
| 2026-09-12T00:53:48Z | 934f7739 | 4.5 | 0 |
| 2026-09-12T00:54:59Z | 934f7739 | 4.5 | 0 |
| 2026-09-12T01:04:36Z | 014e5b9d | 4.5 | 0 |
| 2026-09-12T01:10:32Z | 09206580 | 4.5 | 0 |
| 2026-09-12T01:33:28Z | 10059fb4 | 4.5 | 0 |
| 2026-09-12T01:55:40Z | a103c3ce | 4.5 | 0 |
| 2026-09-12T02:12:33Z | 7fc800a3 | 4.5 | 0 |
| 2026-09-18T19:59:49Z | 36571786 | 4.3 | 1 |
| 2026-09-18T20:03:00Z | 36571786 | 4.4 | 0 |
| 2026-09-18T20:50:09Z | 24a65e9c | 4.4 | 0 |
| 2026-09-18T21:32:18Z | ae275404 | 4.4 | 0 |
| 2026-09-19T01:11:44Z | e973a0cb | 4.3 | 1 |
| 2026-09-19T01:21:41Z | e973a0cb | 4.4 | 0 |
| 2026-09-19T22:09:11Z | 6c609930 | 4.4 | 0 |
61 separate series; scans either side of a break were produced by different instruments and are reported apart. The current series is given in full, the earlier ones summarized.
This series begins at a break: the tool version changed, so scans before this point were produced by a different instrument and cannot be joined to those after it.
Current series — 1 scan, 2026-09-19T22:09:11Z to 2026-09-19T22:09:11Z.
| Window | Scans | Direction | Change | Began at a break in |
|---|---|---|---|---|
| 2026-09-19T01:11:44Z to 2026-09-19T01:21:41Z | 2 | indistinguishable | +0.10 | the tool version changed |
| 2026-09-18T21:32:18Z to 2026-09-18T21:32:18Z | 1 | unknown | — | the tool version changed |
| 2026-09-18T20:50:09Z to 2026-09-18T20:50:09Z | 1 | unknown | — | the tool version, which analyzers contributed changed |
| 2026-09-18T19:59:49Z to 2026-09-18T20:03:00Z | 2 | indistinguishable | +0.10 | the tool version changed |
| 2026-09-12T00:17:35Z to 2026-09-12T02:12:33Z | 11 | indistinguishable | +0.00 | the tool version, a delegated pillar's producer or its scoring model changed |
| 2026-09-12T00:03:02Z to 2026-09-12T00:03:02Z | 1 | unknown | — | the tool version, a delegated pillar's producer or its scoring model changed |
| 2026-09-11T23:21:19Z to 2026-09-11T23:43:19Z | 2 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-11T22:43:02Z to 2026-09-11T23:05:25Z | 4 | indistinguishable | +0.00 | a delegated pillar's producer or its scoring model changed |
| 2026-09-11T21:08:33Z to 2026-09-11T21:29:07Z | 2 | indistinguishable | +0.00 | the tool version, a delegated pillar's producer or its scoring model changed |
| 2026-09-10T23:35:05Z to 2026-09-11T19:24:09Z | 26 | indistinguishable | +0.10 | the tool version changed |
| 2026-09-10T22:48:20Z to 2026-09-10T23:22:21Z | 6 | indistinguishable | +0.00 | the tool version, the configured thresholds changed |
| 2026-09-09T16:26:16Z to 2026-09-09T16:26:16Z | 1 | unknown | — | the tool version, which analyzers contributed changed |
| 2026-09-09T16:03:21Z to 2026-09-09T16:03:21Z | 1 | unknown | — | which analyzers contributed changed |
| 2026-09-09T15:57:18Z to 2026-09-09T15:57:18Z | 1 | unknown | — | which analyzers contributed changed |
| 2026-09-09T15:51:34Z to 2026-09-09T15:51:34Z | 1 | unknown | — | which analyzers contributed changed |
| 2026-09-09T15:45:03Z to 2026-09-09T15:45:03Z | 1 | unknown | — | which analyzers contributed changed |
| 2026-09-09T15:28:08Z to 2026-09-09T15:28:08Z | 1 | unknown | — | which analyzers contributed changed |
| 2026-09-08T19:04:32Z to 2026-09-08T19:04:32Z | 1 | unknown | — | the tool version changed |
| 2026-09-08T07:43:59Z to 2026-09-08T17:45:09Z | 5 | indistinguishable | +0.00 | the tool version, the calibration constant changed |
| 2026-09-07T18:48:35Z to 2026-09-08T00:14:00Z | 7 | indistinguishable | +0.00 | the tool version, which analyzers contributed changed |
| 2026-09-06T18:48:06Z to 2026-09-06T18:55:57Z | 2 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-06T14:42:34Z to 2026-09-06T18:28:54Z | 9 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-05T21:35:57Z to 2026-09-06T04:02:48Z | 6 | indistinguishable | +0.00 | the tool version, which analyzers contributed, the scored languages, the scan scope changed |
| 2026-09-05T20:49:08Z to 2026-09-05T20:53:53Z | 2 | unknown | — | which analyzers contributed, the scored languages changed |
| 2026-09-05T20:44:46Z to 2026-09-05T20:44:46Z | 1 | unknown | — | the scan scope changed |
| 2026-09-05T19:52:45Z to 2026-09-05T19:52:45Z | 1 | unknown | — | the tool version changed |
| 2026-09-05T00:59:02Z to 2026-09-05T18:15:54Z | 23 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-04T22:42:23Z to 2026-09-05T00:47:24Z | 6 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-04T19:52:42Z to 2026-09-04T22:33:54Z | 16 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-04T19:08:33Z to 2026-09-04T19:08:33Z | 1 | unknown | — | the tool version changed |
| 2026-09-04T16:40:06Z to 2026-09-04T17:56:04Z | 2 | indistinguishable | +0.00 | the tool version, which analyzers contributed changed |
| 2026-09-04T07:53:46Z to 2026-09-04T07:53:46Z | 1 | unknown | — | the tool version changed |
| 2026-09-04T07:11:36Z to 2026-09-04T07:40:48Z | 2 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-04T05:56:43Z to 2026-09-04T06:58:47Z | 4 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-04T04:25:28Z to 2026-09-04T05:44:00Z | 6 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-03T22:26:06Z to 2026-09-04T04:12:38Z | 11 | indistinguishable | +0.00 | the tool version, the calibration constant changed |
| 2026-09-03T16:43:03Z to 2026-09-03T19:57:41Z | 15 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-03T14:19:51Z to 2026-09-03T15:38:52Z | 5 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-03T04:32:13Z to 2026-09-03T14:04:41Z | 10 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-03T03:14:36Z to 2026-09-03T03:26:28Z | 3 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-03T01:50:55Z to 2026-09-03T01:50:55Z | 1 | unknown | — | the tool version, which analyzers contributed changed |
| 2026-09-02T21:22:31Z to 2026-09-02T21:22:31Z | 1 | unknown | — | the tool version, which analyzers contributed changed |
| 2026-09-02T20:57:23Z to 2026-09-02T20:57:23Z | 1 | unknown | — | the tool version changed |
| 2026-09-02T19:48:51Z to 2026-09-02T20:10:01Z | 4 | indistinguishable | +0.00 | which analyzers contributed changed |
| 2026-09-02T19:09:34Z to 2026-09-02T19:09:34Z | 1 | unknown | — | the tool version, which analyzers contributed changed |
| 2026-09-02T16:49:38Z to 2026-09-02T18:17:31Z | 5 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-02T15:53:44Z to 2026-09-02T16:09:57Z | 4 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-02T05:07:33Z to 2026-09-02T05:21:56Z | 2 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-02T04:13:12Z to 2026-09-02T04:32:59Z | 5 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-02T03:10:30Z to 2026-09-02T03:10:30Z | 1 | unknown | — | the tool version changed |
| 2026-09-02T02:55:46Z to 2026-09-02T02:55:46Z | 1 | unknown | — | the tool version changed |
| 2026-09-02T02:37:15Z to 2026-09-02T02:37:15Z | 1 | unknown | — | the tool version changed |
| 2026-09-02T00:13:53Z to 2026-09-02T02:21:34Z | 2 | indistinguishable | +0.00 | the tool version changed |
| 2026-09-01T22:50:04Z to 2026-09-01T23:57:58Z | 4 | indistinguishable | +0.00 | the tool version, the calibration constant, which analyzers contributed, the scan scope changed |
| 2026-08-28T13:05:26Z to 2026-08-28T13:07:10Z | 3 | unknown | — | which analyzers contributed, the scan scope changed |
| 2026-08-21T18:32:29Z to 2026-08-21T18:32:29Z | 1 | unknown | — | the tool version changed |
| 2026-08-20T16:20:52Z to 2026-08-21T18:18:13Z | 27 | indistinguishable | +0.20 | the tool version changed |
| 2026-08-19T22:59:02Z to 2026-08-19T23:50:01Z | 6 | indistinguishable | +0.10 | which analyzers contributed changed |
| 2026-08-17T15:38:29Z to 2026-08-19T22:06:38Z | 48 | indistinguishable | +0.00 | the tool version, which analyzers contributed, the scored languages changed |
| 2026-08-15T20:46:31Z to 2026-08-16T06:01:10Z | 7 | indistinguishable | +0.00 | the first recorded scan |
Every figure describes scans that happened; nothing forecasts.
0 – 0 USD over 12 months (base 0 USD), across 0 work-order item(s).
This is a scenario, not a prediction.
Assumptions:
TDD-shaped tests: detected beside 128 of 154 production source files (path pairing). Constructs: pytest in 260 file(s), unittest in 1 file(s), describe_it in 18 file(s), parametrize in 90 file(s), given_when_then in 2 file(s).
Chronology is not measured. Effectiveness is unscored unless the operator opted into suite execution.
The operator opted in to running the repository's test command; it failed (exit 1).
Command: pytest -n auto --cov=maintainability_audit --cov-report=xml:coverage.xml -q
Coverage: 96.0% line coverage
Practice level 4 of 5 — CI holds a numeric quality gate.
| Pillar | Scope | Practice | Condition | Reading |
|---|---|---|---|---|
| readability | partial | 4 | 4.8 | healthy: enforced, and the code reflects it |
| maintainability | owned | 4 | 3.9 | healthy: enforced, and the code reflects it |
| efficiency | out-of-scope | 4 | — | not measured — see below |
| security | delegated | 5 | 5.0 | healthy: enforced, and the code reflects it; findings: no findings |
| testability | partial | 4 | 5.0 | healthy: enforced, and the code reflects it |
Not measured here, and why:
Enforcement found: linter-config, recorded-decisions, lint-in-ci, types-in-ci, duplication-in-ci, coverage-gate.
| Category | Score |
|---|---|
| modularity | 3.9 |
| reusability | 4.9 |
| analyzability | 4.4 |
| modifiability | 3.8 |
| testability | 4.8 |
| Aspect | Score |
|---|---|
| file size | 4.5 |
| declaration size | 4.3 |
| duplication | 5.0 |
| risk patterns | 5.0 |
| policy gates | 5.0 |
| test presence | 5.0 |
| dead code | 5.0 |
| near duplication | 5.0 |
| idiom consistency | 5.0 |
| documentation | 5.0 |
| churn hotspots | 4.0 |
| change coupling | 2.0 |
| knowledge concentration | 2.0 |
| test effectiveness | 4.8 |
| Aspect | Why |
|---|---|
| naming quality | no static proxy survives contact; a wrong-name detector needs semantics |
| comment accuracy | comments are deliberately unparsed; staleness needs meaning, not structure |
| indirection depth | call-graph construction is not implemented for the supported languages |
| architectural coherence | no measurement distinguishes a wrong boundary from an unusual one statically |
| File | Lines | Status |
|---|---|---|
src/maintainability_audit/_work_order.py | 666 | warn |
src/maintainability_audit/_scan_history.py | 624 | warn |
.github/workflows/quality-gates.yml | 615 | warn |
tests/test_operator_named_reads.py | 613 | warn |
src/maintainability_audit/_prompt_sections.py | 569 | ok |
src/maintainability_audit/cli.py | 556 | ok |
src/maintainability_audit/_discovery.py | 553 | ok |
src/maintainability_audit/report.py | 540 | ok |
src/maintainability_audit/mcp_server.py | 535 | ok |
src/maintainability_audit/_mcp_audit.py | 526 | ok |
tests/test_docs_links.py | 524 | ok |
tests/test_mcp_server.py | 520 | ok |
README.md | 506 | ok |
tools/prove_falsifiers.py | 500 | ok |
src/maintainability_audit/scoring.py | 499 | ok |
tests/test_calibration_corpus.py | 499 | ok |
tests/test_evidence_properties.py | 496 | ok |
src/maintainability_audit/_adapters.py | 492 | ok |
tests/test_adapters.py | 491 | ok |
tests/test_mcp_history.py | 486 | ok |
src/maintainability_audit/_analysis.py | 485 | ok |
src/maintainability_audit/_mcp_setup.py | 481 | ok |
src/maintainability_audit/_masking.py | 476 | ok |
tests/test_grant_only_user_tier.py | 475 | ok |
src/maintainability_audit/_metrics_types.py | 472 | ok |
| File | Declaration | Line | Lines | Complexity | Cognitive | Status |
|---|---|---|---|---|---|---|
tools/build_catalog.py | build | 327 | 36 | 15 | 0 | warn |
tests/test_docs_links.py | test_no_markdown_table_is_split_by_prose | 198 | 35 | 15 | 20 | warn |
src/maintainability_audit/history.py | history_section | 298 | 51 | 14 | 3 | warn |
tools/build_catalog.py | _entry | 257 | 46 | 14 | 15 | warn |
tests/_ast_reading.py | reachable_names | 203 | 44 | 14 | 17 | warn |
src/maintainability_audit/_html_view.py | _chart_sections | 196 | 39 | 14 | 4 | warn |
tests/test_identity_resolution.py | test_fail_on_new_uses_structured_matching_not_a_label_set_difference | 278 | 33 | 14 | 13 | warn |
src/maintainability_audit/_ranges_core.py | scan_bounded | 207 | 78 | 13 | 19 | warn |
src/maintainability_audit/_skill_install.py | install_skill | 48 | 67 | 13 | 13 | warn |
tests/test_git_argv.py | test_every_git_command_disables_gits_own_housekeeping | 396 | 66 | 13 | 20 | warn |
tests/test_language_coverage.py | test_every_parsed_language_can_reach_a_complexity_analyzer | 212 | 58 | 13 | 3 | warn |
tools/calibration/sampling_error.py | main | 88 | 54 | 13 | 10 | warn |
src/maintainability_audit/_metric_adapters.py | expand_files | 46 | 47 | 13 | 6 | warn |
tools/resolve_pool.py | main | 65 | 46 | 13 | 12 | warn |
tests/test_authorship_gates.py | _step_scripts | 41 | 43 | 13 | 23 | warn |
src/maintainability_audit/_discovery.py | discover | 466 | 42 | 13 | 12 | warn |
tests/test_analysis_coverage.py | test_no_built_in_claims_to_be_unique_when_an_adapter_exists | 302 | 36 | 13 | 2 | warn |
src/maintainability_audit/duplication.py | duplicate_blocks | 50 | 35 | 13 | 10 | warn |
tests/test_ci_installs_the_analyzer_pool.py | _pip_installed_by_ci | 73 | 35 | 13 | 15 | warn |
src/maintainability_audit/_documents.py | coverage_document | 262 | 34 | 13 | 4 | warn |
src/maintainability_audit/_semantic_view.py | semantic_markdown | 36 | 33 | 13 | 12 | warn |
src/maintainability_audit/_jvm_adapters.py | _finding_of | 367 | 27 | 13 | 12 | warn |
tests/test_promises.py | _paths_the_audit_produced | 129 | 25 | 13 | 20 | warn |
tests/test_first_run_elicitation.py | _preferred_for | 255 | 18 | 13 | 14 | warn |
src/maintainability_audit/_analysis.py | analyze | 274 | 79 | 12 | 5 | warn |
src/maintainability_audit/_pressures.py | declined_dimensions | 244 | 79 | 12 | 6 | warn |
tools/calibration/measure_cohorts.py | main | 251 | 67 | 12 | 8 | warn |
tests/test_platform_claim.py | test_the_macos_runner_actually_runs_the_suite | 174 | 61 | 12 | 8 | warn |
src/maintainability_audit/_masking.py | _mask_code | 68 | 47 | 12 | 20 | warn |
src/maintainability_audit/_ranges_js.py | js_declaration_ranges | 202 | 38 | 12 | 24 | warn |
src/maintainability_audit/_test_execution.py | run_test_suite | 152 | 80 | 11 | 11 | warn |
tools/calibration/measure_fix_breadth.py | main | 225 | 66 | 11 | 6 | warn |
src/maintainability_audit/cli.py | main | 446 | 64 | 11 | 12 | warn |
src/maintainability_audit/_prompt_sections.py | prompt_work_order | 237 | 55 | 11 | 20 | warn |
tests/test_finding_identity.py | test_no_module_hardcodes_an_ordinal | 301 | 47 | 11 | 19 | warn |
src/maintainability_audit/_masking.py | _blank_fstring_literals | 353 | 44 | 11 | 18 | warn |
src/maintainability_audit/_ranges_fortran.py | _fortran_end | 163 | 38 | 11 | 16 | warn |
tests/test_network_disclosure.py | test_no_module_imports_an_http_client | 69 | 24 | 11 | 16 | warn |
src/maintainability_audit/_analysis.py | _attempt | 398 | 80 | 10 | 12 | warn |
tests/test_verified_grade.py | test_not_applicable_rollup_is_the_only_change_to_the_pre_stage_five_anchor | 255 | 80 | 10 | 0 | warn |
src/maintainability_audit/scoring.py | _score_document | 433 | 67 | 10 | 13 | warn |
tests/test_written_record.py | test_no_document_says_a_register_entry_is_open_that_the_register_closed | 343 | 45 | 10 | 16 | warn |
tests/test_anticipated_refusals.py | _named_exceptions | 95 | 26 | 10 | 16 | warn |
src/maintainability_audit/report.py | build_report | 461 | 80 | 9 | 3 | warn |
src/maintainability_audit/_prompt_sections.py | prompt_pressure_section | 318 | 66 | 9 | 5 | warn |
tests/test_docs_links.py | test_every_internal_link_resolves_to_a_file_and_an_anchor | 82 | 16 | 9 | 17 | warn |
src/maintainability_audit/_mcp_audit.py | audit_repository | 180 | 73 | 8 | 9 | warn |
tests/test_release_plan.py | test_the_release_plan_table_is_measured_not_remembered | 27 | 68 | 8 | 2 | warn |
tools/calibration/verify_corpus.py | main | 100 | 74 | 7 | 7 | warn |
tests/test_determinism.py | test_the_history_window_is_disclosed_as_clock_relative | 230 | 71 | 7 | 4 | warn |
Written by secure-code-agent 0.12.8 and reproduced as it wrote it. It is that tool's work order, not this one's: its findings are not re-ranked or merged into the maintainability work order above.
68 to fix · 0 to review · 5226 suppression candidates.
Defects the scanner is confident about.
B314 — Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.fromstring with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is calledsrc/maintainability_audit/_xml.py:70
69 ) 70 return ElementTree.fromstring(payload) # noqa: S314 - declarations refused above
Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.fromstring with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is called
CWE-20 · medium/high via bandit
B310 — Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.tools/sonar_resolve.py:56
55 request.add_header("Authorization", f"Basic {basic}")
56 with urllib.request.urlopen(request, timeout=30) as response: # noqa: S310 - fixed host
57 body = response.read().decode()
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
CWE-22 · A01 · medium/high via bandit
B310 — Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.tools/sonar_resolve.py:109
108 request.add_header("Authorization", f"Basic {basic}")
109 with urllib.request.urlopen(request, timeout=30) as response: # noqa: S310 - fixed host
110 found = json.loads(response.read().decode()).get("issues") or []
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
CWE-22 · A01 · medium/high via bandit
B404 — Consider possible security implications associated with the subprocess module.src/maintainability_audit/_backfill.py:29
28 29 import subprocess 30 from pathlib import Path
Consider possible security implications associated with the subprocess module.
CWE-78 · A03 · low/high via bandit
B607 — Starting a process with a partial executable pathsrc/maintainability_audit/_backfill.py:51-69
50 try: 51 result = subprocess.run( # noqa: S603 - argv list, never a shell 52 # D71: this spawn is not `run_git`, and the sweep that was 53 # meant to hold that rule only read `git_tools.py` -- so 54 # the one git command in this package that lives 55 # somewhere else went uncovered. `commits_in_range` runs 56 # `rev-list` here before any worktree exists, which is 57 # exactly the read that can schedule housekeeping. 58 # `_attr_tree_config` as well as `READ_ONLY_GIT_CONFIG`. The 59 # fixed `-c` list cannot name the per-driver filter/textconv 60 # keys a tree selects in `.gitattributes`, so attribute-driven 61 # code execution is cut off by reading attributes from an empty 62 # tree instead -- and backfill's `worktree add` re-hashes 63 # content, which is exactly what runs a `clean` filter. `run_git` 64 # got this; this spawner, living outside `git_tools`, did not 65 # (audit of `e88b429`; the D92 sweep only read `git_tools.py`). 66 ["git", *READ_ONLY_GIT_CONFIG, *_attr_tree_config(root), 67 "-C", str(root), *args], 68 capture_output=True, text=True, check=False, 69 timeout=GIT_TIMEOUT_SECONDS, env=git_env()) 70 except subprocess.TimeoutExpired as expired:
Starting a process with a partial executable path
CWE-78 · A03 · low/high via bandit
B603 — subprocess call - check for execution of untrusted input.src/maintainability_audit/_backfill.py:51-69
50 try: 51 result = subprocess.run( # noqa: S603 - argv list, never a shell 52 # D71: this spawn is not `run_git`, and the sweep that was 53 # meant to hold that rule only read `git_tools.py` -- so 54 # the one git command in this package that lives 55 # somewhere else went uncovered. `commits_in_range` runs 56 # `rev-list` here before any worktree exists, which is 57 # exactly the read that can schedule housekeeping. 58 # `_attr_tree_config` as well as `READ_ONLY_GIT_CONFIG`. The 59 # fixed `-c` list cannot name the per-driver filter/textconv 60 # keys a tree selects in `.gitattributes`, so attribute-driven 61 # code execution is cut off by reading attributes from an empty 62 # tree instead -- and backfill's `worktree add` re-hashes 63 # content, which is exactly what runs a `clean` filter. `run_git` 64 # got this; this spawner, living outside `git_tools`, did not 65 # (audit of `e88b429`; the D92 sweep only read `git_tools.py`). 66 ["git", *READ_ONLY_GIT_CONFIG, *_attr_tree_config(root), 67 "-C", str(root), *args], 68 capture_output=True, text=True, check=False, 69 timeout=GIT_TIMEOUT_SECONDS, env=git_env()) 70 except subprocess.TimeoutExpired as expired:
subprocess call - check for execution of untrusted input.
CWE-78 · A03 · low/high via bandit
B405 — Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.src/maintainability_audit/_jvm_adapters.py:21
20 from typing import Any 21 from xml.etree import ElementTree 22
Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
CWE-20 · low/high via bandit
B404 — Consider possible security implications associated with the subprocess module.src/maintainability_audit/_runner.py:33
32 import shutil 33 import subprocess 34 import sys
Consider possible security implications associated with the subprocess module.
CWE-78 · A03 · low/high via bandit
B603 — subprocess call - check for execution of untrusted input.src/maintainability_audit/_runner.py:255-260
254 try:
255 completed = subprocess.run( # noqa: S603 - argv list, never a shell
256 [npm, "config", "get", "registry"],
257 cwd=neutral, capture_output=True, text=True, timeout=30,
258 env={k: v for k, v in os.environ.items() if k not in _CODE_LOADING_VARS},
259 check=False,
260 )
261 except (OSError, subprocess.SubprocessError):
subprocess call - check for execution of untrusted input.
CWE-78 · A03 · low/high via bandit
B603 — subprocess call - check for execution of untrusted input.src/maintainability_audit/_runner.py:431-439
430 try:
431 completed = subprocess.run( # noqa: S603 - argv is built by adapters, never a shell string
432 argv,
433 cwd=str(cwd or invocation.cwd) if (cwd or invocation.cwd) else None,
434 capture_output=True,
435 text=True,
436 timeout=timeout_seconds,
437 env={**analyzer_env(), **(invocation.env or {})},
438 check=False,
439 )
440 except subprocess.TimeoutExpired:
subprocess call - check for execution of untrusted input.
CWE-78 · A03 · low/high via bandit
B405 — Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.src/maintainability_audit/_xml.py:30
29 from typing import Any 30 from xml.etree import ElementTree 31
Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
CWE-20 · low/high via bandit
B404 — Consider possible security implications associated with the subprocess module.src/maintainability_audit/git_tools.py:21
20 import re 21 import subprocess 22 from pathlib import Path
Consider possible security implications associated with the subprocess module.
CWE-78 · A03 · low/high via bandit
56 more not shown.
TypeScript semantic coverage: unknown — no recorded type analysis and no local type checker: semantic coverage for TypeScript is unknown. Absence of analysis is not absence of findings.