Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b1b5fca
test: verify OTLP multi-span export contract
ChoMinGi Jul 20, 2026
cb1c5d3
test(starter): validate OpenAI executor boundary
ChoMinGi Jul 20, 2026
d38dd9d
docs: clarify LangChain4j executor boundary
ChoMinGi Jul 20, 2026
05d1141
feat(core): track standalone export diagnostics
ChoMinGi Jul 20, 2026
64720fe
feat(starter): expose Langfuse Actuator signals
ChoMinGi Jul 20, 2026
93a8de3
docs: document operational diagnostics
ChoMinGi Jul 20, 2026
151d889
build: enforce module coverage baselines
ChoMinGi Jul 21, 2026
0a786f9
docs: record coverage gates
ChoMinGi Jul 21, 2026
f700ae2
build: record packaged implementation version
ChoMinGi Jul 22, 2026
280b241
fix(starter): restore auto-configuration factory API
ChoMinGi Jul 22, 2026
bf59548
fix(starter): select filters by web application type
ChoMinGi Jul 22, 2026
ebd2b46
fix(core): enforce scoped span lifecycle
ChoMinGi Jul 22, 2026
b5f13e5
docs: define manual span lifecycle contract
ChoMinGi Jul 22, 2026
e3cfa0e
build(deps): align Spring Boot 3 runtime baseline
ChoMinGi Jul 23, 2026
94c047f
build: enforce dependency convergence
ChoMinGi Jul 23, 2026
99d7587
build(examples): align supported dependency versions
ChoMinGi Jul 23, 2026
033d958
ci: test supported Spring AI compatibility lines
ChoMinGi Jul 23, 2026
aad381d
docs: define the Boot 3 compatibility boundary
ChoMinGi Jul 23, 2026
05b6ff3
build(examples): enforce dependency convergence
ChoMinGi Jul 23, 2026
bf9fdf5
ci: add quality and supply chain gates
ChoMinGi Jul 23, 2026
f9a8b30
fix(ci): skip coverage checks for artifact installs
ChoMinGi Jul 23, 2026
4a8f77a
build: enforce public API compatibility
ChoMinGi Jul 23, 2026
10596f1
build(deps): upgrade OpenTelemetry to 1.62.0
ChoMinGi Jul 23, 2026
45807ff
fix(starter): enforce Spring AI embedding contracts
ChoMinGi Jul 23, 2026
f8eb557
docs(api): complete public API documentation
ChoMinGi Jul 23, 2026
0a98347
docs: simplify public project guidance
ChoMinGi Jul 23, 2026
71227ae
ci: enable dependency security updates
ChoMinGi Jul 23, 2026
eae6afc
fix(core): use JDK OTLP transport
ChoMinGi Jul 23, 2026
89e7068
test: cover prompt consumer classpath
ChoMinGi Jul 23, 2026
78c7479
docs: clarify production setup
ChoMinGi Jul 23, 2026
f975615
chore: improve bug report context
ChoMinGi Jul 23, 2026
cd8c801
ci: use Node 24 action runtimes
ChoMinGi Jul 23, 2026
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
28 changes: 27 additions & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,16 @@ body:
1. Configure with...
2. Call...
3. Observe...
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected behavior
placeholder: What you expected to happen.
validations:
required: true

- type: dropdown
id: module
Expand All @@ -40,13 +44,17 @@ body:
id: version
attributes:
label: Library version
placeholder: "0.1.0"
placeholder: "0.1.1 or commit SHA"
validations:
required: true

- type: input
id: java-version
attributes:
label: Java version
placeholder: "17"
validations:
required: true

- type: dropdown
id: framework
Expand All @@ -57,3 +65,21 @@ body:
- LangChain4j
- None (standalone)
- Other
validations:
required: true

- type: input
id: framework-versions
attributes:
label: Framework versions
description: Include Spring Boot and Spring AI or LangChain4j versions, or enter "n/a".
placeholder: "Spring Boot 3.5.16, Spring AI 1.1.8"
validations:
required: true

- type: textarea
id: diagnostics
attributes:
label: Relevant configuration and logs
description: Remove API keys, credentials, model content, and other sensitive data.
render: shell
14 changes: 14 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
version: 2

updates:
- package-ecosystem: maven
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 0

- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 3
17 changes: 5 additions & 12 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
## Summary
## What changed

<!-- What does this PR do and why? -->

## Changes

-

## Testing

<!-- How did you verify this works? -->

## Checklist

