Skip to content
Skip to content
Documentation

Configuration reference

This page is generated from the configuration models in the ASH source code by scripts/generate_config_reference.py. Edits made to this file by hand are overwritten the next time it is generated.

Every key is listed with its type, default and the description the model carries. A key whose model has no description says so. Keys inside a list are written key[].field: global_settings.suppressions[].rule_id is the rule_id of one entry in the suppressions list. A default written as from NAME, else value is read from that environment variable when ASH starts; value applies when the variable is not set.

Where ASH finds its configuration

A path given with --config, -c, or the ASH_CONFIG environment variable is used as is, and nothing is discovered.

Otherwise ASH looks in the scan's source directory and uses the first of these it finds. Sources are never merged: every other one that exists is ignored, with a warning naming it.

  1. .ash.yml
  2. .ash/.ash.yml
  3. .ash.yaml
  4. .ash/.ash.yaml
  5. .ash.json
  6. .ash/.ash.json
  7. ash.yml
  8. .ash/ash.yml
  9. ash.yaml
  10. .ash/ash.yaml
  11. ash.json
  12. .ash/ash.json
  13. .ashrc.toml
  14. .ashrc.yaml
  15. .ashrc.yml
  16. .ashrc.json
  17. ashrc.toml
  18. ashrc.yaml
  19. ashrc.yml
  20. ashrc.json
  21. pyproject.toml

pyproject.toml counts only when it has a [tool.ash] table; one without it is not a configuration source.

These are read from the source directory only, never from .ash/: .ashrc.toml, .ashrc.yaml, .ashrc.yml, .ashrc.json, ashrc.toml, ashrc.yaml, ashrc.yml, ashrc.json, pyproject.toml.

A config file can name base files with extends. A chain may be at most 10 levels deep and read at most 50 files.

Top-level keys

A key not listed here is ignored, without an error, when the configuration is loaded.

