Skip to content

Fix uploaded lesson prompts through LMS preview#628

Merged
meiiie merged 1 commit into
mainfrom
codex/627-fix-uploaded-lesson-preview-intent
May 24, 2026
Merged

Fix uploaded lesson prompts through LMS preview#628
meiiie merged 1 commit into
mainfrom
codex/627-fix-uploaded-lesson-preview-intent

Conversation

@meiiie
Copy link
Copy Markdown
Owner

@meiiie meiiie commented May 24, 2026

Summary

  • Fixes Route uploaded lesson authoring prompt to LMS preview #627.
  • Routes uploaded-document singular lesson authoring prompts such as "t?o cho m?nh b?i h?c" through the deterministic LMS preview host action instead of uploaded-document fallback text.
  • Centralizes uploaded-document lesson preview intent in document_preview_contract and reuses it from preflight, tool payload shortcut, and tool collection.
  • Mounts PreviewPanel in the embed surface so host-action previews returned inside LMS iframe can be reviewed and applied.

Scope

  • Backend document preview/course intent contract and callers.
  • Focused regression tests for lesson preview intent and document fallback bypass.
  • Embed preview panel mounting for LMS iframe host-action apply UX.

Non-Scope

  • No real LMS mutation; E2E used a fake same-origin LMS parent and required preview + approval_token before apply.
  • No changes to generated dist-embed/ artifacts.
  • No provider/runtime configuration changes.

Verification

  • cd maritime-ai-service; uv run --python 3.12 --extra dev pytest tests/unit/test_document_preview_contract.py tests/unit/test_document_context_api.py::test_uploaded_document_preview_request_bypasses_fact_fast_path tests/unit/test_document_context_api.py::test_uploaded_document_lesson_creation_request_bypasses_fact_fast_path tests/unit/test_direct_node_document_preview_runtime.py tests/unit/test_direct_node_provider_errors.py::test_direct_response_node_rebinds_document_preview_tool_when_collection_misses tests/unit/test_direct_node_provider_errors.py::test_direct_response_node_preflights_document_preview_before_tool_collection -q --tb=short -> 12 passed.
  • cd maritime-ai-service; uv run --python 3.12 --extra dev ruff check app/engine/multi_agent/document_preview_contract.py app/engine/multi_agent/direct_node_uploaded_context.py app/engine/multi_agent/direct_document_preview_payloads.py app/engine/multi_agent/tool_collection.py tests/unit/test_document_preview_contract.py tests/unit/test_document_context_api.py -> passed.
  • cd wiii-desktop; npx vitest run src/__tests__/preview-panel-ui.test.tsx src/__tests__/context-bridge.test.ts --pool forks --maxWorkers=1 -> 24 passed.
  • cd wiii-desktop; npx tsc --noEmit -> passed.
  • cd wiii-desktop; npm run build:embed -> passed; Vite emitted existing chunk-size / ineffective dynamic import warnings.
  • Headless Playwright fake LMS E2E: embed.html iframe + real DOCX upload ke-hoach-bai-hoc-wiii-e2e.docx -> document parse via markitdown -> prompt "t?o cho m?nh b?i h?c" -> authoring.preview_lesson_patch with source refs -> PreviewPanel visible with preview-e2e-token -> Apply forwards preview_token and approval_token -> fake course editor draft updated -> 0 Pointy actions.
  • git diff --check -> passed.

Risk

  • Medium/high LMS authoring path risk: changes routing predicates for uploaded-document preview intent. Regression coverage keeps quiz/question prompts out of lesson preview and preserves course-plan markers.
  • Frontend risk is limited to embed surface mounting an existing PreviewPanel component; apply still uses host action request and requires returned approval_token when the host capability schema requires it.

Rollback

  • Revert this PR. Uploaded-document lesson creation prompts will return to prior fallback behavior and embed host-action previews will no longer expose the Wiii PreviewPanel apply surface.

