Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ jobs:
- name: Run adapter tests
run: make adapter-test

- name: Validate spike contracts
run: make spike-validate
- name: Validate captured evidence
run: make evidence-validate

java-lint:
name: Java lint gate
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: test package adapter-test adapter-package java-lint java-lint-report java-lint-test manual-analysis spike-validate framework-enrichment semantic-facts-spike fixture-test fixture-package spring-test download-jdtls jdtls-probe sootup-quarkus sootup-quarkus-full sootup-spring sootup-fsi codeql-quarkus codeql-spring codeql-fsi normalize-static-analysis
.PHONY: test package adapter-test adapter-package java-lint java-lint-report java-lint-test manual-analysis evidence-validate framework-enrichment semantic-facts-spike fixture-test fixture-package spring-test download-jdtls jdtls-probe sootup-quarkus sootup-quarkus-full sootup-spring sootup-fsi codeql-quarkus codeql-spring codeql-fsi normalize-static-analysis

adapter-test test:
MAVEN_BIN="$$(bash spike/scripts/bootstrap-maven.sh)" && "$${MAVEN_BIN}" -B -ntp test -f pom.xml
Expand Down Expand Up @@ -33,7 +33,7 @@ java-lint-report:
"$${MAVEN_BIN}" -B -ntp pmd:pmd pmd:cpd -f pom.xml && \
"$${MAVEN_BIN}" -B -ntp org.projectlightpath:java-lint-maven-plugin:0.1.0:validate -DjavaLint.enforce=false -f pom.xml

spike-validate:
evidence-validate:
python3 spike/scripts/validate_spike.py