Key Type Default Description
project_name string from ASH_PROJECT_NAME, else ash-scan Name of the project being scanned
global_settings section see the section Global default settings for ASH shared across scanners. If the same setting exists at the scanner level and is set in both places, the scanner level settings take precedence.
fail_on_findings boolean true Whether to exit with non-zero code if findings are detected
fail_on_incomplete_scanners boolean true Whether to exit with a non-zero code when a selected scanner did not complete -- status ERROR (ran and failed) or MISSING (dependencies unavailable, never ran). A SKIPPED scanner, one not selected or one with nothing of its kind to scan, does not trip this by itself, but a run in which every scanner is SKIPPED, such as one where no selected scanner had a file to scan, exits 1 while this is on. Independent of fail_on_findings: one answers 'was anything found', this one answers 'did what I asked for actually run'. Selects on the scanner's status, so it covers only a failure that reached that status. Defaults to True, so a scanner recorded ERROR or MISSING does not report the exit code of a clean scan. Converters count too: one that crashed, one that could not convert some of its inputs, and one whose tool is missing while it had inputs make the scan exit non-zero the same way. Set it to False, or pass --no-fail-on-incomplete-scanners, to accept a partial scan's exit code; excluding the scanner whose tool is unavailable is usually better, because an excluded scanner is recorded SKIPPED and the report then says what was not measured. One ending overrides this setting: a run where ASH could not stop a scanner's tool exits 1 either way, because the tool may still be running and writing into the output directory.
honor_ignore_files boolean true Whether the .gitignore and .ignore files in the scanned tree decide which files are left out of ASH's scan set, the file list detect-secrets, cfn-nag, cdk-nag, cfn-lint, cfn-guard, actionlint, zizmor, npm-audit and the converters read. True (the default) leaves out every file they match. False scans those files too; ASH's own exclusions (.git, CDK assets, its own output directory) still apply. An operator setting: a config file inside the scanned tree, or one an MCP client supplied, cannot change it, and its value there is ignored with a warning. Set it in a config file outside the tree, with --config-overrides, or with --no-honor-ignore-files / --honor-ignore-files. Every scan records the outcome in metadata.ignore_file_exclusions.
sandbox section see the section OS-level sandboxing of scanner subprocesses.
content_db_staleness one of fail, warn fail What a scan does when a scanner's content database (grype's or trivy's vulnerability database, the offline semgrep/opengrep rulesets) was built longer ago than the bound declared for it in automated_security_helper/utils/content_databases.py. 'fail' (the default) keeps the scanner's findings and exits 1, naming the database, its build time, its age and the bound. 'warn' lets the scan pass and records the same warning in the log and in the reports (summary, SARIF invocation notifications, flat JSON). The CLI flag --allow-stale-content-db sets 'warn' for one scan and takes precedence over this value; --no-allow-stale-content-db sets 'fail'.
content_db_staleness_overrides list of section [] Per-database exceptions to content_db_staleness, each with a required expiration date and reason. An entry holds one named database to its own policy until 00:00 UTC on its expiration date, and every database not named keeps content_db_staleness. An expired entry is ignored with a warning. Empty by default. Either form of --allow-stale-content-db clears this list for that scan, so the flag still decides for every database.
content_db_staleness_offline_image_default boolean true Whether an image built with OFFLINE=YES holds trivy-db to 'warn' rather than to content_db_staleness: fail. Such an image carries the trivy database it was built with, and trivy's own bound would fail every scan in it from a day after the build; with this, those scans pass and every report records the stale database. Only trivy-db: grype-db and the offline rulesets keep content_db_staleness. ASH_OFFLINE_AT_BUILD_TIME=YES in ASH's environment, which the image sets from its OFFLINE build argument, turns it on; without that variable this does nothing, whatever it says. Set false to hold trivy-db to content_db_staleness in the image too. A content_db_staleness_overrides entry for trivy-db outranks it, and either form of --allow-stale-content-db sets this to false for that scan.
ash_plugin_modules list of string [] List of Python modules to import containing ASH plugins and/or event subscribers. These are loaded in addition to the default modules.
external_reports_to_include list of string [] List of external reports to include in the final report. These can be paths to SARIF or CycloneDX reports produced by other tools.
build section or null null Build-time configuration settings. ash config validate warns that this key is an internal field, and still passes the config; a scan accepts it.
converters section see the section Converter configurations by name.
scanners section see the section Scanner configurations by name.
reporters section see the section Reporter configurations by name.
output_formats list of one of aggregated, text, flat-json, yaml, csv, html, dict, junitxml, markdown, sarif, asff, ocsf, cyclonedx, spdx, custom, github-ghas, gitlab-sast, gitlab-cyclonedx, unused-suppressions, aws-security-hub, bedrock-summary-reporter, cloudwatch-logs, s3 [] Reports to write, by reporter name (for example sarif, markdown, github-ghas): a list, one name, or names separated by commas. Narrows the enabled reporters; it does not enable a disabled one. Empty or null writes every enabled reporter. A --output-formats list on the command line replaces this list.
mcp-resource-management section see the section Configuration for MCP server resource management and limits. Also accepted as mcp_resource_management.
workspace section see the section Workspace-mode execution settings. Read from the config resolved for the workspace root; a project's own copy of this block is ignored, because how many projects run at once is not a project's decision.
extends string, list of string, or null null Base config file(s) this config extends: a path, or a list of paths applied in order, relative to this file. Mappings merge key by key; lists and scalars from this file replace the base's. Paths must stay inside the repository being scanned; URLs are refused. Read when the file is loaded and not written back when a config is saved.
patch list of mapping of string to any or null null RFC 6902 JSON-Patch operations (add, remove, replace, test) applied after this file is merged over its bases. Use 'add' at '/global_settings/suppressions/-' to append to a base's list. Read when the file is loaded and not written back when a config is saved.

Sections

global_settings

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
severity_threshold one of ALL, LOW, MEDIUM, HIGH, CRITICAL from ASH_DEFAULT_SEVERITY_LEVEL, else MEDIUM Global minimum severity level to consider findings as failures across all scanners
ignore_paths list of section [] Global list of IgnorePaths. Each path requires a reason for ignoring, e.g. 'Folder contains test data only and is not committed'.
suppressions list of section [] Global list of suppression rules. Each rule specifies findings to suppress based on rule ID, file path, and optional line numbers.
mcp section see the section MCP-server-specific configuration (runtime override allowlist, etc.).

global_settings.ignore_paths[]

Represents a path exclusion entry.

Each entry in the list has these keys.

A key not listed here is accepted and kept, without validation.

