Skip to content

feat(learning): ground guided lessons with durable citations - #110

Merged
WilliamAGH merged 21 commits into
mainfrom
dev
Jul 18, 2026
Merged

feat(learning): ground guided lessons with durable citations#110
WilliamAGH merged 21 commits into
mainfrom
dev

Conversation

@WilliamAGH

@WilliamAGHWilliamAGH commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Summary

  • grounds all 34 guided lessons in manifest-owned documentation sources, expands verified Java/JVM examples, and fills the promised Kotlin data-class, Scala case-class/enum, and PostgreSQL Testcontainers coverage
  • rejects unknown guided slugs before retrieval or model work, emits preparation status immediately, and keeps deterministic citations and partial-citation warnings visible through stream completion
  • publishes documentation mirrors atomically, derives source fields and seed types from canonical manifests, rejects overlapping mirror roots, and preserves the prior valid mirror when replacement validation fails
  • binds ingestion markers to canonical provenance before stale-vector pruning, quarantines files atomically, and fails document processing and cancellation paths instead of reporting false success
  • centralizes typed Qdrant and provider backoff contracts while preserving upstream provider failures and exact cooldown semantics
  • synchronizes canonical route metadata, preserves mobile chat focus, and highlights the curriculum JVM and configuration languages

Validation

  • make lint
  • make build
  • make test — 619 tests passed, 0 failures, 0 skipped
  • npm run validate and npm run test — 158 frontend tests passed
  • documentation fetch and Java API projection suites
  • Python seed suite — 6 tests passed
  • process monitor signal/exit regressions
  • Docker frontend-builder validation, tests, and production build
  • signed pre-commit and pre-push hooks

Deployment verification

The dev deployment is pinned to commit 09c3612341e0d8204283f7696aca94e3e9b0b4d8. After review checks pass and this PR is merged, production verification will confirm exact runtime commit identity, health/readiness, canonical Java citation paths, stream latency, unknown-slug rejection, responsive guided navigation, and a fresh black-box dogfood pass.

The packaged recursion trace requested a syntax language that is not loaded in the production highlighter, emitting a console warning on normal lesson navigation. Render the trace as an unclassified code block so its formatting remains intact without invoking an unavailable grammar.
- Remove the unsupported text language marker from the recursion trace fence
Closing the mobile lesson-chat drawer removed the focused close control without returning keyboard focus to the control that opened it. Preserve the invoking button and restore focus after Svelte completes the drawer's DOM update.
- Capture the mobile chat trigger when opening the drawer
- Return focus after closing and cover the keyboard flow with a regression test
Regenerate the manifest-bound seed before accepting an existing Java API
mirror and quarantine unseeded HTML outside the ingestion tree. This
prevents stale flat Javadoc pages from recreating noncanonical citations.
Documentation mirrors now derive discovery behavior, field positions, and
allowed seed types from canonical manifests instead of parallel script
inventories. Existing mirrors are reconciled before they are accepted.
- Share manifest parsing across Java, Bash, and Python
- Preserve extensionless pages with bounded retry and timeout behavior
- Quarantine Java API files absent from the canonical seed
…mmediately
Learners can browse the complete curriculum, receive lesson-specific guidance
from canonical sources, and see immediate stream progress. Invalid lesson
requests now fail before retrieval or model inference.
- Add source-scoped lessons across Java, JVM languages, Spring, and Quarkus
- Make citation discovery deterministic and remove obsolete PDF anchoring
- Reject false Javadoc anchors and stale lesson slugs
- Restore focus and syntax highlighting across the expanded lesson UI
Navigation now keeps the active view, browser history, canonical URL, title,
and social metadata aligned for direct visits and in-app route changes.
- Share one route metadata owner between bootstrap and Svelte navigation
- Normalize supported trailing-slash routes
- Preserve back and forward navigation across Chat and Learn
Guided lesson catalogs and retrieval constraints now own detached immutable
state, preventing callers from mutating cached metadata or source scopes.
- Return deep lesson snapshots from the TOC provider
- Defensively copy retrieval source constraints
- Prove both boundaries reject external mutation
Guided lesson snapshots now have the copy constructor used by the TOC cache
and response boundaries, keeping the defensive-ownership commit buildable.
CopilotAI review requested due to automatic review settings July 18, 2026 06:34
@coderabbitai

coderabbitaiBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR expands guided learning with canonical documentation scopes, curated lesson content, and new JVM/framework lessons. It adds documentation seed discovery and selective fetching, refactors retrieval and citations, synchronizes SPA routes with SEO metadata, improves accessibility, and emits preparation status events before streaming work.

Changes

Frontend navigation and presentation