framework-enrichment:
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ make test
make package
```

The `Adapter tests` CI lane runs `make adapter-test` and `make spike-validate`
The `Adapter tests` CI lane runs `make adapter-test` and `make evidence-validate`
on pull requests and pushes to `main`. The separate `Java lint` CI lane runs
the enforced production-quality gate with `make java-lint` and uploads the
PMD/CPD reports as workflow artifacts, including when the gate fails.

See [`docs/flpath-5002-java-adapter.md`](docs/flpath-5002-java-adapter.md) for
the implementation boundary.
the implementation boundary and pre-release Java API versioning policy.

Run the enforced Java quality gate with:

Expand All @@ -53,10 +53,10 @@ matrices, contracts, analyzer probes, scripts, and portable normalized results.
The readiness report is in
[`docs/flpath-5000-java-readiness.md`](docs/flpath-5000-java-readiness.md).

Validate the checked-in spike evidence with:
Validate the checked-in evidence contracts with:

```sh
make spike-validate
make evidence-validate
```

The Spring Boot baseline remains external and is not vendored. The ignored
Expand Down
101 changes: 67 additions & 34 deletions config/java-lint-baseline.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"capturedOn": "2026-11-11",
"capturedOn": "2026-11-12",
"cpd": {
"findings": [],
"minimumTokens": 100,
Expand Down Expand Up @@ -46,8 +46,8 @@
"class": "BoundedFrameworkModel",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/BoundedFrameworkModel.java",
"fingerprint": "76b77b164603c48a5b79a8bb6b310dd1885088aac4d3512da35f5424b0dacee9",
"message": "Possible God Class (WMC=367, ATFD=59, TCC=6.816%)",
"fingerprint": "3eb67caa04e30dc4b4d3f1a951d4a705f1c6bfc94f8d74d0ab03c7f7dee3db5d",
"message": "Possible God Class (WMC=368, ATFD=60, TCC=6.646%)",
"method": "",
"rationale": "Reviewed maintainability baseline: framework enrichment intentionally centralizes route, injection, proxy, generated-source, and lifecycle policy; decomposition is future work and the behavior is covered by adapter tests.",
"rule": "GodClass",
Expand All @@ -57,8 +57,8 @@
"class": "BoundedFrameworkModel",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/BoundedFrameworkModel.java",
"fingerprint": "4a15360d0a2967fbbe5c1072b2c4c5a1f4906f339f80fc25fe27517793203e77",
"message": "The class 'BoundedFrameworkModel' has a total cyclomatic complexity of 367 (highest 23).",
"fingerprint": "4f27384fd3f5ae8c59d7611df3a84aed0afdb35c224c4d7202e961ddcb7d6bd8",
"message": "The class 'BoundedFrameworkModel' has a total cyclomatic complexity of 368 (highest 23).",
"method": "",
"rationale": "Reviewed maintainability baseline: framework enrichment intentionally centralizes route, injection, proxy, generated-source, and lifecycle policy; decomposition is future work and the behavior is covered by adapter tests.",
"rule": "CyclomaticComplexity",
Expand Down Expand Up @@ -141,17 +141,6 @@
"rule": "NPathComplexity",
"variable": ""
},
{
"class": "BoundedFrameworkModel",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/BoundedFrameworkModel.java",
"fingerprint": "5b64fdc4e97135fa514decb19272c193d0589e5abb82c3e622ab18c473ec833d",
"message": "The method 'springLifecycleFacts(AnalysisContext, SourceMetadataScanner)' has a cognitive complexity of 20, current threshold is 20",
"method": "springLifecycleFacts",
"rationale": "Reviewed maintainability baseline: framework enrichment intentionally centralizes route, injection, proxy, generated-source, and lifecycle policy; decomposition is future work and the behavior is covered by adapter tests.",
"rule": "CognitiveComplexity",
"variable": ""
},
{
"class": "ManualAnalysisMain",
"classification": "intentional",
Expand Down Expand Up @@ -189,8 +178,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "282d5663e603a62b9f9cd8e1f68a01b46cbab6d1ed5fce6c47c7c1716dd0d407",
"message": "Possible God Class (WMC=1,378, ATFD=75, TCC=0.054%)",
"fingerprint": "9ea40331a2cb034c62173741f52bfd5c4ccd5556f2f5a6da50fdf1ceb14ab915",
"message": "Possible God Class (WMC=1,506, ATFD=90, TCC=0.049%)",
"method": "",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "GodClass",
Expand All @@ -200,8 +189,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "1fb90fabdb5aa8026d897b714924fe3328ec3b0986904373aab219379d3b65ee",
"message": "The class 'SourceMetadataScanner' has a NCSS line count of 2616 (Highest = 68).",
"fingerprint": "d795a7d0072edb1c2a0cbad0e71c0b7f402ea9dc1b39aa25a6e1a711b8489b91",
"message": "The class 'SourceMetadataScanner' has a NCSS line count of 2861 (Highest = 68).",
"method": "",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "NcssCount",
Expand All @@ -211,8 +200,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "d72bdb252b636c1c4f9ad4ed1e6c987c81019219862bf16c31a4213f1a232536",
"message": "The class 'SourceMetadataScanner' has a total cyclomatic complexity of 1378 (highest 37).",
"fingerprint": "8a6cd91bba3f2e931bc8bb8ae8e4deb0d9daa1b8983cd6b4e07b5654a3aedb4f",
"message": "The class 'SourceMetadataScanner' has a total cyclomatic complexity of 1506 (highest 37).",
"method": "",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CyclomaticComplexity",
Expand All @@ -222,8 +211,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "056fd2ebdb9bd1b8f2a590a9f2a51b5f226944c297972d581f8314d34504fdb7",
"message": "The method 'routes(Framework)' has a cognitive complexity of 95, current threshold is 20",
"fingerprint": "9c74f4e47948351ce815051c1e309c97cc2bf86b09968d7d0b0f6efa421ab9b1",
"message": "The method 'routes(Framework)' has a cognitive complexity of 96, current threshold is 20",
"method": "routes",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CognitiveComplexity",
Expand All @@ -244,8 +233,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "eb46135d37209826fa01fa79274ab80d9a61c9728308ff50308a554446af3ee8",
"message": "The method 'routes(Framework)' has an NPath complexity of 6648642, current threshold is 300",
"fingerprint": "b57a8abe64701a056707019999a6e4af63d6a0849f72627fadc659c75e59c159",
"message": "The method 'routes(Framework)' has an NPath complexity of 13297283, current threshold is 300",
"method": "routes",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "NPathComplexity",
Expand Down Expand Up @@ -607,8 +596,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "56ab896a60381fd41d7acc9874dd9a917cb9b11b88ace228eb2dce05cde31b11",
"message": "The method 'httpMethods(String, String)' has a cyclomatic complexity of 18.",
"fingerprint": "392cdb5839ea8c3b93fb6563495a87900591daaab436e68f314485d16c5a3e07",
"message": "The method 'httpMethods(SourceFile, String, String)' has a cyclomatic complexity of 18.",
"method": "httpMethods",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CyclomaticComplexity",
Expand All @@ -618,8 +607,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "93f77831d91235771cfbc8299f46429a76615354390ae0f6b6a2bc20cce6ae21",
"message": "The method 'typeHeader(SourceFile)' has a cyclomatic complexity of 15.",
"fingerprint": "77601f3b5f568ad6a7629e8ca4cb3201edd78b31606ac767e94fa0b7fb565f36",
"message": "The method 'typeHeader(SourceFile, String)' has a cyclomatic complexity of 17.",
"method": "typeHeader",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CyclomaticComplexity",
Expand All @@ -640,8 +629,8 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "a5c6eeff1738a6792f5a087f216a3a49954d80e086fd44aea60d53b758192001",
"message": "The method 'qualifierNames(String)' has a cognitive complexity of 33, current threshold is 20",
"fingerprint": "afdbcd3a0fd3f8b4f9db768da99799f5dc5c8b5a5a4d936233a1c0837e9664e9",
"message": "The method 'qualifierNames(SourceFile, String)' has a cognitive complexity of 36, current threshold is 20",
"method": "qualifierNames",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CognitiveComplexity",
Expand All @@ -651,13 +640,24 @@
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "08be2bbc27f357b5512b3c47b7feffa8f5d3c3cb47d05fcaddee2d6add55d2d3",
"message": "The method 'qualifierNames(String)' has a cyclomatic complexity of 17.",
"fingerprint": "3a500e26a12b851259b171dcfddd11ed4ce71b67150dd1a0616ec347d0885b08",
"message": "The method 'qualifierNames(SourceFile, String)' has a cyclomatic complexity of 20.",
"method": "qualifierNames",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "CyclomaticComplexity",
"variable": ""
},
{
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "6e9c975e57f810d09e842a2b08be5bcc1442e5c925a64b23b5de0d25e0ab153c",
"message": "The method 'qualifierNames(SourceFile, String)' has an NPath complexity of 890, current threshold is 300",
"method": "qualifierNames",
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "NPathComplexity",
"variable": ""
},
{
"class": "SourceMetadataScanner",
"classification": "maintainability",
Expand Down Expand Up @@ -756,6 +756,39 @@
"rationale": "Reviewed maintainability baseline: the scanner is an intentionally source-backed Java parser with stateful comment, literal, delimiter, type, route, injection, and dynamic-feature handling; broad extraction risks parser regressions and is tracked separately.",
"rule": "NPathComplexity",
"variable": ""
},
{
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "23df838dee3ab6913395bce5b1dcbfeccbeb17d6a3f5b5e8c09ded1a68f1e2f1",
"message": "The method 'beanCandidates(Framework)' has a cognitive complexity of 53, current threshold is 20",
"method": "beanCandidates",
"rationale": "Reviewed maintainability baseline for FLPATH-5077: repository-interface classification now preserves annotated Spring Data candidates while the existing scanner intentionally centralizes bounded source parsing; focused repository and lifecycle regressions cover the behavior.",
"rule": "CognitiveComplexity",
"variable": ""
},
{
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "c2619061c39dc23e1c7ab277ae4ffbf1569ccfee8e3c2b8ac4bc709cf5b09474",
"message": "The method 'beanCandidates(Framework)' has a cyclomatic complexity of 20.",
"method": "beanCandidates",
"rationale": "Reviewed maintainability baseline for FLPATH-5077: repository-interface classification now preserves annotated Spring Data candidates while the existing scanner intentionally centralizes bounded source parsing; focused repository and lifecycle regressions cover the behavior.",
"rule": "CyclomaticComplexity",
"variable": ""
},
{
"class": "SourceMetadataScanner",
"classification": "maintainability",
"file": "src/main/java/com/projectlightpath/analysis/java/SourceMetadataScanner.java",
"fingerprint": "1441640aa465d43ad537ae3b003ca11fe39af1a0aeb906c3222bba978d51af44",
"message": "The method 'beanCandidates(Framework)' has an NPath complexity of 203743, current threshold is 300",
"method": "beanCandidates",
"rationale": "Reviewed maintainability baseline for FLPATH-5077: repository-interface classification now preserves annotated Spring Data candidates while the existing scanner intentionally centralizes bounded source parsing; focused repository and lifecycle regressions cover the behavior.",
"rule": "NPathComplexity",
"variable": ""
}
],
"minimumPriority": 3,
Expand Down
23 changes: 23 additions & 0 deletions docs/flpath-5002-java-adapter.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,29 @@ a unique non-abstained provider target identity. Links use
`enriches_without_replacing`, preserving separate provider and framework fact
sets.

## Java API versioning

The Maven module is currently `0.1.0-SNAPSHOT` and has no production release.
The public Java API, including `SemanticCallFacts`, `Fact.FrameworkInput`, and
`RunMetadata`, is therefore pre-release and has no source or binary backwards-
compatibility guarantee. Breaking API changes are allowed before the first
production release when the adapter tests and handoff evidence are updated in
the same change.

This policy covers the intentional FLPATH-5076 API change:

- positional `Fact.framework(...)` arguments were replaced by the named
`Fact.FrameworkInput` value;
- public positional `RunMetadata` constructors were replaced by
`RunMetadata.from(AnalysisContext, AnalysisGraph)`; and
- run metadata now derives immutable source-root information from the analysis
context and provider graph.

No japicmp or Revapi comparison is configured because there is no released
artifact to use as a compatibility baseline. Before the first production
release, publish a stable version and add a dedicated compatibility policy and
check if downstream Java consumers require source or binary compatibility.

Route scanning expands literal class/method path arrays, HTTP method arrays, and
Spring header/parameter/media conditions. Quarkus routes require a class-level
`@Path`; method-level `@Path` narrows that root and an unregistered method-only
Expand Down
Loading
Loading