Key Type Default Description
path string required Path or pattern to exclude
reason string required Reason for exclusion
expiration string or null null (Optional) Expiration date (YYYY-MM-DD). The entry stops applying on this date, by the local clock of the host running the scan.
client_supplied boolean false Set by ASH: True when a config or workspace policy file an MCP client delivered supplied this entry, so results show which suppressions and ignored paths came from the client. A value written in a config file is ignored.

global_settings.suppressions[]

Represents a finding suppression rule.

Each entry in the list has these keys.

A key not listed here is accepted and kept, without validation.

Key Type Default Description
path string required Path or pattern to exclude
reason string required Reason for exclusion
expiration string or null null (Optional) Expiration date (YYYY-MM-DD). The entry stops applying on this date, by the local clock of the host running the scan.
client_supplied boolean false Set by ASH: True when a config or workspace policy file an MCP client delivered supplied this entry, so results show which suppressions and ignored paths came from the client. A value written in a config file is ignored.
rule_id string or null null Rule ID to suppress
line_start integer or null null (Optional) Starting line number
line_end integer or null null (Optional) Ending line number
package_name string or null null (Optional) Only suppress findings about this package (glob, case-insensitive). Findings that do not report a package name never match.
package_version string or null null (Optional) Only suppress findings about this installed package version (glob, case-insensitive). Findings that do not report an installed version never match.
package_path string or null null (Optional) Only suppress findings about the package copy installed at this path, relative to the scan root (glob, supports **), e.g. 'deploy/cdk/node_modules/aws-cdk-lib/node_modules/brace-expansion'. Separates two copies with the same name and version. Findings that do not report an install path never match.
symbol string or null null (Optional) Only suppress findings whose lines lie inside the definition with this qualified name, e.g. 'MyClass.my_method', in the finding's file. Names are dotted from the top of the file, exact and case-sensitive. Resolved by parsing the file with tree-sitter (Python, JavaScript, TypeScript, Java), which needs the 'symbols' extra; a finding whose file cannot be parsed never matches.

global_settings.mcp

MCP-server-specific config bundle (transport-agnostic).

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
runtime_overrides section see the section Allowlist for runtime JSON-Patch overrides.

global_settings.mcp.runtime_overrides