Layer / File(s)Summary
Route metadata and browser history synchronization
frontend/index.html, frontend/src/App.svelte, frontend/src/lib/services/pageMetadata.ts, frontend/src/App.test.ts
Views now derive from the pathname, canonical routes update browser history, popstate restores the selected view, and title, canonical, social, and JSON-LD metadata synchronize with the active route.
Accessibility and code highlighting
frontend/src/lib/components/*, frontend/src/lib/utils/highlight.*
The guided lesson title is an h1, mobile drawer focus returns to its trigger, and highlighting supports additional JVM languages and plaintext formats.

Documentation ingestion and lessons

Layer / File(s)Summary
Manifest-driven documentation seeds
scripts/documentation_seed.py, scripts/fetch_all_docs.sh, scripts/lib/*, src/main/resources/*manifest
Documentation sources now support structured discovery, constrained canonical seed URLs, doc-set selection, fetch validation, Java API seed reconciliation, and expanded manifest fields.
Guided lesson curriculum
src/main/resources/guided/lessons/*, src/main/resources/guided/toc.json, docs/*.md
The curriculum adds Java, JVM-language, Spring Boot, and Quarkus lessons, enriches TOC entries with technology and source references, and documents the updated streaming and documentation-pipeline contracts.

Guided learning and retrieval

Layer / File(s)Summary
Lesson source scope and snapshots
src/main/java/.../GuidedLesson.java, GuidedTOCProvider.java, DocsSourceRegistry.java
Lessons validate technology and source references, resolve references to official docSet values, and expose immutable cached snapshots.
Scoped retrieval and citations
src/main/java/.../GuidedLearningService.java, RetrievalConstraint.java, QdrantRetrievalConstraintBuilder.java, RetrievalService.java
Guided prompts, enrichment, and citations use lesson-scoped official documentation; retrieval constraints match doc-set keywords, and citation discovery bypasses reranking while respecting configured limits.
Streaming contracts
src/main/java/.../web/*
Chat and guided streams emit a non-terminal stream.preparing retrieval status before deferred history or retrieval work, while guided requests resolve listed lesson slugs and derive citations from context documents.

Configuration and validation cleanup

Layer / File(s)Summary
Shared configuration and validation rules
src/main/java/.../config/*, src/main/resources/application.properties
Guided-learning PDF configuration and enhancement support are removed; manifest validation is centralized and now handles canonical numbers, booleans, HTTP(S) URLs, seed catalogs, and structured discovery fields.
Regression coverage
src/test/java/..., scripts/test_*.sh, frontend/src/**/*.test.*
Tests cover source projection, doc-set filtering, seed determinism and safety, mirror reconciliation, route metadata, focus restoration, scoped retrieval, citation refinement, endpoint validation, and SSE ordering.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels:enhancement, documentation, java, javascript

Suggested reviewers:copilot

Poem

Seeds find their paths,
Lessons bloom with scoped sources,
Streams announce their start.
Tabs remember the way home,
Bright metadata follows.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 46.91% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title captures the main guided-lesson citation grounding change, even if it is a bit broader than the full changeset.
Description check✅ PassedThe description closely matches the PR’s guided-lesson, docs, routing, and validation changes.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot added documentation Improvements or additions to documentation enhancement New feature or request java Pull requests that update java code javascript Pull requests that update javascript code labels Jul 18, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates guided learning to ground lessons in manifest-owned canonical documentation sources, emit citations earlier and deterministically, and improve both backend streaming UX (early “preparing” status) and frontend learning experience (SEO sync, accessibility, syntax highlighting, mobile focus).

Changes:

  • Introduces manifest-governed documentation source scoping (including seed discovery) and projects guided lessons onto canonical docSet constraints.
  • Emits an immediate SSE status preparation event for chat/guided streams and refactors retrieval/citation handling around context documents.
  • Improves Learn UX: route/metadata synchronization, guided lesson heading accessibility, mobile focus restoration, and expanded syntax highlighting for JVM/config languages.

Reviewed changes

