PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement
This report summarizes scanner evidence for PRQL/prql, a Rust project with 10,935 GitHub stars. SynthScan examined 78,179 lines of code across 456 source files, recording 117 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 111 finding(s).
Are imports declared and package/API names verified? 2 finding(s).
Are wrappers, guards, and repeated structures necessary? 6 finding(s).
Which changes need focused human review? 117 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 117 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .markdownlint-cli2.yaml | 1 | config: | COMMENT |
| LOW | Taskfile.yaml | 1 | # yaml-language-server: $schema=https://json.schemastore.org/taskfile.json | COMMENT |
| LOW | Taskfile.yaml | 381 | # The next two tasks are not used for either: | COMMENT |
| LOW | .pre-commit-config.yaml | 101 | entry: "```prql$" | COMMENT |
| LOW | .prettierrc.yaml | 1 | proseWrap: always | COMMENT |
| LOW | .config/wt.toml | 1 | # Worktrunk configuration for PRQL | COMMENT |
| LOW | prqlc/prqlc/tests/integration/bad_error_messages.rs | 1 | //! Record bad error messages here which we should improve. | COMMENT |
| LOW | prqlc/prqlc/tests/integration/sql.rs | 421 | /// The dialect forms are documented in | COMMENT |
| LOW | prqlc/prqlc/tests/integration/sql.rs | 8421 | #[test] | COMMENT |
| LOW | prqlc/prqlc/tests/integration/dbs/docker-compose.yaml | 21 | command: --secure-file-priv="" | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 1 | //! # prqlc | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 21 | //! (resolve) │ | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 41 | // https://github.com/rust-lang/rust/issues/147648 | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 61 | //! For inline strings, use the `prqlc-macros` crate; for example: | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 81 | //! * `cli`: enables the `prqlc` CLI binary. This is enabled by default. When | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 121 | pub mod parser; | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 161 | }) | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 261 | } | COMMENT |
| LOW | prqlc/prqlc/src/lib.rs | 281 | pub color: bool, | COMMENT |
| LOW | prqlc/prqlc/src/ir/decl.rs | 21 | COMMENT | |
| LOW | prqlc/prqlc/src/ir/pl/expr.rs | 21 | COMMENT | |
| LOW | prqlc/prqlc/src/ir/pl/fold.rs | 1 | /// A trait to "fold" a PRQL AST (similar to a visitor), so we can transitively | COMMENT |
| LOW | prqlc/prqlc/src/ir/rq/fold.rs | 1 | /// A trait to "fold" a PRQL AST (similar to a visitor), so we can transitively | COMMENT |
| LOW | prqlc/prqlc/src/cli/jinja.rs | 1 | //! Handling of Jinja templates | COMMENT |
| LOW | prqlc/prqlc/src/cli/mod.rs | 141 | /// Only displays the main pipeline and does not handle loop. | COMMENT |
| LOW | prqlc/prqlc/src/cli/mod.rs | 161 | debug_log: Option<PathBuf>, | COMMENT |
| LOW | prqlc/prqlc/src/cli/mod.rs | 181 | /// Print a shell completion for supported shells | COMMENT |
| LOW | prqlc/prqlc/src/cli/mod.rs | 201 | /// | COMMENT |
| LOW | prqlc/prqlc/src/cli/mod.rs | 221 | /// of node IDs (optional). | COMMENT |
| LOW | prqlc/prqlc/src/codegen/mod.rs | 61 | /// Current remaining number of characters in line | COMMENT |
| LOW | prqlc/prqlc/src/codegen/ast.rs | 61 | } | COMMENT |
| LOW | prqlc/prqlc/src/semantic/lowering.rs | 41 | .with_code("E0001") | COMMENT |
| LOW | prqlc/prqlc/src/semantic/resolver/flatten.rs | 21 | COMMENT | |
| LOW | prqlc/prqlc/src/semantic/resolver/functions.rs | 441 | // x, | COMMENT |
| LOW | prqlc/prqlc/src/semantic/resolver/functions.rs | 461 | // params: [a, b], | COMMENT |
| LOW | prqlc/prqlc/src/semantic/resolver/mod.rs | 21 | COMMENT | |
| LOW | prqlc/prqlc/src/semantic/resolver/names.rs | 101 | default_namespace: Option<&String>, | COMMENT |
| LOW | prqlc/prqlc/src/sql/dialect.rs | 1 | //! Feature map for SQL dialects. | COMMENT |
| LOW | prqlc/prqlc/src/sql/dialect.rs | 61 | /// The error a dialect raises for a `date.to_text` specifier it can't express. | COMMENT |
| LOW | prqlc/prqlc/src/sql/gen_expr.rs | 781 | // b = b + a.start -1 (take care of 1-based index!) | COMMENT |
| LOW | prqlc/prqlc/src/sql/gen_expr.rs | 1101 | Ok(expr.wrap_in_parenthesis()) | COMMENT |
| LOW | prqlc/prqlc/src/sql/gen_expr.rs | 1121 | /// parentheses are not required. Some examples of when parentheses are not required: | COMMENT |
| LOW | prqlc/prqlc/src/sql/pq/preprocess.rs | 41 | // /// Pushes all [Transform::Select]s to the back of the pipeline. | COMMENT |
| LOW | prqlc/prqlc/src/sql/pq/anchor.rs | 301 | second.insert(0, SqlTransform::From(riid)); | COMMENT |
| LOW | prqlc/prqlc/src/sql/pq/ast.rs | 61 | COMMENT | |
| LOW | prqlc/prqlc-parser/src/lexer/lr.rs | 61 | // - The line wrap span technically includes the comments — on a newline, | COMMENT |
| LOW | prqlc/prqlc-parser/src/parser/types.rs | 101 | )), | COMMENT |
| LOW | prqlc/prqlc-parser/src/parser/expr.rs | 421 | // leads to quite confusing error messages. | COMMENT |
| LOW | prqlc/prqlc-macros/src/lib.rs | 1 | //! Macros for PRQL compilation at build time. | COMMENT |
| LOW | prqlc/bindings/prqlc-python/src/lib.rs | 101 | COMMENT | |
| LOW | prqlc/bindings/elixir/native/prql/src/lib.rs | 101 | /// Target dialect to compile to. | COMMENT |
| LOW | prqlc/bindings/java/cross.sh | 21 | #rustup target add x86_64-unknown-linux-musl | COMMENT |
| LOW | prqlc/bindings/java/cross.sh | 41 | echo "compiling for aarch64-unknown-linux-gnu" | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/MessageKind.cs | 1 | namespace Prql.Compiler; | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/Message.cs | 1 | namespace Prql.Compiler; | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/Message.cs | 21 | public string Reason { get; init; } = string.Empty; | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/Span.cs | 1 | namespace Prql.Compiler; | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.cs | 1 | using System.Runtime.InteropServices; | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.cs | 21 | /// <exception cref="ArgumentException"><paramref name="prqlQuery"/> is null or empty.</exception> | COMMENT |
| LOW | prqlc/bindings/dotnet/PrqlCompiler/PrqlCompiler.cs | 61 | } | COMMENT |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | prqlc/prqlc/src/lib.rs | 16 | //! ────────► | COMMENT |
| MEDIUM⚡ | prqlc/prqlc/src/lib.rs | 18 | //! ◄──────── | COMMENT |
| MEDIUM⚡ | prqlc/prqlc/src/lib.rs | 26 | //! ────────► | COMMENT |
| MEDIUM⚡ | prqlc/prqlc/src/lib.rs | 28 | //! ◄──────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Taskfile.yaml | 145 | # List extensions, or just return true if we can't find `code`. | COMMENT |
| MEDIUM | prqlc/prqlc/Cargo.toml | 150 | # We use `benches/bench.rs` for the benchmark harness so disable searching for | COMMENT |
| MEDIUM | .github/workflows/tests.yaml | 553 | # `prove6` is the TAP harness that runs the whole `t/` directory in one | COMMENT |
| MEDIUM | .github/workflows/tend-review.yaml | 46 | # local actions' POST chains; the harness moves the agent's view of it to | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …ntent/posts/2023-01-28-format-pretty-reports/_index.md | 103 | # Step 1: First calculate important columns | COMMENT |
| LOW⚡ | …ntent/posts/2023-01-28-format-pretty-reports/_index.md | 112 | # Step 2: Sort the resulting table by pct_change | COMMENT |
| LOW⚡ | …ntent/posts/2023-01-28-format-pretty-reports/_index.md | 115 | # Step 3: Format the column headings and contents | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Taskfile.yaml | 3 | # Root Taskfile - handles setup, orchestration, and repo-wide operations. | COMMENT |
| MEDIUM | Taskfile.yaml | 9 | # - Root (this file): Setup, orchestration, repo-wide tasks (lint, test-all, build-all) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | prqlc/Taskfile.yaml | 3 | # This file contains tasks for prqlc development: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | prqlc/bindings/prqlc-python/python/tests/test_all.py | 88 | def test_invalid_options_name_the_offending_option() -> None: | STRING |
| LOW | prqlc/bindings/php/tests/CompilerTest.php | 18 | public function testPrqlLibraryFileExists(): void | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/Taskfile.yaml | 45 | # Check if npm dependencies for the playground need to be updated | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | prqlc/bindings/prqlc-python/python/prqlc/__init__.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/book/theme/highlight.js | 1 | var hljs=function(){"use strict";var e={exports:{}};function n(e){return e instanceof Map?e.clear=e.delete=e.set=()=>{th | CODE |