- [ ] Compiles without errors (`mvn compile`)
- [ ] All unit tests pass (`mvn test`)
- [ ] New functionality has test coverage
- [ ] Core module stays Java 11 compatible
- [ ] No hardcoded API keys or secrets
- [ ] Tracing wrappers handle setup failures gracefully (no app-breaking exceptions)
- [ ] Streaming instrumentation uses raw `Span` without `makeCurrent()` (see DESIGN.md #13)
- [ ] `./mvnw -B -ntp clean verify` passes
- [ ] Tests cover the changed behavior
- [ ] Public API or user-facing behavior is documented
- [ ] No credentials or captured model data are included
51 changes: 29 additions & 22 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,20 @@ concurrency:
cancel-in-progress: true

jobs:
quality:
name: quality and supply chain
uses: ./.github/workflows/quality.yml

verify:
name: verify (Java 17, package + Javadoc)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Set up Java 17
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: 17
Expand All @@ -32,18 +36,25 @@ jobs:
- name: Clean verify
run: ./mvnw -B -ntp clean verify

- name: Verify coverage artifacts
run: |
test -s langfuse-otel-core/target/jacoco.exec
test -s langfuse-otel-core/target/site/jacoco/jacoco.xml
test -s langfuse-otel-spring-boot-starter/target/jacoco.exec
test -s langfuse-otel-spring-boot-starter/target/site/jacoco/jacoco.xml

core:
runs-on: ubuntu-latest
strategy:
matrix:
java: [11, 17, 21]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Set up Java ${{ matrix.java }}
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: ${{ matrix.java }}
Expand All @@ -58,12 +69,12 @@ jobs:
fail-fast: false
matrix:
include:
# Baseline: minimum supported versions
# Baseline: minimum supported, security-patched versions
- java: 17
spring-ai-version: '1.0.0'
spring-ai-version: '1.0.9'
langchain4j-version: '1.0.0'
- java: 21
spring-ai-version: '1.0.0'
spring-ai-version: '1.0.9'
langchain4j-version: '1.0.0'
# Latest stable releases on the Spring AI 1.x line and LangChain4j
- java: 17
Expand All @@ -72,21 +83,14 @@ jobs:
- java: 21
spring-ai-version: '1.1.8'
langchain4j-version: '1.18.0'
# Current stable releases
- java: 17
spring-ai-version: '2.0.0'
langchain4j-version: '1.18.0'
- java: 21
spring-ai-version: '2.0.0'
langchain4j-version: '1.18.0'
name: starter (java-${{ matrix.java }}, spring-ai-${{ matrix.spring-ai-version }}, lc4j-${{ matrix.langchain4j-version }})
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Set up Java ${{ matrix.java }}
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: ${{ matrix.java }}
Expand All @@ -104,31 +108,34 @@ jobs:
runs-on: ubuntu-latest
needs: [verify]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Set up Java 17
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: 17
cache: maven

- name: Install snapshot artifacts
run: ./mvnw -B -ntp -DskipTests install
run: ./mvnw -B -ntp -DskipTests -Djacoco.skip=true install

- name: Compile Spring AI consumer
run: ./mvnw -B -ntp -f examples/spring-ai-example/pom.xml -DskipTests verify

- name: Compile LangChain4j consumer
run: ./mvnw -B -ntp -f examples/langchain4j-example/pom.xml -DskipTests verify

- name: Verify core and prompt client compatibility
run: ./mvnw -B -ntp -f consumer-tests/core-prompt-consumer/pom.xml verify

integration-status:
name: live export smoke status (explicit opt-in)
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: [verify, core, starter, consumer-smoke]
needs: [quality, verify, core, starter, consumer-smoke]
outputs:
enabled: ${{ steps.configuration.outputs.enabled }}
env:
Expand Down Expand Up @@ -186,12 +193,12 @@ jobs:
LANGFUSE_HOST: ${{ secrets.LANGFUSE_HOST }}
LANGFUSE_TEST_PROMPT_NAME: ${{ secrets.LANGFUSE_TEST_PROMPT_NAME }}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Set up Java 17
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: 17
Expand Down
101 changes: 101 additions & 0 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Quality and supply chain

on:
workflow_call:
inputs:
checkout_ref:
description: Commit or ref to audit
required: false
type: string
workflow_dispatch:
schedule:
- cron: '17 2 * * 1'

permissions:
contents: read

concurrency:
group: quality-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
quality:
name: static analysis, licenses, SBOM, vulnerabilities
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
ref: ${{ inputs.checkout_ref || github.sha }}
persist-credentials: false

- name: Set up Java 17
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: temurin
java-version: 17
cache: maven

- name: Build quality evidence
run: >-
./mvnw -B -ntp -Pquality
-DskipTests
-Djacoco.skip=true
-Dmaven.javadoc.skip=true
clean verify

- name: Validate quality evidence
shell: bash
run: |
set -euo pipefail

test -s target/bom.json
test -s target/generated-sources/license/THIRD-PARTY.txt
test -s langfuse-otel-core/target/spotbugsXml.xml
test -s langfuse-otel-spring-boot-starter/target/spotbugsXml.xml

jq -e '
.bomFormat == "CycloneDX"
and .specVersion == "1.6"
and .metadata.component.type == "library"
and ((.components // []) | length > 0)
and ((.dependencies // []) | length > 0)
' target/bom.json > /dev/null

- name: Audit all dependency vulnerabilities
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: sbom
scan-ref: target/bom.json
scanners: vuln
format: json
output: target/trivy-vulnerabilities.json
exit-code: '0'
severity: UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL
list-all-pkgs: true
hide-progress: true
timeout: 10m
version: v0.72.0

- name: Reject high and critical dependency vulnerabilities
run: |
jq -e '
[
.Results[]?.Vulnerabilities[]?
| select(.Severity == "HIGH" or .Severity == "CRITICAL")
]
| length == 0
' target/trivy-vulnerabilities.json > /dev/null

- name: Retain quality evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: quality-evidence-${{ github.run_id }}-${{ github.run_attempt }}
path: |
target/bom.json
target/generated-sources/license/THIRD-PARTY.txt
target/trivy-vulnerabilities.json
langfuse-otel-core/target/spotbugsXml.xml
langfuse-otel-spring-boot-starter/target/spotbugsXml.xml
if-no-files-found: warn
retention-days: 14
Loading