This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-mcp.git
The following commit(s) were added to refs/heads/main by this push:
new 2a91dbb docs: correct claims that do not match the code (#178)
2a91dbb is described below
commit 2a91dbb633debbe9f9cb2717ac5f74a25042c4a7
Author: Aditya Parikh <[email protected]>
AuthorDate: Tue Aug 18 17:16:09 2026 -0400
docs: correct claims that do not match the code (#178)
Each item below was checked against the repository, not just reworded.
Wrong symbols and paths:
- CollectionService lives in collection/, not metadata/ (AGENTS.md,
ARCHITECTURE.md).
- DEVELOPMENT.md named @McpToolParameter; the annotation is @McpToolParam.
- DEVELOPMENT.md had the document-creator roles inverted: formats implement
SolrDocumentCreator and register with the IndexingDocumentCreator.
- .github/workflows/publish-mcp.yml does not exist; the MCP Registry is
published by the publish-mcp-registry job in release-publish.yml.
- The observability test README documented InMemorySpanExporter and
ObservabilityTestConfiguration.java, neither of which exists anywhere
except that README. The tests use SimpleTracer from
micrometer-tracing-test via OpenTelemetryTestConfiguration.
- ARCHITECTURE.md listed a test tree of *DirectTest files that do not exist,
described record DTOs as POJOs, and still listed implemented OAuth2
support under Future Considerations.
- FAQ.md claimed 27 tools; there are 11. It also said every tool returns the
same record while naming two different ones.
Commands that do not work as written:
- TROUBLESHOOTING.md piped STDIO logs with 2>&1, merging diagnostics into
the stdout JSON-RPC stream, and called `gradlew clean --no-build-cache` a
cache purge.
- ATR_TESTING_GUIDE.md ran `ls -lh build/distributions/` after cd-ing into
that directory, and referenced trstringer/manual-approval@v1 - ASF's
Actions allow-list matches by exact SHA, so a mutable tag fails at
startup.
- DEPLOYMENT.md showed an unauthenticated curl of /actuator/info; only
/actuator/health is permitAll.
- DOCKER_PUBLISHING.md passed registry credentials via -Djib.to.auth.*,
putting tokens in the process argument list.
- WORKFLOWS.md advertised a pull_request trigger build-and-publish.yml does
not have - it publishes images, so it must not run on PRs - and described
signing without noting that publication is not gated on it.
- init-solr.sh declared "add-field" twice in one JSON object; the duplicate
key silently won, so the "name" field was never created.
- get-auth0-token.sh sourced .env, executing whatever it contained. Parse
only AUTH0_* assignments instead.
- benchmark-native.sh guarded against premature exit with
`docker inspect >/dev/null`, which also succeeds for an exited container;
check .State.Running. Added -i, without which the stdio profile hits EOF
on stdin and exits immediately.
Stale statements and data:
- docs/security/stdio.md described the trust boundary as the direct parent
process; a descriptor can be inherited or passed on.
- DEVELOPMENT.md called `books` a collection with sample data; init-solr.sh
creates it but the download and post are commented out, so it is empty.
- .run/SolrMcpServerHttp.run.xml shipped a contributor's real Auth0 tenant
URL.
- mydata/devnexus-2026.json carried Atlanta local times with a Z suffix. The
conference runs 4-6 March 2026, before the 8 March DST switch, so all 116
records are UTC-5; converted to real UTC instants, keeping the Z that
Solr's date parsing requires. ConferenceEndToEndIntegrationTest, which
indexes this file, still passes.
Not applied: the correction to docs/specs/graalvm-native-image.md, since
that file was pruned from main by #156.
Signed-off-by: Aditya Parikh <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
---
.run/SolrMcpServerHttp.run.xml | 4 +-
AGENTS.md | 2 +-
dev-docs/ARCHITECTURE.md | 37 +++-
dev-docs/ATR_TESTING_GUIDE.md | 9 +-
dev-docs/DEPLOYMENT.md | 12 +-
dev-docs/DEVELOPMENT.md | 13 +-
dev-docs/DOCKER_PUBLISHING.md | 10 +-
dev-docs/TROUBLESHOOTING.md | 12 +-
dev-docs/WORKFLOWS.md | 14 +-
docs/FAQ.md | 8 +-
docs/security/stdio.md | 4 +-
init-solr.sh | 27 ++-
mydata/devnexus-2026.json | 232 ++++++++++-----------
scripts/benchmark-native.sh | 11 +-
scripts/get-auth0-token.sh | 20 +-
.../apache/solr/mcp/server/observability/README.md | 17 +-
16 files changed, 247 insertions(+), 185 deletions(-)
diff --git a/.run/SolrMcpServerHttp.run.xml b/.run/SolrMcpServerHttp.run.xml
index e4ff6c4..a174b10 100644
--- a/.run/SolrMcpServerHttp.run.xml
+++ b/.run/SolrMcpServerHttp.run.xml
@@ -3,7 +3,9 @@
factoryName="Spring Boot">
<option name="ACTIVE_PROFILES" value="http"/>
<envs>
- <env name="OAUTH2_ISSUER_URI"
value="https://dev-qa6ay6y8fhsk7m7l.us.auth0.com/"/>
+ <!-- Placeholder: point this at your own issuer before running.
+ Do not commit a contributor-specific tenant URL. -->
+ <env name="OAUTH2_ISSUER_URI"
value="https://YOUR_TENANT.us.auth0.com/"/>
</envs>
<module name="solr-mcp.main"/>
<option name="SPRING_BOOT_MAIN_CLASS"
value="org.apache.solr.mcp.server.Main"/>
diff --git a/AGENTS.md b/AGENTS.md
index 65b039b..7d7ce52 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -100,7 +100,7 @@ Four service classes expose MCP tools via `@McpTool`
annotations:
- **SearchService** (`search/`) - Full-text search with filtering, faceting,
sorting, pagination
- **IndexingService** (`indexing/`) - Document indexing supporting JSON, CSV,
XML formats
-- **CollectionService** (`metadata/`) - List collections, get stats, health
checks
+- **CollectionService** (`collection/`) - List collections, get stats, health
checks
- **SchemaService** (`schema/`) - Schema introspection and additive
modification (add-fields, add-field-types)
### Document Creators (Strategy Pattern)
diff --git a/dev-docs/ARCHITECTURE.md b/dev-docs/ARCHITECTURE.md
index f379d77..5d5739f 100644
--- a/dev-docs/ARCHITECTURE.md
+++ b/dev-docs/ARCHITECTURE.md
@@ -25,7 +25,7 @@ src/main/java/org/apache/solr/mcp/server/
│ ├── SolrDocumentCreator.java # Common interface for document
creators
│ ├── FieldNameSanitizer.java # Field name sanitization utility
│ └── DocumentProcessingException.java # Indexing exceptions
-└── metadata/ # Collection management functionality
+└── collection/ # Collection management functionality
├── CollectionService.java # MCP tools for collection operations
├── SchemaService.java # MCP tool for schema retrieval
├── CollectionUtils.java # Collection utility methods
@@ -61,11 +61,12 @@ Strategy pattern implementation for parsing different
document formats:
### DTOs
-Plain Java classes (POJOs) used as data transfer objects:
+Java `record` types used as data transfer objects:
-- No Lombok dependency; simple, explicit types
+- No Lombok dependency; the record declaration is the whole definition
- Designed for straightforward serialization/deserialization
-- Favor clarity; immutability can be introduced where it adds value
+- Records are immutable by construction, so the response types handed to
+ MCP clients cannot be mutated after they are built
## Design Decisions
@@ -132,24 +133,38 @@ The document creator pattern allows for:
### Test Structure
```
src/test/java/org/apache/solr/mcp/server/
+├── MainTest.java # Application bootstrap
├── McpToolRegistrationTest.java # MCP tool registration tests
+├── McpClientIntegrationTest.java # MCP workflow over the in-process
client
+├── McpClientStdioIntegrationTest.java # MCP workflow against `java -jar` over
STDIO
├── BuildInfoReader.java # Test utility for build metadata
├── SampleClient.java # Example MCP client
├── search/
-│ ├── SearchServiceTest.java # Unit tests
-│ └── SearchServiceDirectTest.java # Integration tests
+│ ├── SearchServiceTest.java # Unit tests
+│ └── SearchServiceIntegrationTest.java # Testcontainers
├── indexing/
│ ├── IndexingServiceTest.java
-│ ├── IndexingServiceDirectTest.java
+│ ├── IndexingServiceIntegrationTest.java
│ ├── CsvIndexingTest.java
│ └── XmlIndexingTest.java
-├── metadata/
+├── collection/
│ ├── CollectionServiceTest.java
+│ ├── CollectionUtilsTest.java
│ ├── CollectionServiceIntegrationTest.java
+│ └── ConferenceEndToEndIntegrationTest.java
+├── schema/
│ ├── SchemaServiceTest.java
│ └── SchemaServiceIntegrationTest.java
-└── containerization/
+├── config/
+│ ├── JsonResponseParserTest.java
+│ ├── SolrConfigUrlNormalizationTest.java
+│ └── SolrConfigIntegrationTest.java
+├── observability/
+│ ├── DistributedTracingTest.java
+│ └── OtlpExportIntegrationTest.java
+└── containerization/ # @Tag("docker-integration") only
├── DockerImageStdioIntegrationTest.java
+ ├── DockerImageMcpClientStdioIntegrationTest.java
└── DockerImageHttpIntegrationTest.java
```
@@ -179,9 +194,9 @@ All dependencies are managed via Gradle version catalogs in
`gradle/libs.version
### Potential Enhancements
1. **Authentication & Authorization**
- - OAuth2 support for HTTP mode
- - Token-based authentication
- Role-based access control
+ (OAuth2 resource-server support and bearer-token authentication for HTTP
+ mode are already implemented — see `security/HttpSecurityConfiguration`.)
2. **Additional Tools**
- Bulk operations
diff --git a/dev-docs/ATR_TESTING_GUIDE.md b/dev-docs/ATR_TESTING_GUIDE.md
index 95499a2..4f14d87 100644
--- a/dev-docs/ATR_TESTING_GUIDE.md
+++ b/dev-docs/ATR_TESTING_GUIDE.md
@@ -127,8 +127,8 @@ cd build/distributions
sha512sum solr-mcp-0.0.1-test-rc1-src.tar.gz >
solr-mcp-0.0.1-test-rc1-src.tar.gz.sha512
sha256sum solr-mcp-0.0.1-test-rc1-src.tar.gz >
solr-mcp-0.0.1-test-rc1-src.tar.gz.sha256
-# 4. Verify artifacts
-ls -lh build/distributions/
+# 4. Verify artifacts (still inside build/distributions from the cd above)
+ls -lh
sha512sum -c solr-mcp-0.0.1-test-rc1-src.tar.gz.sha512
```
@@ -332,7 +332,10 @@ jobs:
steps:
- name: Request PMC verification
- uses: trstringer/manual-approval@v1
+ # ASF's Actions allow-list matches third-party actions by exact
+ # commit SHA, not by tag - a mutable @v1 ref makes the workflow
+ # fail at startup. Pin the reviewed SHA before using this.
+ uses: trstringer/manual-approval@<reviewed-commit-sha> # v1
with:
approvers: apache-pmc-members # Replace with actual PMC
GitHub team
minimum-approvals: 1
diff --git a/dev-docs/DEPLOYMENT.md b/dev-docs/DEPLOYMENT.md
index 629cb04..f5148e9 100644
--- a/dev-docs/DEPLOYMENT.md
+++ b/dev-docs/DEPLOYMENT.md
@@ -173,7 +173,7 @@ docker run -i --rm \
### Workflows
- `.github/workflows/build-and-publish.yml` — Build, test, and publish Docker
images
-- `.github/workflows/publish-mcp.yml` — Publish to the Model Context Protocol
Registry on version tags
+- `.github/workflows/release-publish.yml` — the `publish-mcp-registry` job
publishes to the Model Context Protocol Registry after a release vote passes
### Docker image publishing
@@ -194,7 +194,7 @@ To publish images, use Jib from your local machine or set
up your own workflow:
### MCP Registry Publishing
-`.github/workflows/publish-mcp.yml` publishes to the Model Context Protocol
Registry.
+The `publish-mcp-registry` job in `.github/workflows/release-publish.yml`
publishes to the Model Context Protocol Registry.
**Triggers:**
- Version tags (e.g., `v0.1.0`)
@@ -412,8 +412,12 @@ The server exposes Spring Boot Actuator endpoints:
# Health check
curl http://localhost:8080/actuator/health
-# Build info
-curl http://localhost:8080/actuator/info
+# Build info. Only /actuator/health is anonymous; every other actuator
+# endpoint requires authentication when HTTP security is enabled (the default),
+# so pass a bearer token:
+curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/actuator/info
+
+# ...or run with HTTP_SECURITY_ENABLED=false for a local unsecured setup.
```
### Docker Health Check
diff --git a/dev-docs/DEVELOPMENT.md b/dev-docs/DEVELOPMENT.md
index d3c945a..c11def4 100644
--- a/dev-docs/DEVELOPMENT.md
+++ b/dev-docs/DEVELOPMENT.md
@@ -102,8 +102,9 @@ docker compose up -d
```
This starts a Solr instance in SolrCloud mode with ZooKeeper and creates two
sample collections:
-- `books` - Collection with sample book data
-- `films` - Collection with sample film data
+- `books` - Created empty. The books.csv download and post are commented out in
+ `init-solr.sh`, so use it as a scratch collection or uncomment those lines.
+- `films` - Collection populated with Solr's sample film data
### Run the Server
@@ -438,7 +439,7 @@ Standard debugging works normally:
description = "What this tool does"
)
public String myTool(
- @McpToolParameter(description = "Parameter description")
+ @McpToolParam(description = "Parameter description")
String param
) {
// Implementation
@@ -449,8 +450,8 @@ Standard debugging works normally:
### Adding a New Document Format
-1. Create a new class implementing `IndexingDocumentCreator`
-2. Register in `SolrDocumentCreator` factory
+1. Create a new class implementing `SolrDocumentCreator` (the format interface)
+2. Register it with the `IndexingDocumentCreator` orchestrator
3. Add tests
4. Update documentation
@@ -491,7 +492,7 @@ Analyze with Java Mission Control.
The project uses GitHub Actions for CI/CD. See:
- `.github/workflows/build-and-publish.yml` - Build, test, and publish Docker
images
-- `.github/workflows/publish-mcp.yml` - Publish to the MCP Registry on version
tags
+- `.github/workflows/release-publish.yml` - the `publish-mcp-registry` job
publishes to the MCP Registry after a release vote passes
Local CI simulation:
diff --git a/dev-docs/DOCKER_PUBLISHING.md b/dev-docs/DOCKER_PUBLISHING.md
index 010a8fd..ff4e0f9 100644
--- a/dev-docs/DOCKER_PUBLISHING.md
+++ b/dev-docs/DOCKER_PUBLISHING.md
@@ -98,10 +98,12 @@ Trigger the release publish workflow:
# Build to local Docker daemon
./gradlew jibDockerBuild
-# Build and push to registry
-./gradlew jib -Djib.to.image=myregistry/solr-mcp:my-tag \
- -Djib.to.auth.username=USERNAME \
- -Djib.to.auth.password=TOKEN
+# Build and push to registry.
+# Pass credentials through the environment, not -Djib.to.auth.*: command-line
+# arguments are visible to any process that can run `ps` on the machine.
+export JIB_TO_AUTH_USERNAME=USERNAME
+export JIB_TO_AUTH_PASSWORD=TOKEN
+./gradlew jib -Djib.to.image=myregistry/solr-mcp:my-tag
```
### Multi-platform Build
diff --git a/dev-docs/TROUBLESHOOTING.md b/dev-docs/TROUBLESHOOTING.md
index 2e14db4..8bb35e4 100644
--- a/dev-docs/TROUBLESHOOTING.md
+++ b/dev-docs/TROUBLESHOOTING.md
@@ -255,9 +255,13 @@ The following files had format violations:
**Solution:**
```bash
-# Clean Gradle cache
+# Remove build outputs and bypass the build cache for this run
+# (this does NOT purge the cache itself)
./gradlew clean --no-build-cache
+# Actually purge the Gradle build cache
+rm -rf ~/.gradle/caches/build-cache-1
+
# Nuclear option: delete .gradle directory
rm -rf .gradle
./gradlew clean build
@@ -404,8 +408,10 @@ If you're still having issues:
### Server Logs
```bash
-# STDIO mode - logs to stderr
-./gradlew bootRun 2>&1 | tee server.log
+# STDIO mode - logs go to stderr; capture stderr ONLY.
+# Do not use 2>&1: that merges diagnostics into stdout, which carries the
+# MCP JSON-RPC stream and must stay clean.
+./gradlew bootRun 2> server.log
# HTTP mode - Spring Boot logging
PROFILES=http ./gradlew bootRun
diff --git a/dev-docs/WORKFLOWS.md b/dev-docs/WORKFLOWS.md
index c11309b..817cc7b 100644
--- a/dev-docs/WORKFLOWS.md
+++ b/dev-docs/WORKFLOWS.md
@@ -62,9 +62,10 @@ This guide explains when and how to use each GitHub Actions
workflow in the proj
#### When to Use
- ✅ Automatic on every commit to `main`
-- ✅ Automatic on pull requests (build + test only)
- ✅ When you merge a PR and want development images published
+(Pull requests are built by `ci.yml`, not by this workflow.)
+
#### When NOT to Use
- ❌ For official Apache releases (use `release-publish.yml`)
@@ -77,11 +78,13 @@ on:
push:
branches: [main]
tags: ['v*'] # ⚠️ Avoid using tags; prefer release-publish.yml
- pull_request:
- branches: [main]
workflow_dispatch: # Manual trigger
```
+There is deliberately **no `pull_request` trigger**: this workflow publishes
+images, and pull requests must not be able to push to a registry. PR builds are
+covered by `ci.yml`.
+
#### What It Does
1. **Builds** the project with Gradle
@@ -162,7 +165,10 @@ on:
1. **Validates** release tag exists (`v1.0.0-rc1`)
2. **Builds** the project from approved RC tag
-3. **Signs** artifacts (placeholder for future automation)
+3. **Signs** artifacts — placeholder only; this step logs a message and does
+ not produce or verify a signature. Publication below is **not** gated on a
+ verified signature, so the Release Manager must still sign manually per the
+ ATR guidance.
4. **Publishes Docker images** to:
- Docker Hub: `apache/solr-mcp:1.0.0`, `apache/solr-mcp:1.0`,
`apache/solr-mcp:1`, `apache/solr-mcp:latest`
- GitHub Container Registry: `ghcr.io/apache/solr-mcp:1.0.0`, `latest`
diff --git a/docs/FAQ.md b/docs/FAQ.md
index d0fafbd..064c7ba 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -72,15 +72,15 @@ Anthropic puts it, *"tool descriptions occupy more context
window
space"*, and at scale agents *"need to process hundreds of thousands of
tokens before reading a request."*[code-execution]
-For this server (27 tools across search, indexing, schema, and
+For this server (11 tools across search, indexing, schema, and
collections), the upfront overhead is a few thousand tokens — real but
bounded.
Two factors close the gap at runtime:
-- **Typed, compact returns.** Every tool returns the same typed record
- (e.g. `SearchResponse`, `SolrHealthStatus`), not raw Solr JSON the
- model must reparse. Over a multi-turn agent run, leaner tool output
+- **Typed, compact returns.** Every tool returns its own purpose-built
+ typed record (`SearchResponse`, `SolrHealthStatus`, `IndexStats`, …),
+ not raw Solr JSON the model must reparse. Over a multi-turn agent run,
leaner tool output
offsets the upfront schema cost.
- **Code execution with MCP.** Anthropic's pattern of discovering tool
definitions on demand inside a code-execution loop cut a reference
diff --git a/docs/security/stdio.md b/docs/security/stdio.md
index c772f53..a18008d 100644
--- a/docs/security/stdio.md
+++ b/docs/security/stdio.md
@@ -15,8 +15,8 @@ that launched the process. No code changes are required for
STDIO security.
| Property | Where it's set | Why it's safe |
|---|---|---|
| No network listener | `application-stdio.properties` →
`spring.main.web-application-type=none` | No socket exists for a remote
attacker to reach |
-| Communication is stdin/stdout only | MCP framing per spec | Only the parent
process (e.g. Claude Desktop) can write to `stdin` |
-| Trust boundary = OS process owner | Launcher runs the binary | Same model as
any local CLI; OS user permissions are the auth |
+| Communication is stdin/stdout only | MCP framing per spec | No socket to
reach; input arrives over an inherited file descriptor |
+| Trust boundary = OS process owner | Launcher runs the binary | Same model as
any local CLI; OS user permissions are the auth. Note the boundary is **any
process that can reach the server's stdin**, not only the direct parent — a
descriptor can be inherited or passed on, so isolate by OS user rather than
assuming a single writer |
| Spring Security autoconfig disabled | `application-stdio.properties`
excludes `SecurityAutoConfiguration` and
`ManagementWebSecurityAutoConfiguration` | Belt-and-suspenders; the filter
chain has nothing to do without a servlet container |
| `stdout` is reserved for JSON-RPC | `logback.xml` + empty
`logging.pattern.console` (see [Logging Architecture in
CLAUDE.md](../../CLAUDE.md#logging-architecture)) | Prevents log lines from
being mis-parsed as MCP frames |
diff --git a/init-solr.sh b/init-solr.sh
index 2c015a8..360604a 100755
--- a/init-solr.sh
+++ b/init-solr.sh
@@ -92,18 +92,23 @@ until curl -s
"http://localhost:8983/solr/admin/collections?action=LIST" | grep
sleep 2
done
+# Both fields go in a single "add-field" array. Repeating the key instead
+# would leave duplicate JSON members, and the second silently wins - so the
+# "name" field was never actually created.
curl -X POST -H 'Content-type:application/json' --data-binary '{
- "add-field": {
- "name":"name",
- "type":"text_general",
- "multiValued":false,
- "stored":true
- },
- "add-field": {
- "name":"initial_release_date",
- "type":"pdate",
- "stored":true
- }
+ "add-field": [
+ {
+ "name":"name",
+ "type":"text_general",
+ "multiValued":false,
+ "stored":true
+ },
+ {
+ "name":"initial_release_date",
+ "type":"pdate",
+ "stored":true
+ }
+ ]
}' http://localhost:8983/solr/films/schema
## Post the books.csv data
diff --git a/mydata/devnexus-2026.json b/mydata/devnexus-2026.json
index 8f7d050..2c6ef05 100644
--- a/mydata/devnexus-2026.json
+++ b/mydata/devnexus-2026.json
@@ -9,7 +9,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "09:00",
- "start_datetime": "2026-03-04T09:00:00Z",
+ "start_datetime": "2026-03-04T14:00:00Z",
"session_type": "Workshop",
"tags": ["event-driven", "event-streaming", "architecture", "workshop"]
},
@@ -23,7 +23,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "09:00",
- "start_datetime": "2026-03-04T09:00:00Z",
+ "start_datetime": "2026-03-04T14:00:00Z",
"session_type": "Workshop",
"tags": ["software-engineering", "ai", "practices", "workshop"]
},
@@ -37,7 +37,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "09:00",
- "start_datetime": "2026-03-04T09:00:00Z",
+ "start_datetime": "2026-03-04T14:00:00Z",
"session_type": "Workshop",
"tags": ["spring-ai", "mcp", "java", "amazon-bedrock", "agents",
"workshop"]
},
@@ -51,7 +51,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "13:00",
- "start_datetime": "2026-03-04T13:00:00Z",
+ "start_datetime": "2026-03-04T18:00:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "patterns", "predictive-ai"]
},
@@ -65,7 +65,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "13:00",
- "start_datetime": "2026-03-04T13:00:00Z",
+ "start_datetime": "2026-03-04T18:00:00Z",
"session_type": "Talk",
"tags": ["java", "java-25", "language-evolution", "jvm"]
},
@@ -79,7 +79,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "13:00",
- "start_datetime": "2026-03-04T13:00:00Z",
+ "start_datetime": "2026-03-04T18:00:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "modernization", "generative-ai"]
},
@@ -93,7 +93,7 @@
"day": "Day 0",
"date": "2026-03-04",
"start_time": "18:15",
- "start_datetime": "2026-03-04T18:15:00Z",
+ "start_datetime": "2026-03-04T23:15:00Z",
"session_type": "Social",
"tags": ["networking", "social"]
},
@@ -107,7 +107,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "09:00",
- "start_datetime": "2026-03-05T09:00:00Z",
+ "start_datetime": "2026-03-05T14:00:00Z",
"session_type": "Keynote",
"tags": ["keynote", "java", "ai", "enterprise"]
},
@@ -121,7 +121,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "design-patterns", "multi-agent"]
},
@@ -135,7 +135,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "java", "practical"]
},
@@ -149,7 +149,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["architecture", "data-warehouse", "open-source", "data-lakes",
"cloud"]
},
@@ -163,7 +163,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["java", "java-26", "language-evolution", "jvm"]
},
@@ -177,7 +177,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-boot", "spring-boot-4", "frameworks"]
},
@@ -191,7 +191,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "mcp", "agents", "generative-ai", "tools"]
},
@@ -205,7 +205,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "09:00",
- "start_datetime": "2026-03-05T09:00:00Z",
+ "start_datetime": "2026-03-05T14:00:00Z",
"session_type": "Community",
"tags": ["mentorship", "community", "career"]
},
@@ -219,7 +219,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["refactoring", "practices", "code-quality"]
},
@@ -233,7 +233,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["spring", "java", "ai", "enterprise", "frameworks"]
},
@@ -247,7 +247,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["java", "migration", "security", "compatibility"]
},
@@ -261,7 +261,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["leadership", "career", "education", "engineering-culture"]
},
@@ -275,7 +275,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "10:00",
- "start_datetime": "2026-03-05T10:00:00Z",
+ "start_datetime": "2026-03-05T15:00:00Z",
"session_type": "Talk",
"tags": ["mcp", "automation", "tools", "productivity"]
},
@@ -289,7 +289,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["ai", "java", "tools", "code-platform"]
},
@@ -303,7 +303,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["mcp", "ai", "practical", "architecture"]
},
@@ -317,7 +317,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["java", "testing", "junit", "junit-6"]
},
@@ -331,7 +331,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-data", "frameworks", "data-access"]
},
@@ -345,7 +345,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["ai", "java", "tools", "generative-ai", "productivity"]
},
@@ -359,7 +359,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["lean", "practices", "software-development", "agile"]
},
@@ -373,7 +373,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-cloud", "api", "api-versioning", "gateway",
"enterprise"]
},
@@ -387,7 +387,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-security", "security"]
},
@@ -401,7 +401,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["architecture", "leadership", "software-development"]
},
@@ -415,7 +415,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "11:20",
- "start_datetime": "2026-03-05T11:20:00Z",
+ "start_datetime": "2026-03-05T16:20:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "ide", "productivity", "tools"]
},
@@ -429,7 +429,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "software-engineering", "practices", "tools"]
},
@@ -443,7 +443,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "practical", "critique"]
},
@@ -457,7 +457,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["java", "cloud", "serverless", "native", "crac", "performance",
"architecture"]
},
@@ -471,7 +471,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["java", "performance", "jvm", "latency"]
},
@@ -485,7 +485,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "java", "enterprise", "benchmarks", "spring"]
},
@@ -499,7 +499,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-ai", "mcp", "agents", "generative-ai"]
},
@@ -513,7 +513,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["git", "practices", "tools", "version-control"]
},
@@ -527,7 +527,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["spring", "tanzu", "ai", "enterprise", "cloud-native"]
},
@@ -541,7 +541,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["llm", "ai", "security", "reliability", "trust"]
},
@@ -555,7 +555,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "13:20",
- "start_datetime": "2026-03-05T13:20:00Z",
+ "start_datetime": "2026-03-05T18:20:00Z",
"session_type": "Talk",
"tags": ["leadership", "career", "management"]
},
@@ -569,7 +569,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["ai", "embabel", "tools", "agents"]
},
@@ -583,7 +583,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["mcp", "ai", "agents", "protocol"]
},
@@ -597,7 +597,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["architecture", "modular-monolith", "microservices"]
},
@@ -611,7 +611,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["java", "kubernetes", "performance", "ai", "jvm"]
},
@@ -625,7 +625,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["java", "graphs", "ai", "frameworks", "neo4j"]
},
@@ -639,7 +639,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["mcp", "ai", "java", "modernization", "agents", "generative-ai"]
},
@@ -653,7 +653,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["refactoring", "intellij", "practices", "code-quality", "ide"]
},
@@ -667,7 +667,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-ai", "agents", "tanzu", "ai"]
},
@@ -681,7 +681,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["mcp", "llm", "data-streaming", "kafka", "security"]
},
@@ -695,7 +695,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["leadership", "management", "one-on-one", "career"]
},
@@ -709,7 +709,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "14:50",
- "start_datetime": "2026-03-05T14:50:00Z",
+ "start_datetime": "2026-03-05T19:50:00Z",
"session_type": "Talk",
"tags": ["soft-skills", "career", "communication"]
},
@@ -723,7 +723,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "memory", "tools"]
},
@@ -737,7 +737,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["ai", "multi-agent", "agents", "practical"]
},
@@ -751,7 +751,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["java", "cloud-native", "modernization", "automation",
"architecture"]
},
@@ -765,7 +765,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["career", "java", "developer", "growth"]
},
@@ -779,7 +779,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["spring", "jakarta-ee", "frameworks", "java"]
},
@@ -793,7 +793,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["microservices", "ai", "agents", "architecture", "generative-ai"]
},
@@ -807,7 +807,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["database", "migration", "liquibase", "flyway", "practices"]
},
@@ -821,7 +821,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["ai", "inference", "performance", "spring", "llm"]
},
@@ -835,7 +835,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["security", "privacy", "devsecops", "practices"]
},
@@ -849,7 +849,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["career", "leadership", "software-industry"]
},
@@ -863,7 +863,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "15:50",
- "start_datetime": "2026-03-05T15:50:00Z",
+ "start_datetime": "2026-03-05T20:50:00Z",
"session_type": "Talk",
"tags": ["developer-experience", "productivity", "tools"]
},
@@ -877,7 +877,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "16:50",
- "start_datetime": "2026-03-05T16:50:00Z",
+ "start_datetime": "2026-03-05T21:50:00Z",
"session_type": "Talk",
"tags": ["java", "podcast", "ai", "agents", "community"]
},
@@ -891,7 +891,7 @@
"day": "Day 1",
"date": "2026-03-05",
"start_time": "17:30",
- "start_datetime": "2026-03-05T17:30:00Z",
+ "start_datetime": "2026-03-05T22:30:00Z",
"session_type": "Social",
"tags": ["networking", "social"]
},
@@ -905,7 +905,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "09:00",
- "start_datetime": "2026-03-06T09:00:00Z",
+ "start_datetime": "2026-03-06T14:00:00Z",
"session_type": "Keynote",
"tags": ["keynote", "ai", "security", "hacking"]
},
@@ -919,7 +919,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "graphs", "context", "rag", "tools"]
},
@@ -933,7 +933,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "llm", "prompting", "practical", "development"]
},
@@ -947,7 +947,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["architecture", "cell-architecture", "distributed-systems"]
},
@@ -961,7 +961,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["java", "jvm", "startup", "performance", "graalvm"]
},
@@ -975,7 +975,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["spring", "api", "api-versioning", "frameworks"]
},
@@ -989,7 +989,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "predictive-ai", "machine-learning", "generative-ai"]
},
@@ -1003,7 +1003,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["maven", "build", "practices", "performance"]
},
@@ -1017,7 +1017,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-cloud", "production", "cloud-native"]
},
@@ -1031,7 +1031,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["java", "security", "vulnerabilities", "devsecops"]
},
@@ -1045,7 +1045,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["ai", "testing", "leadership", "prompting",
"software-engineering"]
},
@@ -1059,7 +1059,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "10:00",
- "start_datetime": "2026-03-06T10:00:00Z",
+ "start_datetime": "2026-03-06T15:00:00Z",
"session_type": "Talk",
"tags": ["boxlang", "jvm-languages", "tools"]
},
@@ -1073,7 +1073,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["ai", "rag", "neo4j", "graphs", "tools", "llm"]
},
@@ -1087,7 +1087,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "microservices", "architecture", "practical"]
},
@@ -1101,7 +1101,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["architecture", "hexagonal", "java", "monolith",
"layered-architecture"]
},
@@ -1115,7 +1115,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["java", "jvm", "memory-management", "garbage-collection",
"performance"]
},
@@ -1129,7 +1129,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-boot", "kubernetes", "keda", "autoscaling",
"cloud-native"]
},
@@ -1143,7 +1143,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["llm", "java", "mcp", "spring-ai", "generative-ai"]
},
@@ -1157,7 +1157,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["platform-engineering", "practices", "devops", "culture"]
},
@@ -1171,7 +1171,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["spring", "tanzu", "modernization", "refactoring", "cloud"]
},
@@ -1185,7 +1185,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["mcp", "spring-security", "oauth2", "security", "authorization"]
},
@@ -1199,7 +1199,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["leadership", "career", "tech-lead", "management"]
},
@@ -1213,7 +1213,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "11:20",
- "start_datetime": "2026-03-06T11:20:00Z",
+ "start_datetime": "2026-03-06T16:20:00Z",
"session_type": "Talk",
"tags": ["java", "rest", "api", "data-oriented-programming", "tools"]
},
@@ -1227,7 +1227,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "java", "microservices", "fintech", "cloud",
"performance"]
},
@@ -1241,7 +1241,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "rag", "semantic-search", "elasticsearch", "e-commerce"]
},
@@ -1255,7 +1255,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["architecture", "resilience", "durable-execution", "reliability"]
},
@@ -1269,7 +1269,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["java", "jvm", "jit", "performance", "compilation"]
},
@@ -1283,7 +1283,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["spring", "spring-boot", "observability", "monitoring", "jvm",
"opentelemetry"]
},
@@ -1297,7 +1297,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["ai", "graphs", "llm", "generative-ai", "context"]
},
@@ -1311,7 +1311,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["testing", "assertj", "java", "practices"]
},
@@ -1325,7 +1325,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["spring", "developer-experience", "production",
"platform-engineering"]
},
@@ -1339,7 +1339,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["java", "ai", "generative-ai", "security", "responsible-ai"]
},
@@ -1353,7 +1353,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["leadership", "architecture", "culture", "organizational-change"]
},
@@ -1367,7 +1367,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "13:20",
- "start_datetime": "2026-03-06T13:20:00Z",
+ "start_datetime": "2026-03-06T18:20:00Z",
"session_type": "Talk",
"tags": ["java", "career", "tools"]
},
@@ -1381,7 +1381,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["ai", "prompting", "prompt-engineering", "tools", "llm"]
},
@@ -1395,7 +1395,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["java", "kafka", "streaming", "fraud-detection", "vector-search",
"ai", "practical"]
},
@@ -1409,7 +1409,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["database", "isolation", "architecture", "transactions"]
},
@@ -1423,7 +1423,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["java", "async", "reactive", "virtual-threads", "jvm"]
},
@@ -1437,7 +1437,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["java", "jpa", "json", "database", "spring", "frameworks"]
},
@@ -1451,7 +1451,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["spring-ai", "langchain4j", "java", "generative-ai", "llm"]
},
@@ -1465,7 +1465,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["java", "open-source", "community", "jcp", "openjdk", "career"]
},
@@ -1479,7 +1479,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["spring", "maintenance", "upgrades", "production"]
},
@@ -1493,7 +1493,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["security", "kafka", "data-streaming", "encryption"]
},
@@ -1507,7 +1507,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["leadership", "management", "organizational-change", "tech-lead"]
},
@@ -1521,7 +1521,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "14:40",
- "start_datetime": "2026-03-06T14:40:00Z",
+ "start_datetime": "2026-03-06T19:40:00Z",
"session_type": "Talk",
"tags": ["ai", "gpt", "productivity", "tools", "automation"]
},
@@ -1535,7 +1535,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["ai", "agents", "java", "tools", "deployment"]
},
@@ -1549,7 +1549,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["microservices", "architecture", "pragmatic"]
},
@@ -1563,7 +1563,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["java", "performance", "jvm", "native", "panama"]
},
@@ -1577,7 +1577,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["intellij", "debugging", "ide", "practices", "java"]
},
@@ -1591,7 +1591,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["spring", "security", "shift-left", "devops", "production"]
},
@@ -1605,7 +1605,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "15:40",
- "start_datetime": "2026-03-06T15:40:00Z",
+ "start_datetime": "2026-03-06T20:40:00Z",
"session_type": "Talk",
"tags": ["security", "quantum", "encryption", "post-quantum",
"cryptography"]
},
@@ -1619,7 +1619,7 @@
"day": "Day 2",
"date": "2026-03-06",
"start_time": "16:40",
- "start_datetime": "2026-03-06T16:40:00Z",
+ "start_datetime": "2026-03-06T21:40:00Z",
"session_type": "Closing",
"tags": ["closing", "social"]
}
diff --git a/scripts/benchmark-native.sh b/scripts/benchmark-native.sh
index 5c25c49..584df6a 100755
--- a/scripts/benchmark-native.sh
+++ b/scripts/benchmark-native.sh
@@ -73,15 +73,20 @@ run_one() {
local cid
local t_start t_ready rss_mb prev_rss=0 stable_count=0
t_start="$(date +%s%N)"
- # Do not use --rm so we can reliably inspect and clean up the container
- cid="$(docker run -d \
+ # Do not use --rm so we can reliably inspect and clean up the container.
+ # -i keeps stdin open: the default (stdio) profile reads MCP JSON-RPC
from
+ # stdin and exits immediately on EOF, which would make every run look
like
+ # a crash.
+ cid="$(docker run -d -i \
-e SOLR_URL="${SOLR_URL}" \
-e SPRING_DOCKER_COMPOSE_ENABLED=false \
"${image}")"
# Poll at 25ms intervals for up to 60s
for i in $(seq 1 2400); do
- if ! docker inspect "${cid}" >/dev/null 2>&1; then
+ # Check that the container is still *running*. `docker inspect`
also
+ # succeeds for an exited container, so it never detected a
crash.
+ if [[ "$(docker inspect -f '{{.State.Running}}' "${cid}"
2>/dev/null)" != "true" ]]; then
docker logs "${cid}" >&2 || true
docker rm -f "${cid}" >/dev/null 2>&1 || true
echo "container exited prematurely" >&2
diff --git a/scripts/get-auth0-token.sh b/scripts/get-auth0-token.sh
index 98ec4bd..771e1ef 100755
--- a/scripts/get-auth0-token.sh
+++ b/scripts/get-auth0-token.sh
@@ -113,10 +113,22 @@ load_env_file() {
local env_file="${PROJECT_ROOT}/.env"
if [ -f "$env_file" ]; then
print_info "Loading configuration from .env file"
- # Export variables from .env file
- set -a
- source "$env_file"
- set +a
+ # Parse only AUTH0_* assignments rather than sourcing the file.
+ # `source` executes its contents, so any command in .env would run
+ # with this script's privileges.
+ local line key value
+ while IFS= read -r line || [ -n "$line" ]; do
+ # Skip blanks, comments, and anything that is not a simple
+ # AUTH0_<NAME>=<value> assignment.
+ [[ "$line" =~ ^[[:space:]]*(#|$) ]] && continue
+ [[ "$line" =~
^[[:space:]]*(export[[:space:]]+)?(AUTH0_[A-Za-z0-9_]+)=(.*)$ ]] || continue
+ key="${BASH_REMATCH[2]}"
+ value="${BASH_REMATCH[3]}"
+ # Strip one layer of surrounding quotes, if present
+ value="${value%\"}"; value="${value#\"}"
+ value="${value%\'}"; value="${value#\'}"
+ export "$key=$value"
+ done < "$env_file"
fi
}
diff --git a/src/test/java/org/apache/solr/mcp/server/observability/README.md
b/src/test/java/org/apache/solr/mcp/server/observability/README.md
index e9540f6..7f597ec 100644
--- a/src/test/java/org/apache/solr/mcp/server/observability/README.md
+++ b/src/test/java/org/apache/solr/mcp/server/observability/README.md
@@ -25,7 +25,7 @@ We use a **three-tier testing strategy** to verify that
distributed tracing work
- Span durations are valid
**How it works**:
-- Uses `InMemorySpanExporter` to capture spans without external infrastructure
+- Uses `SimpleTracer` (micrometer-tracing-test) to capture spans without
external infrastructure
- Uses Awaitility for asynchronous span collection
- Runs fast (seconds) - suitable for CI/CD pipelines
@@ -63,10 +63,10 @@ We use a **three-tier testing strategy** to verify that
distributed tracing work
### 3. Helper Classes
-#### `ObservabilityTestConfiguration.java`
+#### `OpenTelemetryTestConfiguration.java`
Test configuration that provides:
-- `InMemorySpanExporter` bean for capturing spans
-- `SdkTracerProvider` configured to use in-memory exporter
+- A `SimpleTracer` bean (from `micrometer-tracing-test`) that records spans in
memory
+- Exposed as `SimpleTracer` rather than `Tracer` so tests can call `getSpans()`
#### `LgtmAssertions.java`
Helper for querying LGTM stack (Tempo, Prometheus, Loki):
@@ -180,7 +180,7 @@ The **integration tests** (`OtlpExportIntegrationTest`) can
be run:
### Spans Not Appearing in Tests
-**Problem**: `InMemorySpanExporter` returns empty list
+**Problem**: `tracer.getSpans()` returns an empty list
**Solutions**:
1. Verify `@Observed` annotation is present on method
@@ -206,7 +206,8 @@ The **integration tests** (`OtlpExportIntegrationTest`) can
be run:
1. Verify LGTM stack is running: `docker compose ps`
2. Check OTLP endpoint: `http://localhost:4318/v1/traces`
3. Verify application properties:
- - `spring.opentelemetry.tracing.export.otlp.endpoint` is set
+ - `otel.exporter.otlp.endpoint` is set (see `application-http.properties`);
+ tests override `management.otlp.tracing.endpoint` to disable export
- `management.tracing.sampling.probability=1.0` (100% sampling)
4. Check application logs for OTLP export errors
5. Verify Grafana datasource: Grafana → Connections → Data Sources → Tempo
@@ -227,7 +228,7 @@ The **integration tests** (`OtlpExportIntegrationTest`) can
be run:
@Test
void shouldCreateSpanForMyOperation() throws Exception {
// Given: Initial state
- spanExporter.reset();
+ tracer.getSpans().clear();
// When: Execute operation
myService.doSomething();
@@ -236,7 +237,7 @@ void shouldCreateSpanForMyOperation() throws Exception {
await()
.atMost(5, TimeUnit.SECONDS)
.untilAsserted(() -> {
- List<SpanData> spans = spanExporter.getFinishedSpanItems();
+ var spans = tracer.getSpans();
TraceAssertions.assertSpanExists(spans, "MyService.doSomething");
TraceAssertions.assertSpanHasAttribute(spans, "MyService",
"operation", "doSomething");
});