A friendly programming language from the future
This report summarizes scanner evidence for unisonweb/unison, a Haskell project with 6,773 GitHub stars. SynthScan examined 111,120 lines of code across 726 source files, recording 171 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 3.3 (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? 67 finding(s).
Are imports declared and package/API names verified? 32 finding(s).
Are wrappers, guards, and repeated structures necessary? 72 finding(s).
Which changes need focused human review? 171 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 171 distinct pattern matches across 4 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 |
|---|---|---|---|---|
| MEDIUM | scripts/migration-test.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/migration-test.sh | 5 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/migration-test.sh | 41 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/check.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/check.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/check.sh | 24 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/weeds.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/weeds.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/weeds.sh | 21 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/tests.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/tests.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/tests.sh | 21 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/migration.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/migration.sh | 5 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/migration.sh | 33 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-hash.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-hash.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-hash.sh | 30 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 88 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 91 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 97 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 100 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 168 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 172 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 282 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 289 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 297 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/proofs/lib-attestation-randr.sh | 300 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 29 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 43 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 46 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 125 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 130 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 313 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/lib-attestation-randr.sh | 322 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/proofs/transcripts.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/transcripts.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/transcripts.sh | 31 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/formatting.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/formatting.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/proofs/formatting.sh | 21 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/pre-push.bash | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/pre-push.bash | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/pre-push.bash | 16 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/with-clean-worktree.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/with-clean-worktree.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/hooks/with-clean-worktree.sh | 32 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 51 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 53 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 57 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 59 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 105 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 107 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 111 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/with-clean-worktree.sh | 113 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/hooks/lib-pre-push.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/hooks/lib-pre-push.sh | 4 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/hooks/lib-pre-push.sh | 12 | # ============================================================================= | COMMENT |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weeder.toml | 1 | ### This file should be seen as documenting the public API. | COMMENT |
| LOW | scripts/migration-test.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/migration-test.sh | 21 | # this platform. | COMMENT |
| LOW | scripts/jit-test-matrix.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/check.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/testing-codebase.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/weeds.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/tests.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/migration.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/migration.sh | 21 | # WHAT IT PROVES: | COMMENT |
| LOW | scripts/proofs/lib-attestation-hash.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/lib-attestation-hash.sh | 101 | _list_files_0 > "$list" | COMMENT |
| LOW | scripts/proofs/lib-attestation-randr.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/lib-attestation-randr.sh | 281 | COMMENT | |
| LOW | scripts/proofs/transcripts.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/proofs/transcripts.sh | 21 | # attestation satisfies the pull request check but not the | COMMENT |
| LOW | scripts/proofs/formatting.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/hooks/pre-push.bash | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/hooks/with-clean-worktree.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/hooks/with-clean-worktree.sh | 21 | # | COMMENT |
| LOW | scripts/hooks/lib-pre-push.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/warm-caches.yaml | 1 | name: warm caches | COMMENT |
| LOW | .github/workflows/full-verification.yaml | 1 | name: full verification | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_ropes.c | 1 | // Part of the JIT's C runtime, included by jit_rt.c (the files are one translation unit): see | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_ropes.c | 21 | // of bytes through UTF-8. A RopeKind holds that, and every function here | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_arrays.c | 1 | // Part of the JIT's C runtime, included by jit_rt.c (the files are one translation unit): see | COMMENT |
| LOW | unison-runtime/cbits/jit_llvm.c | 1 | // The JIT's only use of LLVM: a small shim over the C API. Haskell calls these | COMMENT |
| LOW | unison-runtime/cbits/jit_llvm.c | 21 | #include <string.h> | COMMENT |
| LOW | unison-runtime/cbits/jit_llvm.c | 101 | enum { LLVMCodeModelJITDefault = 1 }; | COMMENT |
| LOW | unison-runtime/cbits/jit_llvm.c | 381 | // LLVM's static destructors under the compile in progress, which crashed in | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 1 | // The JIT's C runtime: the machinery, and the pieces of the GHC runtime it needs. See | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 21 | #include "Rts.h" | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 121 | static int64_t stress_poll = 0; | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 141 | #define MIN_NATIVE_FRAME 4 | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 281 | // Allocation | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 301 | // limits was hit. When it was the budget, the object is still handed out (an | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 521 | thread_ctx = ctx; | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.c | 821 | COMMENT | |
| LOW | unison-runtime/cbits/gen-helpers.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins.h | 1 | // Private to the JIT's C runtime (jit_rt.c and the jit_builtins_*.c files it includes): what | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins.h | 161 | // --- the list structure's constants (see jit_builtins_lists.c), used by the ropes too --- | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_lists.c | 1 | // Part of the JIT's C runtime, included by jit_rt.c (the files are one translation unit): see | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_lists.c | 21 | // SList: SNil (tag 1), SCons x rest (tag 2) | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_lists.c | 921 | return 16; | COMMENT |
| LOW | unison-runtime/cbits/jit_exit.c | 1 | // The exit routine, compiled to LLVM IR (cbits/jit_exit.ll, by | COMMENT |
| LOW | unison-runtime/cbits/jit_exit.c | 21 | // otherwise it is the frame base. The argument block holds a word and a | COMMENT |
| LOW | unison-runtime/cbits/jit_builtins_text.c | 1 | // Part of the JIT's C runtime, included by jit_rt.c (the files are one translation unit): see | COMMENT |
| LOW | unison-runtime/cbits/jit_helpers.c | 1 | // Helpers that generated code calls as LLVM IR rather than as C. | COMMENT |
| LOW | unison-runtime/cbits/jit_helpers.c | 21 | // constructors hash their tag (the low 16 bits of the packed tag) and fields, | COMMENT |
| LOW | unison-runtime/cbits/jit_helpers.c | 321 | } | COMMENT |
| LOW | unison-runtime/cbits/jit_helpers.c | 341 | // under tyEq, different packed tags compare the type references, which | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.h | 41 | // The capability running this thread, for allocate(). Set at entry. | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.h | 61 | // stack's out-area at entry and back there on return, so that the | COMMENT |
| LOW | unison-runtime/cbits/jit_rt.h | 81 | } UnisonJitCtx; | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 1 | // What jit_rt.c shares with the helpers that are compiled to LLVM IR | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 21 | #include <stdint.h> | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 161 | static inline void *wrapped_of(void *x, const WrapInfo *w) { return (void *)wrapped_word(x, w); } | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 221 | // why a comparison was left to the interpreter, under UNISON_JIT_TRACE_TEST | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 261 | // A record is `GRecord shape vals` with the shape (MCode.RecordShape) and the | COMMENT |
| LOW | unison-runtime/cbits/jit_internal.h | 281 | #define REC_VALS 3 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | unison-src/transcripts/idempotent/new-records.md | 353 | createPersonExtra = Person { name: "Alice", age: 30, address: "123 Main St" } | CODE |
| LOW | unison-src/transcripts/idempotent/new-records.md | 361 | 1 | createPersonExtra = Person { name: "Alice", age: 30, address: "123 Main St" } | CODE |
| LOW | unison-src/transcripts/idempotent/config.md | 4 | scratch/main> config.set author.name "Jane Doe" | CODE |
| LOW | unison-src/transcripts/idempotent/config.md | 8 | author.name = "Jane Doe" | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 358 | Para to reflow: lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum do | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 360 | {List.take} starting para lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lore | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 362 | Middle of para: lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor {List.take} lorem ipsum dolor lorem ipsum dolor lo | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 370 | before a para-line lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 373 | {List.take} lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 375 | a para-line ending with ref lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lo | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 379 | para line lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lo | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 425 | Para to reflow: lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 426 | ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 427 | dolor lorem ipsum dolor ending in ref {take} | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 429 | {take} starting para lorem ipsum dolor lorem ipsum dolor | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 430 | lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 431 | ipsum dolor lorem ipsum dolor. | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 433 | Middle of para: lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 434 | ipsum dolor {take} lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 435 | ipsum dolor lorem ipsum dolor. | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 445 | before a para-line lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 446 | ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 447 | dolor lorem ipsum dolor lorem ipsum dolor. | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 451 | {take} lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 452 | lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 453 | ipsum dolor lorem ipsum dolor. | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 455 | a para-line ending with ref lorem ipsum dolor lorem ipsum | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 456 | dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 457 | lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor {take} | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 461 | para line lorem ipsum dolor lorem ipsum dolor lorem ipsum | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 462 | dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor | CODE |
| LOW⚡ | unison-src/transcripts/idempotent/doc-formatting.md | 463 | lorem ipsum dolor lorem ipsum dolor | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/get-share-hash.sh | 14 | # Check if it's a release or a branch | COMMENT |
| LOW | scripts/proofs/lib-attestation-hash.sh | 109 | # Check if an attestation exists in the tracked proofs directory. | COMMENT |
| LOW⚡ | scripts/proofs/lib-attestation-randr.sh | 170 | # Check if we can skip based on existing attestations | COMMENT |
| LOW | scripts/hooks/pre-commit.bash | 6 | # Check if this hook differs from the repo version | COMMENT |
| LOW⚡ | scripts/hooks/with-clean-worktree.sh | 58 | # Check if there's anything to stash | COMMENT |
| LOW⚡ | scripts/hooks/lib-pre-push.sh | 100 | # Check if proof already exists for the given type. | COMMENT |
| LOW | scripts/hooks/lib-pre-push.sh | 120 | # Check if the proof for this hash is in the committed version | COMMENT |