Summary by CodeRabbit

  • New Features

    • Added preview panel component to the embedded chat interface for improved document visualization.
  • Improvements

    • Enhanced detection and routing of lesson preview and authoring requests from uploaded documents.
    • Improved document request classification logic for more accurate intent recognition.
  • Tests

    • Added test coverage for lesson preview request detection and document routing scenarios.

Review Change Stack

@meiiie meiiie requested a review from wiiiii123 as a code owner May 24, 2026 18:08
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 24, 2026

Warning

Review limit reached

@meiiie, we couldn't start this review because you've used your available PR reviews for now.

Your plan currently allows 1 review/hour. Refill in 46 minutes and 38 seconds.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more review capacity refills, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than trial, open-source, and free plans. In all cases, review capacity refills continuously over time.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: eeacbcc4-44e9-497a-b810-39d35a97434f

📥 Commits

Reviewing files that changed from the base of the PR and between 0a614da and 1ebe7b1.

📒 Files selected for processing (7)
  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
  • maritime-ai-service/tests/unit/test_document_context_api.py
  • maritime-ai-service/tests/unit/test_document_preview_contract.py
  • wiii-desktop/src/EmbedApp.tsx
📝 Walkthrough

Walkthrough

This PR centralizes uploaded-document lesson authoring and preview intent detection into a new document_preview_contract module with configurable markers and keyword patterns. Backend routing consumers (tool_collection, direct modules) now delegate to this shared contract instead of using local heuristics. Frontend adds lazy-loaded PreviewPanel component to embed. Backend tests validate intent matching; routing determinism is verified via new test.

Changes

Lesson Preview Intent Routing & Frontend Integration

Layer / File(s) Summary
Lesson-preview contract definition with markers
maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
New looks_uploaded_document_lesson_preview_request(query) public contract function with marker sets for lesson authoring (with exclusion logic) and lesson-preview queries. Helper determines singular lesson authoring from Vietnamese/English keywords; contract returns true when normalized query matches preview markers or singular authoring criteria.
Lazy routing helpers in tool_collection
maritime-ai-service/app/engine/multi_agent/tool_collection.py
Introduces _looks_uploaded_document_course_request and _looks_uploaded_document_lesson_preview_request as lazy-loaded module helpers delegating to contract. Updates _looks_like_document_preview_request to combine course/lesson-preview contract checks; simplifies _looks_like_document_course_preview_request to contract delegation after context verification.
Direct module routing consumers
maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py, maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
Imports new lesson-preview and course request helpers; replaces prior hardcoded marker heuristics in _should_request_uploaded_doc_preview and _looks_uploaded_document_preview_request with delegated contract checks using folded query text.
Backend intent detection test coverage
maritime-ai-service/tests/unit/test_document_preview_contract.py, maritime-ai-service/tests/unit/test_document_context_api.py
New test_uploaded_document_lesson_preview_intent_is_shared_by_preview_and_tool_rounds validates intent matching across multiple Vietnamese/English prompts. Imports contract function. Updates test_document_preview_forced_tool_choice_prefers_course_when_available prompt. Adds test_uploaded_document_lesson_creation_request_bypasses_fact_fast_path for routing determinism.
Frontend PreviewPanel lazy integration
wiii-desktop/src/EmbedApp.tsx
Updates React imports to include lazy. Adds PreviewPanel constant via React.lazy with dynamic import of @/components/layout/PreviewPanel. Renders component inside Suspense boundary (fallback null) alongside ChatView in embed iframe.

Possibly related PRs

  • meiiie/wiii#408: Introduces centralized document_preview_contract intent helpers; this PR extends and uses those helpers for preview/course routing across backend consumers.
  • meiiie/wiii#540: Adds early document-preview preflight gating on looks_uploaded_document_preview_request callable; both PRs interconnect through the same preview-intent detection logic.
  • meiiie/wiii#294: Modifies tool_collection uploaded-document preview routing and host-action binding; this PR consolidates those same routing decisions through centralized contract delegation.

Suggested labels

area:backend, area:frontend