Copilot reviewed 94 out of 94 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/test/java/com/williamcallahan/javachat/web/GuidedSseCitationEventTest.javaUpdates guided SSE tests for context-document citations and revised error-stream assertions.
src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerTest.javaAdds tests ensuring unknown/blank/missing slugs 404 before any guided work starts.
src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerStreamingFailureTest.javaAdjusts controller failure tests to new citation API and lesson lookup behavior.
src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerCuratedContentTest.javaUpdates curated-content tests for revised GuidedLesson construction.
src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerBackpressureOverflowTest.javaAdds preparation-status assertion and updates citation API usage.
src/test/java/com/williamcallahan/javachat/web/ChatControllerStreamingFailureTest.javaAdds StepVerifier test that preparation status emits before deferred work begins.
src/test/java/com/williamcallahan/javachat/util/JavadocTypeCanonicalizerTest.javaExpands tests for anchor/type canonicalization edge cases.
src/test/java/com/williamcallahan/javachat/service/RetrievalConstraintTest.javaAdds tests for immutable, normalized docSet handling in retrieval constraints.
src/test/java/com/williamcallahan/javachat/service/QdrantRetrievalConstraintBuilderTest.javaExtends Qdrant filter tests for docSet any-of keyword matching.
src/test/java/com/williamcallahan/javachat/service/GuidedTOCProviderTest.javaTests manifest-projected guided lesson scoping and immutability snapshots.
src/test/java/com/williamcallahan/javachat/service/GuidedLessonCuratedContentTest.javaAdds TOC invariants test and adjusts curated lesson resource missing behavior.
src/main/resources/guided/lessons/variables-and-types.mdRefreshes lesson content with clearer structure, runnable steps, and checks.
src/main/resources/guided/lessons/testing-with-junit.mdAdds new guided lesson content for JUnit testing fundamentals.
src/main/resources/guided/lessons/strings.mdRefreshes string lessons with runnable examples, outputs, and exercises.
src/main/resources/guided/lessons/spring-boot-vs-quarkus.mdAdds new lesson comparing Spring Boot vs Quarkus with cited references.
src/main/resources/guided/lessons/scala-on-the-jvm.mdAdds new Scala JVM lesson (versioned) with references.
src/main/resources/guided/lessons/recursion.mdRefreshes recursion lesson with runnable examples and exercises.
src/main/resources/guided/lessons/records.mdAdds new lesson explaining Java records with examples and references.
src/main/resources/guided/lessons/packages-and-imports.mdAdds new lesson about packages/imports and compilation commands.
src/main/resources/guided/lessons/modules.mdAdds new lesson on JPMS modules and boundaries.
src/main/resources/guided/lessons/modern-java-pattern-matching.mdAdds new lesson on pattern matching, sealed types, and switch guards.
src/main/resources/guided/lessons/methods.mdRefreshes methods lesson with runnable examples and clearer structure.
src/main/resources/guided/lessons/loops.mdRefreshes loops lesson with runnable examples, outputs, and exercises.
src/main/resources/guided/lessons/lambdas-and-streams.mdAdds new lesson on lambdas/streams with deterministic examples.
src/main/resources/guided/lessons/kotlin-on-the-jvm.mdAdds new Kotlin JVM lesson (versioned) with references.
src/main/resources/guided/lessons/introduction-to-java.mdRefreshes intro lesson with runnable steps and comprehension checks.
src/main/resources/guided/lessons/interfaces-and-inheritance.mdAdds new lesson on interfaces/inheritance and polymorphism.
src/main/resources/guided/lessons/groovy-on-the-jvm.mdAdds new Groovy JVM lesson (versioned) with references.
src/main/resources/guided/lessons/generics.mdAdds new lesson on generics, variance, and erasure.
src/main/resources/guided/lessons/garbage-collection-and-memory.mdAdds new lesson on GC vs resource ownership and diagnosis.
src/main/resources/guided/lessons/file-io.mdAdds new lesson on file I/O, charset choice, and try-with-resources.
src/main/resources/guided/lessons/exceptions.mdAdds new lesson on exceptions, causes, and recovery boundaries.
src/main/resources/guided/lessons/enums-and-sealed-types.mdAdds new lesson on enums and sealed hierarchies.
src/main/resources/guided/lessons/conditionals.mdRefreshes conditionals lesson with runnable examples and boundary focus.
src/main/resources/guided/lessons/concurrency-and-virtual-threads.mdAdds new lesson on concurrency and virtual threads with references.
src/main/resources/guided/lessons/collections.mdAdds new lesson on core collection interfaces and contracts.
src/main/resources/guided/lessons/clojure-on-the-jvm.mdAdds new Clojure JVM lesson (versioned) with references.
src/main/resources/guided/lessons/classes-and-objects.mdRefreshes classes/objects lesson with clearer object independence example.
src/main/resources/guided/lessons/choosing-a-jvm-language.mdAdds new lesson comparing JVM languages and boundary costs.
src/main/resources/guided/lessons/arrays.mdRefreshes arrays lesson with runnable examples and indexing guidance.
src/main/resources/documentation-sources.manifestExpands canonical documentation-source manifest schema with seed discovery + policies.
src/main/resources/documentation-seed-document-types.manifestAdds canonical catalog of supported seed discovery document types.
src/main/resources/application.propertiesRemoves guided Think Java PDF path property.
src/main/java/com/williamcallahan/javachat/web/SseSupport.javaAdds response-preparation SSE status helper for early stream admission visibility.
src/main/java/com/williamcallahan/javachat/web/SseConstants.javaAdds stable status code + stage for “preparing” retrieval phase.
src/main/java/com/williamcallahan/javachat/web/ChatController.javaEmits preparation status immediately and defers work until after first event.
src/main/java/com/williamcallahan/javachat/util/JavadocMemberAnchorResolver.javaRejects invocation-like tokens when canonicalizing declaration parameter anchors.
src/main/java/com/williamcallahan/javachat/service/RetrievalConstraint.javaAdds immutable, normalized docSet constraint support and official-docSet factory.
src/main/java/com/williamcallahan/javachat/service/QdrantRetrievalConstraintBuilder.javaAdds docSet any-of keyword filter and centralizes metadata field names.
src/main/java/com/williamcallahan/javachat/service/GuidedTOCProvider.javaProjects lessons onto manifest-owned source scopes and returns immutable snapshots.
src/main/java/com/williamcallahan/javachat/model/GuidedLesson.javaAdds technology, sourceReferences (write-only), docSet, and snapshot-copy ctor + validation.
src/main/java/com/williamcallahan/javachat/config/JavaApiDocumentationManifest.javaMoves shared field rules into a shared validator and updates parsing accordingly.
src/main/java/com/williamcallahan/javachat/config/DocumentationSourceManifest.javaParses/serializes expanded manifest schema; enforces unique docSet.
src/main/java/com/williamcallahan/javachat/config/DocumentationSeedDocumentTypeCatalog.javaLoads and validates manifest-owned seed document types for structured discovery.
src/main/java/com/williamcallahan/javachat/config/DocumentationManifestFieldRules.javaAdds shared boolean/unsigned-int parsing and HTTP/HTTPS URL validation helpers.
src/main/java/com/williamcallahan/javachat/config/DocsSourceRegistry.javaExtends documentation source records with seed discovery + policy fields.
src/main/java/com/williamcallahan/javachat/config/AppProperties.javaRemoves guided-learning Think Java PDF configuration section.
scripts/testdata/documentation_seed/sitemap.xmlAdds sitemap test data for seed discovery scenarios.
scripts/testdata/documentation_seed/sitemap-line-injection.xmlAdds sitemap test data for injection/whitespace rejection.
scripts/testdata/documentation_seed/navigation.htmlAdds HTML navigation test data for seed discovery scenarios.
scripts/test_java_api_fetch_projection.shExpands fetch projection tests to cover seed reconciliation/quarantine behavior.
scripts/documentation_seed.pyAdds deterministic seed builder for xml-sitemap and html-links discovery sources.
frontend/src/lib/validation/schemas.tsExtends GuidedLesson schema with technology and docSet.
frontend/src/lib/utils/highlight.tsExpands highlight.js language support for curriculum JVM/config languages.
frontend/src/lib/utils/highlight.test.tsAdds tests ensuring supported lesson languages are highlighted (and text/properties are quiet).
frontend/src/lib/services/guided.tsUpdates citations fetch comment to reflect canonical official scope (not Think Java PDF).
frontend/src/lib/services/guided.test.tsAdds TOC validation tests for projected lesson source-scope contract.
frontend/src/lib/components/LearnView.test.tsAdds mobile focus restoration test for guided chat drawer close behavior.
frontend/src/lib/components/LearnView.svelteRestores mobile focus on close using tick() and tracks trigger element.
frontend/src/lib/components/GuidedLessonHeader.test.tsAdds accessibility test for a single H1 lesson title.
frontend/src/lib/components/GuidedLessonHeader.svelteChanges lesson title heading from H2 to H1.
frontend/src/App.test.tsAdds route/metadata synchronization tests and resets head metadata between runs.
frontend/src/App.svelteSynchronizes view with path and browser history; centralizes metadata sync.
frontend/index.htmlReplaces inline SEO script with module import of route metadata synchronization.
docs/pipeline-commands.mdDocuments expanded manifest ownership + seed discovery and adds --doc-sets flag docs.
docs/api.mdDocuments initial stream.preparing status event for chat and guided streaming endpoints.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadscripts/documentation_seed.py Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:6e791410a9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadscripts/fetch_all_docs.sh Outdated

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/java/com/williamcallahan/javachat/web/GuidedLearningController.java (1)

