theqtcompanyrnd/qt-qml-review
>- Invoke when the user asks to review, check, audit, or look over Qt6 QML code -- or suggest before committing. Runs deterministic linting (47+ rules) then six parallel deep- analysis agents covering bindings, layout, loaders, delegates, states, and performance. Optionally invokes system qmllint for type-level checks. Reports only high-confidence issues (>80/100) with structured mitigations. Read-only -- never modifies code.
npx skills add https://github.com/TheQtCompanyRnD/agent-skills --skill qt-qml-review
A structured, read-only code review skill for Qt6 QML code that
combines deterministic linting with parallel agent-driven deep
analysis across six focused domains.
"audit", "look over", "code review", "sanity check"
Detect the user's intended scope from their language:
Triggered by language like: "this commit", "these changes",
"the diff", "what I changed", "my changes", "staged changes",
"outstanding changes", "before I commit"
Action: Run git diff (unstaged) and git diff --cached
(staged) to obtain the changeset. If the user says "this commit",
use git diff HEAD~1..HEAD. Review only the changed lines plus
sufficient surrounding context (±50 lines) for understanding.
Only report issues found in the changed lines -- do not report
issues in unchanged surrounding context.
Triggered by language like: "review the codebase", "audit the
project", "check the repository", "review src/", or when a specific
file/directory path is given without commit language.
Action: Glob for *.qml files in the specified scope. Review
all matched files.
The review proceeds in three phases. Never skip a phase.
Run the unified Python linter against the target files. Requires
Python 3.6+ (no external dependencies). If Python is not available,
warn the user and skip to Phase 1b.
python3 references/lint-scripts/qt_qml_lint.py <files...>
# If python3 is not found, fall back to:
python references/lint-scripts/qt_qml_lint.py <files...>
This single-pass scanner encodes all mechanically-checkable rules
from the QML review checklist. It reads each file once and evaluates
all rules per line, plus block-level structural checks. Output is
deterministic and repeatable. The linter is authoritative -- do not
second-guess its output.
Collect all output before proceeding.
Rule categories (47+ checks):
Attempt to run qmllint if available on the system. Detection
order:
$QT_HOST_PATH/bin/qmllintwhich qmllint / where qmllintIf found, run with JSON output:
qmllint --json - -I <import-paths> <files...>
Parse the JSON output and merge with Python linter findings.
Deduplicate by file+line+issue. qmllint is authoritative for type-
level checks (unresolved types, incompatible assignments, alias
cycles). The Python linter is authoritative for style, ordering,
and performance patterns that qmllint does not cover.
Launch six focused review agents in parallel. Name each agent
descriptively when launching (e.g. "Agent 1: Bindings & Properties")
to provide progress visibility. Each agent has a tight scope
and a specific checklist. Agents are READ-ONLY -- they must
never edit or write files.
Tool-agnostic agent contract: Each agent described below is
a self-contained review mission. In Claude Code, launch them as
general-purpose subagents. In other tools, implement each as
whatever subprocess, prompt chain, or analysis pass the tool
supports. The key requirement is that each agent:
60-79 = investigation target (max 10 total across all
agents), <60 = suppress
(pass lint output as context to each agent)
See Agent missions below for the six agents.
Merge lint script output, qmllint output (if available), and all
agent findings. Deduplicate (same file+line+issue = one finding).
Apply confidence scoring. Format the final report using the output
format below.
Launch all six agents in parallel. Pass each agent:
Each agent should read all files in scope, then focus on its
assigned categories.
Scope: Binding correctness, property types, alias chains,
qualified lookup, binding loops.
Check for:
updates A) -- runtime only detects single-cycle
components may not be initialized
someProperty instead ofroot.someProperty) -- complements qmllint unqualified warning
with semantic context
Qt.binding() closures capturing loop variables by reference(use let not var)
pragma ComponentBehavior: Bound missing on files with delegatesthat access outer-scope ids
readonly on properties that are bound but neverimperatively assigned
References: references/qt-qml-review-checklist.md
sections 3 (Bindings & Properties)
Scope: Anchoring correctness, layout sizing, visual tree
structure.
Check for:
visible: false (resolve the target id,check its visible property)
common parent)
implicitWidth/implicitHeight bindingsthat could create feedback loops
Layout.fillWidth/Layout.fillHeight on items thatshould stretch
negotiation)
References: references/qt-qml-review-checklist.md
section 4 (Layout & Anchoring)
Scope: Loader patterns, dynamic object creation, Connections
lifecycle, C++ integration.
Check for:
Component.createObject() return values not tracked or destroyed(memory leak)
source and sourceComponent at runtime(unsupported)
Image.status errorhandling
Connections with dynamically-changing target not handlingnull target state
rootContext()->setContextProperty()) in C++integration code
returned from invokable functions)
References: references/qt-qml-review-checklist.md
sections 5 (Loader), 8 (Images), 13 (C++ Integration)
Scope: Model-view patterns, delegate lifecycle, reuse safety,
required properties.
Check for:
required property int index when index is used in adelegate that declares other required properties
model.roleName for roles not defined in themodel's roleNames()
bindings) that will degrade scroll performance
currentIndex usage without guards for known Qt bugs(QTBUG-48633, QTBUG-93293)
DelegateChooser patterns that could fail on non-QAbstractItemModel(choice made once at creation, not re-evaluated)
onPooled: visible = false pattern)
References: references/qt-qml-review-checklist.md
section 6 (ListView & Delegates)
Scope: State machine correctness, migration patterns, component
structure.
Check for:
PropertyChanges.restoreEntryValues surprises (propertiesreverting on state exit when developer expects them to persist)
Binding.restoreMode mismatch from Qt 5 migration (defaultchanged from RestoreNone to RestoreBindingOrValue)
Connections handler syntax (onFoo:) vsmodern function onFoo() in migrated code
QtGraphicalEffects imports that should be migrated toMultiEffect (Qt 6.5+)
StateGroup forreusability
from/to on transitions that could fire unexpectedlywhen new states are added
References: references/qt-qml-review-checklist.md
sections 7 (States), 14 (Migration)
Scope: Performance anti-patterns, rendering cost, JavaScript
quality, style consistency.
Check for:
should be cached as readonly property)
QRegularExpression or complex computation inside loopsText.PlainText when rich text is not needed (defaulttextFormat incurs parsing overhead)
font.preferShaping: false opportunity (when text shapingfeatures are unused)
that communicate up (should be signals)
id assignments on objects never referencedin QtObject { id: privates }
testability)
TapHandler/DragHandler for multi-touch)
width/height instead ofimplicitWidth/implicitHeight (prevents consumer resizing)
parent used without null-check in delegates or Loader items(can be null during creation/destruction)
pragma ComponentBehavior: Bound on files with delegatesthat access outer-scope ids
References: references/qt-qml-review-checklist.md
sections 9 (Performance), 10 (Style), 11 (Signals),
12 (JavaScript), 13 (C++ Integration)
| Confidence | Meaning | Action |
|------------|---------|--------|
| 90-100 | Certain: direct rule violation with full trace | Report as finding |
| 80-89 | High: rule violation confirmed but edge case possible | Report as finding |
| 60-79 | Medium: likely issue but cannot fully verify | Report as investigation target |
| <60 | Low: suspicion only | Suppress entirely |
Investigation targets are findings the agent believes are real
but cannot fully verify. These are presented in a separate section
for human verification. Maximum 10 investigation targets per report,
prioritized by confidence within the 60-79 band.
Present the final report as follows. Use exactly this structure.
## QML Code Review Report
**Scope**: [diff: `git diff HEAD~1..HEAD` | files: <paths>]
**Files reviewed**: N
**Issues found**: N (M from lint, K from deep analysis)
**qmllint**: [ran / not available]
---
### Lint findings
For each lint finding:
#### [L-NNN] <Short title>
- **File**: `path/to/file.qml:42`
- **Rule**: <rule ID from checklist>
- **Finding**: <what the script detected>
- **Mitigation**: <what to do, in prose -- no code patches>
---
### Deep analysis findings
For each agent finding:
#### [D-NNN] <Short title>
- **File**: `path/to/file.qml:42`
- **Category**: <agent name: Bindings & Properties | Layout &
Anchoring | Component Loading & Lifecycle | ListView &
Delegates | States & Structure | Performance & Quality>
- **Confidence**: NN/100
- **Finding**: <description of the issue>
- **Trace**: <how the issue was confirmed -- which symbols were
followed, what was checked>
- **Mitigation**: <what to do, in prose -- no code patches>
---
### Investigation targets (human verification needed)
Findings the agent identified but could not fully verify.
Maximum 10, sorted by confidence. These require human judgment.
For each investigation target:
#### [I-NNN] <Short title>
- **File**: `path/to/file.qml:42`
- **Category**: <agent name>
- **Confidence**: NN/100
- **Finding**: <what the agent suspects>
- **Unverified because**: <what the agent could not confirm>
- **How to verify**: <specific action for the reviewer>
---
### Summary
| Category | Lint | Deep | Investigate | Total |
|----------|------|------|-------------|-------|
| ... | N | N | N | N |
| **Total**| **M**| **K**| **I** | **N** |
Findings below confidence 60 are suppressed entirely.
The following reference files contain detailed checklists:
references/qt-qml-review-checklist.md -- Complete QML reviewrules (lint + agent rules, always loaded)
references/lint-scripts/qt_qml_lint.py -- Single-pass Pythonlinter (runs all 47+ checks in <1s)
Copyright (C) 2026 The Qt Company.
Take theqtcompanyrnd/qt-qml-review from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.