This report summarizes scanner evidence for storytold/gridcraft. SynthScan examined 211,980 lines of code across 678 source files, recording 113 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 0.6 (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? 109 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 0 finding(s).
Which changes need focused human review? 113 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 113 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 |
|---|---|---|---|---|
| LOW | packaging/env.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | packaging/macos/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/web/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/freebsd/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak-oci.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak-bundle.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak/ai.storyteller.gridcraft.yml | 1 | # Flatpak manifest for GridCraft, ready for a Flathub submission. | COMMENT |
| LOW | packaging/linux/flatpak/ai.storyteller.gridcraft.yml | 21 | - --filesystem=xdg-data/ArtCraft/versions:ro | COMMENT |
| LOW | …ging/linux/flatpak/ai.storyteller.gridcraft.bundle.yml | 1 | # Flatpak manifest for the single-file bundle attached to every GitHub release | COMMENT |
| LOW | …ging/linux/flatpak/ai.storyteller.gridcraft.bundle.yml | 21 | # Display: Wayland first; X11 only when no Wayland compositor is running. | COMMENT |
| LOW | crates/chart/src/trend.rs | 1 | //! Trendline maths: least-squares fits behind chart trendlines and moving averages. | COMMENT |
| LOW | crates/chart/src/lib.rs | 1 | //! GridCraft charts (layer L3, toolkit-free). | COMMENT |
| LOW | crates/numfmt/src/decimal.rs | 1 | //! Decimal-string rounding and the General format. | COMMENT |
| LOW | crates/xlsx/src/xml.rs | 481 | } else { | COMMENT |
| LOW | crates/xlsx/src/lib.rs | 1 | //! GridCraft file formats: XLSX (transitional and strict) and CSV import/export, plus XLSB and ODS data import | COMMENT |
| LOW | crates/xlsx/src/pivot.rs | 1 | //! PivotTables: pivot cache definitions and records (ECMA-376 Part 1 §18.10.1) and PivotTable | COMMENT |
| LOW | crates/xlsx/src/sheet_read.rs | 81 | const MAX_HYPERLINK_CELLS: u64 = 10_000; | COMMENT |
| LOW | crates/xlsx/src/passthrough.rs | 1 | //! Pass-through of package content GridCraft does not model, so that open → edit → save keeps it. | COMMENT |
| LOW | crates/xlsx/src/csv.rs | 301 | wb.sheets = vec![Arc::new(sheet)]; | COMMENT |
| LOW | crates/xlsx/src/feature_bags.rs | 1 | //! Feature property bags ([MS-XLSX] 2.1.22, 2.3.9): how Excel stores cell checkboxes. | COMMENT |
| LOW | crates/xlsx/src/crypto.rs | 1 | //! Password-encrypted workbooks. Excel wraps the ordinary OOXML package in a compound file with | COMMENT |
| LOW | crates/pdf/src/lib.rs | 1 | //! A tiny, self-contained PDF 1.7 writer for GridCraft's print and PDF export. | COMMENT |
| LOW | crates/pdf/src/metrics.rs | 1 | //! Advance widths of the standard 14 PDF fonts, in 1/1000 em, for the printable ASCII range. | COMMENT |
| LOW | crates/mcp/src/lib.rs | 1 | //! GridCraft's MCP server. | COMMENT |
| LOW | crates/mcp/src/control_auth.rs | 1 | //! Authentication of the control channel (#777). | COMMENT |
| LOW | crates/calc/src/recalc.rs | 1 | //! Dependency graph and recalculation. | COMMENT |
| LOW | crates/calc/src/eval.rs | 21 | use array::map_unary; | COMMENT |
| LOW | crates/calc/src/recalc/graph.rs | 41 | } | COMMENT |
| LOW | crates/calc/src/recalc/pass_host.rs | 41 | /// Other formulas read at [`MAX_NESTED`] levels deep by the evaluations being abandoned. They | COMMENT |
| LOW | crates/ui-egui/build.rs | 1 | //! Bake the contributor credits into the binary as static Rust tables. Nothing is read at run time. | COMMENT |
| LOW | crates/ui-egui/tests/it/symbol_glyphs.rs | 1 | //! The interface's symbol characters must not render as empty boxes (#197, #54): the UI font often | COMMENT |
| LOW | crates/ui-egui/src/desktop_theme.rs | 1 | //! The desktop's own light/dark choice, for an interface setting that follows it. | COMMENT |
| LOW | crates/ui-egui/src/doc_windows.rs | 1 | //! Desktop: each workbook window is a native window of its own. | COMMENT |
| LOW | crates/ui-egui/src/control.rs | 1 | //! Programmatic control of the running app (agents, tests, MCP). | COMMENT |
| LOW | crates/ui-egui/src/lib.rs | 101 | pub keytip_invoke: Option<&'static str>, | COMMENT |
| LOW | crates/ui-egui/src/lib.rs | 241 | /// style tables are walked only when a workbook changes. | COMMENT |
| LOW | crates/ui-egui/src/lib.rs | 261 | pub(crate) capture_epoch: u64, | COMMENT |
| LOW | crates/ui-egui/src/lib.rs | 281 | /// Automate › Macros: relative recording, recent macros, a macro's question. | COMMENT |
| LOW | crates/ui-egui/src/theme.rs | 1 | //! Design tokens and fonts. | COMMENT |
| LOW | crates/ui-egui/src/services.rs | 21 | /// insert into a subsequent dialog or open the image as a workbook. | COMMENT |
| LOW | crates/ui-egui/src/services.rs | 41 | /// Web: hand PDF bytes to the browser's print flow directly (no download, | COMMENT |
| LOW | crates/ui-egui/src/grid.rs | 221 | /// The PivotTable Fields pane's `pivot.fields` answer, cached per (doc uid, revision, pivot): | COMMENT |
| LOW | crates/ui-egui/src/fonts.rs | 1 | //! The fonts installed on the machine, so the font list can offer them and cells can render with | COMMENT |
| LOW | crates/ui-egui/src/fonts.rs | 21 | COMMENT | |
| LOW | crates/ui-egui/src/macro_editor.rs | 1 | //! The macro step editor (Automate › New Macro; Macros › Edit, Create, Step Into): a large, | COMMENT |
| LOW | crates/ui-egui/src/app.rs | 161 | } | COMMENT |
| LOW | crates/ui-egui/src/widgets.rs | 361 | pub fn color_palette(ui: &mut Ui, theme_colors: &[u32; 12], none_label: &str) -> Option<String> { | COMMENT |
| LOW | crates/ui-egui/src/craft_fonts_policy.rs | 1 | //! craft-fonts build policy shared by `build.rs` and the UI crate. | COMMENT |
| LOW | crates/ui-egui/src/selection_glide.rs | 1 | //! The selection outline glides to a new selection instead of jumping there, like Excel's cell | COMMENT |
| LOW | crates/ui-egui/src/selection_glide.rs | 21 | //! drag) and the cell editor use the real cells at once. | COMMENT |
| LOW | crates/ui-egui/src/app/input.rs | 1 | use super::{SheetApp, control}; | COMMENT |
| LOW | crates/ui-egui/src/theme/font_fallback.rs | 1 | #[cfg(not(target_arch = "wasm32"))] | COMMENT |
| LOW | crates/ui-egui/src/keytips/keytip_table.rs | 1 | //! The keytip sequence table: every Excel-style Alt access sequence and what it does. | COMMENT |
| LOW | crates/ui-egui/src/control/screenshots.rs | 41 | COMMENT | |
| LOW | crates/ui-egui/src/control/screenshots.rs | 261 | /// Settle time before the first issuance (the UI must be still). | COMMENT |
| LOW | crates/model/src/features.rs | 361 | COMMENT | |
| LOW | crates/model/src/features.rs | 461 | /// Combo charts: this series drawn as a line on the secondary axis. | COMMENT |
| LOW | crates/model/src/style.rs | 121 | pub minor_font: String, | COMMENT |
| LOW | crates/model/src/store.rs | 141 | return None; | COMMENT |
| 45 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/ui-egui/Cargo.toml | 19 | # harness (and a host with no symbol font) renders them as tofu. | COMMENT |
| MEDIUM | xtask/src/keytips.rs | 342 | out.push_str(&format!("\n#[test]\nfn {}() {{\n let mut h = harness(blank());\n {body}\n}}\n", test_name(&e | CODE |
| MEDIUM | xtask/src/stats.rs | 125 | println!("\n(#[test] counts source attributes; macro-generated tests count once. Use --exact for harness counts. | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/numfmt/src/tests.rs | 102 | assert_eq!(f(phone, 5551234.0), "555-1234"); | CODE |
| LOW | crates/pdf/src/tests.rs | 90 | first.link_uri(-20.0, -20.0, 40.0, 40.0, "mailto:a@example.org"); | CODE |
| LOW | crates/functions/src/text.rs | 1414 | is_text(ev("REGEXEXTRACT", vec![t("tel 555-1234 or 555-9876"), t("[0-9]{3}-[0-9]{4}")]), "555-1234"); | CODE |
| LOW | crates/functions/src/text.rs | 1416 | assert_eq!(rows_of(&v), vec![vec![tv("555-1234")], vec![tv("555-9876")]]); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/linux/flatpak-oci.sh | 5 | # Usage: | COMMENT |