Suggested reviewers

  • wiiiii123
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.33% 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 name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: fixing uploaded lesson prompts to route through LMS preview instead of fallback handling.
Linked Issues check ✅ Passed Changes implement all core requirements from #627: broadened lesson authoring intent detection, preserved course-generation routing, added unit test coverage, and validated via fake LMS E2E.
Out of Scope Changes check ✅ Passed All changes are scoped correctly: backend intent detection refactoring, contract centralization, unit tests, and frontend PreviewPanel mounting for embed—no unrelated code alterations.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/627-fix-uploaded-lesson-preview-intent

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 and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

⚠️ Outside diff range comments (1)
maritime-ai-service/app/engine/multi_agent/tool_collection.py (1)

623-629: 🧹 Nitpick | 🔵 Trivial

Add explicit risk telemetry + rollback toggle for forced preview routing.

Risk note: this branch forces a host-action tool in uploaded-doc turns; misclassification can change write-adjacent LMS behavior.
Rollback note: keep a dedicated runtime flag (or env switch) to disable lesson-preview forcing independently of other host-action features, and log forced-route reason (course vs lesson_preview) for quick rollback decisions.

As per coding guidelines, changes under maritime-ai-service/app/{auth,core,engine,repositories}/** should include explicit risk and rollback notes for provider/runtime high-risk surfaces.

🤖 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 `@maritime-ai-service/app/engine/multi_agent/tool_collection.py` around lines
623 - 629, Add explicit risk telemetry, a dedicated runtime rollback toggle, and
a reason tag when forcing document-preview routing: guard the branch that calls
_looks_like_document_preview_request(...) and uses
_preferred_document_preview_host_action_tools(...) with a separate runtime
flag/env (e.g., ENABLE_FORCE_LESSON_PREVIEW) so preview forcing can be disabled
independently; emit structured telemetry/metrics and logger entries that include
a clear forced-route reason field ("course" vs "lesson_preview") and a risk note
string before returning preview_tools[:1], True; also add an inline comment
summarizing the rollback instruction and high-risk surface for future reviewers.
🤖 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 `@maritime-ai-service/app/engine/multi_agent/document_preview_contract.py`:
- Around line 90-106: The tuple _LESSON_PREVIEW_REQUEST_MARKERS contains overly
broad standalone tokens ("draft", "preview", "citation", "diff") that produce
false-positive routing to the LMS preview host-action; tighten matching so these
weak markers only trigger when anchored to a lesson context (e.g., require
presence of a lesson anchor token like "lesson", "bai hoc", "lesson patch", "ban
xem truoc" or localized equivalents, or convert them to explicit anchored
phrases such as "lesson preview", "preview_lesson", "lesson draft", "lesson
citation"); update _LESSON_PREVIEW_REQUEST_MARKERS accordingly and apply the
same tightening to the other preview-marker tuple defined elsewhere in this
module to preserve correct fallback behavior and routing.

In `@wiii-desktop/src/EmbedApp.tsx`:
- Around line 320-322: The Suspense wrapper around PreviewPanel currently uses
fallback={null}, which shows nothing while PreviewPanel lazy-loads; change the
Suspense fallback to a minimal loading indicator to avoid a flash (e.g., a small
spinner or placeholder). Locate the Suspense component wrapping <PreviewPanel />
in EmbedApp (symbols: Suspense and PreviewPanel) and replace fallback={null}
with a lightweight UX element (spinner, skeleton, or "Loading preview…") or
conditionally keep null only if PreviewPanel is guaranteed hidden on mount.

---

Outside diff comments:
In `@maritime-ai-service/app/engine/multi_agent/tool_collection.py`:
- Around line 623-629: Add explicit risk telemetry, a dedicated runtime rollback
toggle, and a reason tag when forcing document-preview routing: guard the branch
that calls _looks_like_document_preview_request(...) and uses
_preferred_document_preview_host_action_tools(...) with a separate runtime
flag/env (e.g., ENABLE_FORCE_LESSON_PREVIEW) so preview forcing can be disabled
independently; emit structured telemetry/metrics and logger entries that include
a clear forced-route reason field ("course" vs "lesson_preview") and a risk note
string before returning preview_tools[:1], True; also add an inline comment
summarizing the rollback instruction and high-risk surface for future reviewers.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3ba4a380-1e63-4f0e-86dd-c30e223979fc

📥 Commits

Reviewing files that changed from the base of the PR and between e07c53c and 0a614da.

📒 Files selected for processing (7)
  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
  • maritime-ai-service/tests/unit/test_document_context_api.py
  • maritime-ai-service/tests/unit/test_document_preview_contract.py
  • wiii-desktop/src/EmbedApp.tsx
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Backend Unit Gate
  • GitHub Check: Desktop Gate
  • GitHub Check: Unit Tests
  • GitHub Check: Build Images
  • GitHub Check: Security Audit (pip-audit)
  • GitHub Check: CodeQL Analyze (python)
  • GitHub Check: test
  • GitHub Check: test
  • GitHub Check: CodeQL Analyze (javascript-typescript)
🧰 Additional context used
📓 Path-based instructions (7)
wiii-desktop/src/**/*.{ts,tsx,json}

