Code Review Checklist
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
Runs a 47-rule deterministic QML linter, then six parallel deep-analysis passes over bindings, layout, loaders, delegates, states, and performance.
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install x-tools-author/x-tools qt-qml-review --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/qt-qml-review .claude/skills/qt-qml-review && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .claude/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-reviewType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install x-tools-author/x-tools qt-qml-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/qt-qml-review .agents/skills/qt-qml-review && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .agents/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install x-tools-author/x-tools qt-qml-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/qt-qml-review .cursor/skills/qt-qml-review && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .cursor/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/x-tools-author/x-tools.git --path .github/skills/qt-qml-review--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install x-tools-author/x-tools qt-qml-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/qt-qml-review .gemini/skills/qt-qml-review && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .gemini/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install x-tools-author/x-tools qt-qml-reviewInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/qt-qml-review .github/skills/qt-qml-review && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .github/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add x-tools-author/x-tools --skill qt-qml-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install x-tools-author/x-tools qt-qml-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/x-tools-author/x-tools.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/qt-qml-review .opencode/skills/qt-qml-review && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "qt-qml-review" agent skill from https://github.com/x-tools-author/x-tools/tree/master/.github/skills/qt-qml-review into .opencode/skills/qt-qml-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qt-qml-review", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
qt-qml-reviewRuns a 47-rule deterministic QML linter, then six parallel deep-analysis passes over bindings, layout, loaders, delegates, states, and performance.
This skill detects whether the user means a narrow diff or commit scope, reviewing only changed lines from git diff with surrounding context, or a wide codebase scope that globs every QML file in the given path, and never skips the ordered review phases.
Phase one runs a dependency-free Python linter encoding every mechanically checkable rule as the authoritative first pass, covering import ordering, attribute ordering, binding style, and layout mixing among others. Later phases run parallel agents for deeper analysis and can optionally call the system qmllint for type-level checks, but the skill only reports findings above an 80/100 confidence threshold with a structured mitigation, and never modifies code itself.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6214c41. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Python), which the agent can run.
Shell commands in SKILL.md call:
gitpython3pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designed for Claude Code, GitHub Copilot, and similar agents.
From compatibility in the SKILL.md frontmatter.
Qt6 QML Code Reviewer loads about 3.6k tokens when it runs, and up to ~23k if it reads all its reference files. Until then it costs about 110 tokens; SKILL.md has 1,430 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from x-tools-author/x-tools at commit 6214c41, republished under its BSD-3-Clause licence (© x-tools-author). 1,430 words, ~3,584 tokens.
.claude/skills/qt-qml-review/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.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.
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:
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:
someProperty instead of
root.someProperty) -- complements qmllint unqualified warning
with semantic contextQt.binding() closures capturing loop variables by reference
(use let not var)pragma ComponentBehavior: Bound missing on files with delegates
that access outer-scope idsreadonly on properties that are bound but never
imperatively assignedReferences: 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)implicitWidth/implicitHeight bindings
that could create feedback loopsLayout.fillWidth/Layout.fillHeight on items that
should stretchReferences: 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 error
handlingConnections with dynamically-changing target not handling
null target staterootContext()->setContextProperty()) in C++
integration codeReferences: 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 a
delegate that declares other required propertiesmodel.roleName for roles not defined in the
model's roleNames()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 (properties
reverting on state exit when developer expects them to persist)Binding.restoreMode mismatch from Qt 5 migration (default
changed from RestoreNone to RestoreBindingOrValue)Connections handler syntax (onFoo:) vs
modern function onFoo() in migrated codeQtGraphicalEffects imports that should be migrated to
MultiEffect (Qt 6.5+)StateGroup for
reusabilityfrom/to on transitions that could fire unexpectedly
when new states are addedReferences: references/qt-qml-review-checklist.md
sections 7 (States), 14 (Migration)
Scope: Performance anti-patterns, rendering cost, JavaScript quality, style consistency.
Check for:
readonly property)QRegularExpression or complex computation inside loopsText.PlainText when rich text is not needed (default
textFormat incurs parsing overhead)font.preferShaping: false opportunity (when text shaping
features are unused)id assignments on objects never referencedQtObject { id: privates }width/height instead of
implicitWidth/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 delegates
that access outer-scope idsReferences: 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 review
rules (lint + agent rules, always loaded)references/lint-scripts/qt_qml_lint.py -- Single-pass Python
linter (runs all 47+ checks in <1s)Copyright (C) 2026 The Qt Company.
© x-tools-author, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references) in .github/skills/qt-qml-review of x-tools-author/x-tools.
Open the folder on GitHubat commit 6214c41
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in x-tools-author/x-tools, which our catalogue first saw on October 7, 2026.
Qt6 QML Code Reviewer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Qt6 QML Code Reviewer this skillx-tools-author/x-tools | 1.1k | 1 repos | ~3.6k | Automated safety check: Pass | BSD-3-Clause | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 4 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Saleor Commit Workflowsaleor/saleor | 23k | — | ~575 | Automated safety check: Pass | BSD-3-Clause | |
| Qt Cpp ReviewSerial-Studio/Serial-Studio | 7.2k | — | ~4.3k | Automated safety check: Pass | Custom licence | |
| Git History Bug Auditben-manes/caffeine | 18k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Qt Qml ReviewSerial-Studio/Serial-Studio | 7.2k | — | ~3.7k | Automated safety check: Pass | Custom licence |
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
saleor/saleor
Commits changes in the Saleor codebase and works through pre-commit hook failures from ruff, mypy, the GraphQL schema check and the migrations check.
Serial-Studio/Serial-Studio
Qt6/C++ deep code review for Serial Studio. An agent skill from Serial-Studio/Serial-Studio.
ben-manes/caffeine
Audits a module by walking its git history commit by commit, tracking unresolved issues forward, and reporting the ones that survive to HEAD as findings.
Serial-Studio/Serial-Studio
Qt6/QML deep code review for Serial Studio. An agent skill from Serial-Studio/Serial-Studio.
google/adk-python
Sets up a local ADK Python development environment in a git clone of the open-source adk-python repository: a uv virtual environment, all dependency extras, pre-commit hooks, and a first unit-test…
x-tools-author/x-tools
Read-only review of Qt6 C++ code that combines a deterministic lint script with six parallel analysis agents and reports only high-confidence issues.
x-tools-author/x-tools
Generates standalone Markdown reference docs for QML components and Qt Quick applications from .qml source and related C++ and build files, one file per component.
x-tools-author/x-tools
Finds what is making a Qt Quick interface stutter or drop frames by capturing a profiler trace and tracing the slow spots back to the QML source.
x-tools-author/x-tools
Generates standalone Markdown reference docs for Qt and plain C++ source files, from Widgets and Quick classes to utility headers and main.cpp, as prose and tables.
x-tools-author/x-tools
Applies QML best practices when writing, reviewing, refactoring or debugging QML code, with Qt 5 and Qt 6 import rules and concise, rule-silent output.
x-tools-author/x-tools
Builds the xTools Qt C++ desktop app, or a chosen X_APP target, with the repository's CMake and Ninja workflow on Windows, Linux or macOS and reports what was built.
Categories
Runs a 47-rule deterministic QML linter, then six parallel deep-analysis passes over bindings, layout, loaders, delegates, states, and performance. This skill detects whether the user means a narrow diff or commit scope, reviewing only changed lines from git diff with surrounding context, or a wide codebase scope that globs every QML file in the given path, and never skips the ordered review phases.
Qt6 QML Code Reviewer fits situations like: reviewing QML code before committing it; auditing an entire QML codebase for binding or layout issues; checking QML changes for performance anti-patterns.
Run `npx skills add x-tools-author/x-tools --skill qt-qml-review -a claude-code`. Or copy the skill folder (.github/skills/qt-qml-review in x-tools-author/x-tools) into .claude/skills/qt-qml-review in your project. Claude Code loads it when a task matches its description.
Run `npx skills add x-tools-author/x-tools --skill qt-qml-review -a codex`. Or copy the skill folder (.github/skills/qt-qml-review in x-tools-author/x-tools) into .agents/skills/qt-qml-review in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add x-tools-author/x-tools --skill qt-qml-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/qt-qml-review, .gemini/skills/qt-qml-review, .github/skills/qt-qml-review and .opencode/skills/qt-qml-review in your project.
Going by SKILL.md and its folder, Qt6 QML Code Reviewer needs Python for the scripts in its folder and the command-line tools its instructions call (git, python3 and python). Our summary lists: Python 3.6+ for the bundled linter; git for diff/commit scope detection. Compatibility (from SKILL.md): Designed for Claude Code, GitHub Copilot, and similar agents..
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Qt6 QML Code Reviewer is published under the BSD-3-Clause licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 20k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Qt6 QML Code Reviewer: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Saleor Commit Workflow (saleor/saleor, 23k stars), Qt Cpp Review (Serial-Studio/Serial-Studio, 7.2k stars) and Git History Bug Audit (ben-manes/caffeine, 18k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
x-tools-author (a GitHub user) maintains it in x-tools-author/x-tools, which has 1,093 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 10, 2026.
Source: x-tools-author/x-tools on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.