Open-Source Subscription Billing & Payments Platform
This report summarizes scanner evidence for killbill/killbill, a Java project with 5,834 GitHub stars. SynthScan examined 327,411 lines of code across 2007 source files, recording 100 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 64 finding(s).
Are imports declared and package/API names verified? 36 finding(s).
Are wrappers, guards, and repeated structures necessary? 2 finding(s).
Which changes need focused human review? 100 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 100 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | …ll/billing/util/nodes/DefaultKillbillNodesService.java | 158 | final String kbVersion = org.killbill.billing.util.nodes.KillbillVersions.getKillbillVersion(); | CODE |
| CRITICAL⚡ | …ll/billing/util/nodes/DefaultKillbillNodesService.java | 159 | final String kbApiVersion = org.killbill.billing.util.nodes.KillbillVersions.getApiVersion(); | CODE |
| CRITICAL⚡ | …ll/billing/util/nodes/DefaultKillbillNodesService.java | 160 | final String kbPluginApiVersion = org.killbill.billing.util.nodes.KillbillVersions.getPluginApiVersion(); | CODE |
| CRITICAL⚡ | …ll/billing/util/nodes/DefaultKillbillNodesService.java | 161 | final String kbPlatformVersion = org.killbill.billing.util.nodes.KillbillVersions.getPlatformVersion(); | CODE |
| CRITICAL⚡ | …ll/billing/util/nodes/DefaultKillbillNodesService.java | 162 | final String kbCommonVersion = org.killbill.billing.util.nodes.KillbillVersions.getCommonVersion(); | CODE |
| CRITICAL | …illbill/billing/jaxrs/TestPaymentPluginProperties.java | 276 | expectProperties.add(new org.killbill.billing.payment.api.PluginProperty(key, value, false)); | CODE |
| CRITICAL | …illbill/billing/jaxrs/TestPaymentPluginProperties.java | 281 | expectProperties.add(new org.killbill.billing.payment.api.PluginProperty(key, value, false)); | CODE |
| CRITICAL | …killbill/billing/server/listeners/CleanupListener.java | 46 | com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkedShutdown(); | CODE |
| CRITICAL | profiles/killpay/src/main/webapp/lib/swagger-ui.min.js | 8 | return this.then(void 0,e)},p.progress=F,m.prototype.progress=function(e){return this.then(void 0,void 0,e)},p.fin=p["fi | CODE |
| CRITICAL | …/killbill/billing/jaxrs/resources/AccountResource.java | 156 | @io.swagger.v3.oas.annotations.tags.Tag(name = "Account", description = "Operations on accounts") | CODE |
| CRITICAL | …/org/killbill/billing/jaxrs/resources/TagResource.java | 74 | @io.swagger.v3.oas.annotations.tags.Tag(name = "Tag", description = "Operations on tags") | CODE |
| CRITICAL | …bill/billing/jaxrs/resources/SubscriptionResource.java | 128 | @io.swagger.v3.oas.annotations.tags.Tag(name = "Subscription", description = "Operations on subscriptions") | CODE |
| CRITICAL | …rg/killbill/billing/jaxrs/resources/AdminResource.java | 109 | @io.swagger.v3.oas.annotations.tags.Tag(name = "Admin", description = "Admin operations (will require special privileges | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …src/test/resources/org/killbill/billing/util/shiro.ini | 1 | ################################################################################### | COMMENT |
| LOW | …illing/junction/plumbing/billing/DisabledDuration.java | 81 | return result; | COMMENT |
| LOW | …bscription/api/user/TestSubscriptionBillingEvents.java | 41 | import org.testng.annotations.Test; | COMMENT |
| LOW | …/beatrix/integration/TestIntegrationParentInvoice.java | 521 | // issue a $10 adj when invoice is unpaid | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 141 | // Step 4: Block billing retroactively from the subscription start date. | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 281 | // Tracking 4-5 fall on/after Jun 16 → billed under volt-recurring-high ($3.00/unit) | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 341 | clock.setDay(new LocalDate(2026, 7, 1)); | COMMENT |
| LOW | …OverdueStateSkipWithShiftingEarliestUnpaidInvoice.java | 201 | // check ran rather than from the anchor, which would have given 06-02 + 5 = 06-07. | COMMENT |
| LOW | api/src/main/java/org/killbill/billing/util/UUIDs.java | 101 | # the traditional system/thread activity algorithm will be used. | COMMENT |
| LOW | …c/test/resources/org/killbill/billing/server/shiro.ini | 1 | ################################################################################### | COMMENT |
| LOW | …/test/resources/org/killbill/billing/server/plugin.yml | 1 | ############################################################################################ | COMMENT |
| LOW | …/test/java/org/killbill/billing/jaxrs/TestInvoice.java | 121 | final String htmlInvoice = invoiceApi.getInvoiceAsHTML(invoiceJson.getInvoiceId(), requestOptions); | COMMENT |
| LOW | …/test/java/org/killbill/billing/jaxrs/TestInvoice.java | 141 | // " <tr class=\"top\">\r\n" + | COMMENT |
| LOW | …/test/java/org/killbill/billing/jaxrs/TestInvoice.java | 161 | // " <td>\r\n" + | COMMENT |
| LOW | …/test/java/org/killbill/billing/jaxrs/TestInvoice.java | 181 | // " <td>invoiceItemDescription</td>\r\n" + | COMMENT |
| LOW | profiles/killbill/src/main/resources/shiro.ini | 1 | ################################################################################### | COMMENT |
| LOW | profiles/killpay/src/main/webapp/lib/shred.bundle.js | 1161 | var http = request.scheme == "http" ? HTTP : HTTPS; | COMMENT |
| LOW | profiles/killpay/src/main/webapp/lib/shred.bundle.js | 2121 | // header. | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 101 | // ---------------------------------------------------------------------------------- | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 121 | // Kill Bill declare via @Produces(APPLICATION_JSON) — even though they return no body. | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 141 | // generated return type — e.g., BlockingState[] or String). A side-effect is that | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 161 | "addAccountBlockingState", | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 521 | // map (void operations returning 204, bodyless PUTs/DELETEs). | COMMENT |
| LOW | …/killbill/billing/jaxrs/resources/SwaggerResource.java | 561 | // is empty after conversion. Codegen uses consumes to set Content-Type header. | COMMENT |
| LOW | …g/killbill/billing/jaxrs/resources/ExportResource.java | 81 | @GET | COMMENT |
| LOW | …rg/killbill/billing/jaxrs/resources/AdminResource.java | 161 | // Response hierarchy (EntityTag, Link, MediaType, NewCookie, StatusType, UriBuilder), | COMMENT |
| LOW | …org/killbill/billing/jaxrs/resources/TestResource.java | 81 | import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; | COMMENT |
| LOW | …ill/billing/jaxrs/resources/KillBillApiDefinition.java | 81 | } | COMMENT |
| LOW | …ill/billing/jaxrs/resources/KillBillApiDefinition.java | 121 | // the inline schema is set explicitly in decorateOperation above) | COMMENT |
| LOW | …nerator/TestFixedAndRecurringInvoiceItemGenerator.java | 1441 | COMMENT | |
| LOW | …va/org/killbill/billing/invoice/tree/NodeInterval.java | 141 | // Note that it does not matter what happens with newNode#end, and whether it even spans multiple ch | COMMENT |
| LOW | …org/killbill/billing/invoice/usage/UsageClockUtil.java | 21 | import org.joda.time.DateTimeZone; | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …bill/billing/tenant/api/TestInvoiceBrandingLoader.java | 56 | final CompanyInfo companyInfo = new CompanyInfo("Kill Bill", "123 Main St", "Palo Alto, CA", "USA", "https://kil | CODE |
| LOW | …/billing/tenant/api/user/TestDefaultTenantUserApi.java | 152 | "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenea | CODE |
| LOW | …/billing/tenant/api/user/TestDefaultTenantUserApi.java | 152 | "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenea | CODE |
| LOW⚡ | …/test/resources/org/killbill/billing/util/ddl_test.sql | 127 | dummy_id varchar(36) NOT NULL, | CODE |
| LOW⚡ | …/test/resources/org/killbill/billing/util/ddl_test.sql | 129 | PRIMARY KEY(dummy_id) | CODE |
| LOW⚡ | …/test/resources/org/killbill/billing/util/ddl_test.sql | 135 | dummy_id varchar(36) NOT NULL, | CODE |
| LOW | …l/billing/util/globallocker/TestMysqlGlobalLocker.java | 45 | conn.execute("insert into dummy2 (dummy_id) values ('" + UUID.randomUUID().toString() + "')"); | CODE |
| LOW | …ment/core/TestPaymentMethodProcessorRefreshWithDB.java | 53 | final Account account = testHelper.createTestAccount("foo@bar.com", true); | CODE |
| LOW | …ing/payment/core/TestPaymentMethodProcessorWithDB.java | 41 | final Account account = testHelper.createTestAccount("foo@bar.com", true); | CODE |
| LOW | …ing/payment/core/TestPaymentMethodProcessorWithDB.java | 52 | final Account account = testHelper.createTestAccount("foo@bar.com", true); | CODE |
| LOW | …ing/payment/core/TestPaymentMethodProcessorWithDB.java | 65 | final Account account = testHelper.createTestAccount("foo@bar.com", true); | CODE |
| LOW⚡ | …a/org/killbill/billing/payment/api/TestPaymentApi.java | 918 | final String paymentExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligu | CODE |
| LOW⚡ | …a/org/killbill/billing/payment/api/TestPaymentApi.java | 918 | final String paymentExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligu | CODE |
| LOW⚡ | …a/org/killbill/billing/payment/api/TestPaymentApi.java | 919 | final String transactionExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo | CODE |
| LOW⚡ | …a/org/killbill/billing/payment/api/TestPaymentApi.java | 919 | final String transactionExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo | CODE |
| LOW | profiles/killbill/src/main/webapp/lib/swagger-ui.js | 1 | !function(root,factory){"object"==typeof exports&&"object"==typeof module?module.exports=factory(require("react"),requir | CODE |
| LOW | …ll/src/main/webapp/lib/swagger-ui-standalone-preset.js | 13 | var r=n(225),i=n(360),o=n(169);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()<e) | CODE |
| LOW | profiles/killpay/src/main/webapp/lib/swagger-ui.min.js | 9 | "click .submit":"submitOperation","click .response_hider":"hideResponse","click .toggleOperation":"toggleOperationConten | CODE |
| LOW | profiles/killpay/src/main/webapp/lib/jsoneditor.min.js | 8 | });else if(window.ace){var d=this.input_type;("cpp"===d||"c++"===d||"c"===d)&&(d="c_cpp"),this.ace_container=document.cr | CODE |
| LOW | …illing/account/api/user/TestDefaultAccountUserApi.java | 496 | accountModelDao.setExternalKey("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula | CODE |
| LOW | …illing/account/api/user/TestDefaultAccountUserApi.java | 496 | accountModelDao.setExternalKey("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula | CODE |
| LOW | …illing/entitlement/api/TestDefaultSubscriptionApi.java | 725 | final String externalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget | CODE |
| LOW | …illing/entitlement/api/TestDefaultSubscriptionApi.java | 725 | final String externalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 134 | // Step 3: Advance clock to 2026-06-18 (plan-change day). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 141 | // Step 4: Block billing retroactively from the subscription start date. | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 178 | // Step 6: Advance clock to 2026-06-28 (end of first billing period). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 185 | // Step 7: Unblock billing from the same date (subscription start date). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 293 | // Step 3: Advance clock to 2026-06-16 (plan-change day). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 300 | // Step 4: Block billing retroactively from the subscription start date. | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 337 | // Step 6: Advance clock to 2026-07-01 (billing date). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 345 | // Step 7: Unblock billing from the subscription start date (2026-06-01). | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 97 | // Step 1: Create account (BCD=28) and subscription on volt-usage-low | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 119 | // Step 2: Record 6 usage points spread across the billing period | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 164 | // Step 5: Change plan to volt-usage-high on 2026-06-18. | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 252 | // Step 1: Create account (BCD=1) and subscription on volt-recurring-low. | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 278 | // Step 2: Record usage data across the billing period (Jun 1 → Jul 1, BCD=1). | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 324 | // Step 5: Change plan to volt-recurring-high on 2026-06-16. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 134 | // Step 3: Advance clock to 2026-06-18 (plan-change day). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 141 | // Step 4: Block billing retroactively from the subscription start date. | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 178 | // Step 6: Advance clock to 2026-06-28 (end of first billing period). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 185 | // Step 7: Unblock billing from the same date (subscription start date). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 293 | // Step 3: Advance clock to 2026-06-16 (plan-change day). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 300 | // Step 4: Block billing retroactively from the subscription start date. | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 337 | // Step 6: Advance clock to 2026-07-01 (billing date). | COMMENT |
| LOW⚡ | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 345 | // Step 7: Unblock billing from the subscription start date (2026-06-01). | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 97 | // Step 1: Create account (BCD=28) and subscription on volt-usage-low | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 119 | // Step 2: Record 6 usage points spread across the billing period | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 164 | // Step 5: Change plan to volt-usage-high on 2026-06-18. | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 252 | // Step 1: Create account (BCD=1) and subscription on volt-recurring-low. | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 278 | // Step 2: Record usage data across the billing period (Jun 1 → Jul 1, BCD=1). | COMMENT |
| LOW | …atrix/integration/usage/TestUsageUpgradeWithBlock.java | 324 | // Step 5: Change plan to volt-recurring-high on 2026-06-16. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …va/org/killbill/billing/jaxrs/TestPluginIssue2205.java | 157 | // path to keep the assertion robust. | COMMENT |
| LOW | …ll/src/main/webapp/lib/swagger-ui-standalone-preset.js | 13 | var r=n(225),i=n(360),o=n(169);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()<e) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/ec2-launcher.rb | 120 | def terminate_all_running_instances(wait_for_completion) | CODE |
| LOW | bin/ec2-launcher.rb | 155 | def upload_file_to_running_instances(src, dest) | CODE |