Quality matrix
This page is our own measurement, not an external quality assessment. It has two parts.
- Component checker scores. The Common Ground component checker scores each app from 0 to 100. The latest round ran on 13 November 2026.
- The quality matrix. Our estimate of the maintainability rating an external assessment would give, our own measures and every gate. An external assessment uses its own parsers and scoping, so its numbers can differ.
Component checker scores
Measured on 13 November 2026, 04:01 to 04:19 UTC, with checker version
d6a3b66. We measured openregister on main and every other app on
development. The commit is the head we measured.
The checker rates 30 criteria in five categories: governance, security, architecture, maintainability, and deployment and operations. The score runs from 0 to 100, the rating from 1 to 5 stars. An app is endorsed when no mandatory criterion fails.
| App | Commit | Score | Rating | Endorsed | Mandatory criteria that do not pass |
|---|---|---|---|---|---|
| openregister | 5af71ed90 | 97 | 4.8 | yes | none |
| thematiq | bafd06c33 | 97 | 4.9 | yes | none |
| larpinq | 1137ab67c | 97 | 4.7 | yes | none |
| filinq | e1f08e30b | 97 | 4.6 | yes | none |
| keepiq | 2f62be103 | 93 (round: 89) | 4.3 | yes | API design rules warn, 536 warnings. Secure coding passes since the checker fix, see below |
| versioniq | 2d33f50fe | 93 | 4.5 | yes | API design rules warn, 87 warnings |
| integriq | 0a984caa0 | 93 | 4.4 | yes | API design rules warn, 25 warnings |
| hermiq | beeb8ec1c | 93 | 4.4 | yes | API design rules warn, 6 warnings |
| humaniq | 8d29580c1 | 93 | 4.4 | yes | API design rules warn, no API spec found |
| planninq | 8fc73df3d | 93 | 4.4 | yes | API design rules warn, no API spec found |
| pipelinq | 7933b59c4 | 93 | 4.3 | yes | API design rules warn, no API spec found |
| launchpad | 39f212172 | 93 | 4.3 | yes | API design rules warn, no API spec found |
| shillinq | e7b76198c | 93 | 4.3 | yes | API design rules warn, no API spec found |
| learniq | c16800b62 | 93 | 4.3 | yes | API design rules warn, no API spec found |
| decidiq | 7cd7d1756 | 93 | 4.3 | yes | API design rules warn, no API spec found |
| stackiq | 7cd10138f | 92 | 4.5 | no | coverage fails, 65.17% of 80% |
| opencatalogi | 92b8e73e6 | 90 | 4.3 | no | API design rules fail, 1 error and 1 warning |
| portaliq | a893a302a | 88 | 4.4 | no | secure coding fails, 23 findings, all in the vendored woo/static/js bundle |
| buildiq | 5f5f87c67 | 88 | 4.3 | no | coverage fails, 79.92% of 80%. API design rules warn, no API spec found |
| dossiq | d63da17a9 | 88 | 4.4 | no | coverage fails, 75.80% of 80%. API design rules warn, no API spec found |
The five-layer architecture criterion warns in every app, so the table leaves it out. The checker sees signals of several Common Ground layers in each repository.
- Fleet. The mean score is 92.7, or 92.9 with keepiq's rescan. 15 of 20 apps are endorsed.
- Blocked. Coverage holds back stackiq, buildiq and dossiq. buildiq misses 80% by 0.08 points. API design rules hold back opencatalogi. Secure coding holds back portaliq.
- Coverage is self-reported. The checker reads the committed
coverage/coverage-summary.json. It does not run the tests itself. - portaliq's secure coding findings sit in a third-party bundle we commit, not in portaliq's own source.
Why the checker scores moved this week
The checker changed between rounds, so not every jump is new code.
- Round of 01:00 UTC, 13 November (checker
d6a3b66). Three fixes landed. The hardcoded-secret rule now needs a value that looks like a secret, not just a name. Go, pytest, end-to-end and Android test paths count as test code. The licence check honours the excludes in each repository's scope file. Eight apps gained 4 points from these fixes alone. A control scan of the same commits with the old checker separates the two effects. - Round of 04:00 UTC (same checker). Every change came from merged work. launchpad gained 12 points from its Docker image and Helm chart. filinq, larpinq and thematiq reached 97 with a clean versioned API spec. portaliq gained 3 points for the same reason.
- keepiq rescan, about 04:30 UTC (checker
afb5f1b). The secret rule now looks at one line only and accepts PascalCase names. keepiq's one finding was an icon name, so secure coding passes and keepiq scores 93 on the same commit.
The quality matrix
Measured on 2026-11-06. We have not measured the matrix again since. The commit under each app name is the head that was measured. An app we measured again later shows its own date under its name. For that app, the rating, maintainability rows and levers come from that date. Its other rows keep the date above.
Until 31 October 2026 the fleet followed the Nextcloud coding standards. From 1 November 2026 we apply the maintainability rules of the maintainability guidance. Gates 122 and 123 check them on every change. That is why the scores rise from 1 November.
How to read the matrix
Each column is an app. The rows come in five sections.
- Estimated maintainability rating. Our estimate of the rating an external assessment would give, from 0.5 to 5.5. The overall row is a range. Below it are the five sub-characteristics and the seven properties. All of it is an estimate.
- Maintainability checks. Every check of gate 122, per language, rated from 1 to 5 stars.
- Other external models. Open Source Health and Architecture Quality, where we can measure them. The guidance publishes only the 4-star value, so a cell says met (4★) or missed (<4).
- Our own measures. Tests, debt, security, and accessibility and UI. We define these bands ourselves. The table below the matrix gives each band's basis.
- Gates per category. Each row shows the gates that pass out of the gates that apply, and the findings of all of them. Open a row to see its gates.
- Unit size, complexity and interfacing: the share of unit code above the bound, for example the code in units longer than 15 lines.
- Duplication: the share of redundant lines, in fragments of 6 lines or more. In a Vue file we treat template, script and style as separate pieces, so a fragment never crosses from one into the next. This is our assumption until a real external scan confirms it.
- Module coupling: the share of module code in files with more than 10, 20 or 50 incoming dependencies.
- Component independence: the share of code that no other component calls. Higher is better here. For every other check, lower is better.
A cell shows the stars and the measured value. Hover a cell for the details.
An empty cell (·) means the app has no such code or the gate does not apply.
Maintainability bands
The 4-star limits come from the maintainability guidance, Guidance for Producers v18.1, dated 31 March 2026. It is the 2026 model. Volume no longer counts.
The guidance publishes no other level. We derive the 5, 3 and 2-star limits ourselves. The only public table of all levels is Alves, Correia and Visser (2011). We take its distance between each band and the 4-star band. We apply that ratio to the v18.1 limits. Duplication uses the band ratios of Heitlager, Kuipers and Visser (2007). Anything worse than 2 stars is 1 star.
| Check | 5★ | 4★ (v18.1) | 3★ | 2★ |
|---|---|---|---|---|
| Unit size, code in units over 15 / 30 / 60 lines | 36.0 / 17.0 / 5.5% | 48.0 / 24.2 / 9.1% | 63.0 / 34.7 / 15.4% | 84.7 / 49.0 / 25.3% |
| Unit complexity, McCabe over 5 / 10 / 25 | 15.8 / 4.4 / 0.5% | 20.7 / 7.5 / 1.1% | 27.7 / 10.6 / 1.7% | 34.6 / 13.2 / 2.7% |
| Unit interfacing, 3+ / 5+ / 7+ parameters | 12.5 / 2.5 / 0.6% | 15.4 / 3.4 / 0.9% | 18.3 / 4.8 / 1.4% | 26.0 / 7.2 / 2.1% |
| Module coupling, fan-in over 10 / 20 / 50 | 7.4 / 3.3 / 1.2% | 9.7 / 5.3 / 1.8% | 10.7 / 5.9 / 2.3% | 13.0 / 8.0 / 3.8% |
| Duplication | 3.5% | 5.8% | 11.6% | 23% |
| Component independence | at least 97.3% | at least 94.5% | no band | no band |
| Component entanglement | at most 0.0375 | at most 0.075 | no band | no band |
The 2011 table was calibrated on a 20/20/20/20/20 spread. The 2026 model uses 5/30/30/30/5. So the real 5-star limits are probably stricter, and the real 2-star limits looser.
For independence and entanglement no public source gives other levels. We set
5 stars at half the 4-star exposure. A value below 4 stars shows as <4.
Entanglement is our estimate from the violation degree, because the assessor
normalises it against benchmark figures it does not publish. It is shown, but
gate 123 does not floor it.
How we estimate the maintainability rating
The external assessment rates each app from 0.5 to 5.5 stars. Our estimate follows its published steps, from the checks up to one number. Where nothing is published, we made a choice. Each choice is listed under assumptions.
- Check. A share of code between two star limits gets a rating between them, on a straight line. A share at the 4-star limit rates 3.5. This is equation 1 of Alves, Correia and Visser (2011). We test it on the paper's own example, which rates 2.68.
- Property. A property with three checks takes its worst check. Same paper.
- Languages. Each language gets its own property rating. We weight them by the code each property measures in that language.
- Sub-characteristic. The plain mean of its properties. Analysability: duplication and unit size. Modifiability: duplication, unit complexity and module coupling. Testability: unit complexity and component independence. Modularity: module coupling, component independence and component entanglement. Reusability: unit size and unit interfacing.
- Overall. The power mean of the five sub-characteristics. The 2026 model switched to a power mean in 2026 but does not publish the exponent. We show two: p = 1, the plain mean, and p = -1, the harmonic mean. The harmonic mean pulls harder towards the weakest sub-characteristic. The real rating probably sits between them.
Rounding to stars follows the guidance: half up, and 5.5 is still 5 stars. A rating row is coloured by its stars and shows the value. The overall row is coloured by the lower end of its range.
Sources
- Key changes in the 2026 quality models, the assessor's own note: volume is removed, and the overall rating is now a power mean.
- Guidance for Producers v18.1, 31 March 2026: the 4-star limits, per language.
- Evaluation Criteria Trusted Product Maintainability v12.0, 2020: which properties feed which sub-characteristic, and the order of the steps.
- Alves, Correia and Visser, Benchmark-based aggregation of metrics to ratings, IWSM/Mensura 2011: the interpolation and the minimum over checks.
- Baggen, Correia, Schill and Visser, Standardized code quality benchmarking for improving software maintainability, Software Quality Journal 2012: a sub-characteristic is the mean of its properties, and the overall rating the mean of the sub-characteristics.
- The worked example in the 2026 changes note fits this: its overall 3.2 is the mean of the sub-characteristics, not of the properties.
Assumptions
- Exponent. The assessor does not publish it. We show p = 1 and p = -1 as a range.
- Weights. Every property counts equally in its sub-characteristic, and every sub-characteristic in the overall rating. The evaluation criteria say a panel of experts sets the weights, and the assessor does not publish them. The worked example fits equal weights.
- Mapping in 2026. The 2020 mapping, minus volume and component balance, which the 2026 model no longer rates. Nothing is added.
- Power mean at the last step only. The sub-characteristics stay a plain mean. The published text does not say at which step the power mean applies.
- Languages. Weighted by code. The guidance says most results are weighted by code volume, but not how languages combine.
- 1 star. Below the 2-star limit the rating falls on a straight line to 0.5 when all code is in the band. The paper does not give this end.
- Limits other than 4 stars. Our derived 5, 3 and 2-star limits from the table above.
- Independence and entanglement below 4 stars. The assessor rates them below 4
stars but publishes only the 4-star limit. For the estimate, each star level
doubles the allowed exposure. Independence: at least 97.25, 94.5, 89 and
78% hidden code for 5, 4, 3 and 2 stars. Entanglement: at most 0.0375,
0.075, 0.15 and 0.30. The check rows keep showing
<4. - Entanglement value. We rate the violation degree. The assessor combines it with the communication density against benchmark maxima it does not publish.
- Missing structure. Module coupling, independence and entanglement are
measured for PHP under
lib/and for Python only. JavaScript, TypeScript and Vue count for the unit checks and duplication.
Floors
A cell with a ring and a lock is floored. Gate 123 holds that check. The app
met it when its floor was recorded, and a change that loses it fails.
Re-recording a floor never lowers it. A floored check that the v18.1 limits
miss stays in the floor and shows <4 until development meets it again.
- 5★ 5 stars
- 4★ 4 stars
- 3★ 3 stars
- 2★ 2 stars
- 1★ 1 star
- 3★ in the estimated rating rows: a rating from 0.5 to 5.5, rounded to stars, value below
- <4 misses 4 stars where no lower band is published or estimated
- 4★ floored: gate 123 refuses a change that loses this check
- · not measured for this app
All 20 apps: 612 of 758 maintainability checks at 4 stars or better (81%). This average is our own figure, not an external score.
| measure | buildiqd6f56351 | decidiq3a356e7e | dossiq9622acd9 | filinqab6c1ebb | hermiq1fad8992 | humaniq5589f3ab | integriqcd844692 | keepiqee758777 | larpinq5ad762be | launchpad3e7bf07b | learniq4d971c74 | opencatalogi7a191dbb | openregister4eccbfbcmeasured 2026-11-08 | pipelinqe4d420d4 | planninq19c35bed | portaliq795da17b | shillinqf1e580b0 | stackiq9ad6a74f | thematiq3a5ccb20 | versioniqab0f16d6 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Maintainability checks at 4 stars or betterand the share of the app's checks | 26/3476% | 27/3479% | 20/3459% | 40/4491% | 25/3474% | 29/3485% | 25/3474% | 46/5879% | 33/3497% | 28/3482% | 23/3468% | 39/4489% | 54/5893% | 21/3462% | 33/3497% | 24/3471% | 32/4473% | 24/3471% | 22/2492% | 41/4493% |
| Maintainability checks at 5 stars | 20/34 | 22/34 | 16/34 | 36/44 | 17/34 | 26/34 | 25/34 | 42/58 | 29/34 | 25/34 | 18/34 | 28/44 | 53/58 | 16/34 | 26/34 | 17/34 | 28/44 | 17/34 | 20/24 | 41/44 |
| floored checksfloor recorded at commit | 27fa904a53 | 244242e8e1 | 1939ea188e | 40aff2d605 | 2557a9fd98 | 29d83ab23e | 2645eaf576 | 46441230ac | 29ebf9d6ef | 289080e1fa | 229e7724de | 39d34462cb | 43eb3a3908 | 2135f34859 | 323b8ff73f | 242dadb96d | 327a3bf1b6 | 17dd80cc1c | 21c2740962 | 418a3e548d |
| Estimated maintainability rating | ||||||||||||||||||||
| overall | ||||||||||||||||||||
| Estimated maintainability rating (estimate)range from power mean p = -1 to p = 1, on 0.5 to 5.5; stars of the lower end | 3★2.82 to 3.05 | 3★2.91 to 3.07 | 2★2.34 to 2.59 | 4★3.76 to 3.86 | 2★2.36 to 2.50 | 2★2.43 to 2.71 | 3★3.00 to 3.15 | 3★2.95 to 3.13 | 4★3.95 to 4.08 | 3★2.67 to 2.89 | 3★2.61 to 2.80 | 4★3.99 to 4.05 | 4★3.94 to 4.01 | 2★2.34 to 2.63 | 4★3.59 to 3.77 | 2★2.45 to 2.83 | 2★2.16 to 2.32 | 2★2.11 to 2.27 | 3★3.40 to 3.59 | 4★3.68 to 3.88 |
| sub-characteristics (estimate) | ||||||||||||||||||||
| analysabilitymean of duplication, unit size | 3★3.39 | 3★3.30 | 3★2.97 | 4★3.65 | 3★2.80 | 4★3.54 | 3★2.92 | 4★3.71 | 5★4.55 | 3★3.23 | 3★2.90 | 4★3.66 | 5★4.58 | 3★2.90 | 4★4.44 | 4★3.61 | 2★2.43 | 3★2.50 | 5★4.58 | 5★4.73 |
| modifiabilitymean of duplication, unit complexity, module coupling | 4★3.62 | 4★3.75 | 3★3.33 | 4★4.39 | 3★3.00 | 3★2.98 | 4★3.51 | 3★3.45 | 5★4.73 | 4★3.52 | 3★3.40 | 4★4.15 | 5★4.79 | 3★3.17 | 4★4.25 | 3★3.19 | 3★2.99 | 2★2.13 | 4★4.47 | 5★4.57 |
| testabilitymean of unit complexity, component independence | 2★1.69 | 2★1.92 | 1★1.38 | 4★3.59 | 2★1.53 | 1★1.37 | 3★2.76 | 2★1.90 | 3★2.90 | 2★1.63 | 2★1.60 | 3★3.42 | 4★3.51 | 1★1.28 | 3★2.94 | 1★1.26 | 1★1.39 | 1★1.44 | 2★2.46 | 2★2.49 |
| modularitymean of module coupling, component independence, component entanglement | 3★3.33 | 3★3.15 | 3★2.98 | 5★4.72 | 3★2.71 | 3★3.08 | 4★4.32 | 3★3.17 | 4★3.79 | 3★3.34 | 3★3.21 | 5★4.76 | 4★3.70 | 3★3.09 | 3★2.67 | 3★3.03 | 3★2.73 | 2★2.00 | 3★3.25 | 4★3.61 |
| reusabilitymean of unit size, unit interfacing | 3★3.22 | 3★3.22 | 2★2.28 | 3★2.98 | 2★2.46 | 3★2.58 | 2★2.25 | 3★3.41 | 4★4.44 | 3★2.74 | 3★2.90 | 4★4.25 | 3★3.46 | 3★2.70 | 5★4.57 | 3★3.05 | 2★2.08 | 3★3.29 | 3★3.17 | 4★3.98 |
| properties (estimate) | ||||||||||||||||||||
| duplicationlanguages weighted by their code | 4★3.56 | 3★3.26 | 3★3.33 | 4★4.07 | 3★2.95 | 4★3.82 | 3★3.24 | 4★3.77 | 5★4.78 | 4★3.65 | 3★2.80 | 4★3.56 | 5★4.56 | 3★2.98 | 4★4.18 | 4★3.75 | 3★2.65 | 3★2.91 | 5★5.00 | 5★4.91 |
| unit sizelanguages weighted by their code | 3★3.23 | 3★3.33 | 3★2.61 | 3★3.22 | 3★2.64 | 3★3.27 | 3★2.59 | 4★3.65 | 4★4.32 | 3★2.80 | 3★3.00 | 4★3.75 | 5★4.61 | 3★2.82 | 5★4.71 | 3★3.47 | 2★2.20 | 2★2.08 | 4★4.15 | 5★4.54 |
| unit complexitylanguages weighted by their code | 2★2.28 | 3★2.76 | 2★1.63 | 4★3.79 | 2★1.98 | 2★1.65 | 2★2.16 | 3★2.68 | 5★4.67 | 2★2.25 | 2★2.12 | 3★3.44 | 5★4.78 | 2★1.50 | 5★4.72 | 1★1.43 | 2★1.61 | 2★2.01 | 4★3.76 | 4★3.66 |
| unit interfacinglanguages weighted by their code | 3★3.21 | 3★3.11 | 2★1.95 | 3★2.74 | 2★2.27 | 2★1.89 | 2★1.90 | 3★3.18 | 5★4.56 | 3★2.68 | 3★2.80 | 5★4.75 | 2★2.31 | 3★2.57 | 4★4.42 | 3★2.62 | 2★1.96 | 5★4.51 | 2★2.19 | 3★3.42 |
| module couplinglanguages weighted by their code | 5★5.01 | 5★5.21 | 5★5.04 | 5★5.31 | 4★4.07 | 3★3.48 | 5★5.12 | 4★3.89 | 5★4.75 | 5★4.65 | 5★5.28 | 5★5.45 | 5★5.05 | 5★5.02 | 4★3.84 | 4★4.41 | 5★4.72 | 1★1.48 | 5★4.65 | 5★5.14 |
| component independencelanguages weighted by their code | 1★1.09 | 1★1.08 | 1★1.14 | 3★3.38 | 1★1.09 | 1★1.09 | 3★3.35 | 1★1.13 | 1★1.12 | 1★1.02 | 1★1.09 | 3★3.41 | 2★2.24 | 1★1.05 | 1★1.15 | 1★1.10 | 1★1.18 | 1★0.88 | 1★1.15 | 1★1.32 |
| component entanglementlanguages weighted by their code | 4★3.89 | 3★3.15 | 3★2.77 | 5★5.46 | 3★2.99 | 5★4.67 | 4★4.47 | 5★4.51 | 5★5.50 | 4★4.35 | 3★3.27 | 5★5.42 | 4★3.81 | 3★3.19 | 3★3.04 | 4★3.59 | 2★2.29 | 4★3.63 | 4★3.96 | 4★4.37 |
| Maintainability checks | ||||||||||||||||||||
| php | ||||||||||||||||||||
| unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★ | 2★71.3% | 3★56.2% | 2★64.1% | 3★57.8% | 2★69.7% | 3★52.8% | 2★67.0% | 3★54.8% | 4★40.2% | 2★71.3% | 3★57.5% | 4★46.1% | 5★32.3% | 2★65.0% | 5★floored35.7% | 3★56.3% | 2★71.4% | 2★80.6% | 4★floored40.2% | 5★floored35.8% |
| unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★ | 2★35.5% | 4★22.2% | 4★23.5% | 5★floored14.9% | 3★33.2% | 5★floored14.5% | 3★31.0% | 4★floored22.6% | 5★floored4.8% | 2★35.7% | 4★floored18.9% | 5★floored12.4% | 5★11.3% | 3★28.7% | 5★floored4.3% | 5★floored16.2% | 2★42.5% | 1★55.8% | 5★floored7.4% | 5★floored7.0% |
| unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★ | 4★floored6.0% | 5★floored3.1% | 5★floored1.7% | 5★floored0.1% | 4★floored6.3% | 5★floored2.4% | 5★floored3.8% | 5★floored1.9% | 5★floored1.1% | 5★floored2.7% | 5★floored1.2% | 5★floored0.8% | 5★1.1% | 5★floored3.7% | 5★floored0.0% | 5★floored1.1% | 3★13.7% | 1★27.1% | 5★floored0.0% | 5★floored0.0% |
| unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★ | 1★44.7% | 2★29.2% | 2★34.0% | 4★floored20.0% | 1★35.1% | 1★37.1% | 2★32.5% | 3★24.8% | 5★15.6% | 2★34.2% | 2★31.6% | 3★21.0% | 5★11.5% | 1★36.4% | 5★floored10.5% | 1★40.4% | 1★44.1% | 1★45.5% | 4★19.4% | 3★21.5% |
| unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★ | 4★floored5.7% | 5★floored0.1% | 5★floored0.7% | 5★floored0.1% | 5★floored3.5% | 5★floored3.0% | 5★floored3.5% | 5★floored1.6% | 5★floored0.0% | 5★floored2.0% | 5★floored0.1% | 5★floored1.2% | 5★1.0% | 5★floored3.2% | 5★floored0.4% | 5★floored0.5% | 3★8.0% | 1★14.5% | 5★floored0.0% | 5★floored1.8% |
| unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★ | 4★floored0.6% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 4★floored0.8% | 5★floored0.5% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.3% | 1★2.9% | 5★floored0.0% | 5★floored0.0% |
| unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★ | 1★26.3% | 2★22.1% | 1★28.9% | 2★22.0% | 1★29.4% | 2★24.4% | 1★28.1% | 1★34.8% | 4★13.2% | 2★25.1% | 2★22.4% | 4★floored12.7% | 2★22.1% | 2★24.6% | 4★14.4% | 1★35.1% | 1★26.7% | 4★13.3% | 2★20.7% | 3★17.1% |
| unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★ | 3★4.3% | 2★4.9% | 1★7.8% | 2★5.1% | 1★11.5% | 4★floored3.1% | 1★9.5% | 1★12.0% | 4★2.5% | 5★floored2.2% | 4★3.0% | 5★floored2.5% | 3★4.2% | 2★6.0% | 4★floored2.8% | 1★12.4% | 1★7.8% | 4★floored2.6% | 5★floored2.3% | 5★floored1.7% |
| unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★ | 5★floored0.4% | 3★1.0% | 2★1.6% | 5★floored0.3% | 1★4.6% | 5★floored0.4% | 1★3.5% | 1★4.4% | 5★floored0.2% | 5★floored0.6% | 5★floored0.4% | 5★floored0.6% | 3★1.4% | 4★floored0.7% | 4★floored0.8% | 1★4.4% | 1★2.2% | 5★floored0.6% | 5★floored0.0% | 5★floored0.1% |
| duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★ | 4★floored5.0% | 4★floored5.0% | 3★6.9% | 4★floored4.5% | 3★8.7% | 4★5.3% | 3★7.2% | 3★7.4% | 5★floored2.1% | 3★6.7% | 3★10.5% | 4★floored3.7% | 5★2.9% | 3★9.7% | 5★floored3.4% | 4★floored5.3% | 2★12.1% | 3★8.6% | 5★floored1.8% | 5★floored1.9% |
| module coupling fan-in >105★ ≤7.4%, 4★ ≤9.7%, 3★ ≤10.7%, 2★ ≤13.0%, worse 1★ | 5★floored3.6% | 5★floored2.1% | 5★floored3.4% | 5★floored1.4% | 4★floored8.4% | 5★floored3.7% | 5★floored2.8% | 5★floored7.4% | 5★floored2.5% | 5★floored5.1% | 5★floored0.8% | 5★floored0.4% | 5★2.9% | 5★floored1.8% | 5★floored7.1% | 5★floored6.0% | 5★floored1.1% | 4★floored9.5% | 5★floored6.3% | 5★floored2.7% |
| module coupling fan-in >205★ ≤3.3%, 4★ ≤5.3%, 3★ ≤5.9%, 2★ ≤8.0%, worse 1★ | 5★floored1.5% | 5★floored0.4% | 5★floored1.3% | 5★floored0.4% | 5★floored0.3% | 5★floored3.0% | 5★floored0.2% | 5★floored3.0% | 5★floored2.5% | 5★floored2.8% | 5★floored0.5% | 5★floored0.2% | 5★1.1% | 5★floored1.1% | 4★floored4.6% | 4★floored3.5% | 5★floored1.1% | 1★9.5% | 5★floored2.0% | 5★floored0.2% |
| module coupling fan-in >505★ ≤1.2%, 4★ ≤1.8%, 3★ ≤2.3%, 2★ ≤3.8%, worse 1★ | 5★floored0.0% | 5★floored0.1% | 5★floored0.5% | 5★floored0.0% | 5★floored0.3% | 3★floored1.8% | 5★floored0.0% | 4★floored1.6% | 5★floored0.0% | 5★floored0.5% | 5★floored0.3% | 5★floored0.0% | 5★0.5% | 5★floored0.6% | 5★floored0.0% | 5★floored0.6% | 5★floored0.9% | 5★0.0% | 5★floored0.2% | 5★floored0.0% |
| component independence5★ ≥97.3%, 4★ ≥94.5%, under that <4 | <446.2% | <445.4% | <449.8% | <4floored93.8% | <446.1% | <446.3% | <4floored93.7% | <445.0% | <448.7% | <440.3% | <445.7% | <4floored94.0% | <486.2% | <443.2% | <450.3% | <446.7% | <452.8% | <429.4% | <450.5% | <464.1% |
| component entanglement (estimate, not floored)5★ ≤0.0375, 4★ ≤0.075, under that <4 | 4★0.060 | <40.102 | <40.130 | 5★0.002 | <40.113 | 5★0.031 | 4★0.039 | 4★0.038 | 5★0.000 | 4★0.043 | <40.093 | 5★0.003 | 4★0.063 | <40.098 | <40.110 | 4★0.072 | <40.181 | 4★0.070 | 4★0.058 | 4★0.042 |
| javascript | ||||||||||||||||||||
| unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★ | 5★floored33.0% | 5★floored29.2% | 3★48.9% | 5★floored35.0% | 5★floored34.3% | 5★floored17.9% | 5★floored16.0% | 3★49.3% | 5★floored21.4% | 5★floored31.9% | 4★floored38.5% | 5★floored24.6% | 5★floored19.4% | 4★floored41.0% | 5★floored21.2% | 4★floored42.3% | 5★floored26.5% | 4★38.0% | 5★floored0.0% | 5★floored18.4% |
| unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★ | 5★floored4.8% | 5★floored2.7% | 4★floored21.1% | 5★floored6.9% | 5★floored11.4% | 5★floored0.0% | 5★floored0.0% | 5★floored15.7% | 5★floored2.2% | 5★floored2.9% | 5★floored11.0% | 5★floored12.5% | 5★floored0.7% | 5★floored14.1% | 5★floored0.0% | 5★floored11.5% | 5★floored2.7% | 5★12.9% | 5★floored0.0% | 5★floored0.0% |
| unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 5★floored4.9% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored1.9% | 5★floored0.0% | 5★floored0.0% | 5★floored1.9% | 4★floored5.9% | 5★floored0.0% | 5★floored4.8% | 5★floored0.0% | 5★floored2.8% | 5★floored0.0% | 5★0.0% | 5★floored0.0% | 5★floored0.0% |
| unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★ | 4★floored18.4% | 4★19.8% | 1★39.9% | 4★floored19.3% | 4★floored18.4% | 5★floored6.7% | 5★floored1.9% | 2★29.6% | 5★floored6.1% | 4★floored17.4% | 1★41.4% | 5★floored9.6% | 5★floored6.0% | 2★31.8% | 4★floored17.5% | 1★39.8% | 4★16.3% | 4★19.0% | 5★floored0.0% | 5★floored0.0% |
| unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★ | 5★floored1.0% | 5★floored1.8% | 1★13.4% | 5★floored0.0% | 5★floored3.5% | 5★floored0.0% | 5★floored0.0% | 4★floored5.8% | 5★floored0.0% | 5★floored0.3% | 3★9.2% | 5★floored2.8% | 5★floored0.3% | 3★9.0% | 5★floored1.6% | 2★10.8% | 5★floored1.6% | 5★0.7% | 5★floored0.0% | 5★floored0.0% |
| unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 2★2.5% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 4★floored0.9% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% |
| unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★ | 5★floored5.1% | 5★floored8.5% | 5★floored9.5% | 5★floored4.5% | 5★floored6.9% | 5★floored6.4% | 5★floored3.3% | 5★floored11.0% | 5★floored2.1% | 5★floored3.4% | 5★floored11.4% | 5★floored5.1% | 5★floored4.1% | 5★floored8.6% | 4★floored12.7% | 4★floored14.2% | 5★floored7.0% | 5★floored6.0% | 5★floored0.0% | 5★floored0.0% |
| unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★ | 5★floored0.0% | 5★floored1.0% | 5★floored1.3% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.3% | 5★floored0.0% | 5★floored0.0% | 5★floored1.4% | 5★floored0.8% | 5★floored0.2% | 5★floored0.8% | 5★floored0.0% | 5★floored0.6% | 5★floored0.9% | 5★floored0.8% | 5★floored0.0% | 5★floored0.0% |
| unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.1% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% |
| duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★ | 5★floored2.2% | 5★floored1.6% | 5★floored2.8% | 5★floored2.4% | 5★floored2.5% | 5★floored1.7% | 5★floored0.0% | 5★floored2.0% | 5★floored1.3% | 5★floored0.9% | 5★floored0.9% | 5★floored1.7% | 5★floored1.6% | 5★floored2.4% | 5★floored1.6% | 5★floored2.6% | 5★floored1.0% | 5★floored3.3% | 5★floored0.0% | 5★floored2.5% |
| typescript | ||||||||||||||||||||
| unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored26.2% | not measured for this app | not measured for this app | not measured for this app | 4★floored45.3% | 5★floored18.7% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored12.4% |
| unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored7.9% | not measured for this app | not measured for this app | not measured for this app | 5★floored14.9% | 5★floored7.8% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored1.0% | not measured for this app | not measured for this app | not measured for this app | 4★floored7.6% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 2★33.5% | not measured for this app | not measured for this app | not measured for this app | 4★floored17.7% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored8.5% |
| unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 2★10.7% | not measured for this app | not measured for this app | not measured for this app | 4★floored6.0% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.3% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored8.7% | not measured for this app | not measured for this app | not measured for this app | 5★floored4.1% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored5.4% |
| unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.6% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.3% | not measured for this app | not measured for this app | not measured for this app | 5★floored3.3% | 5★floored0.6% | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | 5★floored0.0% |
| vue | ||||||||||||||||||||
| unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★ | 5★floored34.2% | 4★floored45.6% | 4★floored44.4% | 5★floored33.5% | 4★floored39.9% | 5★floored25.1% | 5★floored25.8% | 5★floored35.9% | 5★floored30.3% | 5★floored35.2% | 3★53.2% | 4★floored44.1% | 5★floored33.1% | 4★floored40.8% | 5★floored21.7% | 5★floored27.9% | 4★floored47.0% | 4★floored43.5% | not measured for this app | 5★floored34.5% |
| unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★ | 5★floored12.4% | 5★floored12.7% | 5★floored15.9% | 5★floored11.8% | 5★floored10.3% | 5★floored2.2% | 5★floored8.0% | 5★floored13.3% | 5★floored6.5% | 5★floored8.6% | 3★25.9% | 4★floored18.5% | 5★floored9.1% | 4★floored17.2% | 5★floored3.6% | 5★floored9.8% | 4★floored19.7% | 5★floored14.1% | not measured for this app | 5★floored3.2% |
| unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★ | 5★floored0.9% | 5★floored0.0% | 5★floored3.1% | 5★floored2.6% | 5★floored0.9% | 5★floored0.0% | 5★floored1.5% | 5★floored2.4% | 5★floored0.0% | 5★floored0.0% | 4★floored7.1% | 5★floored4.3% | 5★floored1.2% | 4★floored6.0% | 5★floored0.0% | 5★floored4.2% | 5★floored1.1% | 5★floored0.8% | not measured for this app | 5★floored0.0% |
| unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★ | 3★floored23.0% | 4★19.9% | 3★22.1% | 5★floored8.6% | 4★floored19.9% | 5★floored10.9% | 5★floored8.0% | 4★floored18.7% | 5★floored7.6% | 4★floored18.5% | 3★24.2% | 3★24.6% | 5★floored12.5% | 3★25.1% | 5★floored8.2% | 4★floored15.9% | 3★floored24.3% | 4★floored18.8% | not measured for this app | 5★floored15.1% |
| unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★ | 4★floored5.5% | 5★floored1.8% | 4★floored6.7% | 5★floored2.7% | 4★floored4.5% | 5★floored0.0% | 5★floored0.0% | 5★floored4.4% | 5★floored1.6% | 5★floored2.5% | 4★floored5.5% | 3★8.3% | 5★floored0.9% | 3★8.0% | 5★floored2.1% | 4★floored4.6% | 4★floored4.5% | 5★floored2.4% | not measured for this app | 5★floored1.5% |
| unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 2★1.8% | 5★floored0.0% | 4★floored0.6% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 4★floored0.8% | 5★0.0% | 1★3.4% | 5★floored0.0% | 1★3.1% | 5★floored0.0% | 5★floored0.0% | not measured for this app | 5★floored0.0% |
| unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★ | 5★floored2.2% | 5★floored0.5% | 5★floored0.5% | 5★floored0.2% | 5★floored0.4% | 5★floored0.0% | 5★floored0.5% | 5★floored0.0% | 5★floored0.0% | 5★floored0.9% | 5★floored1.2% | 5★floored0.5% | 5★floored0.7% | 5★floored0.7% | 5★floored0.7% | 5★floored0.7% | 5★floored1.2% | 5★floored0.4% | not measured for this app | 5★floored2.2% |
| unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | not measured for this app | 5★floored0.0% |
| unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★ | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | 5★floored0.0% | not measured for this app | 5★floored0.0% |
| duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★ | 3★8.1% | 2★16.9% | 3★9.2% | 4★5.1% | 2★12.6% | 4★floored3.6% | 3★9.2% | 3★9.5% | 4★floored3.8% | 4★floored5.0% | 3★10.5% | 2★13.5% | 4★4.9% | 3★9.0% | 4★floored5.3% | 3★7.1% | 3★9.1% | 2★12.2% | not measured for this app | 5★floored2.5% |
| python | ||||||||||||||||||||
| unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored5.6% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored3.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| module coupling fan-in >105★ ≤7.4%, 4★ ≤9.7%, 3★ ≤10.7%, 2★ ≤13.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| module coupling fan-in >205★ ≤3.3%, 4★ ≤5.3%, 3★ ≤5.9%, 2★ ≤8.0%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| module coupling fan-in >505★ ≤1.2%, 4★ ≤1.8%, 3★ ≤2.3%, 2★ ≤3.8%, worse 1★ | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored0.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| component independence5★ ≥97.3%, 4★ ≥94.5%, under that <4 | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored100.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★floored100.0% | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| component entanglement (estimate, not floored)5★ ≤0.0375, 4★ ≤0.075, under that <4 | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★0.000 | not measured for this app | not measured for this app | not measured for this app | not measured for this app | 5★0.000 | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app | not measured for this app |
| Other external models | ||||||||||||||||||||
| Open Source Health | ||||||||||||||||||||
| vulnerabilities above moderate4 stars: none | <414 | <46 | 4★0 | 4★0 | <42 | <414 | 4★0 | <43 | <47 | <413 | <414 | 4★0 | 4★0 | <43 | <412 | <413 | <49 | <49 | <410 | 4★0 |
| dependencies with a licence risk4 stars: no AGPL, GPL or other medium or worse, at most 3 low-risk (LGPL, EPL) | <419 | <417 | <423 | <435 | <420 | <418 | <417 | <432 | <420 | <422 | <418 | <439 | <420 | <419 | <419 | <418 | <416 | <419 | 4★0 | <416 |
| unmanaged dependencies (%)4 stars: at most 6% | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 | 4★0.0 |
| Architecture Quality | ||||||||||||||||||||
| component adjacency (estimate)4 stars: a component talks to at most 6 others on average | 4★5.0 | 4★4.7 | <47.0 | 4★3.4 | 4★4.2 | 4★5.6 | <47.1 | <46.4 | 4★2.7 | 4★5.9 | 4★5.2 | 4★3.2 | <49.1 | 4★5.5 | 4★4.2 | 4★4.8 | <47.4 | 4★3.5 | 4★4.4 | 4★3.2 |
| Our own measures | ||||||||||||||||||||
| Tests | ||||||||||||||||||||
| PHP line coverage5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★ | 2★57.4% | 2★57.7% | 2★29.7% | 3★61.4% | 3★68.2% | 3★77.6% | 3★60.6% | 2★55.8% | 3★67.7% | 2★49.5% | 3★71.2% | 3★70.7% | 2★58.9% | 2★45.4% | 3★69.2% | 3★79.7% | 2★57.7% | 1★13.0% | 3★77.5% | not measured for this app |
| spec coverage (gate 16)5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★ | 4★85.7% | 5★96.4% | 5★96.6% | 4★86.8% | 5★96.5% | 5★95.1% | 5★98.1% | 5★100.0% | 5★99.7% | 5★98.1% | 5★98.5% | 4★94.8% | 5★95.7% | 4★83.6% | 5★99.7% | 4★93.2% | 3★76.1% | 5★98.9% | 5★100.0% | 4★89.9% |
| e2e scenario coverage (gate 19)5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★ | 2★23.1% | 1★18.6% | 1★14.9% | 2★32.4% | 1★4.5% | 1★1.1% | 2★44.2% | 1★16.2% | 3★77.2% | 2★45.5% | 1★13.9% | 2★25.8% | 1★5.1% | 2★24.2% | 2★53.8% | 2★32.1% | 1★8.8% | 2★25.8% | 3★60.0% | 1★8.6% |
| test code ratio5★ ≥120%, 4★ ≥100%, 3★ ≥75%, 2★ ≥25%, worse 1★ | 3★99.9% | 4★107.8% | 5★139.3% | 4★110.8% | 3★93.5% | 4★115.5% | 4★105.2% | 5★129.1% | 5★213.9% | 4★104.4% | 3★97.9% | 5★121.5% | 5★137.4% | 3★79.8% | 3★84.5% | 3★96.4% | 3★93.5% | 2★59.1% | 5★300.6% | 5★135.4% |
| Debt | ||||||||||||||||||||
| baselined findings per kLOC PHP5★ ≤1, 4★ ≤5, 3★ ≤10, 2★ ≤25, worse 1★ | 3★5.3 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 4★4.7 | 4★4.2 | 5★0.0 | 5★0.0 | 4★2.8 | 5★0.0 | 4★1.4 | 3★5.2 | 4★1.1 | 5★0.0 | 5★0.0 | 5★0.0 | 4★3.2 | 5★0.0 | 4★3.2 |
| suppressions per kLOC5★ ≤0.5, 4★ ≤2, 3★ ≤5, 2★ ≤10, worse 1★ | 3★2.0 | 4★0.7 | 3★2.1 | 4★1.2 | 3★4.1 | 4★1.8 | 3★4.9 | 3★2.3 | 1★17.6 | 3★3.7 | 4★1.5 | 3★3.9 | 2★7.6 | 3★3.4 | 5★0.3 | 4★1.3 | 3★3.1 | 3★4.3 | 3★3.4 | 3★2.1 |
| Security | ||||||||||||||||||||
| security gate findings5★ ≤0, 4★ ≤2, 3★ ≤5, 2★ ≤15, worse 1★ | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 4★1 | 5★0 | 4★1 | 1★46 | 2★8 | 5★0 | 5★0 | 4★2 | 5★0 | 5★0 | 5★0 |
| vulnerable dependencies, high or critical5★ ≤0, 4★ ≤0, 3★ ≤2, 2★ ≤5, worse 1★ | 1★14 | 1★6 | 5★0 | 5★0 | 3★2 | 1★14 | 5★0 | 2★3 | 1★7 | 1★13 | 1★14 | 5★0 | 5★0 | 2★3 | 1★12 | 1★13 | 1★9 | 1★9 | 1★10 | 5★0 |
| unmanaged dependencies5★ ≤0%, 4★ ≤6%, 3★ ≤12%, 2★ ≤25%, worse 1★ | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% | 5★0.0% |
| Accessibility and UI | ||||||||||||||||||||
| accessibility findings per .vue file5★ ≤0, 4★ ≤0.05, 3★ ≤0.2, 2★ ≤0.5, worse 1★ | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | 5★0.0 | not measured for this app | 5★0.0 |
| UI convention findings5★ ≤0, 4★ ≤5, 3★ ≤20, 2★ ≤50, worse 1★ | 5★0 | 5★0 | 1★80 | 5★0 | 5★0 | 5★0 | 5★0 | 5★0 | 4★1 | 5★0 | 4★5 | 5★0 | 5★0 | 4★1 | 5★0 | 4★4 | 5★0 | 4★2 | 5★0 | 5★0 |
| Gates per category | ||||||||||||||||||||
| gates passing of applicable, and findings | 10/100 findings | 11/110 findings | 11/110 findings | 11/110 findings | 11/110 findings | 9/90 findings | 11/110 findings | 10/100 findings | 9/90 findings | 10/111 findings | 10/100 findings | 10/111 findings | 10/1146 findings | 9/118 findings | 9/90 findings | 11/110 findings | 8/102 findings | 10/100 findings | 9/90 findings | 6/60 findings |
| gates passing of applicable, and findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 15/150 findings | 14/140 findings | 15/150 findings |
| gates passing of applicable, and findings | 16/175 findings | 17/170 findings | 16/171 findings | 17/170 findings | 17/170 findings | 17/170 findings | 17/170 findings | 12/120 findings | 16/160 findings | 16/160 findings | 15/161 findings | 17/170 findings | 15/1612 findings | 15/162 findings | 17/170 findings | 16/171 findings | 17/170 findings | 16/160 findings | 12/120 findings | 10/100 findings |
| gates passing of applicable, and findings | 3/30 findings | 2/32 findings | 1/349 findings | 2/331 findings | 1/310 findings | 3/30 findings | 3/30 findings | 2/340 findings | 3/30 findings | 3/30 findings | 1/37 findings | 2/31 findings | 3/30 findings | 1/329 findings | 3/30 findings | 1/311 findings | 3/30 findings | 3/30 findings | 2/20 findings | 2/20 findings |
| gates passing of applicable, and findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings | 3/30 findings |
| gates passing of applicable, and findings | 2/355 findings | 2/328 findings | 2/355 findings | 2/328 findings | 2/355 findings | 2/328 findings | 2/373 findings | 2/328 findings | 2/328 findings | 2/328 findings | 2/328 findings | 2/373 findings | 2/364 findings | 2/373 findings | 2/328 findings | 2/328 findings | 2/355 findings | 2/346 findings | 2/355 findings | 3/30 findings |
| gates passing of applicable, and findings | 19/190 findings | 19/190 findings | 15/2080 findings | 19/190 findings | 19/190 findings | 17/170 findings | 19/190 findings | 18/180 findings | 19/201 findings | 19/190 findings | 16/205 findings | 19/190 findings | 19/190 findings | 19/201 findings | 18/180 findings | 18/194 findings | 19/190 findings | 17/192 findings | 13/130 findings | 2/20 findings |
| gates passing of applicable, and findings | 10/13774 findings | 11/131963 findings | 11/132946 findings | 10/12809 findings | 11/121149 findings | 9/11914 findings | 11/13351 findings | 11/12579 findings | 12/13187 findings | 11/12501 findings | 11/13568 findings | 10/13871 findings | 11/133809 findings | 9/121279 findings | 12/13279 findings | 11/13975 findings | 11/13786 findings | 11/13492 findings | 10/11276 findings | 8/9338 findings |
Levers per app
A lever is one property in one language. For each lever we move the next 1,000 lines above a bound to low risk, worst band first, and rate the app again. The gain is how far the overall rating rises, under both exponents. When fewer than 1,000 lines are left, the gain is for the lines that are left.
Lines for +0.5 is the fewest lines to fix in that language to raise the property by half a star. "Not by vue alone" means fixing every vue line is not enough, because the other languages hold the rating down.
A lever is sure when it ranks in the top 3 under both exponents. The panel shows the top 5 of each app, ordered by their two ranks together. Start with a sure lever.
buildiqestimated rating 2.82 to 3.05
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue3,873 lines above a bound | +0.057 / +0.104 | 1,823 | ✓ sure |
| duplication in php1,613 lines above a bound | +0.067 / +0.043 | 1,300 | ✓ sure |
| module coupling in php1,131 lines above a bound | +0.057 / +0.037 | 1,131 | no, not in the top 3 under both exponents |
| unit complexity in javascript1,299 lines above a bound | +0.028 / +0.053 | not by javascript alone | no, not in the top 3 under both exponents |
| duplication in vue3,589 lines above a bound | +0.032 / +0.021 | 1,664 | no, not in the top 3 under both exponents |
decidiqestimated rating 2.91 to 3.07
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in php11,274 lines above a bound | +0.041 / +0.064 | 2,049 | ✓ sure |
| duplication in php2,240 lines above a bound | +0.070 / +0.047 | 1,270 | ✓ sure |
| unit complexity in vue2,567 lines above a bound | +0.039 / +0.061 | not by vue alone | ✓ sure |
| unit complexity in javascript1,426 lines above a bound | +0.029 / +0.046 | not by javascript alone | no, not in the top 3 under both exponents |
| module coupling in php932 lines above a bound | +0.038 / +0.027only 932 lines left | 932 | no, not in the top 3 under both exponents |
dossiqestimated rating 2.34 to 2.59
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue2,537 lines above a bound | +0.025 / +0.048 | not by vue alone | ✓ sure |
| unit complexity in php49,525 lines above a bound | +0.014 / +0.027 | 5,799 | ✓ sure |
| duplication in php11,832 lines above a bound | +0.012 / +0.007 | 3,825 | no, not in the top 3 under both exponents |
| unit size in javascript5,389 lines above a bound | +0.010 / +0.008 | not by javascript alone | no, not in the top 3 under both exponents |
| duplication in vue2,988 lines above a bound | +0.012 / +0.007 | not by vue alone | no, not in the top 3 under both exponents |
filinqestimated rating 3.76 to 3.86
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| component independence in php3,730 lines above a bound | +0.080 / +0.071 | 1,033 | ✓ sure |
| duplication in php2,719 lines above a bound | +0.064 / +0.058 | 1,406 | ✓ sure |
| duplication in vue1,344 lines above a bound | +0.059 / +0.053 | not by vue alone | ✓ sure |
| unit complexity in php10,066 lines above a bound | +0.053 / +0.049 | 1,577 | no, not in the top 3 under both exponents |
| unit interfacing in php11,045 lines above a bound | +0.020 / +0.031 | 2,089 | no, not in the top 3 under both exponents |
hermiqestimated rating 2.36 to 2.50
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue1,823 lines above a bound | +0.031 / +0.050 | not by vue alone | ✓ sure |
| module coupling in php4,734 lines above a bound | +0.072 / +0.047 | 837 | ✓ sure |
| unit complexity in php17,224 lines above a bound | +0.030 / +0.048 | 2,379 | ✓ sure |
| duplication in php4,943 lines above a bound | +0.029 / +0.019 | 2,151 | no, not in the top 3 under both exponents |
| unit complexity in javascript750 lines above a bound | +0.017 / +0.027only 750 lines left | not by javascript alone | no, not in the top 3 under both exponents |
humaniqestimated rating 2.43 to 2.71
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| module coupling in php1,618 lines above a bound | +0.238 / +0.135 | 132 | ✓ sure |
| duplication in php2,379 lines above a bound | +0.130 / +0.067 | 609 | ✓ sure |
| unit interfacing in php9,493 lines above a bound | +0.032 / +0.027 | 1,580 | no, not in the top 3 under both exponents |
| unit size in php20,505 lines above a bound | +0.033 / +0.022 | 2,835 | no, not in the top 3 under both exponents |
| unit complexity in php14,413 lines above a bound | +0.007 / +0.016 | 2,291 | no, not in the top 3 under both exponents |
integriqestimated rating 3.00 to 3.15
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| component independence in php6,821 lines above a bound | +0.032 / +0.028 | 1,925 | ✓ sure |
| unit complexity in php29,627 lines above a bound | +0.024 / +0.023 | 3,529 | ✓ sure |
| duplication in php7,838 lines above a bound | +0.019 / +0.018 | 2,683 | ✓ sure |
| duplication in vue2,589 lines above a bound | +0.019 / +0.018 | not by vue alone | no, not in the top 3 under both exponents |
| unit size in php61,040 lines above a bound | +0.009 / +0.013 | 8,797 | no, not in the top 3 under both exponents |
keepiqestimated rating 2.95 to 3.13
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| module coupling in php3,248 lines above a bound | +0.124 / +0.094 | 134 | ✓ sure |
| unit complexity in typescript4,932 lines above a bound | +0.032 / +0.054 | 2,398 | ✓ sure |
| unit complexity in javascript3,999 lines above a bound | +0.032 / +0.054 | 2,945 | no, not in the top 3 under both exponents |
| duplication in php3,312 lines above a bound | +0.034 / +0.023 | 1,779 | no, not in the top 3 under both exponents |
| unit complexity in php9,190 lines above a bound | +0.032 / +0.054 | 2,302 | no, not in the top 3 under both exponents |
larpinqestimated rating 3.95 to 4.08
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in php1,019 lines above a bound | +0.117 / +0.154 | 711 | ✓ sure |
| module coupling in php192 lines above a bound | +0.100 / +0.086only 192 lines left | 129 | ✓ sure |
| unit size in php2,634 lines above a bound | +0.096 / +0.072 | 1,063 | ✓ sure |
| unit interfacing in php867 lines above a bound | +0.091 / +0.067only 867 lines left | 400 | no, not in the top 3 under both exponents |
| duplication in php166 lines above a bound | +0.059 / +0.042only 166 lines left | not by php alone | no, not in the top 3 under both exponents |
launchpadestimated rating 2.67 to 2.89
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| duplication in vue1,271 lines above a bound | +0.080 / +0.050 | 1,044 | ✓ sure |
| unit complexity in php11,194 lines above a bound | +0.053 / +0.092 | 1,574 | no, not in the top 3 under both exponents |
| duplication in php2,583 lines above a bound | +0.079 / +0.049 | 1,045 | no, not in the top 3 under both exponents |
| unit complexity in vue1,671 lines above a bound | +0.036 / +0.064 | not by vue alone | no, not in the top 3 under both exponents |
| module coupling in php1,921 lines above a bound | +0.070 / +0.041 | 923 | no, not in the top 3 under both exponents |
learniqestimated rating 2.61 to 2.80
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue3,632 lines above a bound | +0.038 / +0.068 | 3,568 | ✓ sure |
| unit complexity in php17,491 lines above a bound | +0.033 / +0.057 | 2,569 | ✓ sure |
| unit complexity in javascript1,645 lines above a bound | +0.027 / +0.048 | not by javascript alone | no, not in the top 3 under both exponents |
| module coupling in php551 lines above a bound | +0.029 / +0.018only 551 lines left | 551 | no, not in the top 3 under both exponents |
| duplication in php7,093 lines above a bound | +0.024 / +0.017 | 3,380 | no, not in the top 3 under both exponents |
opencatalogiestimated rating 3.99 to 4.05
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| component independence in php1,792 lines above a bound | +0.188 / +0.189 | 487 | ✓ sure |
| unit complexity in php5,276 lines above a bound | +0.086 / +0.099 | 966 | ✓ sure |
| unit complexity in vue2,369 lines above a bound | +0.069 / +0.080 | 1,517 | no, not in the top 3 under both exponents |
| duplication in php1,105 lines above a bound | +0.074 / +0.078 | not by php alone | no, not in the top 3 under both exponents |
| unit size in php11,577 lines above a bound | +0.043 / +0.044 | 2,308 | no, not in the top 3 under both exponents |
openregisterestimated rating 3.94 to 4.01
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| module coupling in php11,153 lines above a bound | +0.013 / +0.012 | 11,153 | ✓ sure |
| duplication in vue3,722 lines above a bound | +0.015 / +0.010 | not by vue alone | ✓ sure |
| duplication in php11,495 lines above a bound | +0.010 / +0.007 | 8,576 | ✓ sure |
| unit interfacing in php71,365 lines above a bound | +0.004 / +0.005 | 12,838 | no, not in the top 3 under both exponents |
| component independence in php54,159 lines above a bound | +0.004 / +0.005 | 16,315 | no, not in the top 3 under both exponents |
pipelinqestimated rating 2.34 to 2.63
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue5,340 lines above a bound | +0.065 / +0.133 | 1,633 | ✓ sure |
| unit complexity in javascript2,161 lines above a bound | +0.023 / +0.050 | not by javascript alone | ✓ sure |
| module coupling in php1,774 lines above a bound | +0.050 / +0.027 | 1,774 | ✓ sure |
| duplication in php9,585 lines above a bound | +0.015 / +0.009 | 4,555 | no, not in the top 3 under both exponents |
| unit size in vue8,699 lines above a bound | +0.015 / +0.010 | not by vue alone | no, not in the top 3 under both exponents |
planninqestimated rating 3.59 to 3.77
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| module coupling in php934 lines above a bound | +0.222 / +0.252only 934 lines left | 133 | ✓ sure |
| duplication in vue1,051 lines above a bound | +0.145 / +0.093 | 501 | ✓ sure |
| unit complexity in javascript889 lines above a bound | +0.050 / +0.058only 889 lines left | not by javascript alone | no, not in the top 3 under both exponents |
| duplication in php457 lines above a bound | +0.055 / +0.036only 457 lines left | not by php alone | no, not in the top 3 under both exponents |
| unit interfacing in php1,628 lines above a bound | +0.060 / +0.035 | 714 | no, not in the top 3 under both exponents |
portaliqestimated rating 2.45 to 2.83
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue2,295 lines above a bound | +0.093 / +0.209 | 388 | ✓ sure |
| module coupling in php3,723 lines above a bound | +0.067 / +0.040 | 996 | ✓ sure |
| duplication in php3,327 lines above a bound | +0.049 / +0.024 | 1,991 | ✓ sure |
| duplication in vue3,751 lines above a bound | +0.027 / +0.014 | 2,232 | no, not in the top 3 under both exponents |
| unit interfacing in javascript2,930 lines above a bound | +0.020 / +0.012 | not by javascript alone | no, not in the top 3 under both exponents |
shillinqestimated rating 2.16 to 2.32
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| module coupling in php1,457 lines above a bound | +0.085 / +0.047 | 781 | ✓ sure |
| unit complexity in vue2,827 lines above a bound | +0.022 / +0.036 | not by vue alone | ✓ sure |
| unit size in vue5,477 lines above a bound | +0.013 / +0.012 | not by vue alone | no, not in the top 3 under both exponents |
| duplication in vue2,860 lines above a bound | +0.015 / +0.010 | not by vue alone | no, not in the top 3 under both exponents |
| unit complexity in javascript740 lines above a bound | +0.006 / +0.011only 740 lines left | not by javascript alone | no, not in the top 3 under both exponents |
stackiqestimated rating 2.11 to 2.27
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in vue1,563 lines above a bound | +0.031 / +0.051 | not by vue alone | ✓ sure |
| module coupling in php4,315 lines above a bound | +0.047 / +0.048 | 1,141 | ✓ sure |
| duplication in php3,923 lines above a bound | +0.031 / +0.025 | 1,862 | no, not in the top 3 under both exponents |
| unit complexity in javascript1,072 lines above a bound | +0.028 / +0.046 | not by javascript alone | no, not in the top 3 under both exponents |
| duplication in vue4,019 lines above a bound | +0.028 / +0.022 | 2,432 | no, not in the top 3 under both exponents |
thematiqestimated rating 3.40 to 3.59
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in php4,026 lines above a bound | +0.136 / +0.171 | 509 | ✓ sure |
| unit interfacing in php4,297 lines above a bound | +0.114 / +0.114 | 617 | ✓ sure |
| unit size in php8,340 lines above a bound | +0.074 / +0.061 | 1,978 | no, not in the top 3 under both exponents |
| duplication in php452 lines above a bound | +0.083 / +0.045only 452 lines left | 452 | no, not in the top 3 under both exponents |
| module coupling in php1,539 lines above a bound | +0.073 / +0.059 | 908 | no, not in the top 3 under both exponents |
versioniqestimated rating 3.68 to 3.88
| lever | gain from the next 1,000 lines, p = 1 / p = -1 | lines for +0.5 | sure |
|---|---|---|---|
| unit complexity in php1,899 lines above a bound | +0.192 / +0.268 | 299 | ✓ sure |
| unit interfacing in php1,512 lines above a bound | +0.167 / +0.121 | 164 | ✓ sure |
| module coupling in php281 lines above a bound | +0.048 / +0.040only 281 lines left | 281 | no, not in the top 3 under both exponents |
| unit size in php3,155 lines above a bound | +0.049 / +0.035 | 2,031 | no, not in the top 3 under both exponents |
| duplication in php203 lines above a bound | +0.055 / +0.034only 203 lines left | not by php alone | no, not in the top 3 under both exponents |
What we add beyond the external models
The external models rate maintainability, security, open source health and architecture. They do not rate tests, debt hidden in baselines, or accessibility. These are our own measures, with the reason we add each one and the basis of its bands.
| measure | why we add it | basis of the bands |
|---|---|---|
| PHP line coverage | The external models rate no tests. Coverage shows how much of the code a unit or integration test runs. | Heitlager, Kuipers and Visser 2007: unit test coverage ++ 95-100%, + 80-95%, o 60-80%, - 20-60%, -- 0-20% |
| spec coverage (gate 16) | Share of in-scope methods that name the spec they implement, so a change can be traced to a requirement. | our choice: Heitlager's coverage bands applied to traceability |
| e2e scenario coverage (gate 19) | Share of non-excluded spec scenarios a running Playwright test cites: the behaviour a user sees is proven. | our choice: Heitlager's coverage bands applied to spec scenarios |
| test code ratio | The external test volume figure (test LOC / production LOC), shown there without stars. | external assessment: a 100% test code ratio is roughly 80% coverage, so Heitlager's 95/80/60/20% coverage bands become 120/100/75/25% test code |
| baselined findings per kLOC PHP | psalm, phpstan and phpmd baselines hide findings from the gates. Each entry is debt a reviewer no longer sees. | our own bands; no published benchmark |
| suppressions per kLOC | Inline @psalm-suppress, @phpstan-ignore, @SuppressWarnings, phpcs:ignore and eslint-disable silence a tool where an external assessment still counts the code. | our own bands; no published benchmark |
| security gate findings | Gates 5-9, 11, 30, 48, 50, 82, 97 and 121 find missing auth, IDOR and fail-open checks that SAST tools do not know about Nextcloud. | our own bands; 0 is the only passing state of each gate |
| vulnerable dependencies, high or critical | composer audit and npm audit on the lockfiles; the external Open Source Health model rates the same CVEs. | Open Source Health guidance: 4 stars means no vulnerability above moderate; 5 stars also no moderate |
| unmanaged dependencies | Third-party code committed into the repository (minified or vendored files) gets no security updates. | Open Source Health guidance: 4 stars at most 6% unmanaged; 3 and 2 stars double that |
| accessibility findings per .vue file | The external models have no accessibility model. Gates 12 and 31-45 check WCAG 2.2 AA rules in the source. | our own bands; WCAG 2.2 AA asks for none |
| UI convention findings | The UI gates keep every app on the shared nextcloud-vue patterns, so users meet one interface. | our own bands; 0 is the only passing state of each gate |
Spec coverage counts the methods gate 16 holds in scope, with and without an
@spec tag. E2e coverage is gate 19's report over the scenarios that are not
excluded. PHP coverage is the statement coverage in the newest clover report
CI kept for the app: from development if there is one, otherwise from the
newest run on another branch. The tooltip names the branch, commit and date. CI
keeps these reports 14 days. Without a readable report the cell falls back to the
coverage-guard floor in .coverage-baseline, says stale with the date that
floor last changed, and the run prints a warning. The
vulnerable dependency count treats a Composer advisory without a severity as
high, because nothing shows it is lower.
The gate rows come from a full-scope run of every gate on development.
Floors and ratchets per app
Besides the maintainability floor, each app keeps its own floors and baselines on
development. A baseline lists debt that may stay, so a lower count is
better. A coverage floor is a minimum, so a higher value is better. A ·
means the app has no such file. Hover a cell for the file it came from.
| floor | buildiqd6f56351 | decidiq3a356e7e | dossiq9622acd9 | filinqab6c1ebb | hermiq1fad8992 | humaniq5589f3ab | integriqcd844692 | keepiqee758777 | larpinq5ad762be | launchpad3e7bf07b | learniq4d971c74 | opencatalogi7a191dbb | openregister061df3ec | pipelinqe4d420d4 | planninq19c35bed | portaliq795da17b | shillinqf1e580b0 | stackiq9ad6a74f | thematiq3a5ccb20 | versioniqab0f16d6 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| maintainability floor (gate 123)4-star checks the app must keep | 27 | 24 | 19 | 40 | 25 | 29 | 26 | 46 | 29 | 28 | 22 | 39 | 43 | 21 | 32 | 24 | 32 | 17 | 21 | 41 |
| procedure code (gate 119)procedure-named classes allowed | 0 | 0 | 166 | 1 | 0 | 0 | 10 | 0 | 0 | 0 | 0 | 27 | 0 | 3 | 0 | 0 | 10 | 0 | 0 | 0 |
| PHP coverage (coverage-guard)line coverage the PHP suite may not drop below | 57.39% | 57.66% | 29.69% | 61.41% | 68.25% | 77.60% | 60.65% | 55.79% | 67.68% | 49.47% | 71.16% | 70.69% | 58.88% | 45.36% | 69.15% | 79.70% | 57.71% | 13.01% | 77.48% | none |
| test coverage ratchetsuite coverage per runner, raised on every gain | vitest 64.72% | phpunit 52.25% / vitest 1.62% | phpunit 22.48% / vitest 1.03% | phpunit 46.68% / vitest 4.24% | none | none | vitest 2.34% | phpunit 57.59% / vitest 18.31% | phpunit 57.34% / vitest 8.48% | none | none | phpunit 82.39% / vitest 1.59% | phpunit 54.55% | none | none | none | phpunit 55.42% / vitest 0.37% | phpunit 0.38% | phpunit 11.37% / vitest 66.25% | none |
| debt ratchetsuppressions and ignores counted by check:debt-ratchet | none | none | 862 | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none |
| eslint suppressionssuppressed eslint violations | 123 | 182 | 151 | 137 | 160 | none | 162 | 110 | none | 0 | 47 | 559 | 706 | none | none | 0 | 121 | 414 | none | none |
| phpstan baselineignored phpstan errors, all baseline files | 2 | 1 | none | 0 | 2 | 6 | 62 | none | 0 | none | none | 0 | 1342 | 79 | 0 | 0 | 0 | 141 | none | none |
| psalm baselinebaselined psalm issues | none | none | none | 0 | 0 | 4 | none | none | none | none | none | 0 | 92 | none | none | 0 | none | none | none | 34 |
| phpmd baselinebaselined phpmd violations | 170 | none | none | none | none | 199 | 388 | none | none | 106 | none | 43 | 480 | 26 | none | none | none | 6 | none | none |
| schema l10n baselineuntranslated schema strings allowed | 396 | 1590 | 0 | 213 | 0 | 0 | 0 | 0 | 84 | 15 | 1935 | 219 | 569 | 0 | 123 | 0 | 12169 | 479 | none | none |
| .reuse-baseline.jsonother floor-like file | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none | present | none | none | none | none |
| l10n/.l10n-parity-baseline.jsonother floor-like file | none | none | none | none | none | none | none | none | none | none | present | none | none | none | none | none | none | none | none | none |
| tests/nav-reachability-baseline.jsonother floor-like file | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none | none | present | none | none | none |
Refresh the data
The matrix reads one JSON file in website/src/data/. One generator in
website/scripts/ writes it. Its docstring gives the exact commands.
-
Clone each app's
developmentbranch into one directory, named after the app. -
Run gate 122 in report mode on each clone. It writes one JSON report per app.
-
Run all gates at full scope on each clone. The runner writes
gates.jsoninto its log directory:HYDRA_GATE_LOG_DIR=<gates-dir>/<app> bash hydra-gates/scripts/run-hydra-gates.sh --full <clones>/<app> -
Run the generator from the repository root. It runs
composer auditandnpm auditon the lockfiles and reads the CI coverage reports withgh api, so it needs the network and a logged-ingh. -
Commit the new data file.
The generator takes the rating estimate and the star bands from gate 122 and the own bands from
website/scripts/quality_measures.py. A change to either shows up in the
matrix on the next refresh.
Back to app health.