Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
67d5694
chore: remove hash history (#12183)
jordanrfrazier Mar 16, 2026
8dbcbb0
chore: release nightlies from of release branch (#12181)
Adam-Aghili Mar 16, 2026
37cf0a1
test: add upgrade migration check to ci (#12061)
jordanrfrazier Mar 16, 2026
3811db4
feat(deployments): unify payload passthrough from api to adapter (#12…
HzaRashid Mar 16, 2026
2d3be10
fix: allow clearing Max Tokens field with Backspace/Delete (#12198)
viktoravelino Mar 16, 2026
94c94ad
fix: Resolve CodeQL false positives for path injection and URL substr…
Cristhianzl Mar 16, 2026
68edb4a
fix: Add explicit left/right DataFrame inputs for merge operations (#…
Cristhianzl Mar 16, 2026
7c5bda4
fix: add dict to allowlist preventing TableInput data loss (#12074)
AntonioABLima Mar 16, 2026
facd0b1
chore: update pyproject versions 1.9.0
Adam-Aghili Mar 17, 2026
13908b2
fix: 1.9.0 nightly
Adam-Aghili Mar 17, 2026
4325301
feat: add wxO deployment adapter (#12079)
HzaRashid Mar 17, 2026
11bda00
fix: 1.9.0 nightly (#12210)
Adam-Aghili Mar 17, 2026
f801a8d
fix(mcp): Add schema-driven type conversion (#11796)
schuellerf Mar 17, 2026
288719d
fix: prevent overwriting user-selected global variables in provider c…
stevehaertel Mar 17, 2026
38eed35
fix: Fixed CodeQL security scan about Incomplete URL substring saniti…
MateuszOssGit Mar 17, 2026
a820c6f
fix: remove ibm-watsonx extra from complete installation (#12230)
HzaRashid Mar 18, 2026
2d32e52
docs: lfx readme content (#11870)
mendonk Mar 18, 2026
082b8e3
docs: add a copy to markdown button to docusaurus theme (#12189)
mendonk Mar 18, 2026
b36444f
docs: add versioning (#12218)
mendonk Mar 18, 2026
e8bbae8
docs: replace api build automation (#12214)
mendonk Mar 18, 2026
d50eda2
fix: prevent arbitrary file write via path traversal in files endpoin…
Jkavia Mar 18, 2026
3d1c122
docs: Add AI coding agent skills for code review, testing, and refact…
Cristhianzl Mar 19, 2026
f46ff2a
feat: Add Windows Playwright testing to nightly builds (#12221)
vjgit96 Mar 19, 2026
c5d9c63
fix: Avoid foreign key violation on span table with topological sort …
erichare Mar 19, 2026
ac05f1e
fix: use deepcopy to prevent shared reference mutation in component u…
viktoravelino Mar 19, 2026
7d4ffbc
feat: add support for Langchain 1.0 (#11114)
ogabrielluiz Mar 19, 2026
5c9bbe5
fix: prevent CI injection via unsanitized GitHub context interpolatio…
AntonioABLima Mar 19, 2026
69da593
feat: Refactor and Unify the ModelInput Selector Across Components (#…
erichare Mar 19, 2026
922a49a
fix: Wait for dynamic model fetch in Nvidia (#12229)
erichare Mar 20, 2026
04b4af6
fix: protect image downloads by flow ownership (#12234)
andifilhohub Mar 20, 2026
d26ae48
docs: enhance Agentics documentation with embedded video and full pap…
Mar 20, 2026
198fab1
feat: Add Windows Playwright test fixes to RC (#12265)
vjgit96 Mar 20, 2026
15c803a
fix: Sanitize folder names for CodeQL (#12263)
erichare Mar 20, 2026
2a9b2ea
fix(deps): pin tar-fs to >=2.1.4 to fix symlink following vulnerabili…
RamGopalSrikar Mar 23, 2026
fb6b069
fix: Rebuild the embedding model in the nv template (#12275)
erichare Mar 23, 2026
b288b39
fix: support ZIP file upload for flows and projects endpoints (#12253)
viktoravelino Mar 23, 2026
dbb718a
docs: cherry pick 1.8 changes from main to release (#12292)
mendonk Mar 23, 2026
f625ef2
test: add playwright code coverage (#12294)
Adam-Aghili Mar 23, 2026
2a4b17e
fix(test): Fix Playwright E2E tests and backend compatibility on Wind…
Cristhianzl Mar 24, 2026
b639eb8
fix: resolve File Component 'no component context' error for non-ASCI…
viktoravelino Mar 24, 2026
72e0819
fix: Handle multiple outputs in ComponentToolkit and clean edge logic…
Cristhianzl Mar 25, 2026
c291ebe
fix(docker): Remove broken npm self-upgrade from Docker images (#12309)
Cristhianzl Mar 25, 2026
518cee3
feat(models): Add latest OpenAI GPT-5.3 and GPT-5.4 model families …
Cristhianzl Mar 25, 2026
5f2f287
test: add PostgreSQL to migration CI tests (#12257)
jordanrfrazier Mar 25, 2026
098f3b4
fix: File Manager last item cut off in normal view (#12254)
viktoravelino Mar 25, 2026
677f16b
feat: add session_metadata JSON column to message table (#12255)
HimavarshaVS Mar 25, 2026
44024d9
feat(playground): add bulk delete sessions with Select All functional…
keval718 Mar 25, 2026
792808b
fix: prevent path traversal in knowledge base bulk delete (#12243)
AntonioABLima Mar 25, 2026
313eff2
fix: disable dangerous deserialization by default in FAISS component …
RamGopalSrikar Mar 25, 2026
c30150a
Fix: session metadata migration consistency (#12328)
HimavarshaVS Mar 25, 2026
ed12502
fix: Use plain axios for external GitHub and Discord API calls (#12347)
Cristhianzl Mar 26, 2026
b35c123
fix: Add ephemeral file upload support …
Cristhianzl Mar 26, 2026
6126d2d
fix(core): Add environment variable fallback for provider API key res…
Cristhianzl Mar 26, 2026
937de01
feat(ui): Add custom build error message transform hook (#12208)
Cristhianzl Mar 26, 2026
41d34b2
fix: prevent path traversal in knowledge base create endpoint (#12337)
AntonioABLima Mar 26, 2026
881b37d
fix: update PyTorch to 2.6.0+ to fix torch.load() RCE vulnerability (…
Jkavia Mar 26, 2026
42832d0
feat: add core deployment implementation (#12108)
HzaRashid Mar 26, 2026
efbc4a1
fix: prevent MCP command injection via allowlist validation (CWE-78) …
Jkavia Mar 27, 2026
1f73419
ref: add feature flag around BE wxo deployments (#12365)
jordanrfrazier Mar 27, 2026
2473c1b
fix: replace grep -oP with sed for Node.js version extraction in Dock…
vjgit96 Mar 27, 2026
8ab4f5a
fix: enforce ownership check in build_flow endpoint (GHSA-qj98-rhf8-v…
AntonioABLima Mar 27, 2026
b09b3eb
chore: update deps due to security vulnerabilities (#12371)
Adam-Aghili Mar 27, 2026
acc6491
ci: upgrade runtime to python:3.14.3-slim-trixie (#12369)
Adam-Aghili Mar 29, 2026
46d18e3
feat(deployments): add environment variable overrides for IBM IAM URL…
HzaRashid Mar 30, 2026
4a98666
deps: add official wxo client package to langflow-base complete (#12383)
HzaRashid Mar 30, 2026
1f1fb20
fix: enforce message ownership in monitor endpoints (#12202)
andifilhohub Mar 30, 2026
263cfc6
fix(test): Increase timeout and add waitFor on folder rename input (#…
Cristhianzl Mar 31, 2026
51fd75b
perf(test): Optimize CI tests causing timeout on Windows and Python 3…
Cristhianzl Mar 31, 2026
1810174
fix: Fix shareable playground build events and message rendering …
Cristhianzl Mar 31, 2026
4e449da
fix: update npm dependencies (#12412)
Jkavia Mar 31, 2026
be55784
fix: Add platform markers to cuga extra for macOS x86_64 (#12416)
Cristhianzl Mar 31, 2026
ba34729
docs: CSS redesign (#12306)
mendonk Mar 31, 2026
dd70205
fix: Propagate error details to Playground chat on flow build fail…
Cristhianzl Mar 31, 2026
86dd7df
fix: resolve code scanning alerts for URL sanitization and insecure r…
ogabrielluiz Mar 31, 2026
7c5668e
docs: rename data to JSON and dataframe to table (#12352)
mendonk Mar 31, 2026
9543d7d
feat: MCP server for operating Langflow via REST API (#12237)
ogabrielluiz Mar 31, 2026
ccc7ffa
fix: Improve the sub-process handling of the Docling Worker (#12296)
erichare Mar 31, 2026
1de571a
feat(wxo): list / update (agents) directly from Langflow API (#12390)
HzaRashid Mar 31, 2026
61fac94
feat: Add Langflow Assistant chat panel for component generation (#11…
Cristhianzl Mar 31, 2026
73f7bb0
feat(deployments): add list (llms) endpoint and wxo implementation (#…
HzaRashid Mar 31, 2026
3815b9b
fix(test): Add missing required `llm` field to Watsonx deployment map…
Cristhianzl Apr 1, 2026
1337a70
fix(test): Add missing required `llm` field and fix flaky assertions …
Cristhianzl Apr 1, 2026
cb665e0
fix(mcp): Stop sending API key as Bearer token in MCP client (#12349)
Cristhianzl Mar 26, 2026
e3b90b7
Revert "fix(mcp): Stop sending API key as Bearer token in MCP client …
ogabrielluiz Apr 1, 2026
1c2a79c
fix: Address a dictionary comprehension ruff error (#12438)
erichare Apr 1, 2026
c43fbc9
feat: LE-374 token usage tracking for LLM and Agent components (#11891)
viktoravelino Apr 1, 2026
389f702
fix: Always resolve first dep for determinism (#12204)
erichare Apr 1, 2026
5a0d36c
fix: Support self-referential MCP JSON schema (#12359)
erichare Apr 1, 2026
2ef9a5f
fix: redact sensitive information from log output (#12271)
ogabrielluiz Apr 1, 2026
9f255dc
chore: remove mypy from CI (#12448)
ogabrielluiz Apr 1, 2026
96c9035
docs: point security reports to hackerone (#12368)
mendonk Apr 2, 2026
8c08e1b
feat: opensearch multimodal: support filters, adjust defaults (#12319)
edwinjosechittilappilly Apr 2, 2026
c08a465
docs: block custom components with env var (#12413)
mendonk Apr 2, 2026
a2d3c18
feat: MCP server UX improvements, batch, and spec-based flow creation…
ogabrielluiz Apr 2, 2026
61bc076
fix: restore langflow-logo-color-black-solid.svg removed in docs rele…
tarciorodrigues Apr 2, 2026
45325f6
feat: Langflow SDK and Flow DevOps API Toolkit (#12245)
erichare Apr 2, 2026
b0a8662
docs: add CI optimization analysis for pre-release builds (#12207)
vjgit96 Apr 2, 2026
4bdc87d
fix: Import and Statistics fixes for Knowledge Bases (#12446)
erichare Apr 2, 2026
e6846ea
feat(ui): Add "Connect other models" option for model-type handles (#…
Cristhianzl Apr 2, 2026
103ef7d
fix: Close popup when navigating to MCP settings (#12358)
erichare Apr 2, 2026
4e8c5e7
feat: add Langflow MCP Client settings page (#12321)
ogabrielluiz Apr 2, 2026
cea8b1a
feat: flow event polling for real-time MCP agent activity (#12340)
ogabrielluiz Apr 2, 2026
d0104ab
Merge branch 'release-1.9.0' into docs/update-agentics-video-and-refe…
mendonk Apr 3, 2026
abd772f
fix: Build and install the langflow-sdk for lfx (fixes nightly) (#12481)
erichare Apr 3, 2026
63e6a1d
fix: upgrade dependencies to address CVE vulnerabilities (#12470)
Jkavia Apr 3, 2026
68642a8
fix: Properly grep for the langflow version (#12486)
erichare Apr 3, 2026
6eaa938
fix: add SSRF protection to URL component (PVR0699081) (#11996)
RamGopalSrikar Apr 3, 2026
32c72b0
fix(mcp): stop sending API key as Bearer token in MCP client (#12441)
ogabrielluiz Apr 3, 2026
3ee4bd5
docs: test harness for api reference code samples (#12338)
mendonk Apr 3, 2026
ed3820b
docs: increase padding for sidebars icons (#12480)
mendonk Apr 3, 2026
941d4c7
Merge branch 'release-1.9.0' into docs/update-agentics-video-and-refe…
mendonk Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
225 changes: 225 additions & 0 deletions .agents/skills/backend-code-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
---
name: backend-code-review
description: Review backend code for quality, security, maintainability, and best practices based on established checklist rules. Use when the user requests a review, analysis, or improvement of backend files (e.g., `.py`) under the `src/backend/` directory. Do NOT use for frontend files (e.g., `.tsx`, `.ts`, `.js`). Supports pending-change review, code snippets review, and file-focused review.
---

# Backend Code Review

## When to use this skill

Use this skill whenever the user asks to **review, analyze, or improve** backend code (e.g., `.py`) under the `src/backend/` directory. Supports the following review modes:

- **Pending-change review**: when the user asks to review current changes (inspect staged/working-tree files slated for commit to get the changes).
- **Code snippets review**: when the user pastes code snippets (e.g., a function/class/module excerpt) into the chat and asks for a review.
- **File-focused review**: when the user points to specific files and asks for a review of those files (one file or a small, explicit set of files, e.g., `src/backend/base/langflow/api/v1/flows.py`).

Do NOT use this skill when:

- The request is about frontend code or UI (e.g., `.tsx`, `.ts`, `.js`, `src/frontend/`).
- The user is not asking for a review/analysis/improvement of backend code.
- The scope is not under `src/backend/` (unless the user explicitly asks to review backend-related changes outside `src/backend/`).

## How to use this skill

Follow these steps when using this skill:

1. **Identify the review mode** (pending-change vs snippet vs file-focused) based on the user's input. Keep the scope tight: review only what the user provided or explicitly referenced.
2. Follow the rules defined in **Checklist** to perform the review. If no Checklist rule matches, apply **General Review Rules** as a fallback to perform the best-effort review.
3. Compose the final output strictly following the **Required Output Format**.

Notes when using this skill:
- Always include actionable fixes or suggestions (including possible code snippets).
- Use best-effort `File:Line` references when a file path and line numbers are available; otherwise, use the most specific identifier you can.

## Checklist

- db schema design: if the review scope includes code/files under `src/backend/base/langflow/services/database/models/` or Alembic migrations under `src/backend/base/langflow/alembic/versions/`, follow [references/db-schema-rule.md](references/db-schema-rule.md) to perform the review
- architecture: if the review scope involves route/service/model layering, dependency direction, or moving responsibilities across modules, follow [references/architecture-rule.md](references/architecture-rule.md) to perform the review
- service abstraction: if the review scope contains table/model operations (e.g., `select(...)`, `session.execute(...)`, joins, CRUD) and is not already inside a service under `src/backend/base/langflow/services/`, follow [references/repositories-rule.md](references/repositories-rule.md) to perform the review
- sqlalchemy patterns: if the review scope involves SQLAlchemy/SQLModel session/query usage, db transaction/crud usage, `session_scope()` usage, or raw SQL usage, follow [references/sqlalchemy-rule.md](references/sqlalchemy-rule.md) to perform the review

## General Review Rules

### 1. Security Review

Check for:
- SQL injection vulnerabilities (especially raw `text()` queries with string interpolation). Consequence: attacker can read/modify/delete any data in the database.
- Server-Side Request Forgery (SSRF) in component HTTP calls. Consequence: attacker uses the server to scan internal networks or access cloud metadata endpoints.
- Command injection (especially in subprocess or shell-executing components). Consequence: attacker gains shell access to the server.
- Insecure deserialization (pickle, yaml.load without SafeLoader). Consequence: arbitrary code execution on the server.
- Hardcoded secrets/credentials. Consequence: secrets leak via git history and are impossible to fully revoke.
- Improper authentication/authorization (missing `CurrentActiveUser` dependency). Consequence: unauthenticated users can access protected endpoints.
- Insecure direct object references (missing `user_id` scoping on queries). Consequence: user A can read/modify user B's flows, variables, API keys.
- Path traversal in file storage operations. Consequence: attacker reads arbitrary server files (e.g., `/etc/passwd`, `.env`).

### 2. Performance Review

Check for:
- N+1 queries (especially in loops calling `session.execute()`). Consequence: 100 flows = 101 DB queries instead of 2; page load goes from 50ms to 5s.
- Missing database indexes on frequently queried columns. Consequence: full table scans on large datasets; queries degrade from O(log n) to O(n).
- Memory leaks (unbounded caches, retained references in long-lived services). Consequence: server OOM after hours of operation; pods restart in production.
- Blocking operations in async code (`time.sleep()`, synchronous I/O, CPU-bound work without `run_in_executor`). Consequence: entire event loop stalls; all concurrent requests hang until the blocking call completes.
- Missing caching opportunities for expensive computations. Consequence: repeated computation of the same result on every request.
- Large result sets loaded entirely into memory without pagination. Consequence: memory spike + slow response when user has 10K+ flows.

### 3. Code Quality Review

Check for:
- Code forward compatibility with Python 3.10-3.13
- Code duplication (DRY violations — extract when the *exact same business rule* is duplicated in 3+ places)
- Functions doing too much (SRP violations — if you need "and" to describe it, split it)
- Deep nesting / complex conditionals (prefer early returns and guard clauses)
- Magic numbers/strings (extract to named constants or enums)
- Poor naming: unclear abbreviations, misleading names, generic names (`data`, `result`, `obj`, `temp`). Functions should use verbs (`get`, `create`, `validate`). Booleans should use prefixes (`is_`, `has_`, `can_`, `should_`).
- Missing error handling (bare `except`, swallowed exceptions, silent failures)
- Incomplete type coverage (use strong typing, avoid `Any` where a concrete type is known)
- Use Python 3.10+ union syntax (`X | Y` not `Union[X, Y]`, `X | None` not `Optional[X]`)
- Use `TYPE_CHECKING` guard for imports only needed for type annotations (prevents circular imports)
- Use `Annotated[Type, Depends(...)]` with project aliases (`CurrentActiveUser`, `DbSession`, `DbSessionReadOnly`) for FastAPI DI
- Google-style docstrings (enforced by Ruff): `Args:`, `Returns:`, `Raises:` sections for public functions
- Violations of SOLID principles
- YAGNI violations (code that anticipates future needs without a present requirement)
- Line length exceeding 120 characters (project Ruff config)
- Comments that explain WHAT instead of WHY (comments should only explain reasoning, not restate code)
- Commented-out code (use version control instead)
- Boolean parameters that switch function behavior (split into two named functions instead)
- Mutable shared state where immutable alternatives exist (prefer returning new objects over mutation)

### 4. File Structure Review

Check for:
- Production files exceeding ~500 lines of code (excluding imports, types, and docstrings). Files above 600 lines are a red flag and should be split by responsibility. Why: Files above 500 lines have statistically higher defect rates and take longer to review. They signal multiple responsibilities (SRP violation). In Langflow, services like `DatabaseService` that grow beyond this limit should have their CRUD operations extracted to dedicated modules.
- Test files exceeding ~1000 lines. Split by logical grouping if exceeded.
- No more than 5 functions with different responsibilities in a single file (per AGENTS-example.md).
- Each file has a single reason to exist and a single reason to change (SRP).
- No generic file names: `utils.py`, `helpers.py`, `misc.py`, `common.py` as standalone files. Why: A file named `utils.py` becomes a dumping ground for unrelated functions. Within months it has 50+ functions covering formatting, validation, parsing, and HTTP calls — violating SRP. Each function group should be in a file named after its responsibility (`formatting.py`, `validation.py`).

### 5. Testing Review

Check for:
- Missing test coverage for new code paths
- Tests that don't test behavior (testing implementation details)
- Flaky test patterns (time-dependent, order-dependent, external-service-dependent)
- Proper use of `pytest.mark.asyncio` for async tests
- Excessive mocking (prefer real integrations per project conventions)
- Coverage target: 80% (minimum acceptable: 75%)
- Test anti-patterns: The Liar (passes but doesn't verify claimed behavior), The Mirror (asserts exactly what code does), The Giant (50+ lines setup), The Mockery (tests only mock setup), The Inspector (coupled to implementation), The Chain Gang (depends on execution order), The Flaky (inconsistent results)

**Happy path tests are the foundation but are NOT enough.** Tests MUST also challenge the code to find real defects:

- **Unexpected inputs**: `None`, `""`, `[]`, `{}`, `0`, `-1`, `UUID("00000000-0000-0000-0000-000000000000")`
- **Boundary values**: max length strings, exactly at the limit, one past the limit, zero items, max items
- **Malformed data**: missing required fields, extra unexpected fields, wrong types, invalid formats
- **Error states**: what happens when the database is down? When an external API returns 500? When the user doesn't exist?
- **What should NOT happen**: verify that user A CANNOT access user B's flows. Verify that a deleted flow returns 404. Verify that invalid `endpoint_name` is rejected with 422.
- **Error messages and types**: not just that it fails, but that it fails with the RIGHT exception and the RIGHT message
- **Concurrency**: what happens when two requests try to update the same flow simultaneously?

**Write tests based on REQUIREMENTS/SPEC, not on what the source code currently does.** This is how you catch bugs where the code diverges from expected behavior.

**When a test fails:** first ask if the CODE is wrong, not the test. Do NOT silently change a failing assertion to match the current code without understanding WHY.

### 6. Observability Review

Check for:
- Use the async logger from `lfx.log.logger` with `a`-prefixed methods (`adebug`, `ainfo`, `awarning`, `aerror`, `aexception`). Never use `print()` or stdlib `logging`.
- Log at key decision points and boundaries, not inside tight loops
- Include: operation name, relevant IDs, outcome (success/failure), duration if relevant
- Correct log levels: ERROR (broken, needs attention), WARN (degraded but recoverable), INFO (significant events), DEBUG (diagnostic, off in prod)
- **ZERO PII TOLERANCE**: Never log email addresses, user names, phone numbers, tokens, passwords. Only approved identifiers: `user_id`, `flow_id`, `session_id`
- No `print()` statements — these go to production logs
- Use `{e!s}` for string representation of exceptions in log messages

### 7. Pre-Commit Verification

For pending-change reviews, verify the author has run:
- `make format_backend` (Ruff formatter) — inconsistent formatting creates noisy diffs that hide real changes in code review. Format first, review second.
- `make lint` (MyPy type checking) — type errors caught at lint time are 10x cheaper to fix than runtime crashes in production. Langflow services use duck typing via `Service` base class; MyPy catches mismatches early.
- `make unit_tests` (pytest) — a failing test means the change breaks existing behavior. Never merge with failing tests; investigate whether the code or the test is wrong.

## Required Output Format

When this skill is invoked, the response must exactly follow one of the two templates:

### Template A (any findings)

```markdown
# Code Review Summary

Found <X> critical issues need to be fixed:

## 🔴 Critical (Must Fix)

### 1. <brief description of the issue>

FilePath: <path> line <line>
<relevant code snippet or pointer>

#### Explanation

<detailed explanation and references of the issue>

#### Suggested Fix

1. <brief description of suggested fix>
2. <code example> (optional, omit if not applicable)

---
... (repeat for each critical issue) ...

Found <Y> suggestions for improvement:

## 🟡 Suggestions (Should Consider)

### 1. <brief description of the suggestion>

FilePath: <path> line <line>
<relevant code snippet or pointer>

#### Explanation

<detailed explanation and references of the suggestion>

#### Suggested Fix

1. <brief description of suggested fix>
2. <code example> (optional, omit if not applicable)

---
... (repeat for each suggestion) ...

Found <Z> optional nits:

## 🟢 Nits (Optional)
### 1. <brief description of the nit>

FilePath: <path> line <line>
<relevant code snippet or pointer>

#### Explanation

<explanation and references of the optional nit>

#### Suggested Fix

- <minor suggestions>

---
... (repeat for each nits) ...

## ✅ What's Good

- <Positive feedback on good patterns>
```

- If there are no critical issues or suggestions or optional nits or good points, just omit that section.
- If the issue number is more than 10, summarize as "Found 10+ critical issues/suggestions/optional nits" and only output the first 10 items.
- Don't compress the blank lines between sections; keep them as-is for readability.
- If there is any issue that requires code changes, append a brief follow-up question to ask whether the user wants to apply the fix(es) after the structured output. For example: "Would you like me to use the Suggested fix(es) to address these issues?"

### Template B (no issues)

```markdown
## Code Review Summary
✅ No issues found.
```
Loading
Loading