Generated 2026-09-18T23:57:11+00:00 · commit e54b1c9e6893801bf8df3667516dd308c67a11e1 · 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 | 3934 | 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 | 12621 | 0 |
| multimetric | analyzer | ran | usage: multimetric [-h] [--warn_compiler WARN_COMPILER] | 1752 | 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 | 566 |
| radon | analyzer | ran | 6.0.1 | 417 | 0 |
| ruff | analyzer | ran | ruff 0.16.5 | 0 | 1 |
| vulture | analyzer | ran | vulture 2.16 | 0 | 6 |
| competing-libraries | built-in | ran | — | 511 | 0 |
| dead-code | built-in | ran | — | 4172 | 0 |
| declaration-size | built-in | ran | — | 4172 | 79 |
| duplicate-blocks | built-in | ran | — | 511 | 0 |
| file-size | built-in | ran | — | 511 | 4 |
| history | built-in | ran | — | 510 | 72 |
| near-duplicates | built-in | ran | — | 4172 | 0 |
| risk-patterns | built-in | ran | — | 511 | 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-18T23:36:36Z | e54b1c9e | 4.4 | 0 |
| 2026-09-19T00:06:18Z | e54b1c9e | 4.4 | 0 |
60 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 — 2 scans, 2026-09-18T23:36:36Z to 2026-09-19T00:06:18Z.
| Window | Scans | Direction | Change | Began at a break in |
|---|---|---|---|---|
| 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 255 file(s), unittest in 1 file(s), describe_it in 16 file(s), parametrize in 89 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 -q
Coverage: no coverage reported by the run
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 | not measurable |
| 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 | 538 | ok |
src/maintainability_audit/mcp_server.py | 535 | ok |
tests/test_docs_links.py | 524 | ok |
tests/test_mcp_server.py | 520 | ok |
README.md | 506 | ok |
src/maintainability_audit/_mcp_audit.py | 504 | 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 |
src/maintainability_audit/_runner.py | run | 356 | 79 | 12 | 12 | 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 | 68 | 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/_mcp_audit.py | audit_repository | 180 | 74 | 10 | 11 | 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 | 459 | 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 |
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 |
Written by secure-code-agent 0.12.7 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.
# Security work order
**68 to fix · 0 to review · 5187 suppression candidates.**
Work the tiers in order. Everything in §FIX is a defect the scanner is confident about; everything in §REVIEW needs your judgement before you touch it, and the reason is stated per finding. This is a constrained task, not a refactor.
## Hard constraints — MUST NOT violate
1. Fix only the findings listed. Touch nothing else.
2. Do not change crypto algorithms, key derivation, IV/nonce, padding or random sources unless a finding names them.
3. Do not change auth flows, sessions, token lifetime, cookie attributes or authorization gates unless a finding names them.
4. Do not weaken validation, encoding, sanitization, bounds checks, regex strictness or rate limits to make tests pass.
5. Do not disable, delete or skip security tests, or remove `@require_auth`-style decorators.
6. Do not silence warnings: no `# nosec`, `# noqa`, `# type: ignore`, `eslint-disable` or equivalent.
7. Do not add dependencies. If one is genuinely required, stop and ask.
8. Preserve behaviour. If a finding proves current behaviour unsafe, name the input → old/new output.
9. Add one focused test per fix that FAILS before and PASSES after. No "TODO: add test later".
10. Keep the patch small. If you are rewriting a function rather than patching it, stop and report why.
## Protocol
Per finding: quote the lines you will change, state the minimum change and
the test you will add, apply it, then confirm the test fails on the pre-fix
code and passes after. Do not re-run this tool; CI will.
Report per finding: id · files changed (`file:line`) · test added · behaviour
change (yes/no, with input → old/new) · standards satisfied.
A false positive is a successful outcome: do not patch it. Emit a
`.scignore.yaml` suppression candidate with the justification and a proposed
`expires` date (90 days maximum) for the operator to review.
## §FIX — patch these
### 1. `B314` — Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerab
`src/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](https://cwe.mitre.org/data/definitions/20.html) (Top 25) · medium/high via `bandit`
### 2. `B310` — Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often un
`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](https://cwe.mitre.org/data/definitions/22.html) (Top 25) · A01:2021-Broken Access Control · medium/high via `bandit`
### 3. `B310` — Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often un
`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](https://cwe.mitre.org/data/definitions/22.html) (Top 25) · A01:2021-Broken Access Control · medium/high via `bandit`
### 4. `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](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 5. `B607` — Starting a process with a partial executable path
`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
… 18 more line(s) — open the file
```
Starting a process with a partial executable path
[CWE-78](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 6. `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
… 18 more line(s) — open the file
```
subprocess call - check for execution of untrusted input.
[CWE-78](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 7. `B405` — Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Re
`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](https://cwe.mitre.org/data/definitions/20.html) (Top 25) · low/high via `bandit`
### 8. `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](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 9. `B603` — subprocess call - check for execution of untrusted input.
`src/maintainability_audit/_runner.py:243-248`
```
242 try:
243 completed = subprocess.run( # noqa: S603 - argv list, never a shell
244 [npm, "config", "get", "registry"],
… 5 more line(s) — open the file
```
subprocess call - check for execution of untrusted input.
[CWE-78](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 10. `B603` — subprocess call - check for execution of untrusted input.
`src/maintainability_audit/_runner.py:370-378`
```
369 try:
370 completed = subprocess.run( # noqa: S603 - argv is built by adapters, never a shell string
371 argv,
… 8 more line(s) — open the file
```
subprocess call - check for execution of untrusted input.
[CWE-78](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
### 11. `B405` — Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Re
`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](https://cwe.mitre.org/data/definitions/20.html) (Top 25) · low/high via `bandit`
### 12. `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](https://cwe.mitre.org/data/definitions/78.html) (Top 25) · A03:2021-Injection · low/high via `bandit`
> **56 more in §FIX.** Fix this batch, re-run, and the next order carries the rest. All of them are in the JSON report.
## §ACCEPT — test tree and documentation
Findings outside the shipped source. A credential in a test fixture
or a tutorial is usually deliberate, and these do not grade the code
condition — but they are reported, because one of them may be a real
key committed to the wrong place.
**Do not patch these.** Decide per group: a genuine secret to rotate
and remove, or a fixture to record in `.scignore.yaml` with a reason
and an expiry. Propose, do not apply.
Grouped by rule, because the decision is per rule and not per line.
| rule | count | worst | example |
| --- | ---: | --- | --- |
| `B108` | 9 | medium | `tests/test_analyzer_config_isolation.py:139` |
| `B101` | 4678 | low | `tests/_ast_reading.py:94` |
| `B603` | 215 | low | `tests/_analyzer_fixtures.py:30` |
| `B607` | 185 | low | `tests/_analyzer_fixtures.py:30` |
| `B404` | 98 | low | `tests/_analyzer_fixtures.py:27` |
| `B405` | 1 | low | `tests/test_analyzer_xml_bounds.py:112` |
| `B105` | 1 | low | `tests/test_root_grants.py:263` |
A suppression covering one of these groups looks like:
```yaml
- rule_id: B108
paths: ["*/tests/*"]
reason: "state why this is deliberate, and what you checked"
expires: "YYYY-MM-DD"
```
---
End of findings. Apply the patch protocol above per finding. Report each one in the summary block format.
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.