285-308: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Surface partial citation conversion failures to the client.

citationsForContextDocuments logs conversion failures but returns only the surviving citations, and this controller now emits them as fully successful. Preserve the failure count and emit the existing citation-warning status, as ChatController does.

As per coding guidelines, “catching and logging an exception while continuing as if the operation succeeded” is prohibited.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/java/com/williamcallahan/javachat/web/GuidedLearningController.java`
around lines 285 - 308, Update GuidedLearningController’s
citationsForContextDocuments flow to preserve partial citation-conversion
failures instead of treating surviving citations as fully successful. Capture
the failure count/result alongside finalCitations and emit the existing
citation-warning status event, matching ChatController’s behavior, before or
with the citation event; do not silently continue after logged conversion
failures.

Source: Coding guidelines

src/main/java/com/williamcallahan/javachat/config/DocumentationSourceManifest.java (1)

119-134: 📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Replace the 14-position constructor train with named domain groups.

Most columns are String, so an adjacent-field swap compiles and silently corrupts manifest meaning. Split DocumentationSource into cohesive typed components such as identity, fetch policy, and seed discovery, then construct those by name.

As per coding guidelines, constructors with low-legibility argument trains are prohibited, and methods or constructors exceeding four parameters require parameter objects or builders.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/main/java/com/williamcallahan/javachat/config/DocumentationSourceManifest.java`
around lines 119 - 134, Replace the positional 14-argument DocumentationSource
construction in the manifest reader with named domain-group parameter objects or
a builder, such as identity, fetch policy, and seed discovery. Update
DocumentationSource and its call site to construct each group explicitly by
field name, preserving existing parsing and validation behavior; ensure no
constructor or method exceeds four parameters.

Source: Coding guidelines

🧹 Nitpick comments (7)
src/test/java/com/williamcallahan/javachat/service/RetrievalConstraintTest.java (1)

32-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider a factory method for default constraints.

That's a lot of empty strings! 🚂 As a fun little tidbit, our coding guidelines mention avoiding "positional-null sludge" or repeated placeholder arguments.

If you find yourself creating blank constraints often in tests, throwing a small test helper method like RetrievalConstraint.emptyWithDocSets(requestedDocSets) into the mix can keep our test setups sparkling clean and easy to read. ✨

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/test/java/com/williamcallahan/javachat/service/RetrievalConstraintTest.java`
at line 32, Replace the repeated empty-string constructor arguments in
RetrievalConstraintTest with a clearly named factory or test helper such as
emptyWithDocSets, passing requestedDocSets through it while preserving the
resulting default constraint values.

Source: Coding guidelines

src/test/java/com/williamcallahan/javachat/config/DocumentationSourceManifestTest.java (1)

166-175: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Simplify array searching with Arrays.asList.

Did you know that java.util.Arrays.asList(...).indexOf(...) is a super fun and idiomatic way to find an index without needing a manual for loop? It makes the code a tiny bit sweeter and easier to read! 🍬

✨ Proposed refactor
- private static int canonicalFieldIndex(List<String> manifestLines, String canonicalFieldName) {- String[] manifestHeaderFields = manifestLines.getFirst().split("\\|", -1);- for (int fieldIndex = 0; fieldIndex < manifestHeaderFields.length; fieldIndex++) {- if (manifestHeaderFields[fieldIndex].equals(canonicalFieldName)) {- return fieldIndex;- }- }- throw new IllegalArgumentException(- "Canonical documentation source manifest has no field " + canonicalFieldName);- }+ private static int canonicalFieldIndex(List<String> manifestLines, String canonicalFieldName) {+ String[] manifestHeaderFields = manifestLines.getFirst().split("\\|", -1);+ int fieldIndex = java.util.Arrays.asList(manifestHeaderFields).indexOf(canonicalFieldName);+ if (fieldIndex >= 0) {+ return fieldIndex;+ }+ throw new IllegalArgumentException(+ "Canonical documentation source manifest has no field " + canonicalFieldName);+ }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/test/java/com/williamcallahan/javachat/config/DocumentationSourceManifestTest.java`
around lines 166 - 175, Update canonicalFieldIndex to use
Arrays.asList(manifestHeaderFields).indexOf(canonicalFieldName) instead of the
manual loop, while preserving the existing IllegalArgumentException when the
field is not found.
src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java (2)

165-165: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider using a dedicated unknown slug for clarity.

Fun testing tip! 🎩 Reusing LESSON_SLUG here works perfectly because the tocProvider mock isn't stubbed for it and returns empty. However, using a dedicated string like "unknown-lesson" might make the test's intent a bit clearer at first glance without relying on the mock's default behavior.

