Configuration Reference
Every configurable key in .pyscn.toml (or [tool.pyscn.*] in pyproject.toml). Run pyscn init to generate a commented starter file.
[output]
Controls how results are reported.
Key
Type
Default
Description
format
string
"text"
text, json, yaml, csv, or html. CLI flags like --json override this.
directory
string
""
Output directory. Empty = .pyscn/reports/ under CWD.
show_details
bool
false
Include per-finding detail in the summary.
sort_by
string
"complexity"
name, complexity, or risk.
min_complexity
int
1
Filter out functions below this complexity. Overrides [complexity].min_complexity when set.
[complexity]
Cyclomatic complexity analysis.
Key
Type
Default
Description
enabled
bool
true
Run the analyzer.
low_threshold
int
9
Upper bound for "low risk" (inclusive).
medium_threshold
int
19
Upper bound for "medium risk".
max_complexity
int
0
CI failure threshold. 0 = no limit.
min_complexity
int
1
Don't report functions below this.
report_unchanged
bool
true
Include functions with complexity = 1.
See high-cyclomatic-complexity for thresholds guidance.
[dead_code]
Dead code detection.
Key
Type
Default
Description
enabled
bool
true
Run the analyzer.
min_severity
string
"warning"
info, warning, or critical.
show_context
bool
false
Include surrounding source lines.
context_lines
int
3
Lines of context (0–20).
sort_by
string
"severity"
severity, line, file, or function.
detect_after_return
bool
true
Flag statements after return.
detect_after_break
bool
true
Flag statements after break.
detect_after_continue
bool
true
Flag statements after continue.
detect_after_raise
bool
true
Flag statements after raise.
detect_unreachable_branches
bool
true
Flag branches that can never be taken.
ignore_patterns
string[]
[]
Regex patterns for lines to ignore.
[clones]
Clone detection (the most configurable analyzer).
Fragment selection
Key
Type
Default
Description
min_lines
int
10
Minimum lines to consider a fragment.
min_nodes
int
20
Minimum AST nodes.
skip_docstrings
bool
true
Skip docstrings when hashing.
Type thresholds (0.0–1.0)
Key
Default
Clone type
type1_threshold
0.85
Identical (whitespace/comments only).
type2_threshold
0.75
Renamed identifiers/literals.
type3_threshold
0.70
Structurally similar with modifications.
type4_threshold
0.65
Semantic equivalence.
similarity_threshold
0.65
Global minimum for any clone.
Algorithm
Key
Type
Default
Description
cost_model_type
string
"python"
default, python, or weighted.
ignore_literals
bool
false
Treat different literals as equivalent.
ignore_identifiers
bool
false
Treat different variable names as equivalent.
max_edit_distance
float
50.0
Cap on tree edit distance.
enable_dfa
bool
true
Data-flow analysis for Type-4.
enabled_clone_types
string[]
all
Subset of type1, type2, type3, type4.
LSH acceleration
Key
Type
Default
Description
lsh_enabled
true\|false\|"auto"
"auto"
Enable LSH (auto = based on fragment count or estimated pair count).
lsh_auto_threshold
int
500
Fragment count threshold for auto-enable; auto also enables above 10,000 estimated pairs.
lsh_similarity_threshold
float
0.50
LSH candidate pre-filter.
lsh_bands
int
32
LSH bands.
lsh_rows
int
4
Rows per band.
lsh_hashes
int
128
Hash function count.
Grouping
Key
Type
Default
Description
grouping_mode
string
"connected"
connected, star, complete_linkage, k_core.
grouping_threshold
float
0.65
Minimum similarity for grouping.
k_core_k
int
2
k parameter for k_core mode.
Key
Type
Default
Description
max_memory_mb
int
100
Memory cap (MB). 0 = no limit.
batch_size
int
100
Files per batch.
enable_batching
bool
true
Process in batches.
max_goroutines
int
4
Concurrent workers.
timeout_seconds
int
300
Per-analysis timeout.
Output filtering
Key
Type
Default
Description
min_similarity
float
0.0
Filter out pairs below this.
max_similarity
float
1.0
Filter out pairs above this.
max_results
int
10000
Maximum pairs to report. 0 = no limit.
show_details
bool
false
Verbose output.
show_content
bool
false
Include source in the report.
sort_by
string
"similarity"
similarity, size, location, type.
group_clones
bool
true
Group related clones.
[cbo]
Coupling Between Objects (class coupling).
Key
Type
Default
Description
enabled
bool
true
Run the analyzer.
low_threshold
int
3
Upper bound for "low risk".
medium_threshold
int
7
Upper bound for "medium risk".
min_cbo
int
0
Filter out classes below this CBO.
max_cbo
int
0
Filter out classes above this. 0 = no limit.
show_zeros
bool
false
Include classes with CBO = 0.
include_builtins
bool
false
Count list/dict/str as dependencies.
include_imports
bool
true
Count imported module references.
[lcom]
Lack of Cohesion of Methods (LCOM4).
Key
Type
Default
Description
low_threshold
int
2
Upper bound for "low risk" (good cohesion).
medium_threshold
int
5
Upper bound for "medium risk".
[analysis]
File discovery rules.
Key
Type
Default
Description
recursive
bool
true
Descend into subdirectories.
follow_symlinks
bool
false
Follow symbolic links.
include_patterns
string[]
["**/*.py"]
Glob patterns to include.
exclude_patterns
string[]
see below
Glob patterns to exclude.
Default exclude_patterns:
[
"test_*.py" , "*_test.py" ,
"**/__pycache__/*" , "**/*.pyc" ,
"**/.pytest_cache/" , ".tox/" ,
"venv/" , "env/" , ".venv/" , ".env/" ,
]
[architecture]
Layer validation. All keys optional — if you don't define layers, architecture analysis runs in permissive mode.
Key
Type
Default
Description
enabled
bool
true
Run layer validation.
validate_layers
bool
true
Check layer-to-layer rules.
validate_cohesion
bool
true
Check package cohesion.
validate_responsibility
bool
true
Check module responsibility count.
strict_mode
bool
true
Strict validation.
fail_on_violations
bool
false
Non-zero exit on violation.
min_cohesion
float
0.5
Minimum package cohesion.
max_coupling
int
10
Max inter-layer coupling.
max_responsibilities
int
3
Max concerns per module.
neutral_prefixes
string[]
[]
Top-level module segments to strip before matching layer packages. Useful when every module starts with the same project prefix (e.g. app, src).
Layer definitions
[[architecture.layers]]
name = "presentation"
packages = [ "router" , "routers" , "handler" , "handlers" , "controller" , "api" ]
[[architecture.layers]]
name = "application"
packages = [ "service" , "services" , "usecase" , "usecases" ]
[[architecture.layers]]
name = "domain"
packages = [ "model" , "models" , "entity" , "entities" ]
[[architecture.layers]]
name = "infrastructure"
packages = [ "repository" , "repositories" , "db" , "database" ]
Layer rules
[[architecture.rules]]
from = "presentation"
allow = [ "application" , "domain" ]
deny = [ "infrastructure" ]
[[architecture.rules]]
from = "application"
allow = [ "domain" ]
Neutral prefixes
If every module in the project starts with the same root segment (app., src., ...), layer matching can fail because the project prefix shadows the layer name. List those segments under neutral_prefixes and pyscn will strip them before resolving a module to a layer:
[architecture]
neutral_prefixes = [ "app" , "src" ]
With this set, app.routers.user_router is matched as routers.user_router and resolves to the presentation layer.
[dependencies]
Module dependency analysis. Opt-in for pyscn check; always on for pyscn analyze unless skipped.
Key
Type
Default
Description
enabled
bool
false
Run the analyzer (analyze always runs it regardless).
include_stdlib
bool
false
Include standard-library imports.
include_third_party
bool
true
Include third-party imports.
follow_relative
bool
true
Follow relative imports.
detect_cycles
bool
true
Find circular imports.
calculate_metrics
bool
true
Compute Ca/Ce/I/A/D.
find_long_chains
bool
true
Report longest dependency chains.
cycle_reporting
string
"summary"
all, critical, summary.
max_cycles_to_show
int
10
Cap on reported cycles.
sort_by
string
"name"
name, coupling, instability, distance, risk.
show_matrix
bool
false
Include dependency matrix.
generate_dot_graph
bool
false
Emit Graphviz DOT output.
[mock_data]
Mock/placeholder data detection. Opt-in .
Key
Type
Default
Description
enabled
bool
false
Run the analyzer.
min_severity
string
"warning"
info, warning, error.
ignore_tests
bool
true
Skip test files.
keywords
string[]
built-in
Words flagged as mock indicators.
domains
string[]
built-in
Domains flagged (example.com, test.com, etc.).
ignore_patterns
string[]
[]
Files/regex patterns to skip.
[di]
Dependency Injection anti-pattern detection. Opt-in .
Key
Type
Default
Description
enabled
bool
false
Run the analyzer.
min_severity
string
"warning"
info, warning, error.
constructor_param_threshold
int
5
Flag __init__ with more params.
CLI flag → config key map
Flags that don't map directly to a config key (--select, --skip-*, --no-open) work on top of whatever config you have loaded.
CLI flag
Config key
--config <path>
— (overrides discovery)
--json/--yaml/--csv/--html
[output] format
--min-complexity
[complexity] min_complexity
--max-complexity
[complexity] max_complexity
--min-severity
[dead_code] min_severity
--clone-threshold
[clones] similarity_threshold
--min-cbo
[cbo] min_cbo
--max-cycles
— (check command only)
See also