Allowlist + denylist controlling which JSON-Patch ops the MCP server accepts.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
enabled boolean false Master switch — runtime patches are rejected unless True.
allowed_paths list of string [] JSON-Pointer glob patterns the client may target. * matches one segment, ** matches any subtree. Example: '/scanners/*/options/severity_threshold'.
denied_paths list of string ["/fail_on_findings", "/fail_on_incomplete_scanners", "/content_db_staleness", "/content_db_staleness_overrides", "/honor_ignore_files", "/content_db_staleness_offline_image_default", "/sandbox", "/sandbox/**", "/ash_plugin_modules", "/ash_plugin_modules/**", "/scanners/detect-secrets/options/scan_settings/filters_used", "/scanners/detect-secrets/options/scan_settings/filters_used/**", "/scanners/detect-secrets/options/scan_settings/plugins_used", "/scanners/detect-secrets/options/scan_settings/plugins_used/**", "/scanners/detect-secrets/options/baseline_file", "/global_settings/ignore_paths", "/global_settings/suppressions", "/global_settings/mcp", "/global_settings/mcp/**", "/scanners/opengrep/options/exclude_rule", "/scanners/semgrep/options/exclude_rule", "/scanners/bandit/options/confidence_level", "/scanners/checkov/options/frameworks", "/scanners/checkov/options/skip_frameworks", "/scanners/opengrep/options/config", "/scanners/opengrep/options/patterns", "/scanners/opengrep/options/severity", "/scanners/semgrep/options/config", "/scanners/semgrep/options/severity", "/scanners/detect-secrets/options/scan_settings", "/scanners/cdk-nag/options/nag_packs/AwsSolutionsChecks", "/scanners/ferret-scan/options/checks", "/scanners/ferret-scan/options/confidence_levels", "/scanners/ferret-scan/options/disable_ip_types", "/scanners/ferret-scan/options/enable_preprocessors", "/scanners/ferret-scan/options/finding_limit", "/scanners/ferret-scan/options/profile", "/scanners/ferret-scan/options/recursive", "/scanners/ferret-scan/options/respect_gitignore", "/scanners/ferret-scan/options/use_default_config", "/scanners/ferret-scan/options/validator_budget", "/scanners/trivy-repo/options/license_full", "/scanners/trivy-repo/options/scanners", "/scanners/cfn-guard/options/rule_sets", "/scanners/cfn-lint/options/ignore_checks", "/scanners/cfn-lint/options/regions", "/scanners/gitleaks/options/baseline_path", "/scanners/trivy/options/scanners", "/scanners/trivy/options/ignore_unfixed", "/scanners/*/options/offline", "/scanners/ferret-scan/options/max_live_bytes", "/scanners/gitleaks/options/max_target_megabytes", "/scanners/bandit/options/config_file", "/scanners/checkov/options/config_file", "/scanners/ferret-scan/options/config_file", "/scanners/grype/options/config_file", "/scanners/syft/options/config_file", "/scanners/trivy-repo/options/secret_config_file", "/scanners/trivy-repo/options/config_file", "/scanners/trivy-repo/options/module_dir", "/scanners/trivy/options/config_file", "/scanners/trivy/options/secret_config_file", "/scanners/actionlint/options/config_file", "/scanners/actionlint/options/shellcheck", "/scanners/actionlint/options/pyflakes", "/scanners/cfn-guard/options/rules_paths", "/scanners/cfn-lint/options/config_file", "/scanners/gitleaks/options/config_file", "/scanners/zizmor/options/config_file", "/scanners/zizmor/options/online_audits", "/scanners/snyk-code/options/honor_tree_exclusions", "/scanners/cfn-lint/options/honor_inline_ignores", "/scanners/gitleaks/options/honor_inline_ignores", "/scanners/zizmor/options/honor_inline_ignores", "/scanners/*/options/tool_version", "/converters/jupyter/options/tool_version", "/scanners/opengrep/options/version", "/scanners/opengrep/options/sha256", "/scanners/opengrep/options/metrics", "/scanners/semgrep/options/metrics", "/reporters/bedrock-summary-reporter/options/aws_*", "/reporters/cloudwatch-logs/**", "/reporters/aws-security-hub/**", "/reporters/bedrock-summary-reporter/options/model_id", "/reporters/bedrock-summary-reporter/options/output_file", "/reporters/bedrock-summary-reporter/options/output_executive_file", "/reporters/bedrock-summary-reporter/options/output_technical_file", "/reporters/s3/**", "/reporters/bedrock-summary-reporter/**", "/reporters/gitlab-sast/options/exclude_suppressed", "/scanners/detect-secrets/**", "/scanners/npm-audit/**", "/scanners/opengrep/**", "/scanners/semgrep/**", "/scanners/snyk-code/**", "/scanners/trivy-repo/**", "/scanners/trivy/**", "/scanners/zizmor/**", "/converters/archive/options/max_members", "/converters/archive/options/max_member_bytes", "/converters/archive/options/max_total_bytes", "/converters/archive/options/max_compression_ratio"] JSON-Pointer glob patterns that are never allowed (denied wins over allowed). Each entry starts with '/'. The defaults block the fields that decide whether a scan fails, what it runs and reports, where findings are sent, the scanner sandbox, and this policy. A list equal to a default ASH has shipped counts as the current default list. Any other list is added to the current defaults, unless replace_default_denied_paths is true. When it is added, a list that holds some default entries and leaves others out still gets them, and a warning names the ones it leaves out. Whatever the list, and with replace_default_denied_paths too, the entries ASH always denies (the scanner sandbox, ash_plugin_modules, the detect-secrets verification, plugin and baseline settings, the archive converter's extraction limits, and the sections of the plugins that send data off the host: the s3, aws-security-hub, cloudwatch-logs and bedrock-summary-reporter reporters and the detect-secrets, npm-audit, opengrep, semgrep, snyk-code and trivy-repo scanners) are added to it.
denied_value_patterns mapping of string to string {} Map of JSON-Pointer pattern to regex. add/replace ops are rejected when any string leaf reachable from the op's value matches the regex; lists and dicts are walked recursively so a forbidden token cannot be hidden inside a nested structure. The test op is exempt because it is read-only. Each key starts with '/'.
replace_default_denied_paths boolean false When true, denied_paths is used as written instead of being added to ASH's default list, and each default entry it leaves out is named in a warning. When false (the default), the entries listed are denied as well as the defaults. Either way, an unset list, or one equal to a default ASH has shipped, gets the current default list.

sandbox

OS-level sandboxing of scanner subprocesses. Off by default.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
mode one of off, auto, bwrap, firejail, landlock, sandbox-exec "off" How scanner subprocesses are confined. 'off' runs them as plain subprocesses. 'auto' uses the best sandbox available (Linux: bwrap, then firejail, then landlock; macOS: sandbox-exec). Any other value requires that backend. A scanner that cannot be sandboxed as requested is recorded MISSING with the reason; it is never run unsandboxed. A mode that --sandbox, ASH_CONFIG or the operator's config file sets is a floor: a config file inside a git checkout or the scanned directory cannot turn it off or switch backends. Not applied in container mode, where the container is the boundary; ASH logs a warning when it is set there.
network_scanners list of string or null null Scanners allowed a network when the scan is online. Null (the default) uses each scanner's declared need: semgrep, opengrep, grype, trivy, npm-audit and snyk-code fetch rules, databases or audit data. A list replaces those defaults. Under --offline no scanner gets a network. Honored only from --config-overrides or a config file outside every git checkout and the scanned directory; set by any other config file, a list can only remove network.
extra_read_paths list of string [] Additional host paths every sandboxed scanner may read, for example a corporate CA bundle or a shared rule directory. '~' and $VARS expand. Honored only from --config-overrides or a config file outside every git checkout and the scanned directory.
read_path_scanners list of string [] Scanners allowed the extra host paths their own options ask for (a rules file or baseline outside the source tree, for example). Under a sandbox, without this, a scanner whose read paths come from its options gets only the default policy, and ASH does not read a detect-secrets baseline_file outside the source tree. With it, a granted path, that baseline included, is used only when it resolves inside the source tree or an extra_read_paths entry. Honored only from --config-overrides or a config file outside every git checkout and the scanned directory.
env_scanners list of string [] Scanners allowed the environment variables their own options ask for (a token for an online check, for example). Without this, such variables are not passed. Honored only from --config-overrides or a config file outside every git checkout and the scanned directory.

content_db_staleness_overrides[]

One content database held to a different staleness policy, until a fixed date.

Each entry in the list has these keys.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
database string required The content database's registry name, as listed in automated_security_helper/utils/content_databases.py: grype-db, trivy-db, semgrep-offline-rules or opengrep-offline-rules.
policy one of fail, warn required The policy this database is held to while the entry is in effect.
expiration string required Required. The date (YYYY-MM-DD, UTC) from which the entry no longer applies: at 00:00 UTC that day the database returns to the policy it has without the entry, which is content_db_staleness, or, for trivy-db in an image built with OFFLINE=YES, that image's warn default unless content_db_staleness_offline_image_default is false.
reason string, length at least 1 required Required. Why this database is held differently.

build

Configuration model for build-time settings.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
build_mode one of ONLINE, OFFLINE ONLINE Build mode for the container image build. If enabled, also enables offline mode during the scan phase without any explicit directive when scanning.
tool_install_scripts mapping of string to list of string {} Map of tool names to their installation scripts
custom_scanners list of mapping, length at most 0 [] Not supported: nothing reads these entries, so the list must stay empty. Configure scanners under their own sections.

mcp-resource-management

Configuration model for MCP resource management settings.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
max_concurrent_scans integer or null, at least 0, at most 100 3 Maximum number of scans the MCP server runs at once, across every session; a scan started beyond it is refused. A workspace scan counts as one scan, however many projects it has. 0 or null for no limit. Read from the operator's ASH_CONFIG only.
max_concurrent_scans_per_session integer, at least 0, at most 100 2 Maximum number of scans one session of a network transport (streamable-http, sse) may run at once; 0 for no per-session limit. A run_ash_workspace_scan counts once. Read from the operator's config (ASH_CONFIG) only, never from a scanned or delivered one. stdio's single session is not limited.
max_concurrent_tasks integer, at least 1, at most 50 20 Not enforced: nothing reads this setting. Maximum number of concurrent async tasks allowed
thread_pool_max_workers integer, at least 1, at most 20 4 Not enforced: nothing reads this setting. Maximum number of worker threads in the shared thread pool
scan_timeout_seconds integer or null, at least 0, at most 86,400 1800 Longest a single MCP scan may run, in seconds, counted from when it starts running (after any wait for another scan of its session); a scan still running then is stopped and reported as failed. For a workspace scan it covers the whole workspace, and every project is stopped and reported as failed. 60 to 86400, or 0 or null for no limit. Read from the operator's ASH_CONFIG only.
operation_timeout_seconds integer, at least 30, at most 600 180 Not enforced: nothing reads this setting. Default timeout for general operations in seconds
shutdown_timeout_seconds integer, at least 5, at most 300 30 Not enforced: nothing reads this setting. Maximum time to wait for graceful shutdown in seconds
memory_warning_threshold_mb integer, at least 100, at most 8,192 1024 Not enforced: nothing reads this setting. Memory usage threshold in MB that triggers warnings
memory_critical_threshold_mb integer, at least 200, at most 16,384 2048 Not enforced: nothing reads this setting. Memory usage threshold in MB that triggers protective actions
task_count_warning_threshold integer, at least 5, at most 100 15 Not enforced: nothing reads this setting. Active task count that triggers warnings
max_message_size_bytes integer, at least 1,024, at most 104,857,600 10485760 Not enforced: nothing reads this setting. Maximum size of MCP messages in bytes
max_path_length integer, at least 256, at most 8,192 4096 Not enforced: nothing reads this setting. Maximum allowed path length for security validation
max_directory_size_mb integer, at least 10, at most 10,240 1000 Not enforced: nothing reads this setting. Maximum directory size in MB that can be scanned
enable_health_checks boolean true Not enforced: nothing reads this setting. Enable periodic health checks and resource monitoring
health_check_interval_seconds integer, at least 10, at most 300 60 Not enforced: nothing reads this setting. Interval between health checks in seconds
enable_resource_logging boolean true Not enforced: nothing reads this setting. Enable detailed resource management logging
log_resource_operations boolean false Not enforced: nothing reads this setting. Log individual resource operations for debugging

workspace

How many projects a workspace scan runs at once, and how long each may take.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
max_parallel_projects integer or null, at least 1, at most 64 null Maximum number of projects scanned concurrently. Unset means min(4, cpu_count). This is an outer bound over each project's own scanner thread pool, not a replacement for it.
project_timeout number or null, greater than 0 null Seconds to allow a single project. Unset means no limit. On timeout that project is recorded as failed and the remaining projects still complete.

Plugin sections

scanners, reporters and converters each map a plugin name to that plugin's configuration. Every plugin's entry has these keys; what goes under options is specific to the plugin and is listed on its reference page.

Key Type Default Description
name string, length at least 1, matches ^[a-zA-Z][\w-]+$ the plugin's own name Name of the component using letters, numbers, underscores and hyphens. Must begin with a letter. ash config validate warns that it is internal-only in a scanner, reporter, or converter entry, and still passes the config; a scan accepts it.
enabled boolean true Whether the component is enabled
options mapping the plugin's defaults The plugin's options. Each plugin's are listed on its reference page: scanners, reporters, converters.

scanners

The scanners ASH declares a configuration for. Other scanner names are accepted too (the section allows extra keys), for scanners loaded from ash_plugin_modules.

Key Enabled by default Scanner options
actionlint yes actionlint options
bandit yes bandit options
cdk-nag yes cdk-nag options
cfn-guard yes cfn-guard options
cfn-lint yes cfn-lint options
cfn-nag yes cfn-nag options
checkov yes checkov options
detect-secrets yes detect-secrets options
gitleaks yes gitleaks options
grype yes grype options
npm-audit yes npm-audit options
opengrep yes on Linux and macOS; no on Windows opengrep options
semgrep yes on Linux and macOS; no on Windows semgrep options
syft yes syft options
trivy yes trivy options
zizmor yes zizmor options

reporters

The reporters ASH declares a configuration for. Other reporter names are accepted too (the section allows extra keys), for reporters loaded from ash_plugin_modules.

Key Enabled by default Reporter options
csv yes csv options
cyclonedx yes cyclonedx options
gitlab-cyclonedx yes gitlab-cyclonedx options
html yes html options
flat-json yes flat-json options
gitlab-sast yes gitlab-sast options
github-ghas yes github-ghas options
junitxml yes junitxml options
markdown yes markdown options
ocsf yes ocsf options
sarif yes sarif options
spdx no spdx options
text yes text options
unused-suppressions yes unused-suppressions options
yaml no yaml options

converters

The converters ASH declares a configuration for. Other converter names are accepted too (the section allows extra keys), for converters loaded from ash_plugin_modules.

Key Enabled by default Converter options
archive yes archive options
jupyter yes jupyter options

Workspace policy file

In workspace mode, policy that applies to every project lives in its own file, separate from any project's configuration.

ASH looks for it at the workspace root and then in .ash/, under any of these names: .ash-workspace.yml, .ash-workspace.yaml, .ash-workspace.json, ash-workspace.yml, ash-workspace.yaml, ash-workspace.json.

Exactly one may exist: when ASH finds more than one, it refuses the workspace rather than choose.

Workspace policy keys

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
workspace section see the section Workspace-wide policy. Distinct from AshConfig.workspace, which holds execution scheduling knobs in a project config; nothing here can be set from a project's own file.

Workspace policy workspace

Workspace-wide policy: the workspace block of the policy file.

A key not listed here is an error when the configuration is loaded.

Key Type Default Description
max_severity_threshold one of ALL, LOW, MEDIUM, HIGH, CRITICAL, or null null The LOOSEST severity threshold any project may use. A project configuring something stricter keeps it; a project configuring something looser is tightened to this value. 'max' refers to permissiveness, not to severity: the strictness order is ALL < LOW < MEDIUM < HIGH < CRITICAL, so raising this value LOOSENS the ceiling. Unset means no ceiling. Case-sensitive.
suppressions list of section [] Suppressions that apply across the workspace. Paths are WORKSPACE-relative (e.g. 'api/src/legacy.py') and are rewritten into each project's own coordinates before being applied. A suppression that cannot match inside a project is not passed to it; one that cannot be rewritten soundly refuses the workspace.
ignore_paths list of section [] Paths excluded across the workspace. Workspace-relative and pushed down per project, exactly as 'suppressions' are.
additional_scanners list of string [] Scanners every project must run, in addition to whatever it enables itself. Additive only -- this cannot disable a scanner a project enabled. A scanner the project already declares runs under the project's own config and its findings are the project's; a scanner added only by this policy runs with default config and its findings are tagged 'origin: workspace-policy' and reported separately.
policy_scanners_gate boolean false Whether findings from policy-added scanners affect a project's exit code. Default false: a workspace that adds a scanner to gather visibility should not thereby fail projects that never opted into it, and turning it on is the operator saying they have triaged what the new scanner reports.

Workspace policy workspace.suppressions[]

Represents a finding suppression rule.

Each entry in the list has these keys.

A key not listed here is accepted and kept, without validation.

Key Type Default Description
path string required Path or pattern to exclude
reason string required Reason for exclusion
expiration string or null null (Optional) Expiration date (YYYY-MM-DD). The entry stops applying on this date, by the local clock of the host running the scan.
client_supplied boolean false Set by ASH: True when a config or workspace policy file an MCP client delivered supplied this entry, so results show which suppressions and ignored paths came from the client. A value written in a config file is ignored.
rule_id string or null null Rule ID to suppress
line_start integer or null null (Optional) Starting line number
line_end integer or null null (Optional) Ending line number
package_name string or null null (Optional) Only suppress findings about this package (glob, case-insensitive). Findings that do not report a package name never match.
package_version string or null null (Optional) Only suppress findings about this installed package version (glob, case-insensitive). Findings that do not report an installed version never match.
package_path string or null null (Optional) Only suppress findings about the package copy installed at this path, relative to the scan root (glob, supports **), e.g. 'deploy/cdk/node_modules/aws-cdk-lib/node_modules/brace-expansion'. Separates two copies with the same name and version. Findings that do not report an install path never match.
symbol string or null null (Optional) Only suppress findings whose lines lie inside the definition with this qualified name, e.g. 'MyClass.my_method', in the finding's file. Names are dotted from the top of the file, exact and case-sensitive. Resolved by parsing the file with tree-sitter (Python, JavaScript, TypeScript, Java), which needs the 'symbols' extra; a finding whose file cannot be parsed never matches.

Workspace policy workspace.ignore_paths[]

Represents a path exclusion entry.

Each entry in the list has these keys.

A key not listed here is accepted and kept, without validation.

Key Type Default Description
path string required Path or pattern to exclude
reason string required Reason for exclusion
expiration string or null null (Optional) Expiration date (YYYY-MM-DD). The entry stops applying on this date, by the local clock of the host running the scan.
client_supplied boolean false Set by ASH: True when a config or workspace policy file an MCP client delivered supplied this entry, so results show which suppressions and ignored paths came from the client. A value written in a config file is ignored.