💡 Proposed tweak
- for (String invalidLessonSlug : List.of(LESSON_SLUG, "")) {+ for (String invalidLessonSlug : List.of("unknown-lesson", "")) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java`
at line 165, Update the invalidLessonSlug values in
GuidedLearningServiceCitationTest to use a dedicated unknown slug such as
"unknown-lesson" instead of reusing LESSON_SLUG, while retaining the
empty-string case and existing test behavior.

106-106: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid manual instantiation of ObjectMapper.

Did you know that our coding guidelines explicitly prohibit manually instantiating ObjectMapper? 🚀 Even in unit tests that lack a Spring context, it's a great habit to reuse a single instance (like a private static final field) or inject it, so we don't accidentally miss any awesome Spring Jackson configuration modules in our setups!

Consider updating these calls to use a shared static instance or a Spring-injected bean to keep our DI practices top-notch:

  • src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java#L106-L106: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java#L134-L134: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java#L190-L190: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedLessonCuratedContentTest.java#L122-L122: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedTOCProviderTest.java#L26-L26: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedTOCProviderTest.java#L41-L41: Use a shared ObjectMapper.
  • src/test/java/com/williamcallahan/javachat/service/GuidedTOCProviderTest.java#L62-L62: Use a shared ObjectMapper.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java`
at line 106, The tests manually instantiate ObjectMapper when constructing
GuidedTOCProvider. Replace each occurrence with one shared ObjectMapper
instance, such as a private static final field or injected bean, across
src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java
lines 106, 134, and 190, GuidedLessonCuratedContentTest.java line 122, and
GuidedTOCProviderTest.java lines 26, 41, and 62.

Source: Coding guidelines

frontend/src/lib/utils/highlight.ts (1)

51-66: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider a tiny helper function to DRY up language registrations.

Here's a fun little tidbit: you can DRY up these language registrations with a tiny helper function! It keeps this block incredibly readable and saves a bit of repetition as your supported languages continue to grow. 🚀

💡 Proposed refactor for maximum sleekness
- if (!hljsInstance.getLanguage("plaintext")) {- hljsInstance.registerLanguage("plaintext", plaintext.default);- }- if (!hljsInstance.getLanguage("properties")) {- hljsInstance.registerLanguage("properties", properties.default);- }- if (!hljsInstance.getLanguage("kotlin")) {- hljsInstance.registerLanguage("kotlin", kotlin.default);- }- if (!hljsInstance.getLanguage("scala")) hljsInstance.registerLanguage("scala", scala.default);- if (!hljsInstance.getLanguage("groovy")) {- hljsInstance.registerLanguage("groovy", groovy.default);- }- if (!hljsInstance.getLanguage("clojure")) {- hljsInstance.registerLanguage("clojure", clojure.default);- }+ const register = (name: string, lang: any) => {+ if (!hljsInstance!.getLanguage(name)) {+ hljsInstance!.registerLanguage(name, lang);+ }+ };++ register("plaintext", plaintext.default);+ register("properties", properties.default);+ register("kotlin", kotlin.default);+ register("scala", scala.default);+ register("groovy", groovy.default);+ register("clojure", clojure.default);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@frontend/src/lib/utils/highlight.ts` around lines 51 - 66, Extract the
repeated language-registration logic in the highlight initialization block into
a small helper that checks hljsInstance.getLanguage and registers the language
only when absent. Update the plaintext, properties, kotlin, scala, groovy, and
clojure registrations to use this helper while preserving their current language
names and module defaults.

Source: Coding guidelines

src/main/java/com/williamcallahan/javachat/service/GuidedTOCProvider.java (1)

40-56: 🚀 Performance & Scalability | 🔵 Trivial

Small scalability tidbit: every read pays a full deep-copy while holding the lock. 🙂

getTOC() is fully synchronized and rebuilds a fresh copy of all lessons (immutableLessonSnapshots) on each call, and findBySlug runs this per lookup — so each guided request deep-copies every lesson while serialized on the monitor. Since tocLoaded and cachedLessons are already volatile, the post-load path doesn't actually need the lock; a volatile fast-return keeps the detached-snapshot guarantee without serializing concurrent reads. Not urgent, just a friendly win under load.

♻️ Optional lock-free read fast path
 public synchronized List<GuidedLesson> getTOC() {
- if (tocLoaded) return immutableLessonSnapshots(cachedLessons);+ return tocLoaded ? immutableLessonSnapshots(cachedLessons) : loadAndProjectTOC();+ }++ private synchronized List<GuidedLesson> loadAndProjectTOC() {+ if (tocLoaded) {+ return immutableLessonSnapshots(cachedLessons);+ }
try {
...
}
tocLoaded = true;
return immutableLessonSnapshots(cachedLessons);
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/java/com/williamcallahan/javachat/service/GuidedTOCProvider.java`
around lines 40 - 56, Update GuidedTOCProvider.getTOC() to avoid synchronizing
already-loaded reads: check the volatile tocLoaded state and return an
immutableLessonSnapshots(cachedLessons) fast path before entering the existing
load lock. Preserve synchronized single-load behavior for the initial load and
retain detached immutable snapshots for every caller.
src/main/java/com/williamcallahan/javachat/model/GuidedLesson.java (1)

199-215: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

A tiny naming adventure! 🕵️

It looks like the local variable retainedDocSets might be a small copy-paste traveler from the docSet logic, but since this helper method now also validates sourceReferences, a more general name like retainedTokens or seenTokens would be perfectly intent-revealing for both use cases!

Feel free to rename it if you'd like to keep the local variable name in sync with the method's parameter names.

✨ Proposed rename
 private static void requireValidTokens(List<String> sourceTokens, String tokenName) {
if (sourceTokens.isEmpty()) {
throw new IllegalStateException("Guided lesson " + tokenName + " cannot be empty");
}
- Set<String> retainedDocSets = new HashSet<>();+ Set<String> retainedTokens = new HashSet<>();
for (String sourceToken : sourceTokens) {
if (sourceToken.isBlank()) {
throw new IllegalStateException("Guided lesson " + tokenName + " cannot contain blank tokens");
}
if (!sourceToken.equals(sourceToken.trim())) {
throw new IllegalStateException("Guided lesson " + tokenName + " tokens must be trimmed");
}
- if (!retainedDocSets.add(sourceToken)) {+ if (!retainedTokens.add(sourceToken)) {
throw new IllegalStateException("Guided lesson " + tokenName + " cannot contain duplicate tokens");
}
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/java/com/williamcallahan/javachat/model/GuidedLesson.java` around
lines 199 - 215, Rename the local set variable in requireValidTokens from
retainedDocSets to a generic token-oriented name such as retainedTokens or
seenTokens, and update its add/check usage accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@frontend/src/lib/services/pageMetadata.ts`:
- Around line 172-176: Update canonicalUrlForPath to resolve noncanonical route
aliases to their declared canonical paths before constructing the URL: map /chat
to / and /guided to /learn, while preserving normalized paths for canonical
routes and other paths. Keep the existing pageOrigin handling unchanged.
In `@scripts/documentation_seed.py`:
- Line 10: Update the XML parser import used by read_sitemap_urls() to use
defusedxml.ElementTree instead of xml.etree.ElementTree, and add defusedxml to
the project’s dependency configuration. Preserve the existing sitemap parsing
behavior while ensuring network-fetched XML is processed through the hardened
parser.
In `@scripts/fetch_all_docs.sh`:
- Around line 290-300: Update generate_java_api_javadoc_seed to write the
generator output to a temporary file, check the Python/tee pipeline status and
seed validation, and return nonzero before mirror reconciliation on any failure.
Only after successful validation should the temporary seed be atomically renamed
to seed_file; ensure the callers around the Java mirror flow at the referenced
status checks explicitly propagate this failure instead of continuing.
- Around line 365-369: Update the cached-return branch in the fetch flow around
count_html_files so it restores the caller’s original working directory before
returning success. Preserve the existing cache validation and log behavior, and
ensure subsequent sources and metadata processing run from the original
directory.
In `@scripts/lib/documentation_fetch_sources.sh`:
- Around line 115-142: The validate_fetch_result function currently accepts Wget
exit code 8 for all fetch strategies, allowing seed fetches to pass with stale
or incomplete HTML. Add an explicit strategy or mirror-mode flag to distinguish
recursive mirror fetches, and only permit exit code 8 on that path; seed fetches
must treat it as failure while preserving the existing completeness checks.
In `@scripts/lib/documentation_sources.sh`:
- Around line 92-115: Update load_documentation_source_manifest_header and the
related Bash validation paths to consume the shared canonical manifest field
catalog instead of accepting arbitrary field names or order. Align
DocumentationSourceManifest.validateHeader() with that same catalog so both
implementations reject unknown, missing, reordered, and duplicate fields
identically. Keep the governed inventory defined in exactly one module and
ensure all projections preserve the same field names and order.
- Around line 186-204: Update is_absolute_https_remote_url and
is_absolute_http_remote_base_url to reject remote URLs or base URLs containing
query (?) or fragment (#) components before validation or normalization;
preserve acceptance of valid HTTP/HTTPS values and the existing HTTPS conversion
behavior.
In
`@src/main/java/com/williamcallahan/javachat/web/GuidedLearningController.java`:
- Around line 258-263: Move the sseSupport.configureStreamingHeaders(response)
call before the openAIStreamingService.isAvailable() check in the guided-session
streaming flow, so both unavailable-service errors and successful streams
receive the required SSE headers.
In `@src/main/resources/documentation-sources.manifest`:
- Around line 3-4: Update the manifest entries for Kotlin and Scala, along with
the referenced entries at rows 6 and 8, so their source URLs are immutable
version-specific endpoints when retaining versioned paths and metadata;
alternatively remove the pinned version identity and mark them as rolling
documentation. Ensure no unversioned documentation URL is stored under a
specific release label.
In `@src/main/resources/guided/lessons/data-access-and-testing-in-spring-boot.md`:
- Around line 60-70: Update the StudyNote(String title) constructor to reject
titles exceeding the `@Column` limit of 200 characters, while preserving the
existing null and blank validation. Add or update a test covering an overlong
title if validation tests are present.
- Around line 94-97: Align StudyNoteRepository.findByTitle with the database’s
duplicate-title policy: either add and test a uniqueness constraint for
StudyNote.title to preserve Optional<StudyNote>, or change findByTitle to return
a collection if duplicate titles are allowed. Ensure the repository contract and
database behavior are consistent.
In `@src/main/resources/guided/lessons/dependency-injection-and-configuration.md`:
- Around line 72-74: Update the StudyReminderProperties record invariant to
reject negative leadTime values while allowing zero, using validation
appropriate for Duration. Add coverage for zero and negative durations,
including the expected rejection at the negative boundary.
In `@src/main/resources/guided/lessons/groovy-on-the-jvm.md`:
- Line 24: Replace the authoring-environment disclaimer in
src/main/resources/guided/lessons/groovy-on-the-jvm.md:24 with a reader-facing
instruction explaining how to compile the Groovy snippet, and make the
corresponding replacement in
src/main/resources/guided/lessons/kotlin-on-the-jvm.md:26 with Kotlin
compilation guidance; do not retain workspace-specific statements.
In `@src/main/resources/guided/lessons/records.md`:
- Line 54: Rewrite the `List.copyOf` explanation in the records lesson to state
that it creates an unmodifiable snapshot of the elements, so later additions or
removals to the original list do not affect the record. Do not claim that it
makes the caller’s original list unmodifiable; preserve the clarification that
mutable topic objects are not deep-copied.
---
Outside diff comments:
In
`@src/main/java/com/williamcallahan/javachat/config/DocumentationSourceManifest.java`:
- Around line 119-134: Replace the positional 14-argument DocumentationSource
construction in the manifest reader with named domain-group parameter objects or
a builder, such as identity, fetch policy, and seed discovery. Update
DocumentationSource and its call site to construct each group explicitly by
field name, preserving existing parsing and validation behavior; ensure no
constructor or method exceeds four parameters.
In
`@src/main/java/com/williamcallahan/javachat/web/GuidedLearningController.java`:
- Around line 285-308: Update GuidedLearningController’s
citationsForContextDocuments flow to preserve partial citation-conversion
failures instead of treating surviving citations as fully successful. Capture
the failure count/result alongside finalCitations and emit the existing
citation-warning status event, matching ChatController’s behavior, before or
with the citation event; do not silently continue after logged conversion
failures.
---
Nitpick comments:
In `@frontend/src/lib/utils/highlight.ts`:
- Around line 51-66: Extract the repeated language-registration logic in the
highlight initialization block into a small helper that checks
hljsInstance.getLanguage and registers the language only when absent. Update the
plaintext, properties, kotlin, scala, groovy, and clojure registrations to use
this helper while preserving their current language names and module defaults.
In `@src/main/java/com/williamcallahan/javachat/model/GuidedLesson.java`:
- Around line 199-215: Rename the local set variable in requireValidTokens from
retainedDocSets to a generic token-oriented name such as retainedTokens or
seenTokens, and update its add/check usage accordingly.
In `@src/main/java/com/williamcallahan/javachat/service/GuidedTOCProvider.java`:
- Around line 40-56: Update GuidedTOCProvider.getTOC() to avoid synchronizing
already-loaded reads: check the volatile tocLoaded state and return an
immutableLessonSnapshots(cachedLessons) fast path before entering the existing
load lock. Preserve synchronized single-load behavior for the initial load and
retain detached immutable snapshots for every caller.
In
`@src/test/java/com/williamcallahan/javachat/config/DocumentationSourceManifestTest.java`:
- Around line 166-175: Update canonicalFieldIndex to use
Arrays.asList(manifestHeaderFields).indexOf(canonicalFieldName) instead of the
manual loop, while preserving the existing IllegalArgumentException when the
field is not found.
In
`@src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java`:
- Line 165: Update the invalidLessonSlug values in
GuidedLearningServiceCitationTest to use a dedicated unknown slug such as
"unknown-lesson" instead of reusing LESSON_SLUG, while retaining the
empty-string case and existing test behavior.
- Line 106: The tests manually instantiate ObjectMapper when constructing
GuidedTOCProvider. Replace each occurrence with one shared ObjectMapper
instance, such as a private static final field or injected bean, across
src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java
lines 106, 134, and 190, GuidedLessonCuratedContentTest.java line 122, and
GuidedTOCProviderTest.java lines 26, 41, and 62.
In
`@src/test/java/com/williamcallahan/javachat/service/RetrievalConstraintTest.java`:
- Line 32: Replace the repeated empty-string constructor arguments in
RetrievalConstraintTest with a clearly named factory or test helper such as
emptyWithDocSets, passing requestedDocSets through it while preserving the
resulting default constraint values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 217be38d-98a6-4772-bfdd-43f6e0fac1c4

📥 Commits

Reviewing files that changed from the base of the PR and between 704a8ef and 6e79141.

📒 Files selected for processing (94)
  • docs/api.md
  • docs/pipeline-commands.md
  • frontend/index.html
  • frontend/src/App.svelte
  • frontend/src/App.test.ts
  • frontend/src/lib/components/GuidedLessonHeader.svelte
  • frontend/src/lib/components/GuidedLessonHeader.test.ts
  • frontend/src/lib/components/LearnView.svelte
  • frontend/src/lib/components/LearnView.test.ts
  • frontend/src/lib/services/guided.test.ts
  • frontend/src/lib/services/guided.ts
  • frontend/src/lib/services/pageMetadata.ts
  • frontend/src/lib/utils/highlight.test.ts
  • frontend/src/lib/utils/highlight.ts
  • frontend/src/lib/validation/schemas.ts
  • scripts/documentation_seed.py
  • scripts/fetch_all_docs.sh
  • scripts/lib/documentation_fetch_sources.sh
  • scripts/lib/documentation_sources.sh
  • scripts/test_documentation_fetch_projection.sh
  • scripts/test_java_api_fetch_projection.sh
  • scripts/testdata/documentation_seed/navigation.html
  • scripts/testdata/documentation_seed/sitemap-line-injection.xml
  • scripts/testdata/documentation_seed/sitemap.xml
  • src/main/java/com/williamcallahan/javachat/config/AppProperties.java
  • src/main/java/com/williamcallahan/javachat/config/DocsSourceRegistry.java
  • src/main/java/com/williamcallahan/javachat/config/DocumentationManifestFieldRules.java
  • src/main/java/com/williamcallahan/javachat/config/DocumentationSeedDocumentTypeCatalog.java
  • src/main/java/com/williamcallahan/javachat/config/DocumentationSourceManifest.java
  • src/main/java/com/williamcallahan/javachat/config/JavaApiDocumentationManifest.java
  • src/main/java/com/williamcallahan/javachat/model/GuidedLesson.java
  • src/main/java/com/williamcallahan/javachat/service/GuidedLearningService.java
  • src/main/java/com/williamcallahan/javachat/service/GuidedTOCProvider.java
  • src/main/java/com/williamcallahan/javachat/service/QdrantRetrievalConstraintBuilder.java
  • src/main/java/com/williamcallahan/javachat/service/RetrievalConstraint.java
  • src/main/java/com/williamcallahan/javachat/service/RetrievalService.java
  • src/main/java/com/williamcallahan/javachat/support/PdfCitationEnhancer.java
  • src/main/java/com/williamcallahan/javachat/util/JavadocMemberAnchorResolver.java
  • src/main/java/com/williamcallahan/javachat/web/ChatController.java
  • src/main/java/com/williamcallahan/javachat/web/GuidedLearningController.java
  • src/main/java/com/williamcallahan/javachat/web/SseConstants.java
  • src/main/java/com/williamcallahan/javachat/web/SseSupport.java
  • src/main/resources/application.properties
  • src/main/resources/documentation-seed-document-types.manifest
  • src/main/resources/documentation-sources.manifest
  • src/main/resources/guided/lessons/arrays.md
  • src/main/resources/guided/lessons/building-rest-apis-with-spring-boot.md
  • src/main/resources/guided/lessons/choosing-a-jvm-language.md
  • src/main/resources/guided/lessons/classes-and-objects.md
  • src/main/resources/guided/lessons/clojure-on-the-jvm.md
  • src/main/resources/guided/lessons/collections.md
  • src/main/resources/guided/lessons/concurrency-and-virtual-threads.md
  • src/main/resources/guided/lessons/conditionals.md
  • src/main/resources/guided/lessons/data-access-and-testing-in-spring-boot.md
  • src/main/resources/guided/lessons/dependency-injection-and-configuration.md
  • src/main/resources/guided/lessons/enums-and-sealed-types.md
  • src/main/resources/guided/lessons/exceptions.md
  • src/main/resources/guided/lessons/file-io.md
  • src/main/resources/guided/lessons/garbage-collection-and-memory.md
  • src/main/resources/guided/lessons/generics.md
  • src/main/resources/guided/lessons/groovy-on-the-jvm.md
  • src/main/resources/guided/lessons/interfaces-and-inheritance.md
  • src/main/resources/guided/lessons/introduction-to-java.md
  • src/main/resources/guided/lessons/kotlin-on-the-jvm.md
  • src/main/resources/guided/lessons/lambdas-and-streams.md
  • src/main/resources/guided/lessons/loops.md
  • src/main/resources/guided/lessons/methods.md
  • src/main/resources/guided/lessons/modern-java-pattern-matching.md
  • src/main/resources/guided/lessons/modules.md
  • src/main/resources/guided/lessons/packages-and-imports.md
  • src/main/resources/guided/lessons/quarkus-fundamentals.md
  • src/main/resources/guided/lessons/records.md
  • src/main/resources/guided/lessons/recursion.md
  • src/main/resources/guided/lessons/scala-on-the-jvm.md
  • src/main/resources/guided/lessons/spring-boot-fundamentals.md
  • src/main/resources/guided/lessons/spring-boot-vs-quarkus.md
  • src/main/resources/guided/lessons/strings.md
  • src/main/resources/guided/lessons/testing-with-junit.md
  • src/main/resources/guided/lessons/variables-and-types.md
  • src/main/resources/guided/toc.json
  • src/test/java/com/williamcallahan/javachat/config/DocumentationSourceManifestTest.java
  • src/test/java/com/williamcallahan/javachat/service/GuidedLearningServiceCitationTest.java
  • src/test/java/com/williamcallahan/javachat/service/GuidedLessonCuratedContentTest.java
  • src/test/java/com/williamcallahan/javachat/service/GuidedTOCProviderTest.java
  • src/test/java/com/williamcallahan/javachat/service/QdrantRetrievalConstraintBuilderTest.java
  • src/test/java/com/williamcallahan/javachat/service/RetrievalConstraintTest.java
  • src/test/java/com/williamcallahan/javachat/service/RetrievalServiceTest.java
  • src/test/java/com/williamcallahan/javachat/util/JavadocTypeCanonicalizerTest.java
  • src/test/java/com/williamcallahan/javachat/web/ChatControllerStreamingFailureTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerBackpressureOverflowTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerCuratedContentTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerStreamingFailureTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedLearningControllerTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedSseCitationEventTest.java
💤 Files with no reviewable changes (3)
  • src/main/java/com/williamcallahan/javachat/support/PdfCitationEnhancer.java
  • src/main/resources/application.properties
  • src/main/java/com/williamcallahan/javachat/config/AppProperties.java

Comment threadfrontend/src/lib/services/pageMetadata.ts Outdated
Comment threadscripts/documentation_seed.py
Comment threadscripts/fetch_all_docs.sh Outdated
Comment threadscripts/fetch_all_docs.sh Outdated
Comment threadscripts/lib/documentation_fetch_sources.sh
Comment threadsrc/main/resources/guided/lessons/data-access-and-testing-in-spring-boot.md Outdated
Comment threadsrc/main/resources/guided/lessons/data-access-and-testing-in-spring-boot.md Outdated
Comment threadsrc/main/resources/guided/lessons/dependency-injection-and-configuration.md Outdated
Comment threadsrc/main/resources/guided/lessons/groovy-on-the-jvm.md Outdated
Comment threadsrc/main/resources/guided/lessons/records.md Outdated
@WilliamAGHWilliamAGH changed the title feat(learning): ground lessons in canonical sources and deliver citations fasterfeat(learning): ground guided lessons with durable citationsJul 18, 2026
@WilliamAGH
WilliamAGH merged commit f371d53 into mainJul 18, 2026
7 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationenhancementNew feature or requestjavaPull requests that update java codejavascriptPull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@WilliamAGH