📄 CodeRabbit inference engine (AGENTS.md)

Preserve Vietnamese-first user-facing copy in UI, prompts, and error messages unless the surrounding product surface is intentionally English

Files:

  • wiii-desktop/src/EmbedApp.tsx
wiii-desktop/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

wiii-desktop/src/**/*.{ts,tsx}: For frontend-visible changes, include screenshots or a clear reason why visual evidence is not applicable
Run desktop verification: cd wiii-desktop && npx vitest run && npx tsc --noEmit && npm run build:embed
For wiii-desktop/src/**, verify SSE V3 event handling, persisted Zustand state, auth refresh, Tauri HTTP/fetch fallback parity, accessibility, responsive behavior, and no accidental loss of conversation state

wiii-desktop/src/**/*.{ts,tsx}: Never show raw internal tool JSON as the final answer in chat output
Keep renderer fixes in renderer or repair helpers, not inside random chat components
Avoid adding hidden global state for chat lifecycle; use explicit Zustand stores
Source references must remain visible when an answer uses uploaded documents
Vietnamese UI copy should be natural and accented unless the surrounding surface is intentionally English

Files:

  • wiii-desktop/src/EmbedApp.tsx
wiii-desktop/src/**

⚙️ CodeRabbit configuration file

wiii-desktop/src/**: Review React/Tauri changes for SSE correctness, persisted Zustand state, auth refresh behavior, accessibility, responsive UI, and CORS/Tauri HTTP fallback compatibility.

Files:

  • wiii-desktop/src/EmbedApp.tsx
maritime-ai-service/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Run backend verification: cd maritime-ai-service && set PYTHONIOENCODING=utf-8 && pytest tests/unit/ -p no:capture --tb=short -q && ruff check app/ --select=E9,F63,F7

Files:

  • maritime-ai-service/tests/unit/test_document_context_api.py
  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/tests/unit/test_document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
maritime-ai-service/app/{auth,core,engine,repositories}/**

📄 CodeRabbit inference engine (AGENTS.md)

maritime-ai-service/app/{auth,core,engine,repositories}/**: For backend, auth, memory, tenant isolation, migration, provider/runtime, MCP, or deployment changes, include explicit risk and rollback notes
Treat auth, JWT, OAuth, LMS token exchange, organization context, tenant isolation, semantic memory, long-term memory, MCP/tool execution, provider routing, migrations, and GitHub automation as high-risk surfaces requiring P0/P1 flagging when changes expose private data, cross tenant boundaries, bypass authorization, corrupt persistent memory, break streaming contracts, weaken deployment safety, or make rollback unclear

Files:

  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
maritime-ai-service/app/engine/**

📄 CodeRabbit inference engine (AGENTS.md)

For maritime-ai-service/app/engine/**, verify routing correctness, source propagation, memory/tool boundaries, streaming parity, structured output robustness, and fallback behavior

Files:

  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
maritime-ai-service/app/engine/multi_agent/**

📄 CodeRabbit inference engine (maritime-ai-service/AGENTS.md)

Agent runtime changes should preserve routing, tool loop, provider behavior, and source propagation

Files:

  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py

⚙️ CodeRabbit configuration file

maritime-ai-service/app/engine/multi_agent/**: Focus on routing correctness, streaming parity, memory/tool boundaries, structured output robustness, and fallback behavior. Flag hidden prompt or state-contract changes.

Files:

  • maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py
  • maritime-ai-service/app/engine/multi_agent/document_preview_contract.py
  • maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py
  • maritime-ai-service/app/engine/multi_agent/tool_collection.py
🔇 Additional comments (7)
wiii-desktop/src/EmbedApp.tsx (1)

20-20: PreviewPanel lazy import/export mapping is consistent

wiii-desktop/src/components/layout/PreviewPanel.tsx exports PreviewPanel as a named export, and EmbedApp.tsx correctly wraps it for React.lazy via { default: mod.PreviewPanel }. Using <PreviewPanel /> is also valid since inline is optional; the component returns null when the preview panel is closed, so Suspense fallback={null} won’t introduce unwanted placeholder UI.

maritime-ai-service/app/engine/multi_agent/document_preview_contract.py (1)

169-174: LGTM!

maritime-ai-service/app/engine/multi_agent/tool_collection.py (1)

27-39: LGTM!

Also applies to: 291-305

maritime-ai-service/app/engine/multi_agent/direct_document_preview_payloads.py (1)

12-13: LGTM!

Also applies to: 138-149

maritime-ai-service/app/engine/multi_agent/direct_node_uploaded_context.py (1)

11-13: LGTM!

Also applies to: 121-130

maritime-ai-service/tests/unit/test_document_preview_contract.py (1)

11-12: LGTM!

Also applies to: 48-53, 70-73

maritime-ai-service/tests/unit/test_document_context_api.py (1)

510-535: LGTM!

Comment on lines +320 to +322
<Suspense fallback={null}>
<PreviewPanel />
</Suspense>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider a loading fallback for better UX.

The fallback={null} means no loading indicator is shown during PreviewPanel's initial lazy load. If PreviewPanel is conditionally visible (only during LMS preview actions), this is acceptable. However, if it's immediately visible on mount, users may experience a brief content flash.

Optional: Add a minimal loading fallback
-        <Suspense fallback={null}>
+        <Suspense fallback={<div className="sr-only">Loading preview...</div>}>
           <PreviewPanel />
         </Suspense>

Note: Only needed if PreviewPanel is immediately visible. If it's hidden by default until preview actions trigger, fallback={null} is fine.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Suspense fallback={null}>
<PreviewPanel />
</Suspense>
<Suspense fallback={<div className="sr-only">Loading preview...</div>}>
<PreviewPanel />
</Suspense>
🤖 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 `@wiii-desktop/src/EmbedApp.tsx` around lines 320 - 322, The Suspense wrapper
around PreviewPanel currently uses fallback={null}, which shows nothing while
PreviewPanel lazy-loads; change the Suspense fallback to a minimal loading
indicator to avoid a flash (e.g., a small spinner or placeholder). Locate the
Suspense component wrapping <PreviewPanel /> in EmbedApp (symbols: Suspense and
PreviewPanel) and replace fallback={null} with a lightweight UX element
(spinner, skeleton, or "Loading preview…") or conditionally keep null only if
PreviewPanel is guaranteed hidden on mount.

@meiiie meiiie force-pushed the codex/627-fix-uploaded-lesson-preview-intent branch from 0a614da to 1ebe7b1 Compare May 24, 2026 18:21
@meiiie
Copy link
Copy Markdown
Owner Author

meiiie commented May 24, 2026

Governance note: repo-owned checks are green on commit 1ebe7b1. CodeRabbit is failing only with \Insufficient review credits, so this is treated as non-blocking per Wiii automation governance.

@meiiie meiiie merged commit c0b1fce into main May 24, 2026
19 of 20 checks passed
@meiiie meiiie deleted the codex/627-fix-uploaded-lesson-preview-intent branch May 24, 2026 18:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Route uploaded lesson authoring prompt to LMS preview

1 participant